diff --git a/.github/actions/send-notification/action.yml b/.github/actions/send-notification/action.yml new file mode 100644 index 0000000000..0d28e65613 --- /dev/null +++ b/.github/actions/send-notification/action.yml @@ -0,0 +1,30 @@ +name: Send notification +description: Sends a Google Chat message as a notification of the job's outcome +inputs: + webhook-url: + description: 'Google Chat Webhook URL' + required: true + status: + description: 'Status of the job' + required: true + run-name: + description: 'Name of the run to include in the notification' + default: ${{ format('{0} {1}', github.ref_name, github.job) }} +runs: + using: composite + steps: + - shell: bash + run: | + echo "RUN_URL=${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" >> "$GITHUB_ENV" + - shell: bash + if: ${{ inputs.status == 'success' }} + run: | + curl -X POST '${{ inputs.webhook-url }}' -H 'Content-Type: application/json' -d '{ text: "<${{ env.RUN_URL }}|${{ inputs.run-name }}> was successful"}' || true + - shell: bash + if: ${{ inputs.status == 'failure' }} + run: | + curl -X POST '${{ inputs.webhook-url }}' -H 'Content-Type: application/json' -d '{ text: " *<${{ env.RUN_URL }}|${{ inputs.run-name }}> failed* "}' || true + - shell: bash + if: ${{ inputs.status == 'cancelled' }} + run: | + curl -X POST '${{ inputs.webhook-url }}' -H 'Content-Type: application/json' -d '{ text: "<${{ env.RUN_URL }}|${{ inputs.run-name }}> was cancelled"}' || true diff --git a/.github/dco.yml b/.github/dco.yml new file mode 100644 index 0000000000..0c4b142e9a --- /dev/null +++ b/.github/dco.yml @@ -0,0 +1,2 @@ +require: + members: false diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..187fe1cd72 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,8 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + labels: + - "type: task" diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml new file mode 100644 index 0000000000..367e7fa8cf --- /dev/null +++ b/.github/workflows/build-and-deploy.yml @@ -0,0 +1,66 @@ +name: Build and deploy +on: + push: + branches: + - main + workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +jobs: + build: + name: Build and deploy + runs-on: ubuntu-latest + steps: + - name: Check out + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'liberica' + cache: 'maven' + + - name: Cache Maven/Gradle repositories for tests + uses: actions/cache@v4 + with: + path: /tmp/start-spring-io-cache-2024-12-11 + # See https://github.com/actions/cache/blob/main/tips-and-workarounds.md#update-a-cache + key: test-repositories-${{ runner.os }}-${{ github.run_id }} + restore-keys: test-repositories-${{ runner.os }} + + - name: Cache node_modules + uses: actions/cache@v4 + with: + path: start-client/node_modules + key: node-modules-${{ hashFiles('start-client/yarn.lock') }} + + - name: Build with Maven + env: + START_SPRING_IO_TMPDIR: /tmp/start-spring-io-cache-2024-12-11 + run: ./mvnw --batch-mode --update-snapshots verify + + - name: Set up Azure + uses: azure/login@a65d910e8af852a8061c627c456678983e180302 # v2.2.0 + with: + creds: ${{ secrets.AZURE_CREDENTIALS_SPRING_IO }} + + - name: Set up Azure Spring Extension + run: az extension add --name spring + + - name: Deploy + run: | + az spring app deploy \ + --name start-spring-io \ + --service spring-io \ + --resource-group spring-io \ + --artifact-path start-site/target/start-site-exec.jar + + - name: Send notification + uses: ./.github/actions/send-notification + if: always() + with: + webhook-url: ${{ secrets.GOOGLE_CHAT_WEBHOOK }} + status: ${{ job.status }} + run-name: ${{ format('start.spring.io | {0}', github.ref_name) }} diff --git a/.github/workflows/build-on-windows.yml b/.github/workflows/build-on-windows.yml new file mode 100644 index 0000000000..e17dee30ad --- /dev/null +++ b/.github/workflows/build-on-windows.yml @@ -0,0 +1,28 @@ +name: Build on Windows +on: + push: + branches: + - main + workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +jobs: + build: + name: Build + runs-on: windows-latest + steps: + - name: Check out + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'liberica' + cache: 'maven' + + - name: Build with Maven + run: ./mvnw.cmd --batch-mode --update-snapshots --no-transfer-progress verify + env: + JUNIT_MAX_PARALLELISM: "1" diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml new file mode 100644 index 0000000000..0cff25ba98 --- /dev/null +++ b/.github/workflows/build-pull-request.yml @@ -0,0 +1,27 @@ +name: Build Pull Request +on: pull_request + +permissions: + contents: read + +jobs: + build: + name: Build pull request + runs-on: ubuntu-latest + if: ${{ github.repository == 'spring-io/start.spring.io' }} + steps: + - name: Check out + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'liberica' + cache: 'maven' + + - name: Build with Maven + run: ./mvnw --batch-mode --update-snapshots verify + + - name: Run metadata verification tests + run: ./mvnw --batch-mode --update-snapshots -Pverification verify diff --git a/.github/workflows/verification.yml b/.github/workflows/verification.yml new file mode 100644 index 0000000000..7f50db9ca4 --- /dev/null +++ b/.github/workflows/verification.yml @@ -0,0 +1,47 @@ +name: Verification +on: + schedule: + - cron: '15 3 * * *' + workflow_dispatch: + +jobs: + verification: + name: Verification + runs-on: ubuntu-latest + steps: + - name: Check out + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'liberica' + cache: 'maven' + + - name: Cache node_modules + uses: actions/cache@v4 + with: + path: start-client/node_modules + key: node-modules-${{ hashFiles('start-client/yarn.lock') }} + + - name: Cache Maven/Gradle repositories for tests + uses: actions/cache@v4 + with: + path: /tmp/start-spring-io-cache-2024-12-11 + # See https://github.com/actions/cache/blob/main/tips-and-workarounds.md#update-a-cache + key: test-repositories-${{ runner.os }}-${{ github.run_id }} + restore-keys: test-repositories-${{ runner.os }} + + - name: Build with Maven + env: + START_SPRING_IO_TMPDIR: /tmp/start-spring-io-cache-2024-12-11 + run: ./mvnw --batch-mode --update-snapshots --activate-profiles verification verify + + - name: Send notification + uses: ./.github/actions/send-notification + if: always() + with: + webhook-url: ${{ secrets.GOOGLE_CHAT_WEBHOOK }} + status: ${{ job.status }} + run-name: ${{ format('start.spring.io (Verification) | {0}', github.ref_name) }} diff --git a/.gitignore b/.gitignore index a4e518a941..21c6b153be 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,9 @@ target /nbdist/ /.nb-gradle/ +### Visual Studio Code ### +.vscode/ + ### Start Client ### /start-client/public/ /start-client/node_modules/ @@ -33,4 +36,4 @@ target /start-client/.cache/ /start-client/package-lock.json /start-client/yarn-error.log -/start-client/analysis \ No newline at end of file +/start-client/analysis diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index cb28b0e37c..0000000000 Binary files a/.mvn/wrapper/maven-wrapper.jar and /dev/null differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index b27a13f1d9..d58dfb70ba 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +1,19 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.2/apache-maven-3.9.2-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip diff --git a/CONTRIBUTING.adoc b/CONTRIBUTING.adoc index 07dccdb206..facd77ff45 100644 --- a/CONTRIBUTING.adoc +++ b/CONTRIBUTING.adoc @@ -21,13 +21,9 @@ We use GitHub issues to track bugs and enhancements. If you have a general usage please ask on https://stackoverflow.com[Stack Overflow] or join us on the https://gitter.im/spring-io/initializr[Gitter channel]. -== Sign the Contributor License Agreement -Before we accept a non-trivial patch or pull request we will need you to -https://cla.pivotal.io/sign/spring[sign the Contributor License Agreement]. -Signing the contributor's agreement does not grant anyone commit rights to the main -repository, but it does mean that we can accept your contributions, and you will get an -author credit if we do. Active contributors might be asked to join the core team, and -given the ability to merge pull requests. +== Include a Signed Off By Trailer +All commits must include a __Signed-off-by__ trailer at the end of each commit message to indicate that the contributor agrees to the Developer Certificate of Origin. +For additional details, please refer to the blog post https://spring.io/blog/2025/01/06/hello-dco-goodbye-cla-simplifying-contributions-to-spring[Hello DCO, Goodbye CLA: Simplifying Contributions to Spring]. == Code Conventions and Housekeeping None of these is essential for a pull request, but they will all help. They can also be @@ -53,7 +49,7 @@ added after the original pull request but before a merge. === Building from Source start.spring.io can be build from the command line using -https://maven.apache.org/run-maven/index.html[Apache Maven] on JDK 11 or above. +https://maven.apache.org/run-maven/index.html[Apache Maven] on JDK 17 or above. We include '`Maven Wrapper`' scripts (`./mvnw` or `mvnw.bat`) that you can run rather than needing to install Maven locally. diff --git a/USING.adoc b/USING.adoc index 5cc54c1ae3..4da69c2455 100644 --- a/USING.adoc +++ b/USING.adoc @@ -1,4 +1,3 @@ -:spring-boot-docs: https://docs.spring.io/spring-boot/docs/current/reference/html = User Guide If you're wondering how to use https://start.spring.io or what features are available, @@ -116,21 +115,21 @@ version: [source] ---- -Requires Spring Boot >=2.4.0 and <2.6.0-M1 +Requires Spring Boot >=3.0.0 and <3.2.0-M1 ---- Concretely, this defines a "version range" that states the dependency is deprecated and is -no longer available as of Spring Boot 2.6. You may want to check the release notes of the +no longer available as of Spring Boot 3.2. You may want to check the release notes of the related project to understand what your migration path can be. Alternatively, the message could be: [source] ---- -Requires Spring Boot >=2.6.0 +Requires Spring Boot >=3.2.0 ---- That version range means the dependency is not available with the selected Spring Boot -generation. If you select Spring Boot 2.6 (or later if available), you'll be +generation. If you select Spring Boot 3.2 (or later if available), you'll be able to select that dependency. @@ -190,7 +189,7 @@ Refer to the documentation of your favorite IDE for more details. The `spring` command line tool defines an `init` command that allows you to create a project using Spring Initializr. It defaults to start.spring.io. -Check {spring-boot-docs}/spring-boot-cli.html#cli-init[the documentation for more details]. +Check https://docs.spring.io/spring-boot/cli/index.html[the documentation for more details]. @@ -237,13 +236,13 @@ understand how you can generate a project. These are obviously tailored to the c you are using. Let's assume that you want to generate a "my-project.zip" project based on Spring Boot -`2.6.4`, using the `web` and `devtools` dependencies (remember, those two ids are +`3.0.8`, using the `web` and `devtools` dependencies (remember, those two ids are displayed in the capabilities of the service): [source] ---- $ curl https://start.spring.io/starter.zip -d dependencies=web,devtools \ - -d bootVersion=2.6.4 -o my-project.zip + -d bootVersion=3.0.8 -o my-project.zip ---- If you extract `my-project.zip`, you'll notice a few differences compared to what happens @@ -259,7 +258,7 @@ The exact same project can be generated using the `http` command as well: [source] ---- $ http https://start.spring.io/starter.zip dependencies==web,devtools \ - bootVersion==2.6.4 -d + bootVersion==3.0.8 -d ---- NOTE: `HTTPie` reads the same hint as the browser, so it will store a `demo.zip` file in diff --git a/ci/README.adoc b/ci/README.adoc deleted file mode 100644 index 6c49f3ed54..0000000000 --- a/ci/README.adoc +++ /dev/null @@ -1,18 +0,0 @@ -== Concourse pipeline - -Ensure that you've setup the target and can login - -[source] ----- -$ fly -t initializr login -n initializr -c https://ci.spring.io ----- - -The pipeline can be deployed using the following command: - -[source] ----- -$ fly -t initializr set-pipeline -p start-site -c ci/pipeline.yml -l ci/parameters.yml ----- - -NOTE: This assumes that you have credhub integration configured with the appropriate -secrets. diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml deleted file mode 100644 index f1ac2195f0..0000000000 --- a/ci/config/deployment.yml +++ /dev/null @@ -1,45 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - namespace: default - name: start-deployment -spec: - replicas: 2 - selector: - matchLabels: - app: start - template: - metadata: - labels: - app: start - spec: - containers: - - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:ce492b31813613ea01a7ce32dfaa055eb3a6c4e102772c550a77d3ccd2125589 - lifecycle: - preStop: - exec: - command: ["sh", "-c", "sleep 10"] - livenessProbe: - httpGet: - path: /actuator/health/liveness - port: 8080 - initialDelaySeconds: 5 - readinessProbe: - httpGet: - path: /actuator/health/readiness - port: 8080 - volumeMounts: - - name: elastic - mountPath: "/etc/config/initializr/stats/elastic" - readOnly: true - env: - - name: SERVER_SHUTDOWN - value: graceful - - name: SPRING_CONFIG_IMPORT - value: configtree:/etc/config/ - volumes: - - name: elastic - secret: - secretName: elastic \ No newline at end of file diff --git a/ci/config/elastic.yml b/ci/config/elastic.yml deleted file mode 100644 index c7d0ab4a69..0000000000 --- a/ci/config/elastic.yml +++ /dev/null @@ -1,3 +0,0 @@ -#@data/values ---- -uri: "" \ No newline at end of file diff --git a/ci/config/kubeconfig.yml b/ci/config/kubeconfig.yml deleted file mode 100644 index 431f2e79a2..0000000000 --- a/ci/config/kubeconfig.yml +++ /dev/null @@ -1,9 +0,0 @@ -kind: Config -current-context: spring-initializr -contexts: [{name: spring-initializr, context: {cluster: spring-initializr, user: user-1}}] -users: [{name: user-1, user: {auth-provider: {name: gcp}}}] -clusters: - - name: spring-initializr - cluster: - server: "https://35.245.127.30" - certificate-authority-data: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURERENDQWZTZ0F3SUJBZ0lSQUxhZ2Q0MzlIdTlBQnFmUEhiZ041aVF3RFFZSktvWklodmNOQVFFTEJRQXcKTHpFdE1Dc0dBMVVFQXhNa09UTmlPVE0yTW1RdFpXSm1aaTAwWVRGa0xXSXpOVGt0TUdKbVpHVXlOVFkxWXpJMgpNQjRYRFRJd01EWXdNakUzTkRFeE9Wb1hEVEkxTURZd01URTROREV4T1Zvd0x6RXRNQ3NHQTFVRUF4TWtPVE5pCk9UTTJNbVF0WldKbVppMDBZVEZrTFdJek5Ua3RNR0ptWkdVeU5UWTFZekkyTUlJQklqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBeFYzQjY2VnZVZE9mRDdOYndlYmdtY3g2K1o1dWo3algwektWTHEzMQpUR2lqUXRvQkQxbmJsMDlrRnlpUHRzVWFOamNTTGNBcFJHb1ZnQmlCbUE2MkpwbW1aRkdyOUVLbGZnU25jZkNGCkUvTnE3RFJmZkFvR2MvbTFsbVROUlFTUGR2UWNGYkVMUnFUaHRsQUNiWmlVS3IyK09vbHdjVDNIVWdHRmVKcTgKNVFzZWZNbUdVV3U3ZzczTVlEN2VPc2lDYUNaUDdVVFIrNVlmUHVRd0lSbC9kNFRmK3krS2xqKzRUL0FnNGhWTwpZZHluZjlhSllrLzF1VWdheUdYVlllendZcUtjVzRBTWdHc1d6bDhDd2xCQTJqUFdvZVQzbis3d0NQOVUxT09TClRYZVFOblFNZlJ4Um9yYVJUSWo0SUpUWWdwRmZDMWkzb0VnZFlGRi80bVI4MFFJREFRQUJveU13SVRBT0JnTlYKSFE4QkFmOEVCQU1DQWdRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQQpUWGhOTytiZ3Rhc2YraHpoS2xyZHhoQXRWYjRTV3IxN1A1dEkyM3pPSXgwelhOK1ltVFV5NXVmbmtiZ2c4UExOCjM2RnJpOFJMT09jaTY5SmhIVzhaL3RVb09ZS3ZqMm5jSmlLNlp3Y0txaXBsUytUNDdoRjRPdGU0WG1ZLzZVNnEKak8xUk5TaFBqdzJvYi9WZTE0cHpXWTh0SUxoTFlhd2w1Z1ZKbGgxaHhmZkJFamNoTW8vbnZqVHZrQjFxVUt5YwoxRmkyRHZCejZDREZtckJUVmR1SXJKM2dYYkZ5VWNsMGk4YXo5RkNpMGJBa2hoL0gwbUpEUUZ4aWFlZjlGdzdZCkNLbGdnZGEzTHppTmw3YUlKaEhRbGpLTXMybFFzNktlYXMwaHgzbitNaFg0S0FGdFVjQXduWVBZZjZHRVN2VTMKTm1sVVlUUGlJL1RhWldSWmoxOFJUQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K" \ No newline at end of file diff --git a/ci/config/secret.yml b/ci/config/secret.yml deleted file mode 100644 index e5eb54f9c5..0000000000 --- a/ci/config/secret.yml +++ /dev/null @@ -1,7 +0,0 @@ -#@ load("@ytt:data", "data") -apiVersion: v1 -kind: Secret -metadata: - name: elastic -data: - uri: #@ data.values.uri diff --git a/ci/images/README.adoc b/ci/images/README.adoc deleted file mode 100644 index 92fa3c2ec5..0000000000 --- a/ci/images/README.adoc +++ /dev/null @@ -1,21 +0,0 @@ -== CI Images - -These images are used by CI to run the actual builds. - -To build the image locally run the following from this directory: - ----- -$ docker build --no-cache -f /Dockerfile . ----- - -For example - ----- -$ docker build --no-cache -f ci-image/Dockerfile . ----- - -To test run: - ----- -$ docker run -it --entrypoint /bin/bash ----- diff --git a/ci/images/setup.sh b/ci/images/setup.sh deleted file mode 100755 index 049db04665..0000000000 --- a/ci/images/setup.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -set -ex - -########################################################### -# UTILS -########################################################### - -export DEBIAN_FRONTEND=noninteractive -apt-get update -apt-get install --no-install-recommends -y tzdata ca-certificates curl git node-gyp -ln -fs /usr/share/zoneinfo/UTC /etc/localtime -dpkg-reconfigure --frontend noninteractive tzdata - -curl https://raw.githubusercontent.com/spring-io/concourse-java-scripts/v0.0.2/concourse-java.sh > /opt/concourse-java.sh - - -########################################################### -# JAVA -########################################################### - -mkdir -p /opt/openjdk -cd /opt/openjdk -curl -L https://github.com/bell-sw/Liberica/releases/download/17.0.7+7/bellsoft-jdk17.0.7+7-linux-amd64.tar.gz | tar zx --strip-components=1 -test -f /opt/openjdk/bin/java -test -f /opt/openjdk/bin/javac diff --git a/ci/images/start-site-ci-image/Dockerfile b/ci/images/start-site-ci-image/Dockerfile deleted file mode 100644 index 47dad8bc54..0000000000 --- a/ci/images/start-site-ci-image/Dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -FROM ubuntu:jammy-20230425 - -ADD setup.sh /setup.sh -RUN ./setup.sh - -ENV JAVA_HOME /opt/openjdk -ENV PATH $JAVA_HOME/bin:$PATH - -RUN apt-get update && \ - apt-get install -y wget && \ - wget https://github.com/k14s/ytt/releases/download/v0.27.2/ytt-linux-amd64 && \ - mv ytt-linux-amd64 /usr/local/bin/ytt && \ - chmod +x /usr/local/bin/ytt - -RUN apt-get update && \ - apt-get install -y apt-transport-https gnupg2 && \ - curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \ - echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | tee -a /etc/apt/sources.list.d/kubernetes.list && \ - apt-get update && \ - apt-get install -y kubectl=1.25.10-00 - diff --git a/ci/parameters.yml b/ci/parameters.yml deleted file mode 100644 index a59414cf6d..0000000000 --- a/ci/parameters.yml +++ /dev/null @@ -1,22 +0,0 @@ -github-repo: "https://github.com/spring-io/start.spring.io.git" -github-repo-name: "spring-io/start.spring.io" -branch: main -artifactory-server: "https://repo.spring.io" -artifactory-repo: "initializr-ci-local" -docker-hub-organization: "springci" -build-name: "start-site" -pipeline-name: "start-site" -concourse-url: "https://ci.spring.io" -task-timeout: 1h00m -shipyard-kubeconfig: | - apiVersion: v1 - kind: Config - current-context: my-cluster - contexts: [{name: my-cluster, context: {cluster: cluster-1, user: user-1}}] - users: [{name: user-1, user: {auth-provider: {name: gcp}}}] - clusters: - - name: cluster-1 - cluster: - server: "https://34.71.146.206" - certificate-authority-data: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLekNDQWhPZ0F3SUJBZ0lSQU8vWktkbC92aS93OHoyMFIrSFM0OWN3RFFZSktvWklodmNOQVFFTEJRQXcKTHpFdE1Dc0dBMVVFQXhNa05UTmpPVGhsWlRFdE16WXhPUzAwWXpJMUxUbGhNRGd0TXpVM01qRmtOR00xTWpJdwpNQjRYRFRJd01Ea3dNakUwTkRjek9Wb1hEVEkxTURrd01URTFORGN6T1Zvd0x6RXRNQ3NHQTFVRUF4TWtOVE5qCk9UaGxaVEV0TXpZeE9TMDBZekkxTFRsaE1EZ3RNelUzTWpGa05HTTFNakl3TUlJQklqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBOHQyVHFvYllJMlhTRjhvZGQ3dElhUzlXT2lPRVJmWE9wQU9oZ3hyWApabWc1Vk04amZiUTZ0YWxKVFZTZ3ZDOHExcjZ0MzlQSGJld3BvTVFBUzB0OFRkeHdONFVxWFJ4b0dURVRDRkJZCk9oZUdEelAySHlnS0hZTG4rdDFRTHUyMm5EY2V0Zk8vKzBGK2VIZ0RaaXoyMFFKUm0yeUkvZURtZHJDRkRaOGEKTFlsMmJINHZnRkdxQ0c3V2pvUlpXbEdaMUpUQXEvRG5nbVJFaGlIdmJhM1VLWktHem5JL0dtN1ZzdXlyKzh2Rwpwa0JIYTFCWDFyZHV4ZnFFYlRLclFSbnAxazQ2Y2VqdWN4ZktMd04zclE1cjNGT2dRd1UyTG96RmYvNHdEdGtBCm5ENGJkT0VyR2l3UDNSZXJoMG1kOFNBblpLWXFsWTV3dXNKdEduLzdYeWQwR3dJREFRQUJvMEl3UURBT0JnTlYKSFE4QkFmOEVCQU1DQWdRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVTdIa3IyOGdkbnQ1ZAozaGZVVFEvMlNWRm9zL0l3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQU1Wdjh4clBFMXZRa1ZrUVh0YUovNUV2CkZ0RFY0MzdBUzBUdWhIdnM3UllpMlBrTTM3OFhyYkxleXlpNHFlNi9zT0VGMDBHaFJzb204cU1JYld2Nlk2MmgKRFJpSjF4NnNucTFaQ0tHbHZDc1ZnRU5pamNiYWYwZjMrRzd1OTNPSldEdWl4Nlhmb3RpaFM0dS9VNWJMK3pwWQpnN2RSYXM0SnZvcC9FZWdNZG9kZWcyckczOHhlOHVjRGZaNFZNM3RORURPSVZZalQxblNsSmlRZFVON0dYS0hXCkczL0doQ1ZQbU9xU1N6YzRQNFVJTm91aHJMZU1ncXBnSVp0d2hleFFHZGFyVnBlSmUvMjRxemhTSlFSRENjdjkKeEVWVUZTSDU4eU8zY3FlanVtU09ScHRkajZicHNxaWhTT3lUM20rcXVsZ1REZUkxakRsNnZRL0RGMzhvaGFzPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==" -google-tagmanager-id: "GTM-KZM7GF6" \ No newline at end of file diff --git a/ci/pipeline.yml b/ci/pipeline.yml deleted file mode 100644 index 85c5c097ac..0000000000 --- a/ci/pipeline.yml +++ /dev/null @@ -1,274 +0,0 @@ -anchors: - docker-resource-source: &docker-resource-source - username: ((docker-hub-username)) - password: ((docker-hub-password)) - -resource_types: -- name: artifactory-resource - type: registry-image - source: - <<: *docker-resource-source - repository: springio/artifactory-resource - tag: 0.0.17 - -- name: github-status-resource - type: registry-image - source: - <<: *docker-resource-source - repository: dpb587/github-status-resource - tag: master - -- name: kpack-image - type: registry-image - source: - repository: gcr.io/cf-build-service-public/concourse-kpack-resource - tag: "1.0" - username: - password: - -- name: slack-notification - type: registry-image - source: - <<: *docker-resource-source - repository: cfcommunity/slack-notification-resource - tag: latest - - -resources: -- name: artifactory-repo - type: artifactory-resource - icon: package-variant - source: - uri: ((artifactory-server)) - username: ((artifactory-username)) - password: ((artifactory-password)) - build_name: ((build-name)) - -- name: build-source - type: git - icon: github-circle - source: - uri: ((github-repo)) - branch: ((branch)) - ignore_paths: - - ci/config/deployment.yml - -- name: build-status - type: github-status-resource - icon: check - source: - repository: spring-io/start.spring.io - access_token: ((github-ci-status-token)) - branch: ((branch)) - context: build - -- name: ci-images - type: git - icon: github-circle - source: - uri: ((github-repo)) - branch: ((branch)) - paths: - - ci/images/* - -- name: daily - type: time - icon: clock-outline - source: - interval: 24h - -- name: deploy-source - type: git - icon: github-circle - source: - uri: ((github-repo)) - branch: ((branch)) - paths: - - ci/config/deployment.yml - -- name: kpack - type: kpack-image - icon: docker - source: - image: initializr-k8s-image - namespace: spring-initializr - gke: - json_key: ((kpack-resource-account-key)) - kubeconfig: ((shipyard-kubeconfig)) - -- name: script-source - type: git - icon: github-circle - source: - uri: ((github-repo)) - username: ((github-username)) - password: ((github-ci-release-token)) - branch: ((branch)) - -- name: slack-alert - type: slack-notification - icon: slack - source: - url: ((slack-webhook-url)) - -- name: start-site-ci-image - type: docker-image - icon: docker - source: - repository: springci/start-site-ci-image - username: ((docker-hub-username)) - password: ((docker-hub-password)) - tag: ((branch)) - - -groups: -- name: site - jobs: - - build - - deploy - - update-deployment - - update-image - - verify -- name: ci-images - jobs: - - build-start-site-ci-image - - -jobs: -- name: build - plan: - - in_parallel: - - get: git-repo - resource: build-source - trigger: true - - get: start-site-ci-image - - put: build-status - params: - commit: git-repo - state: pending - - task: build - image: start-site-ci-image - file: git-repo/ci/tasks/build-service.yml - timeout: ((task-timeout)) - params: - GOOGLE_TAGMANAGER_ID: ((google-tagmanager-id)) - on_success: - put: build-status - params: - commit: git-repo - state: success - on_failure: - in_parallel: - - put: build-status - params: - commit: git-repo - state: failure - - put: slack-alert - params: - text: ":concourse-failed: " - silent: true - icon_emoji: ":concourse:" - username: concourse-ci - - put: artifactory-repo - params: - repo: ((artifactory-repo)) - folder: distribution-repository - build_uri: "https://ci.spring.io/teams/${BUILD_TEAM_NAME}/pipelines/${BUILD_PIPELINE_NAME}/jobs/${BUILD_JOB_NAME}/builds/${BUILD_NAME}" - build_number: "${BUILD_PIPELINE_NAME}-${BUILD_JOB_NAME}-${BUILD_NAME}" - disable_checksum_uploads: true - -- name: deploy - plan: - - in_parallel: - - get: deploy-git-repo - resource: deploy-source - trigger: true - - get: git-repo - resource: script-source - - get: start-site-ci-image - - task: deploy - image: start-site-ci-image - file: git-repo/ci/tasks/deploy.yml - params: - KEY: ((developer-account-key)) - ELASTIC_uri: ((elastic-uri)) - - put: slack-alert - params: - text: ":concourse-succeeded: " - silent: true - icon_emoji: ":concourse:" - username: concourse-ci - -- name: build-start-site-ci-image - plan: - - get: source - resource: ci-images - trigger: true - - put: start-site-ci-image - params: - build: source/ci/images - dockerfile: source/ci/images/start-site-ci-image/Dockerfile - -- name: update-deployment - plan: - - in_parallel: - - get: git-repo - resource: script-source - - get: kpack - trigger: true - - get: start-site-ci-image - - task: update-deployment - image: start-site-ci-image - file: git-repo/ci/tasks/update-deployment.yml - - put: git-repo - resource: script-source - params: - repository: updated-git-repo - -- name: update-image - plan: - - in_parallel: - - get: git-repo - resource: script-source - - get: artifactory-repo - trigger: true - - get: start-site-ci-image - - task: get-blob-url - image: start-site-ci-image - file: git-repo/ci/tasks/get-blob-url.yml - params: - <<: *docker-resource-source - ARTIFACTORY_SERVER: ((artifactory-server)) - ARTIFACTORY_REPO: ((artifactory-repo)) - - put: kpack - params: - blob_url_file: blob-url/url - -- name: verify - serial: true - public: true - plan: - - in_parallel: - - get: daily - trigger: true - - get: git-repo - resource: script-source - trigger: true - - get: start-site-ci-image - - task: verify-service.yml - image: start-site-ci-image - file: git-repo/ci/tasks/verify-service.yml - on_success: - put: slack-alert - params: - text: ":concourse-succeeded: " - silent: true - icon_emoji: ":concourse:" - username: concourse-ci - on_failure: - put: slack-alert - params: - text: ":concourse-failed: " - silent: true - icon_emoji: ":concourse:" - username: concourse-ci diff --git a/ci/scripts/build-service.sh b/ci/scripts/build-service.sh deleted file mode 100755 index aef181ef28..0000000000 --- a/ci/scripts/build-service.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -set -e - -source $(dirname $0)/common.sh - -repository=$(pwd)/distribution-repository -pushd git-repo -./mvnw clean deploy -U -DaltDeploymentRepository=distribution::default::file://${repository} -popd diff --git a/ci/scripts/common.sh b/ci/scripts/common.sh deleted file mode 100644 index d5811adbf5..0000000000 --- a/ci/scripts/common.sh +++ /dev/null @@ -1,4 +0,0 @@ -source /opt/concourse-java.sh - -setup_symlinks -cleanup_maven_repo "io.spring.start" diff --git a/ci/scripts/deploy.sh b/ci/scripts/deploy.sh deleted file mode 100755 index 2fb15c3d0a..0000000000 --- a/ci/scripts/deploy.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -set -e - -CONFIG_DIR=git-repo/ci/config -echo $KEY > key.json -export GOOGLE_APPLICATION_CREDENTIALS=key.json -export KUBECONFIG=${CONFIG_DIR}/kubeconfig.yml -export ENCODED_uri=$(echo -n $ELASTIC_uri | base64) -ytt -f ${CONFIG_DIR}/secret.yml -f ${CONFIG_DIR}/elastic.yml --data-values-env ENCODED | kubectl apply -f- -kubectl apply -f ${CONFIG_DIR}/deployment.yml diff --git a/ci/scripts/get-blob-url.sh b/ci/scripts/get-blob-url.sh deleted file mode 100755 index 883eabebb1..0000000000 --- a/ci/scripts/get-blob-url.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -set -e - -pushd git-repo -snapshotVersion=0.0.1-SNAPSHOT -popd -pushd artifactory-repo/io/spring/start/start-site/$snapshotVersion -path=$( find . -type f -iname "*-exec.jar" ) -name=${path#"./"} -popd -echo $name -echo "${ARTIFACTORY_SERVER}/${ARTIFACTORY_REPO}/io/spring/start/start-site/${snapshotVersion}/$name" > blob-url/url \ No newline at end of file diff --git a/ci/scripts/update-deployment.sh b/ci/scripts/update-deployment.sh deleted file mode 100755 index 996006668f..0000000000 --- a/ci/scripts/update-deployment.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -set -e - -IMAGE=$( cat kpack/image ) - -git clone git-repo updated-git-repo > /dev/null - -pushd updated-git-repo > /dev/null -CONFIG_DIR=ci/config -sed -i -e "s|image: .*|image: ${IMAGE}|" ${CONFIG_DIR}/deployment.yml - -git config user.name "Spring Builds" > /dev/null -git config user.email "spring-builds@users.noreply.github.com" > /dev/null -git add ${CONFIG_DIR}/deployment.yml > /dev/null -git commit -m"Update image digest in deployment.yml" > /dev/null - -popd > /dev/null \ No newline at end of file diff --git a/ci/scripts/verify-service.sh b/ci/scripts/verify-service.sh deleted file mode 100755 index f7a37bfb39..0000000000 --- a/ci/scripts/verify-service.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -set -e - -source $(dirname $0)/common.sh - -pushd git-repo > /dev/null -./mvnw -Pverification -U -f pom.xml clean verify -popd > /dev/null diff --git a/ci/tasks/build-service.yml b/ci/tasks/build-service.yml deleted file mode 100644 index b4d6949160..0000000000 --- a/ci/tasks/build-service.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -platform: linux -inputs: - - name: git-repo -outputs: - - name: distribution-repository -caches: - - path: maven -params: - GOOGLE_TAGMANAGER_ID: -run: - path: git-repo/ci/scripts/build-service.sh \ No newline at end of file diff --git a/ci/tasks/deploy.yml b/ci/tasks/deploy.yml deleted file mode 100644 index e6a743e0eb..0000000000 --- a/ci/tasks/deploy.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -platform: linux -inputs: - - name: git-repo -params: - KEY: - ELASTIC_uri: -run: - path: git-repo/ci/scripts/deploy.sh \ No newline at end of file diff --git a/ci/tasks/get-blob-url.yml b/ci/tasks/get-blob-url.yml deleted file mode 100644 index 5b73151f2f..0000000000 --- a/ci/tasks/get-blob-url.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -platform: linux -image_resource: - type: registry-image - source: - repository: springci/start-site-ci-image - tag: main - username: ((docker-hub-username)) - password: ((docker-hub-password)) -inputs: - - name: artifactory-repo - - name: git-repo -outputs: - - name: blob-url -params: - ARTIFACTORY_SERVER: - ARTIFACTORY_REPO: -run: - path: git-repo/ci/scripts/get-blob-url.sh \ No newline at end of file diff --git a/ci/tasks/update-deployment.yml b/ci/tasks/update-deployment.yml deleted file mode 100644 index e5944eb662..0000000000 --- a/ci/tasks/update-deployment.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -platform: linux -inputs: - - name: git-repo - - name: kpack -outputs: - - name: updated-git-repo -run: - path: git-repo/ci/scripts/update-deployment.sh \ No newline at end of file diff --git a/ci/tasks/verify-service.yml b/ci/tasks/verify-service.yml deleted file mode 100644 index 19ae598549..0000000000 --- a/ci/tasks/verify-service.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -platform: linux -inputs: -- name: git-repo -caches: -- path: maven -run: - path: git-repo/ci/scripts/verify-service.sh diff --git a/mvnw b/mvnw index 66df285428..19529ddf8c 100755 --- a/mvnw +++ b/mvnw @@ -8,7 +8,7 @@ # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # -# https://www.apache.org/licenses/LICENSE-2.0 +# http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an @@ -19,290 +19,241 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Apache Maven Wrapper startup batch script, version 3.2.0 -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir +# Apache Maven Wrapper startup batch script, version 3.3.2 # # Optional ENV vars # ----------------- -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output # ---------------------------------------------------------------------------- -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /usr/local/etc/mavenrc ] ; then - . /usr/local/etc/mavenrc - fi - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false +# OS specific support. +native_path() { printf %s\\n "$1"; } case "$(uname)" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME - else - JAVA_HOME="/Library/Java/Home"; export JAVA_HOME - fi - fi - ;; +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; esac -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=$(java-config --jre-home) - fi -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$JAVA_HOME" ] && - JAVA_HOME=$(cygpath --unix "$JAVA_HOME") - [ -n "$CLASSPATH" ] && - CLASSPATH=$(cygpath --path --unix "$CLASSPATH") -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && - JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="$(which javac)" - if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=$(which readlink) - if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then - if $darwin ; then - javaHome="$(dirname "\"$javaExecutable\"")" - javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" - else - javaExecutable="$(readlink -f "\"$javaExecutable\"")" - fi - javaHome="$(dirname "\"$javaExecutable\"")" - javaHome=$(expr "$javaHome" : '\(.*\)/bin') - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" else JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi fi else - JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi fi +} - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=$(cd "$wdir/.." || exit 1; pwd) - fi - # end of workaround +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" done - printf '%s' "$(cd "$basedir" || exit 1; pwd)" + printf %x\\n $h } -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - # Remove \r in case we run on Windows within Git Bash - # and check out the repository with auto CRLF management - # enabled. Otherwise, we may read lines that are delimited with - # \r\n and produce $'-Xarg\r' rather than -Xarg due to word - # splitting rules. - tr -s '\r\n' ' ' < "$1" - fi +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 } -log() { - if [ "$MVNW_VERBOSE" = true ]; then - printf '%s\n' "$1" - fi +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" } -BASE_DIR=$(find_maven_basedir "$(dirname "$0")") -if [ -z "$BASE_DIR" ]; then - exit 1; +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" fi -MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR -log "$MAVEN_PROJECTBASEDIR" +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" -if [ -r "$wrapperJarPath" ]; then - log "Found $wrapperJarPath" +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT else - log "Couldn't find $wrapperJarPath, downloading it ..." + die "cannot create temp dir" +fi - if [ -n "$MVNW_REPOURL" ]; then - wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - else - wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - fi - while IFS="=" read -r key value; do - # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) - safeValue=$(echo "$value" | tr -d '\r') - case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; - esac - done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" - log "Downloading from: $wrapperUrl" +mkdir -p -- "${MAVEN_HOME%/*}" - if $cygwin; then - wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") - fi +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" - if command -v wget > /dev/null; then - log "Found wget ... using wget" - [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" - else - wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - log "Found curl ... using curl" - [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" - else - curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" - fi - else - log "Falling back to using Java to download" - javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" - javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaSource=$(cygpath --path --windows "$javaSource") - javaClass=$(cygpath --path --windows "$javaClass") - fi - if [ -e "$javaSource" ]; then - if [ ! -e "$javaClass" ]; then - log " - Compiling MavenWrapperDownloader.java ..." - ("$JAVA_HOME/bin/javac" "$javaSource") - fi - if [ -e "$javaClass" ]; then - log " - Running MavenWrapperDownloader.java ..." - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" - fi - fi - fi +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" fi -########################################################################################## -# End of extension -########################################################################################## -# If specified, validate the SHA-256 sum of the Maven wrapper jar file -wrapperSha256Sum="" -while IFS="=" read -r key value; do - case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; - esac -done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" -if [ -n "$wrapperSha256Sum" ]; then - wrapperSha256Result=false - if command -v sha256sum > /dev/null; then - if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then - wrapperSha256Result=true +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true fi - elif command -v shasum > /dev/null; then - if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then - wrapperSha256Result=true + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true fi else - echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." - echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 exit 1 fi - if [ $wrapperSha256Result = false ]; then - echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 - echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 - echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 exit 1 fi fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$JAVA_HOME" ] && - JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") - [ -n "$CLASSPATH" ] && - CLASSPATH=$(cygpath --path --windows "$CLASSPATH") - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -# shellcheck disable=SC2086 # safe args -exec "$JAVACMD" \ - $MAVEN_OPTS \ - $MAVEN_DEBUG_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" +clean || : +exec_maven "$@" diff --git a/mvnw.cmd b/mvnw.cmd index 95ba6f54ac..249bdf3822 100644 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -1,3 +1,4 @@ +<# : batch portion @REM ---------------------------------------------------------------------------- @REM Licensed to the Apache Software Foundation (ASF) under one @REM or more contributor license agreements. See the NOTICE file @@ -7,7 +8,7 @@ @REM "License"); you may not use this file except in compliance @REM with the License. You may obtain a copy of the License at @REM -@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM http://www.apache.org/licenses/LICENSE-2.0 @REM @REM Unless required by applicable law or agreed to in writing, @REM software distributed under the License is distributed on an @@ -18,188 +19,131 @@ @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- -@REM Apache Maven Wrapper startup batch script, version 3.2.0 -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir +@REM Apache Maven Wrapper startup batch script, version 3.3.2 @REM @REM Optional ENV vars -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output @REM ---------------------------------------------------------------------------- -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* -if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - -FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %WRAPPER_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file -SET WRAPPER_SHA_256_SUM="" -FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) ) -IF NOT %WRAPPER_SHA_256_SUM%=="" ( - powershell -Command "&{"^ - "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ - "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ - " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ - " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ - " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ - " exit 1;"^ - "}"^ - "}" - if ERRORLEVEL 1 goto error -) - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% ^ - %JVM_CONFIG_MAVEN_PROPS% ^ - %MAVEN_OPTS% ^ - %MAVEN_DEBUG_OPTS% ^ - -classpath %WRAPPER_JAR% ^ - "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ - %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" -if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%"=="on" pause - -if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% - -cmd /C exit /B %ERROR_CODE% +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/pom.xml b/pom.xml index fb305dcbf2..04ab55f9ec 100644 --- a/pom.xml +++ b/pom.xml @@ -1,4 +1,20 @@ + + @@ -6,7 +22,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.1 + 3.4.2 io.spring.start start-parent @@ -17,13 +33,14 @@ 0.0.1-SNAPSHOT false - 0.20.0-SNAPSHOT - 0.0.39 + 0.22.0-SNAPSHOT + 0.0.43 start-client start-site + test-support @@ -63,6 +80,18 @@ start-site ${revision} + + io.spring.start + test-support + ${revision} + + + com.azure.spring + spring-cloud-azure-dependencies + 5.19.0 + pom + import + @@ -72,7 +101,7 @@ org.codehaus.mojo flatten-maven-plugin - 1.4.1 + 1.5.0 io.spring.javaformat @@ -93,7 +122,7 @@ org.apache.maven.plugins maven-checkstyle-plugin - 3.2.1 + 3.4.0 checkstyle-validation @@ -112,7 +141,7 @@ com.puppycrawl.tools checkstyle - 9.3 + 10.17.0 io.spring.javaformat @@ -124,7 +153,7 @@ com.github.eirslett frontend-maven-plugin - 1.12.1 + 1.13.4 org.apache.maven.plugins @@ -134,7 +163,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.0.0 + 3.2.3 diff --git a/start-client/dev/api.mock.json b/start-client/dev/api.mock.json index de9d03c893..da16d3ef3e 100644 --- a/start-client/dev/api.mock.json +++ b/start-client/dev/api.mock.json @@ -1388,7 +1388,10 @@ "packaging": { "type": "single-select", "default": "jar", - "values": [{ "id": "jar", "name": "Jar" }, { "id": "war", "name": "War" }] + "values": [ + { "id": "jar", "name": "Jar" }, + { "id": "war", "name": "War" } + ] }, "javaVersion": { "type": "single-select", diff --git a/start-client/package.json b/start-client/package.json index 699a3009c7..5dbcaa0783 100644 --- a/start-client/package.json +++ b/start-client/package.json @@ -45,6 +45,7 @@ "babel-eslint": "^10.0.3", "babel-jest": "^28.1.1", "babel-loader": "^8.2.2", + "babel-plugin-lodash": "^3.3.4", "copy-webpack-plugin": "^11.0.0", "css-loader": "^6.7.1", "eslint": "^8.17.0", @@ -56,7 +57,6 @@ "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-react": "^7.23.2", "eslint-plugin-react-hooks": "^4.6.0", - "fibers": "^5.0.0", "file-loader": "^6.2.0", "html-webpack-plugin": "^5.3.1", "import-sort-cli": "^6.0.0", @@ -66,6 +66,7 @@ "jest-cli": "^28.1.1", "jest-fetch-mock": "^3.0.3", "jest-standard-reporter": "^2.0.0", + "lodash-webpack-plugin": "^0.11.6", "node-sass": "^7.0.1", "prettier": "^2.7.1", "react-test-renderer": "^18.2.0", @@ -90,8 +91,8 @@ "immutable": "^4.0.0-rc.12", "js-search": "^2.0.0", "jszip": "^3.6.0", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2", + "lodash": "^4.17.21", + "luxon": "^3.4.4", "prism-react-renderer": "^1.2.0", "prismjs": "^1.24.0", "prop-types": "^15.7.2", diff --git a/start-client/pom.xml b/start-client/pom.xml index f8f46ea4a2..f5330a509a 100644 --- a/start-client/pom.xml +++ b/start-client/pom.xml @@ -23,8 +23,8 @@ install-node-and-yarn - v16.20.0 - v1.22.19 + v20.18.0 + v1.22.22 diff --git a/start-client/src/components/Application.js b/start-client/src/components/Application.js index c54e4b410b..594035c058 100644 --- a/start-client/src/components/Application.js +++ b/start-client/src/components/Application.js @@ -1,6 +1,6 @@ import BodyClassName from 'react-body-classname' import FileSaver from 'file-saver' -import get from 'lodash.get' +import get from 'lodash/get' import React, { Suspense, lazy, @@ -23,7 +23,9 @@ import { getConfig, getInfo, getProject } from './utils/ApiUtils' const Explore = lazy(() => import('./common/explore/Explore')) const Share = lazy(() => import('./common/share/Share')) +const History = lazy(() => import('./common/history/History')) const HotKeys = lazy(() => import('./common/builder/HotKeys')) +const Favorite = lazy(() => import('./common/favorite/Favorite')) export default function Application() { const { @@ -32,6 +34,10 @@ export default function Application() { theme, share: shareOpen, explore: exploreOpen, + history: historyOpen, + favorite: favoriteOpen, + favoriteAdd: favoriteAddOpen, + favoriteOptions, list, dependencies, } = useContext(AppContext) @@ -62,6 +68,22 @@ export default function Application() { } }, [dispatch, dispatchInitializr, windowsUtils.origin]) + const onEscape = () => { + setBlob(null) + dispatch({ + type: 'UPDATE', + payload: { + list: false, + share: false, + explore: false, + nav: false, + history: favoriteOptions.back === 'history', + favorite: favoriteOptions.back === 'favorite', + favoriteAdd: false, + }, + }) + } + const onSubmit = async () => { if (generating || list) { return @@ -72,12 +94,15 @@ export default function Application() { url, values, get(dependencies, 'list') - ).catch(() => { - toast.error(`Could not connect to server. Please check your network.`) + ).catch(err => { + toast.error( + err || `Could not connect to server. Please check your network.` + ) }) setGenerating(false) if (project) { FileSaver.saveAs(project, `${get(values, 'meta.artifact')}.zip`) + dispatch({ type: 'ADD_HISTORY', payload: share }) } } @@ -88,8 +113,11 @@ export default function Application() { url, values, get(dependencies, 'list') - ).catch(() => { - toast.error(`Could not connect to server. Please check your network.`) + ).catch(err => { + toast.error( + err || `Could not connect to server. Please check your network.` + ) + onEscape() }) setBlob(project) } @@ -98,12 +126,8 @@ export default function Application() { dispatch({ type: 'UPDATE', payload: { share: true } }) } - const onEscape = () => { - setBlob(null) - dispatch({ - type: 'UPDATE', - payload: { list: false, share: false, explore: false, nav: false }, - }) + const onFavoriteAdd = () => { + dispatch({ type: 'UPDATE', payload: { favoriteAdd: true } }) } return ( @@ -143,6 +167,7 @@ export default function Application() { onSubmit={onSubmit} onShare={onShare} onExplore={onExplore} + onFavoriteAdd={onFavoriteAdd} refExplore={buttonExplore} refSubmit={buttonSubmit} refDependency={buttonDependency} @@ -162,6 +187,12 @@ export default function Application() { open={exploreOpen || false} onClose={onEscape} /> + + ) diff --git a/start-client/src/components/common/builder/Fields.js b/start-client/src/components/common/builder/Fields.js index fad4070b66..76cc16f147 100644 --- a/start-client/src/components/common/builder/Fields.js +++ b/start-client/src/components/common/builder/Fields.js @@ -1,6 +1,6 @@ import PropTypes from 'prop-types' -import get from 'lodash.get' -import React, { useContext } from 'react' +import get from 'lodash/get' +import React, { useContext, useRef, useState, useEffect } from 'react' import Actions from './Actions' import Control from './Control' @@ -18,12 +18,15 @@ function Fields({ onSubmit, onExplore, onShare, + onFavoriteAdd, refExplore, refSubmit, refDependency, generating, }) { + const wrapper = useRef(null) const windowsUtils = useWindowsUtils() + const [dropdown, setDropdown] = useState(false) const { config, dispatch, dependencies } = useContext(AppContext) const { values, @@ -34,6 +37,19 @@ function Fields({ dispatchInitializr({ type: 'UPDATE', payload: args }) } + useEffect(() => { + const clickOutside = event => { + const children = get(wrapper, 'current') + if (children && !children.contains(event.target)) { + setDropdown(false) + } + } + document.addEventListener('mousedown', clickOutside) + return () => { + document.removeEventListener('mousedown', clickOutside) + } + }, []) + return ( <>
@@ -183,9 +199,40 @@ function Fields({ > Explore - + + + + {dropdown && ( +
+ + +
+ )} +
) @@ -196,6 +243,7 @@ Fields.propTypes = { onSubmit: PropTypes.func.isRequired, onExplore: PropTypes.func.isRequired, onShare: PropTypes.func.isRequired, + onFavoriteAdd: PropTypes.func.isRequired, refExplore: PropTypes.oneOfType([ PropTypes.func, PropTypes.shape({ current: PropTypes.instanceOf(Element) }), diff --git a/start-client/src/components/common/builder/Loading.js b/start-client/src/components/common/builder/Loading.js index e61fee269e..8b8222a96b 100644 --- a/start-client/src/components/common/builder/Loading.js +++ b/start-client/src/components/common/builder/Loading.js @@ -12,8 +12,9 @@ export default function Loading() {
- - + + +
diff --git a/start-client/src/components/common/builder/Warnings.js b/start-client/src/components/common/builder/Warnings.js index cf15f2f2bc..ee13a07c09 100644 --- a/start-client/src/components/common/builder/Warnings.js +++ b/start-client/src/components/common/builder/Warnings.js @@ -1,4 +1,4 @@ -import get from 'lodash.get' +import get from 'lodash/get' import React, { useContext } from 'react' import { IconTimes } from '../icons' diff --git a/start-client/src/components/common/dependency/Dependency.js b/start-client/src/components/common/dependency/Dependency.js index 92c4cf8e25..bff727ed42 100644 --- a/start-client/src/components/common/dependency/Dependency.js +++ b/start-client/src/components/common/dependency/Dependency.js @@ -1,5 +1,5 @@ import PropTypes from 'prop-types' -import get from 'lodash.get' +import get from 'lodash/get' import React, { useContext } from 'react' import List from './List' diff --git a/start-client/src/components/common/dependency/Dialog.js b/start-client/src/components/common/dependency/Dialog.js index 8bd7c12daa..8fbc16b8c9 100644 --- a/start-client/src/components/common/dependency/Dialog.js +++ b/start-client/src/components/common/dependency/Dialog.js @@ -1,6 +1,6 @@ import * as JsSearch from 'js-search' import PropTypes from 'prop-types' -import get from 'lodash.get' +import get from 'lodash/get' import React, { useContext, useEffect, useRef, useState } from 'react' import { CSSTransition, TransitionGroup } from 'react-transition-group' import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock' diff --git a/start-client/src/components/common/dependency/Item.js b/start-client/src/components/common/dependency/Item.js index ea8f23015b..3cd31fc37c 100644 --- a/start-client/src/components/common/dependency/Item.js +++ b/start-client/src/components/common/dependency/Item.js @@ -1,5 +1,5 @@ import PropTypes from 'prop-types' -import get from 'lodash.get' +import get from 'lodash/get' import React, { useContext } from 'react' import { IconEnter } from '../icons' diff --git a/start-client/src/components/common/dependency/List.js b/start-client/src/components/common/dependency/List.js index 6e91f75dee..7ff92f52ca 100644 --- a/start-client/src/components/common/dependency/List.js +++ b/start-client/src/components/common/dependency/List.js @@ -1,4 +1,4 @@ -import get from 'lodash.get' +import get from 'lodash/get' import React, { useContext } from 'react' import { CSSTransition, TransitionGroup } from 'react-transition-group' diff --git a/start-client/src/components/common/explore/Code.js b/start-client/src/components/common/explore/Code.js index dba139f105..07e0425776 100644 --- a/start-client/src/components/common/explore/Code.js +++ b/start-client/src/components/common/explore/Code.js @@ -2,7 +2,7 @@ import Highlight from 'prism-react-renderer' import Prism from 'prism-react-renderer/prism' import PropTypes from 'prop-types' import React from 'react' -import get from 'lodash.get' +import get from 'lodash/get' import ReactMarkdown from 'react-markdown' if (typeof global !== 'undefined') { diff --git a/start-client/src/components/common/explore/Explore.js b/start-client/src/components/common/explore/Explore.js index a22b289e41..49ff1e76e5 100644 --- a/start-client/src/components/common/explore/Explore.js +++ b/start-client/src/components/common/explore/Explore.js @@ -3,7 +3,7 @@ import '../../../styles/explore.scss' import FileSaver from 'file-saver' import JSZip from 'jszip' import PropTypes from 'prop-types' -import get from 'lodash.get' +import get from 'lodash/get' import React, { useContext, useEffect, useRef, useState } from 'react' import { CSSTransition, TransitionGroup } from 'react-transition-group' import { CopyToClipboard } from 'react-copy-to-clipboard' @@ -62,7 +62,7 @@ function Explore({ open, onClose, projectName, blob }) { const onCopy = () => { setButton('Copied!') setTimeout(() => { - setButton('Copy!') + setButton('Copy') }, 3000) } diff --git a/start-client/src/components/common/explore/Select.js b/start-client/src/components/common/explore/Select.js index 6ad561c432..6680c0390e 100644 --- a/start-client/src/components/common/explore/Select.js +++ b/start-client/src/components/common/explore/Select.js @@ -1,5 +1,5 @@ import PropTypes from 'prop-types' -import get from 'lodash.get' +import get from 'lodash/get' import React, { useEffect, useState } from 'react' function Select({ tree, selected, onClickItem }) { diff --git a/start-client/src/components/common/explore/Tree.js b/start-client/src/components/common/explore/Tree.js index bc44ce0e09..0ad09c913c 100644 --- a/start-client/src/components/common/explore/Tree.js +++ b/start-client/src/components/common/explore/Tree.js @@ -1,5 +1,5 @@ import PropTypes from 'prop-types' -import get from 'lodash.get' +import get from 'lodash/get' import React, { useEffect, useState } from 'react' import { IconCaretDown, IconFile, IconFolder } from '../icons' diff --git a/start-client/src/components/common/favorite/Add.js b/start-client/src/components/common/favorite/Add.js new file mode 100644 index 0000000000..b36f080c22 --- /dev/null +++ b/start-client/src/components/common/favorite/Add.js @@ -0,0 +1,185 @@ +import PropTypes from 'prop-types' +import get from 'lodash/get' +import React, { useEffect, useRef, useContext, useState } from 'react' +import { CSSTransition, TransitionGroup } from 'react-transition-group' +import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock' +import queryString from 'query-string' +import { toast } from 'react-toastify' +import FieldInput from '../builder/FieldInput' +import { Button } from '../form' +import { AppContext } from '../../reducer/App' +import { InitializrContext } from '../../reducer/Initializr' +import { + getLabelFromList, + getLabelFromDepsList, + getBookmarkDefaultName, +} from './Utils' + +function FavoriteItem({ value }) { + const { config } = useContext(AppContext) + const params = queryString.parse(value) + const deps = get(params, 'dependencies', '') + .split(',') + .filter(dep => !!dep) + return ( +
+ + + Project{' '} + + {getLabelFromList( + get(config, 'lists.project'), + get(params, 'type') + )} + + {`, `} + Language{' '} + + {getLabelFromList( + get(config, 'lists.language'), + get(params, 'language') + )} + + {`, `} + Spring Boot{' '} + + {getLabelFromList( + get(config, 'lists.boot'), + get(params, 'platformVersion') + )} + + + + {deps.length === 0 && 'No dependency'} + {deps.length > 0 && ( + <> + Dependencies:{' '} + + {deps + .map(dep => + getLabelFromDepsList(get(config, 'lists.dependencies'), dep) + ) + .join(', ')} + + + )} + + +
+ ) +} + +FavoriteItem.propTypes = { + value: PropTypes.string.isRequired, +} + +function Add({ open, onClose }) { + const wrapper = useRef(null) + const { share } = useContext(InitializrContext) + const { dispatch, favoriteOptions } = useContext(AppContext) + const [name, setName] = useState() + const input = useRef(null) + + const title = get(favoriteOptions, 'title', '') || 'Bookmark' + const button = get(favoriteOptions, 'button', '') || 'Save' + const value = get(favoriteOptions, 'favorite.value', '') || share + const nameFav = get(favoriteOptions, 'favorite.name', '') + + useEffect(() => { + setName(nameFav || `${getBookmarkDefaultName()}`) + }, [setName, open, nameFav]) + + useEffect(() => { + const clickOutside = event => { + const children = get(wrapper, 'current') + if (children && !children.contains(event.target)) { + onClose() + } + } + document.addEventListener('mousedown', clickOutside) + return () => { + document.removeEventListener('mousedown', clickOutside) + } + }, [onClose]) + + useEffect(() => { + if (get(wrapper, 'current') && open) { + disableBodyScroll(get(wrapper, 'current')) + } + if (get(input, 'current')) { + get(input, 'current').focus() + } + return () => { + clearAllBodyScrollLocks() + } + }, [wrapper, open]) + + const onSubmit = e => { + e.preventDefault() + if (!get(favoriteOptions, 'button', '')) { + dispatch({ type: 'ADD_FAVORITE', payload: { values: value, name } }) + toast.success('Project bookmarked') + } else { + dispatch({ + type: 'UPDATE_FAVORITE', + payload: { name, favorite: favoriteOptions.favorite }, + }) + } + onClose() + } + + return ( + + {open && ( + +
+
+
+
+

{title}

+
+
+ + { + setName(`${event.target.value}`) + }} + /> +
+
+ + +
+
+
+
+
+ )} +
+ ) +} + +Add.propTypes = { + open: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default Add diff --git a/start-client/src/components/common/favorite/Favorite.js b/start-client/src/components/common/favorite/Favorite.js new file mode 100644 index 0000000000..2116f98dfb --- /dev/null +++ b/start-client/src/components/common/favorite/Favorite.js @@ -0,0 +1,26 @@ +import '../../../styles/favorite.scss' + +import PropTypes from 'prop-types' +import React from 'react' + +import Modal from './Modal' +import Add from './Add' +import { Overlay } from '../form' + +function Favorite({ open, add, onClose }) { + return ( + <> + + + + + ) +} + +Favorite.propTypes = { + open: PropTypes.bool.isRequired, + add: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default Favorite diff --git a/start-client/src/components/common/favorite/Modal.js b/start-client/src/components/common/favorite/Modal.js new file mode 100644 index 0000000000..a587c6c8dd --- /dev/null +++ b/start-client/src/components/common/favorite/Modal.js @@ -0,0 +1,191 @@ +import PropTypes from 'prop-types' +import get from 'lodash/get' +import React, { useEffect, useRef, useContext } from 'react' +import { CSSTransition, TransitionGroup } from 'react-transition-group' +import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock' +import queryString from 'query-string' +import { AppContext } from '../../reducer/App' +import { getLabelFromList, getLabelFromDepsList } from './Utils' +import { IconEdit, IconDelete } from '../icons' + +function FavoriteItem({ name, value, onClose, onRemove, onUpdate }) { + const { config } = useContext(AppContext) + const params = queryString.parse(value) + const deps = get(params, 'dependencies', '') + .split(',') + .filter(dep => !!dep) + return ( +
  • + { + onClose() + }} + > + {name} + + + Project{' '} + + {getLabelFromList( + get(config, 'lists.project'), + get(params, 'type') + )} + + {`, `} + Language{' '} + + {getLabelFromList( + get(config, 'lists.language'), + get(params, 'language') + )} + + {`, `} + Spring Boot{' '} + + {getLabelFromList( + get(config, 'lists.boot'), + get(params, 'platformVersion') + )} + + + + {deps.length === 0 && 'No dependency'} + {deps.length > 0 && ( + <> + Dependencies:{' '} + + {deps + .map(dep => + getLabelFromDepsList( + get(config, 'lists.dependencies'), + dep + ) + ) + .join(', ')} + + + )} + + + + + +
  • + ) +} + +FavoriteItem.propTypes = { + name: PropTypes.string.isRequired, + value: PropTypes.string.isRequired, + onClose: PropTypes.func.isRequired, + onRemove: PropTypes.func.isRequired, + onUpdate: PropTypes.func.isRequired, +} + +function Modal({ open, onClose }) { + const wrapper = useRef(null) + const { favorites, dispatch } = useContext(AppContext) + + useEffect(() => { + const clickOutside = event => { + const children = get(wrapper, 'current') + if (children && !children.contains(event.target)) { + onClose() + } + } + document.addEventListener('mousedown', clickOutside) + return () => { + document.removeEventListener('mousedown', clickOutside) + } + }, [onClose]) + + useEffect(() => { + if (get(wrapper, 'current') && open) { + disableBodyScroll(get(wrapper, 'current')) + } + return () => { + clearAllBodyScrollLocks() + } + }, [wrapper, open]) + + const onRemove = favorite => { + dispatch({ type: 'REMOVE_FAVORITE', payload: favorite }) + } + + const onUpdate = favorite => { + dispatch({ + type: 'UPDATE', + payload: { + favorite: false, + favoriteAdd: true, + favoriteOptions: { + title: 'Edit bookmark', + button: 'Update', + back: 'favorite', + favorite, + }, + }, + }) + } + + return ( + + {open && ( + +
    +
    +
    +

    Bookmarks

    +
    +
    +
    + {favorites.map(favorite => ( + { + onRemove(favorite) + }} + onUpdate={() => { + onUpdate(favorite) + }} + /> + ))} +
    +
    + +
    +
    +
    + )} +
    + ) +} + +Modal.propTypes = { + open: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default Modal diff --git a/start-client/src/components/common/favorite/Utils.js b/start-client/src/components/common/favorite/Utils.js new file mode 100644 index 0000000000..624bc782e0 --- /dev/null +++ b/start-client/src/components/common/favorite/Utils.js @@ -0,0 +1,16 @@ +import { DateTime } from 'luxon' + +export function getLabelFromList(list, key) { + return list.find(item => item.key === key)?.text || key +} + +export function getLabelFromDepsList(list, key) { + return list.find(item => item.id === key)?.name || key +} + +export function getBookmarkDefaultName() { + const date = DateTime.now() + return `Bookmark ${date.toLocaleString( + DateTime.DATE_SHORT + )} ${date.toLocaleString(DateTime.TIME_24_SIMPLE)}` +} diff --git a/start-client/src/components/common/favorite/index.js b/start-client/src/components/common/favorite/index.js new file mode 100644 index 0000000000..ab8695c9c6 --- /dev/null +++ b/start-client/src/components/common/favorite/index.js @@ -0,0 +1 @@ +export { default as Favorite } from './Favorite' diff --git a/start-client/src/components/common/form/Button.js b/start-client/src/components/common/form/Button.js index 20b08218b6..f70e2a5dbd 100644 --- a/start-client/src/components/common/form/Button.js +++ b/start-client/src/components/common/form/Button.js @@ -6,13 +6,16 @@ function Button({ onClick, children, variant, + className, hotkey, refButton, disabled, }) { return ( + + ) +} + +HistoryItem.propTypes = { + time: PropTypes.string.isRequired, + value: PropTypes.string.isRequired, + onClose: PropTypes.func.isRequired, +} + +function Modal({ open, onClose }) { + const wrapper = useRef(null) + const { histories, dispatch } = useContext(AppContext) + + const historiesTransform = useMemo(() => Transform(histories), [histories]) + + useEffect(() => { + const clickOutside = event => { + const children = get(wrapper, 'current') + if (children && !children.contains(event.target)) { + onClose() + } + } + document.addEventListener('mousedown', clickOutside) + return () => { + document.removeEventListener('mousedown', clickOutside) + } + }, [onClose]) + + useEffect(() => { + if (get(wrapper, 'current') && open) { + disableBodyScroll(get(wrapper, 'current')) + } + return () => { + clearAllBodyScrollLocks() + } + }, [wrapper, open]) + + return ( + + {open && ( + + + + )} + + ) +} + +Modal.propTypes = { + open: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default Modal diff --git a/start-client/src/components/common/history/Utils.js b/start-client/src/components/common/history/Utils.js new file mode 100644 index 0000000000..6df683cd52 --- /dev/null +++ b/start-client/src/components/common/history/Utils.js @@ -0,0 +1,46 @@ +import { DateTime } from 'luxon' + +function isToday(date) { + return date.hasSame(DateTime.now(), 'day') +} + +function isYesterday(date) { + return date.hasSame(DateTime.now().minus({ days: 1 }), 'day') +} + +export function Transform(histories) { + if (histories.length === 0) { + return [] + } + const parsed = histories.map(history => { + const dateLuxon = DateTime.fromISO(history.date) + let label = '' + if (isToday(dateLuxon)) { + label = 'Today, ' + } else if (isYesterday(dateLuxon)) { + label = 'Yesterday, ' + } + return { + date: dateLuxon, + time: `${dateLuxon.toFormat('HH:mm')}`, + label: `${label}${dateLuxon.toFormat('cccc, d LLLL yyyy')}`, + value: history.value, + } + }) + return parsed.reduce((acc, history) => { + if (acc.length === 0) { + acc.push({ + label: history.label, + histories: [history], + }) + } else if (acc[acc.length - 1].label === history.label) { + acc[acc.length - 1].histories.push(history) + } else { + acc.push({ + label: history.label, + histories: [history], + }) + } + return acc + }, []) +} diff --git a/start-client/src/components/common/history/index.js b/start-client/src/components/common/history/index.js new file mode 100644 index 0000000000..2efd9c0c11 --- /dev/null +++ b/start-client/src/components/common/history/index.js @@ -0,0 +1 @@ +export { default as History } from './History' diff --git a/start-client/src/components/common/icons/Icons.js b/start-client/src/components/common/icons/Icons.js index 1a2e0d153f..60db8713f5 100644 --- a/start-client/src/components/common/icons/Icons.js +++ b/start-client/src/components/common/icons/Icons.js @@ -368,3 +368,100 @@ export function IconEnter() { ) } + +export function IconHistory() { + return ( + + ) +} + +export function IconFavorite() { + return ( + + ) +} + +export function IconDelete() { + return ( + + ) +} + +export function IconEdit() { + return ( + + ) +} diff --git a/start-client/src/components/common/icons/index.js b/start-client/src/components/common/icons/index.js index bd94fc2a5a..8ae64b986c 100644 --- a/start-client/src/components/common/icons/index.js +++ b/start-client/src/components/common/icons/index.js @@ -1,7 +1,6 @@ export { IconTimes } from './Icons' export { IconPlus } from './Icons' export { IconGithub } from './Icons' -export { IconTwitter } from './Icons' export { IconCaretDown } from './Icons' export { IconList } from './Icons' export { IconSearch } from './Icons' @@ -17,5 +16,9 @@ export { IconSun } from './Icons' export { IconMoon } from './Icons' export { IconRemove } from './Icons' export { IconEnter } from './Icons' +export { IconHistory } from './Icons' +export { IconFavorite } from './Icons' +export { IconEdit } from './Icons' +export { IconDelete } from './Icons' export { IconSpring } from './IconSpring' diff --git a/start-client/src/components/common/layout/Header.js b/start-client/src/components/common/layout/Header.js index b79b4a8b18..d7cb7f260b 100644 --- a/start-client/src/components/common/layout/Header.js +++ b/start-client/src/components/common/layout/Header.js @@ -14,11 +14,6 @@ function Header() { -
    diff --git a/start-client/src/components/common/layout/SideLeft.js b/start-client/src/components/common/layout/SideLeft.js index eb0d71a125..810904bc35 100644 --- a/start-client/src/components/common/layout/SideLeft.js +++ b/start-client/src/components/common/layout/SideLeft.js @@ -1,18 +1,19 @@ -import get from 'lodash.get' +import get from 'lodash/get' import React, { useContext, useEffect, useRef, useState } from 'react' import { CSSTransition, TransitionGroup } from 'react-transition-group' import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock' import Header from './Header' import { AppContext } from '../../reducer/App' -import { IconGithub, IconTwitter } from '../icons' +import { IconGithub, IconHistory, IconFavorite } from '../icons' function SideLeft() { const [isOpen, setIsOpen] = useState(false) const [lock, setLock] = useState(false) + const [status, setStatus] = useState('close') const wrapper = useRef(null) - const { nav, dispatch } = useContext(AppContext) + const { nav, histories, dispatch, favorites } = useContext(AppContext) useEffect(() => { if (get(wrapper, 'current') && nav) { @@ -25,8 +26,10 @@ function SideLeft() { const onEnter = () => { setLock(true) + setStatus('opening') setTimeout(() => { setIsOpen(true) + setStatus('open') }, 350) } const onEntered = () => { @@ -36,13 +39,20 @@ function SideLeft() { const onEnded = () => { setLock(true) setIsOpen(false) + setStatus('closing') } const onExited = () => { setLock(false) + setStatus('close') } return ( <> -
    +
    + + + {(status === 'close' || status === 'closing') && ( + +
    + {favorites.length > 0 && ( + <> +
    + + + )} + {histories.length > 0 && ( + <> +
    + + + )} +
    + + )} +
    @@ -155,21 +203,14 @@ function SideLeft() { -
  • - - - Twitter - - -
  • - © 2013-{new Date().getFullYear()} VMware, Inc. + © 2005-{new Date().getFullYear()} Broadcom. All Rights + Reserved. +
    + The term "Broadcom" refers to Broadcom Inc. and/or + its subsidiaries
    start.spring.io is powered by{' '} @@ -180,8 +221,8 @@ function SideLeft() { > Spring Initializr - {' '} - and{' '} + + ,{' '} Cloud Native Buildpacks + {' '} + and{' '} + + + Azure Spring Apps +
    diff --git a/start-client/src/components/common/layout/Social.js b/start-client/src/components/common/layout/Social.js index b4aa00d803..12b99a7786 100644 --- a/start-client/src/components/common/layout/Social.js +++ b/start-client/src/components/common/layout/Social.js @@ -12,13 +12,6 @@ function Social() { > - - -
    ) } diff --git a/start-client/src/components/common/share/Popover.js b/start-client/src/components/common/share/Popover.js index 4f44ed8f04..e795074fb3 100644 --- a/start-client/src/components/common/share/Popover.js +++ b/start-client/src/components/common/share/Popover.js @@ -1,5 +1,5 @@ import PropTypes from 'prop-types' -import get from 'lodash.get' +import get from 'lodash/get' import React, { useEffect, useRef, useState } from 'react' import { CSSTransition, TransitionGroup } from 'react-transition-group' import { CopyToClipboard } from 'react-copy-to-clipboard' diff --git a/start-client/src/components/reducer/App.js b/start-client/src/components/reducer/App.js index 9a8d1ca9c5..fb36a5f153 100644 --- a/start-client/src/components/reducer/App.js +++ b/start-client/src/components/reducer/App.js @@ -1,16 +1,20 @@ import PropTypes from 'prop-types' -import get from 'lodash.get' -import set from 'lodash.set' +import get from 'lodash/get' +import set from 'lodash/set' import React, { useReducer } from 'react' - import useTheme from '../utils/Theme' import { isValidDependency } from '../utils/ApiUtils' import { rangeToText } from '../utils/Version' +const MAX_HISTORY = 100 + export const defaultAppContext = { complete: false, explore: false, share: false, + history: false, + favorite: false, + favoriteAdd: false, nav: false, list: false, theme: 'light', @@ -20,8 +24,24 @@ export const defaultAppContext = { list: [], groups: [], }, + favoriteOptions: { + title: '', + button: '', + favorite: null, + back: '', + }, + histories: [], + favorites: [], } +const localStorage = + typeof window !== 'undefined' + ? window.localStorage + : { + getItem: () => {}, + setItem: () => {}, + } + export function reduceDependencies(boot, items) { const groups = [] const list = [] @@ -69,6 +89,14 @@ export function reducer(state, action) { if (key === 'theme') { localStorage.setItem('springtheme', value) } + if (key === 'favoriteAdd' && !value) { + newState.favoriteOptions = { + title: '', + button: '', + favorite: null, + back: '', + } + } return key }) return newState @@ -96,7 +124,80 @@ export function reducer(state, action) { get(json, 'defaultValues.boot'), get(json, 'lists.dependencies') ) - return { ...state, complete: true, config: json, dependencies } + const histories = localStorage.getItem('histories') + ? JSON.parse(localStorage.getItem('histories')) + : [] + + const favorites = localStorage.getItem('favorites') + ? JSON.parse(localStorage.getItem('favorites')) + : [] + return { + ...state, + complete: true, + config: json, + dependencies, + histories, + favorites, + } + } + case 'ADD_HISTORY': { + const newHistory = get(action, 'payload') + const histories = [ + { + date: new Date().toISOString(), + value: newHistory, + }, + ...state.histories.slice(0, MAX_HISTORY - 1), + ] + localStorage.setItem('histories', JSON.stringify(histories)) + return { ...state, histories } + } + case 'CLEAR_HISTORY': { + localStorage.setItem('histories', JSON.stringify([])) + return { ...state, histories: [] } + } + case 'ADD_FAVORITE': { + const favorites = [ + { + date: new Date().toISOString(), + name: get(action, 'payload.name'), + value: get(action, 'payload.values'), + }, + ...state.favorites, + ] + localStorage.setItem('favorites', JSON.stringify(favorites)) + return { ...state, favorites } + } + case 'UPDATE_FAVORITE': { + const favoriteToUpdate = get(action, 'payload.favorite') + const favorites = state.favorites.map(item => { + if ( + item.name === favoriteToUpdate.name && + item.date === favoriteToUpdate.date && + item.value === favoriteToUpdate.value + ) { + return { + ...item, + name: get(action, 'payload.name'), + } + } + return item + }) + localStorage.setItem('favorites', JSON.stringify(favorites)) + return { ...state, favorites } + } + case 'REMOVE_FAVORITE': { + const favoriteToRemove = get(action, 'payload') + const favorites = state.favorites.filter( + item => + !( + item.name === favoriteToRemove.name && + item.date === favoriteToRemove.date && + item.value === favoriteToRemove.value + ) + ) + localStorage.setItem('favorites', JSON.stringify(favorites)) + return { ...state, favorites } } default: return state diff --git a/start-client/src/components/reducer/Initializr.js b/start-client/src/components/reducer/Initializr.js index 69d36d6dcf..90cf8b7345 100644 --- a/start-client/src/components/reducer/Initializr.js +++ b/start-client/src/components/reducer/Initializr.js @@ -1,6 +1,6 @@ import PropTypes from 'prop-types' -import get from 'lodash.get' -import set from 'lodash.set' +import get from 'lodash/get' +import set from 'lodash/set' import React, { useReducer } from 'react' import { getShareUrl, parseParams } from '../utils/ApiUtils' @@ -26,17 +26,70 @@ export const defaultInitializrContext = { warnings: {}, } +const localStorage = + typeof window !== 'undefined' + ? window.localStorage + : { + getItem: () => {}, + setItem: () => {}, + } + +const getPersistedOrDefault = json => { + const values = { + project: + localStorage.getItem('project') || get(json, 'defaultValues').project, + language: + localStorage.getItem('language') || get(json, 'defaultValues').language, + boot: get(json, 'defaultValues').boot, + meta: { + name: get(json, 'defaultValues.meta').name, + group: get(json, 'defaultValues.meta').group, + artifact: get(json, 'defaultValues.meta').artifact, + description: get(json, 'defaultValues.meta').description, + packageName: get(json, 'defaultValues.meta').packageName, + packaging: + localStorage.getItem('packaging') || + get(json, 'defaultValues.meta').packaging, + java: + localStorage.getItem('java') || get(json, 'defaultValues.meta').java, + }, + dependencies: [], + } + const checks = ['project', 'language', 'meta.java', 'meta.packaging'] + checks.forEach(key => { + const item = get(json, `lists.${key}`)?.find( + it => it.key === get(values, key) + ) + if (!item) { + set(values, key, get(json, `defaultValues.${key}`)) + } + }) + return values +} + +const persist = changes => { + if (get(changes, 'project')) { + localStorage.setItem('project', get(changes, 'project')) + } + if (get(changes, 'language')) { + localStorage.setItem('language', get(changes, 'language')) + } + if (get(changes, 'meta.packaging')) { + localStorage.setItem('packaging', get(changes, 'meta.packaging')) + } + if (get(changes, 'meta.java')) { + localStorage.setItem('java', get(changes, 'meta.java')) + } +} + export function reducer(state, action) { switch (action.type) { case 'COMPLETE': { const json = get(action, 'payload') - const defaultValues = { - ...get(json, 'defaultValues'), - meta: get(json, 'defaultValues.meta'), - } + const values = getPersistedOrDefault(json) return { - values: defaultValues, - share: getShareUrl(defaultValues), + values, + share: getShareUrl(values), errors: {}, warnings: {}, } @@ -67,6 +120,7 @@ export function reducer(state, action) { ) set(meta, 'name', `${get(meta, 'artifact')}`) } + persist(changes) const values = { ...get(state, 'values'), ...changes, diff --git a/start-client/src/components/reducer/__tests__/App.js b/start-client/src/components/reducer/__tests__/App.js index 373b55cde4..d7995b3ffc 100644 --- a/start-client/src/components/reducer/__tests__/App.js +++ b/start-client/src/components/reducer/__tests__/App.js @@ -1,4 +1,4 @@ -import get from 'lodash.get' +import get from 'lodash/get' import { reducer } from '../App' diff --git a/start-client/src/components/reducer/__tests__/Initializr.js b/start-client/src/components/reducer/__tests__/Initializr.js index fe090c1ce9..23f43b046e 100644 --- a/start-client/src/components/reducer/__tests__/Initializr.js +++ b/start-client/src/components/reducer/__tests__/Initializr.js @@ -1,4 +1,4 @@ -import get from 'lodash.get' +import get from 'lodash/get' import MockClient from '../../../../dev/api.mock.json' import { getDefaultValues, getLists } from '../../utils/ApiUtils' @@ -47,7 +47,7 @@ describe('COMPLETE action', () => { }, }) expect(get(result, 'share')).toBe( - 'type=maven-project&language=java&platformVersion=2.2.0.RELEASE&packaging=jar&jvmVersion=1.8&groupId=com.example&artifactId=demo&name=demo&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.demo' + 'type=maven-project&language=java&platformVersion=2.2.0.RELEASE&packaging=jar&jvmVersion=1.8&groupId=com.example&artifactId=demo&name=demo&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.demo&dependencies=' ) expect(get(result, 'values.project')).toBe('maven-project') expect(get(result, 'values.language')).toBe('java') diff --git a/start-client/src/components/utils/ApiUtils.js b/start-client/src/components/utils/ApiUtils.js index d5ceb8a8e0..f12bb094f9 100644 --- a/start-client/src/components/utils/ApiUtils.js +++ b/start-client/src/components/utils/ApiUtils.js @@ -1,6 +1,6 @@ -import get from 'lodash.get' +import get from 'lodash/get' import querystring from 'querystring' -import set from 'lodash.set' +import set from 'lodash/set' import Extend from '../../Extend.json' import { isInRange, parseReleases, parseVersion } from './Version' @@ -54,6 +54,8 @@ export const getShareUrl = values => { let params = `${querystring.stringify(props)}` if (get(values, 'dependencies', []).length > 0) { params = `${params}&dependencies=${get(values, 'dependencies').join(',')}` + } else { + params = `${params}&dependencies=` } return params } @@ -151,6 +153,7 @@ export const parseParams = (values, queryParams, lists) => { const depsWarning = [] const newVal = value .split(',') + .filter(item => !!item) .map(item => { const dep = get(lists, 'dependencies').find( d => d.id === item.trim() @@ -298,7 +301,13 @@ export const getProject = function getProject(url, values, config) { resolve(response.blob()) return } - reject() + try { + response.json().then(res => { + reject(res?.message || '') + }) + } catch (e) { + reject() + } }, () => { reject() diff --git a/start-client/src/components/utils/Zip.js b/start-client/src/components/utils/Zip.js index 9335b417b1..28c39f3985 100644 --- a/start-client/src/components/utils/Zip.js +++ b/start-client/src/components/utils/Zip.js @@ -1,4 +1,4 @@ -import get from 'lodash.get' +import get from 'lodash/get' const FILE_EXTENSION = { js: 'javascript', @@ -7,6 +7,7 @@ const FILE_EXTENSION = { kts: 'kotlin', gradle: 'groovy', gitignore: 'git', + gitattributes: 'git', java: 'java', xml: 'xml', properties: 'properties', diff --git a/start-client/src/components/utils/__tests__/ApiUtils.js b/start-client/src/components/utils/__tests__/ApiUtils.js index a0202c3035..5f28091dfc 100644 --- a/start-client/src/components/utils/__tests__/ApiUtils.js +++ b/start-client/src/components/utils/__tests__/ApiUtils.js @@ -1,4 +1,4 @@ -import get from 'lodash.get' +import get from 'lodash/get' import MockClient from '../../../../dev/api.mock.json' import { diff --git a/start-client/src/components/utils/__tests__/Version.js b/start-client/src/components/utils/__tests__/Version.js index 7d36a2219d..26b4f8ce7c 100644 --- a/start-client/src/components/utils/__tests__/Version.js +++ b/start-client/src/components/utils/__tests__/Version.js @@ -1,4 +1,4 @@ -import get from 'lodash.get' +import get from 'lodash/get' import { compare, diff --git a/start-client/src/components/utils/__tests__/Zip.js b/start-client/src/components/utils/__tests__/Zip.js index 72726b1b39..c2b54e388b 100644 --- a/start-client/src/components/utils/__tests__/Zip.js +++ b/start-client/src/components/utils/__tests__/Zip.js @@ -1,6 +1,6 @@ import JSZip from 'jszip' import fs from 'fs' -import get from 'lodash.get' +import get from 'lodash/get' import path from 'path' import { createTree, findRoot, getLanguage } from '../Zip' @@ -17,6 +17,7 @@ describe('getLanguage', () => { expect(getLanguage('index.kts')).toBe('kotlin') expect(getLanguage('index.gradle')).toBe('groovy') expect(getLanguage('index.gitignore')).toBe('git') + expect(getLanguage('index.gitattributes')).toBe('git') expect(getLanguage('index.java')).toBe('java') expect(getLanguage('index.xml')).toBe('xml') expect(getLanguage('index.properties')).toBe('properties') diff --git a/start-client/src/styles/_dark.scss b/start-client/src/styles/_dark.scss index 984ceaf056..55dc3f7c84 100644 --- a/start-client/src/styles/_dark.scss +++ b/start-client/src/styles/_dark.scss @@ -16,6 +16,18 @@ body.dark { border-color: rgba(255, 255, 255, 0.2); } + #side-left .navigation-item { + color: white; + transition: all 0.15s; + &:hover { + color: $light-primary; + opacity: 1; + } + } + #side-left .navigation-divider { + border-color: $dark-border; + } + #side-right .side-container { border-color: $dark-border; background: $dark-background; @@ -53,7 +65,16 @@ body.dark { #side-left a { color: $dark-color; &:hover { - color: $dark-primary; + color: $light-primary; + opacity: 1; + } + } + #side-left.is-open { + a { + &:hover { + color: white; + opacity: 0.7; + } } } .hamburger-inner, @@ -61,6 +82,15 @@ body.dark { .hamburger-inner::after { background: white; } + #side-left.is-closing { + .hamburger { + .hamburger-inner, + .hamburger-inner::before, + .hamburger-inner::after { + background: white; + } + } + } a.button, button.button { border-color: $dark-color; @@ -97,10 +127,6 @@ body.dark { border-color: $dark-border; } } - #side-left a:hover { - color: $dark-color; - opacity: 0.8; - } .explorer-actions { background: $dark-background-secondary; } @@ -321,7 +347,8 @@ body.dark { #side-left a, .explorer-ul .file, .explorer-ul .folder, - ul.dependencies-list li a { + ul.dependencies-list li a, + #side-left .navigation-item { &:focus { outline: 1px dotted $dark-border; } @@ -391,4 +418,44 @@ body.dark { box-shadow: inset 0 0 0 2px $dark-color; background: $dark-background; } + + .modal-share, + .modal-add-favorite, + .modal-favorite { + .modal-header { + background: $dark-background; + border-bottom: 1px solid $dark-border; + } + } + .modal-history-container, + .modal-favorite-container, + .modal-add-favorite-container { + border: 1px solid $dark-border; + } + .modal-content { + background: $dark-background; + } + .modal-add-favorite .favorite-desc { + background: $dark-background-secondary; + color: $dark-color; + } + .modal-favorite button.edit, + .modal-favorite button.remove, + .modal-share .modal-content button.favorite { + color: white; + } + .actions .button.clicked { + color: #000; + } + .modal-content .list a.item { + background: $dark-background-secondary; + color: $dark-color; + &:hover { + background: lighten($dark-background-secondary, 2); + } + } + .modal-action { + background: $dark-background; + border-top: 1px solid $dark-border; + } } diff --git a/start-client/src/styles/_hamburgers.scss b/start-client/src/styles/_hamburgers.scss index e7d0e81013..c55e88139f 100644 --- a/start-client/src/styles/_hamburgers.scss +++ b/start-client/src/styles/_hamburgers.scss @@ -16,12 +16,12 @@ $hamburger-layer-height: 3px; $hamburger-layer-spacing: 6px; $hamburger-layer-color: $light-color; $hamburger-layer-border-radius: 4px; -$hamburger-hover-opacity: 0.7; +$hamburger-hover-opacity: 1; $hamburger-active-layer-color: white; $hamburger-active-hover-opacity: $hamburger-hover-opacity; $hamburger-hover-use-filter: false; -$hamburger-hover-filter: opacity(50%); +$hamburger-hover-filter: opacity(100%); $hamburger-active-hover-filter: $hamburger-hover-filter; $hamburger-types: (spin); @@ -41,4 +41,44 @@ $hamburger-types: (spin); outline: none; box-shadow: none; } + &:hover { + .hamburger-inner, + .hamburger-inner::before, + .hamburger-inner::after { + background: $light-primary; + } + } +} + +#side-left { + &.is-open { + .hamburger { + &:hover { + .hamburger-inner, + .hamburger-inner::before, + .hamburger-inner::after { + background: white; + opacity: 0.7; + } + } + } + } + &.is-opening { + .hamburger { + .hamburger-inner, + .hamburger-inner::before, + .hamburger-inner::after { + background: white; + } + } + } + &.is-closing { + .hamburger { + .hamburger-inner, + .hamburger-inner::before, + .hamburger-inner::after { + background: $light-color; + } + } + } } diff --git a/start-client/src/styles/_main.scss b/start-client/src/styles/_main.scss index cba40d36c2..69ffc4aad1 100644 --- a/start-client/src/styles/_main.scss +++ b/start-client/src/styles/_main.scss @@ -85,6 +85,39 @@ body { left: 0; width: 5rem; } + .navigation-divider { + margin: 20px; + border-top: 1px solid $light-border; + } + .navigation-item { + $size: 30px; + display: block; + margin: 0.2rem auto; + color: $light-color; + padding: 0; + cursor: pointer; + width: $size + 12px; + height: $size + 12px; + border: 0 none; + background: none; + @include transition(color $spring-transition-duration); + .icon-history { + width: 30px; + margin-top: 6px; + } + &:hover { + color: $light-primary; + } + &:focus { + outline: 1px dotted #aecaca; + } + } + &.is-open .navigation-item { + color: white; + &:hover { + opacity: 0.7; + } + } } #side-right { @@ -108,7 +141,6 @@ body { // Header #header { - padding-top: 40px; h1, h2 { margin: 0; @@ -116,11 +148,12 @@ body { h1.logo { max-width: 320px; padding: 2rem 0; + display: block; a { - @include outline; display: block; margin-left: -6px; color: $light-color; + @include outline; .logo-content { display: block; outline: none; @@ -164,6 +197,7 @@ body { border: 0; padding: 4px; outline: none; + cursor: pointer; } svg { display: block; @@ -220,8 +254,6 @@ hr.divider { padding-right: 1rem; } } - .right { - } } .col-sticky { @@ -395,10 +427,10 @@ button.button { margin-right: 1rem; cursor: pointer; background: transparent; - @include transition(all calc($spring-transition-duration / 2)); z-index: 1; background: $light-background; font-family: $spring-font-family; + @include transition(all calc($spring-transition-duration / 2)); &:focus { outline: none; box-shadow: 0 0 0 4px $light-border; @@ -430,8 +462,8 @@ button.button { bottom: 0; width: 100%; opacity: 0; - @include transition(all calc($spring-transition-duration / 2)); z-index: -1; + @include transition(all calc($spring-transition-duration / 2)); } &:hover, &:disabled { @@ -550,13 +582,32 @@ button.button { span { padding: 0.9rem 1.5rem 0.8rem; } + &.clicked { + color: white; + &:before { + opacity: 1; + } + } &:focus { box-shadow: 0 0 0 4px darken($light-border, 6); } - &:last-child { + &.last-child { margin-right: 0; } } + .dropdown { + position: relative; + .dropdown-items { + position: absolute; + bottom: 35px; + left: -50px; + text-align: center; + .button { + margin: 4px 0; + width: 160px; + } + } + } } .colset-main { @@ -730,6 +781,26 @@ button.button { @include transition(transform 500ms); } +.navgiation-actions { + transition: opacity 0.15s; +} +.navgiation-actions-enter { + opacity: 0; + transition-delay: .3s; +} + +.navgiation-actions-enter-active { + opacity: 1; +} + +.navgiation-actions-exit { + opacity: 1; +} + +.navgiation-actions-exit-active { + opacity: 0; +} + #side-left { background: white; @include transition(all 100ms); @@ -862,10 +933,11 @@ button.button { background: $light-primary; color: #fff; font-size: $spring-font-size - 2; - padding: 4px 0.6rem 1px; + padding: 2px 0.4rem 1px; line-height: 18px; margin-left: 0.6rem; text-transform: uppercase; + border-radius: 4px; } strong { font-size: $spring-font-size + 2; @@ -945,7 +1017,8 @@ button.button { background: $light-primary; color: #fff; font-size: $spring-font-size - 2; - padding: 4px 0.6rem 1px; + padding: 2px 0.4rem 1px; + border-radius: 4px; line-height: 18px; margin-left: 0.6rem; text-transform: uppercase; @@ -1038,11 +1111,12 @@ ul.dependencies-list { display: inline-block; background: $light-primary; font-size: $spring-font-size - 2; - padding: 4px 0.6rem 1px; + padding: 2px 0.4rem 1px; line-height: 18px; margin-left: 0.6rem; text-transform: uppercase; color: #fff; + border-radius: 4px; } span.invalid { color: #d60000; @@ -1288,7 +1362,7 @@ ul.dependencies-list { width: 249.42px; } &-share { - width: 119px; + width: 62.3px; } &-dep { width: 241.8px; @@ -1318,23 +1392,3 @@ ul.dependencies-list { height: 14px; background: $light-placeholder; } - -.banner { - position: absolute; - top: 0; - right: 5rem; - left: 5rem; - a { - display: block;; - background-color: #6db33f; - color: #FFF; - font-weight: normal; - display: block; - font-size: 0.9rem; - height: 40px; - line-height: 40px; - text-align: center; - text-decoration: none; - cursor: pointer; - } -} diff --git a/start-client/src/styles/_mixins.scss b/start-client/src/styles/_mixins.scss index 53edd8fc31..f5d8960cfa 100644 --- a/start-client/src/styles/_mixins.scss +++ b/start-client/src/styles/_mixins.scss @@ -1,21 +1,17 @@ @mixin transition($args...) { - -webkit-transition: $args; - -moz-transition: $args; - -ms-transition: $args; - -o-transition: $args; - transition: $args; -} - -@mixin clearfix { - &:after { - content: ''; - display: table; - clear: both; + & { + -webkit-transition: $args; + -moz-transition: $args; + -ms-transition: $args; + -o-transition: $args; + transition: $args; } } @mixin outline { - outline: 1px dotted transparent; + & { + outline: 1px dotted transparent; + } &:focus { outline: 1px dotted $light-outline; // outline: none; diff --git a/start-client/src/styles/_responsive.scss b/start-client/src/styles/_responsive.scss index 7fdf9c2ae0..827ac116dc 100644 --- a/start-client/src/styles/_responsive.scss +++ b/start-client/src/styles/_responsive.scss @@ -90,9 +90,6 @@ } @media (min-width: 320px) and (max-width: 767px) { - #header { - padding-top: 0; - } #side-left, #side-right { display: none; @@ -247,7 +244,7 @@ width: 88.55px; } .placeholder-button-share { - width: 82.77px; + width: 33px; } .placeholder-button-download { width: 108.73px; diff --git a/start-client/src/styles/explore.scss b/start-client/src/styles/explore.scss index 083d1953e3..afcc4a5bd4 100644 --- a/start-client/src/styles/explore.scss +++ b/start-client/src/styles/explore.scss @@ -70,7 +70,7 @@ a.button { span.button-content span { cursor: pointer; - padding: 0.55rem 1.2rem 0.4rem; + padding: 0.51rem 1.2rem 0.44rem; font-size: 13px; } } @@ -225,6 +225,7 @@ color: $light-color; word-wrap: normal; white-space: nowrap; + outline: 1px dotted transparent; .item-content { box-shadow: none; outline: none; @@ -256,7 +257,6 @@ width: 16px; } - outline: 1px dotted transparent; &:focus { outline: 1px dotted darken($light-background-seconday, 10); } diff --git a/start-client/src/styles/favorite.scss b/start-client/src/styles/favorite.scss new file mode 100644 index 0000000000..ba82f2002d --- /dev/null +++ b/start-client/src/styles/favorite.scss @@ -0,0 +1,197 @@ +@import 'variables'; +@import 'mixins'; + +$w_arrow: 12px; +$w: 1000px; +$w2: 500px; + +.modal-add-favorite, +.modal-favorite { + z-index: 10000; + position: fixed; + top: 50px; + left: 0; + right: 0; + + .modal-favorite-container, + .modal-add-favorite-container { + max-width: $w; + margin: 0 auto; + background: white; + } + + .modal-add-favorite-container { + max-width: $w2; + } + + @include transition(all $spring-transition-duration); + &:before { + $h: 60px; + content: ' '; + height: $h; + width: $w; + position: absolute; + bottom: -$h; + left: 0; + } + .modal-content { + padding: $spring-8points * 3; + padding-top: $spring-8points; + padding-bottom: $spring-8points * 2; + max-height: 70vh; + overflow: auto; + .list { + .name { + font-weight: bold; + display: block; + } + ul { + padding: 0; + margin: 0 0 10px; + } + li { + position: relative; + list-style: none; + padding: 1px 0; + margin: 0; + } + a.item { + display: block; + position: relative; + background: $light-background-seconday; + border-radius: 3px; + text-decoration: none; + padding: 5px 10px; + color: $light-color; + padding-right: 80px; + &:hover { + background: lighten($light-background-seconday, 2); + a { + opacity: 1; + } + } + } + .time { + width: 80px; + } + .time, + .desc, + .main, + .deps { + display: block; + } + } + } + .modal-header { + position: relative; + padding: 6px $spring-8points * 2 2px; + border-bottom: 1px solid #ebebeb; + h1 { + font-size: $spring-8points * 2.5; + line-height: $spring-8points * 2.5; + font-weight: 600; + } + .button { + position: absolute; + top: 11px; + right: 11px; + font-size: $spring-font-size - 3; + line-height: 0.7rem; + margin-right: 0; + } + } + .modal-action { + text-align: center; + border-top: 1px solid $light-border; + padding: 16px 0 8px; + } + button.remove, + button.edit { + $size: 38px; + display: block; + position: absolute; + width: $size; + right: 10px; + top: 50%; + margin-top: -(calc($size / 2)); + border: 0 none; + cursor: pointer; + background: transparent; + opacity: 0.4; + @include outline; + @include transition(all 150ms); + .a-content { + display: block; + outline: none; + box-shadow: none; + padding: 8px; + } + svg { + display: block; + } + &:hover { + opacity: 0.8; + } + &:focus { + opacity: 1; + } + } + button.edit { + $size: 32px; + right: 45px; + width: $size; + margin-top: -(calc($size / 2)); + svg { + .st0 { + fill: #000; + } + } + } +} + +.modal-enter { + opacity: 0; +} + +.modal-enter-active { + opacity: 1; + transition: all 300ms; +} + +.modal-exit { + opacity: 1; +} + +.modal-exit-active { + opacity: 0; + transition: all 300ms; +} + +.modal-add-favorite { + .control-inline { + flex: none; + display: block; + label { + text-align: left; + flex: none; + display: block; + } + .input { + margin: 0; + } + } + .modal-action { + padding: 16px 0 16px; + } + .favorite-desc { + background: $light-background-seconday; + padding: 8px; + margin: 8px 0; + border-radius: 3px; + .deps { + display: block; + } + } +} + +@import 'responsive'; diff --git a/start-client/src/styles/history.scss b/start-client/src/styles/history.scss new file mode 100644 index 0000000000..cfde1e9156 --- /dev/null +++ b/start-client/src/styles/history.scss @@ -0,0 +1,151 @@ +@import 'variables'; +@import 'mixins'; + +$w_arrow: 12px; +$w: 1000px; + +.modal-share { + z-index: 10000; + position: fixed; + top: 50px; + left: 0; + right: 0; + + .modal-history-container { + max-width: $w; + margin: 0 auto; + background: white; + } + + @include transition(all $spring-transition-duration); + &:before { + $h: 60px; + content: ' '; + height: $h; + width: $w; + position: absolute; + bottom: -$h; + left: 0; + } + .modal-content { + padding: $spring-8points * 3; + padding-top: $spring-8points; + padding-bottom: $spring-8points * 2; + max-height: 70vh; + overflow: auto; + .list { + .date { + font-weight: bold; + padding: 10px 0 5px; + } + ul { + padding: 0; + margin: 0 0 10px; + } + li { + list-style: none; + padding: 1px 0; + margin: 0; + position: relative; + } + a.item { + position: relative; + background: $light-background-seconday; + border-radius: 3px; + display: flex; + text-decoration: none; + padding: 5px 10px; + color: $light-color; + padding-right: 60px; + &:hover { + background: lighten($light-background-seconday, 2); + a { + opacity: 1; + } + } + } + .time { + width: 80px; + } + .time, + .desc, + .main, + .deps { + display: block; + } + } + button.favorite { + $size: 42px; + display: block; + position: absolute; + width: $size; + right: 10px; + top: 50%; + margin-top: -(calc($size / 2)-4); + border: 0 none; + cursor: pointer; + background: transparent; + opacity: 0.4; + @include outline; + @include transition(all 150ms); + .a-content { + display: block; + outline: none; + box-shadow: none; + padding: 8px; + } + svg { + display: block; + } + &:hover { + opacity: 0.8; + } + &:focus { + opacity: 1; + } + } + } + .modal-header { + position: relative; + padding: 6px $spring-8points * 2 2px; + border-bottom: 1px solid #ebebeb; + h1 { + font-size: $spring-8points * 2.5; + line-height: $spring-8points * 2.5; + font-weight: 600; + } + .button { + position: absolute; + top: 11px; + right: 11px; + font-size: $spring-font-size - 3; + line-height: 0.7rem; + margin-right: 0; + } + } + .modal-action { + text-align: center; + border-top: 1px solid $light-border; + padding: 16px 0 8px; + } +} + +.modal-enter { + opacity: 0; +} + +.modal-enter-active { + opacity: 1; + transition: all 300ms; +} + +.modal-exit { + opacity: 1; +} + +.modal-exit-active { + opacity: 0; + transition: all 300ms; +} + +@import 'responsive'; diff --git a/start-client/src/styles/share.scss b/start-client/src/styles/share.scss index b417772d25..8f1c0dc737 100644 --- a/start-client/src/styles/share.scss +++ b/start-client/src/styles/share.scss @@ -38,6 +38,7 @@ $w: 500px; color: $light-color; line-height: $spring-8points * 3; padding-top: $spring-8points; + padding-bottom: $spring-8points; font-weight: 300; } .control { diff --git a/start-client/static/images/icon-144x144.png b/start-client/static/images/icon-144x144.png new file mode 100644 index 0000000000..b030bf4d85 Binary files /dev/null and b/start-client/static/images/icon-144x144.png differ diff --git a/start-client/static/images/icon-192x192.png b/start-client/static/images/icon-192x192.png new file mode 100644 index 0000000000..324d034e17 Binary files /dev/null and b/start-client/static/images/icon-192x192.png differ diff --git a/start-client/static/images/icon-256x256.png b/start-client/static/images/icon-256x256.png new file mode 100644 index 0000000000..b76cb58a24 Binary files /dev/null and b/start-client/static/images/icon-256x256.png differ diff --git a/start-client/static/images/icon-384x384.png b/start-client/static/images/icon-384x384.png new file mode 100644 index 0000000000..0d8eb12227 Binary files /dev/null and b/start-client/static/images/icon-384x384.png differ diff --git a/start-client/static/images/icon-512x512.png b/start-client/static/images/icon-512x512.png new file mode 100644 index 0000000000..fcb3af3596 Binary files /dev/null and b/start-client/static/images/icon-512x512.png differ diff --git a/start-client/static/images/icon-72x72.png b/start-client/static/images/icon-72x72.png new file mode 100644 index 0000000000..8804cbab9f Binary files /dev/null and b/start-client/static/images/icon-72x72.png differ diff --git a/start-client/static/images/icon-96x96.png b/start-client/static/images/icon-96x96.png new file mode 100644 index 0000000000..ff450e791e Binary files /dev/null and b/start-client/static/images/icon-96x96.png differ diff --git a/start-client/static/images/icon.svg b/start-client/static/images/icon.svg new file mode 100644 index 0000000000..c73323ccb6 --- /dev/null +++ b/start-client/static/images/icon.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/start-client/static/index.html b/start-client/static/index.html index c006684f11..54ea4cae7b 100644 --- a/start-client/static/index.html +++ b/start-client/static/index.html @@ -9,6 +9,15 @@ <%= htmlWebpackPlugin.options.title %> + + + + + + + + + diff --git a/start-client/webpack.common.js b/start-client/webpack.common.js index f7cfdac0c5..582bf9f0bc 100644 --- a/start-client/webpack.common.js +++ b/start-client/webpack.common.js @@ -44,10 +44,22 @@ const config = { test: /.(js|jsx)$/, exclude: [path.resolve(__dirname, 'node_modules')], loader: 'babel-loader', + options: { + plugins: ['lodash'], + }, }, { test: /\.s[ac]ss$/i, - use: ['style-loader', 'css-loader', 'sass-loader'], + use: [ + 'style-loader', + 'css-loader', + { + loader: 'sass-loader', + options: { + warnRuleAsWarning: false, + }, + }, + ], }, { test: /\.(woff(2)?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/, diff --git a/start-client/webpack.dev.js b/start-client/webpack.dev.js index 06d594311d..e58aad3a7b 100644 --- a/start-client/webpack.dev.js +++ b/start-client/webpack.dev.js @@ -25,6 +25,15 @@ const config = { }, 800) }) devServer.app.get('/starter.zip', function (req, res) { + // 500 errors + // res.status(500).json({ + // timestamp: '2022-09-05T14:39:37.471+00:00', + // status: 500, + // error: 'Internal Server Error', + // message: + // 'Malformed input or input contains unmappable characters: MixérApplication.java', + // path: '/starter.zip', + // }) fs.readFile(path.resolve('./dev/starter.mock.zip'), (err, data) => { if (err) return sendError(err, res) setTimeout(() => { diff --git a/start-client/webpack.prod.js b/start-client/webpack.prod.js index 2181409310..15c96637ac 100644 --- a/start-client/webpack.prod.js +++ b/start-client/webpack.prod.js @@ -3,11 +3,12 @@ const webpack = require('webpack') const { merge } = require('webpack-merge') const common = require('./webpack.common.js') -const BundleAnalyzerPlugin = require('webpack-bundle-analyzer') - .BundleAnalyzerPlugin -const WebpackBundleSizeAnalyzerPlugin = require('webpack-bundle-size-analyzer') - .WebpackBundleSizeAnalyzerPlugin +const BundleAnalyzerPlugin = + require('webpack-bundle-analyzer').BundleAnalyzerPlugin +const WebpackBundleSizeAnalyzerPlugin = + require('webpack-bundle-size-analyzer').WebpackBundleSizeAnalyzerPlugin const path = require('path') +var LodashWebpackPlugin = require('lodash-webpack-plugin') const config = { mode: 'production', @@ -29,6 +30,9 @@ const config = { statsFilename: '../analysis/stats.json', reportFilename: '../analysis/bundle-analyzer.html', }), + new LodashWebpackPlugin({ + paths: true, + }), new WebpackBundleSizeAnalyzerPlugin('../analysis/bundle-size-analyzer.log'), ], } diff --git a/start-client/yarn.lock b/start-client/yarn.lock index 8480c0ed74..d063940431 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -3,12 +3,12 @@ "@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" "@apideck/better-ajv-errors@^0.3.1": version "0.3.6" @@ -20,300 +20,267 @@ leven "^3.1.0" "@babel/cli@^7.13.16": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.21.5.tgz#a685a5b50b785f2edfbf6e042c1265c653547d9d" - integrity sha512-TOKytQ9uQW9c4np8F+P7ZfPINy5Kv+pizDIUwSVH8X5zHgYHV4AA8HE5LA450xXeu4jEfmUckTYvv1I4S26M/g== + version "7.26.4" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.26.4.tgz#4101ff8ee5de8447a6c395397a97921056411d20" + integrity sha512-+mORf3ezU3p3qr+82WvJSnQNE1GAYeoCfEv4fik6B5/2cvKZ75AX8oawWQdXtM9MmndooQj15Jr9kelRFWsuRw== dependencies: - "@jridgewell/trace-mapping" "^0.3.17" - commander "^4.0.1" - convert-source-map "^1.1.0" + "@jridgewell/trace-mapping" "^0.3.25" + commander "^6.2.0" + convert-source-map "^2.0.0" fs-readdir-recursive "^1.1.0" glob "^7.2.0" make-dir "^2.1.0" slash "^2.0.0" optionalDependencies: "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" - chokidar "^3.4.0" + chokidar "^3.6.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.0", "@babel/compat-data@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.3.tgz#cd502a6a0b6e37d7ad72ce7e71a7160a3ae36f7e" - integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9", "@babel/compat-data@^7.26.0": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02" + integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.2.2": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.1.tgz#5de51c5206f4c6f5533562838337a603c1033cfd" - integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA== + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" + integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.22.0" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-module-transforms" "^7.22.1" - "@babel/helpers" "^7.22.0" - "@babel/parser" "^7.22.0" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" - convert-source-map "^1.7.0" + "@babel/code-frame" "^7.26.0" + "@babel/generator" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.0" + "@babel/parser" "^7.26.0" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.26.0" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" + json5 "^2.2.3" + semver "^6.3.1" "@babel/eslint-parser@^7.18.2": - version "7.21.8" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.21.8.tgz#59fb6fc4f3b017ab86987c076226ceef7b2b2ef2" - integrity sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.9.tgz#603c68a63078796527bc9d0833f5e52dd5f9224c" + integrity sha512-5UXfgpK0j0Xr/xIdgdLEhOFxaDZ0bRPWJJchRpqOSur/3rZoPbqqki5mm0p4NE2cs28krBEiSM2MB7//afRSQQ== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" - semver "^6.3.0" - -"@babel/generator@^7.22.0", "@babel/generator@^7.22.3", "@babel/generator@^7.7.2": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e" - integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== - dependencies: - "@babel/types" "^7.22.3" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz#c9b83d1ba74e163e023f008a3d3204588a7ceb60" - integrity sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg== - dependencies: - "@babel/types" "^7.22.3" - -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz#bfcd6b7321ffebe33290d68550e2c9d7eb7c7a58" - integrity sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ== - dependencies: - "@babel/compat-data" "^7.22.0" - "@babel/helper-validator-option" "^7.21.0" - browserslist "^4.21.3" + semver "^6.3.1" + +"@babel/generator@^7.26.0", "@babel/generator@^7.26.3", "@babel/generator@^7.7.2": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" + integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== + dependencies: + "@babel/parser" "^7.26.3" + "@babel/types" "^7.26.3" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-annotate-as-pure@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" + integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g== + dependencies: + "@babel/types" "^7.25.9" + +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" + integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== + dependencies: + "@babel/compat-data" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz#ae3de70586cc757082ae3eba57240d42f468c41b" - integrity sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.22.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.22.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - semver "^6.3.0" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz#a7ed9a8488b45b467fca353cd1a44dc5f0cf5c70" - integrity sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.3.1" - semver "^6.3.0" - -"@babel/helper-define-polyfill-provider@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz#487053f103110f25b9755c5980e031e93ced24d8" - integrity sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg== + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz#7644147706bb90ff613297d49ed5266bde729f83" + integrity sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/traverse" "^7.25.9" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz#5169756ecbe1d95f7866b90bb555b022595302a0" + integrity sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + regexpu-core "^6.2.0" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.6.2", "@babel/helper-define-polyfill-provider@^0.6.3": + version "0.6.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz#f4f2792fae2ef382074bc2d713522cf24e6ddb21" + integrity sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg== dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz#ac3a56dbada59ed969d712cf527bd8271fe3eba8" - integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA== -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" +"@babel/helper-member-expression-to-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3" + integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-transforms@^7.25.9", "@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== +"@babel/helper-optimise-call-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz#3324ae50bae7e2ab3c33f60c9a877b6a0146b54e" + integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ== dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-member-expression-to-functions@^7.22.0": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz#4b77a12c1b4b8e9e28736ed47d8b91f00976911f" - integrity sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA== + "@babel/types" "^7.25.9" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" + integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== + +"@babel/helper-remap-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92" + integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw== dependencies: - "@babel/types" "^7.22.3" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-wrap-function" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" - integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== +"@babel/helper-replace-supers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5" + integrity sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ== dependencies: - "@babel/types" "^7.21.4" + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5", "@babel/helper-module-transforms@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz#e0cad47fedcf3cae83c11021696376e2d5a50c63" - integrity sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw== +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9" + integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA== dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-simple-access" "^7.21.5" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" - integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz#38cf6e56f7dc614af63a21b45565dd623f0fdc95" - integrity sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ== +"@babel/helper-wrap-function@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0" + integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g== dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-member-expression-to-functions" "^7.22.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/helper-simple-access@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" - integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== +"@babel/helpers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" + integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== dependencies: - "@babel/types" "^7.21.5" + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.0" -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== +"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.3", "@babel/parser@^7.7.0": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" + integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" - integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== - -"@babel/helper-wrap-function@^7.18.6", "@babel/helper-wrap-function@^7.18.9": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" - integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - -"@babel/helpers@^7.22.0": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.3.tgz#53b74351da9684ea2f694bf0877998da26dd830e" - integrity sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w== - dependencies: - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.3" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + "@babel/types" "^7.26.3" + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz#cc2e53ebf0a0340777fff5ed521943e253b4d8fe" + integrity sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g== dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.9", "@babel/parser@^7.22.0", "@babel/parser@^7.22.4", "@babel/parser@^7.7.0": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" - integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz#af9e4fb63ccb8abcb92375b2fcfe36b60c774d30" + integrity sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz#e8dc26fcd616e6c5bf2bd0d5a2c151d4f92a9137" + integrity sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz#a75be1365c0c3188c51399a662168c1c98108659" - integrity sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz#807a667f9158acac6f6164b4beb85ad9ebc9e1d1" + integrity sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-transform-optional-chaining" "^7.22.3" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz#de7093f1e7deaf68eadd7cc6b07f2ab82543269e" + integrity sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" "@babel/plugin-proposal-class-properties@^7.13.0": version "7.18.6" @@ -324,31 +291,27 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-decorators@^7.13.15": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.3.tgz#3502c0f8cfe0cdb79b62102c9c9b111309d942b7" - integrity sha512-XjTKH3sHr6pPqG+hR1NCdVupwiosfdKM2oSMyKQVQ5Bym9l/p7BuLAqT5U32zZzRCfPq/TPRPzMiiTE9bOXU4w== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz#8680707f943d1a3da2cd66b948179920f097e254" + integrity sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-replace-supers" "^7.22.1" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/plugin-syntax-decorators" "^7.22.3" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-decorators" "^7.25.9" "@babel/plugin-proposal-do-expressions@^7.12.13": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.18.6.tgz#b1a05a2876df2ca38556115a7ecde3b4c45463a9" - integrity sha512-ddToGCONJhCuL+l4FhtGnKl5ZYCj9fDVFiqiCdQDpeIbVn/NvMeSib+7T1/rk08jRafae4qNiP8OnJyuqlsuYA== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.25.9.tgz#c1eae77aeb86fcd689804378acefd9e8f1ca8a27" + integrity sha512-0IkO77tw2OcZua/ADovH//IEiUyQpNjWvLyMFNidXnZx4eEriQjwkH9t/EyQZUaQu0KOxxdszC7m8VUVs51ydg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-do-expressions" "^7.18.6" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-proposal-export-default-from@^7.12.13": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.18.10.tgz#091f4794dbce4027c03cf4ebc64d3fb96b75c206" - integrity sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.25.9.tgz#52702be6ef8367fc8f18b8438278332beeb8f87c" + integrity sha512-ykqgwNfSnNOB+C8fV5X4mG3AVmvu+WVxcaU9xHHtBb7PCrPeweMmPjGsn8eMaeJg6SJuoUuZENeeSWaarWqonQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-default-from" "^7.18.6" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-proposal-export-namespace-from@^7.12.13": version "7.18.9" @@ -359,21 +322,19 @@ "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-proposal-function-bind@^7.12.13": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.18.9.tgz#635d6592c24500c6f7ac64cae10383ade68a8a8a" - integrity sha512-9RfxqKkRBCCT0xoBl9AqieCMscJmSAL9HYixGMWH549jUpT9csWWK/HEYZEx9t9iW/PRSXgX95x9bDlgtAJGFA== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.25.9.tgz#ef98187f3d2cb87abf0f815f43bf4f26c1a6d968" + integrity sha512-1g0b0XU667A2IZNdhovGr0ZdywJxf081B8JN5qyiNqzJK7GtdYBxGcuA+lq7q8OgO4cAc4vF57Ad0XLoDBsJAg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-function-bind" "^7.18.6" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-proposal-function-sent@^7.12.13": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.18.6.tgz#60854442f9024869e731116b4f7f98ee8cb072de" - integrity sha512-UdaOKPOLPt0O+Xu26tnw6oAZMLXhk+yMrXOzn6kAzTHBnWHJsoN1hlrgxFAQ+FRLS0ql1oYIQ2phvoFzmN3GMw== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.25.9.tgz#50eccfe5a6a518f9f264eacfc9a9865dcb2bfa85" + integrity sha512-Qi9KEBTY6WAjHBeHJ1jm4HyGlwvZLfjUaxO9g1jKHqyQPe6c+q7DlKgyrBUH7v+VWLJ0bNy5cQlXHtOV5/uibw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-wrap-function" "^7.18.6" - "@babel/plugin-syntax-function-sent" "^7.18.6" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-wrap-function" "^7.25.9" "@babel/plugin-proposal-json-strings@^7.13.8": version "7.18.6" @@ -417,12 +378,12 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-pipeline-operator@^7.12.13": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.18.9.tgz#66a60666efd9c29c7ec4d3e2ccb38f9d97994237" - integrity sha512-Pc33e6m8f4MJhRXVCUwiKZNtEm+W2CUPHIL0lyJNtkp+w6d75CLw3gsBKQ81VAMUgT9jVPIEU8gwJ5nJgmJ1Ag== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.25.9.tgz#8494cd391e0f08de9cb2b19e48978554b4683daa" + integrity sha512-rmb8zOYFdVz6y/OqJn6RfbIBiJPQdUbHg7R5ibym5KM0e8uNGdU9yfn9cjkBLwS22Lqd+ey3D8/UvK5GLyyh5A== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-pipeline-operator" "^7.18.6" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-pipeline-operator" "^7.25.9" "@babel/plugin-proposal-private-methods@^7.13.0": version "7.18.6" @@ -432,31 +393,17 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-private-property-in-object@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" - integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-proposal-throw-expressions@^7.12.13": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.18.6.tgz#f05eb10f417d34857e4ebf3a2a152e77bd59ff9f" - integrity sha512-WHOrJyhGoGrdtW480L79cF7Iq/gZDZ/z6OqK7mVyFR5I37dTpog/wNgb6hmaM3HYZtULEJl++7VaMWkNZsOcHg== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.25.9.tgz#9bfba4a4b775dbadfc5ca91a9f22097754142b56" + integrity sha512-Zw62DP6cdbXXEtTNMWYY10rIOPGAWPk8qdqM+AT3JbHtFq8ook0JXJCWdQJTlSVACHo0R6lvoNKO9B1ZVkjClg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-throw-expressions" "^7.18.6" - -"@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -472,7 +419,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== @@ -486,19 +433,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.3.tgz#760f2d812d56c1d05970d01cdcd3c05e3d87d6ca" - integrity sha512-R16Zuge73+8/nLcDjkIpyhi5wIbN7i7fiuLJR8yQX7vPAa/ltUKtd3iLbb4AgP5nrLi91HnNUNosELIGUGH1bg== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-syntax-do-expressions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.18.6.tgz#8581baedc0f128cdf0292e3003a7f44e47b87368" - integrity sha512-kTogvOsjBTVOSZtkkziiXB5hwGXqwhq2gBXDaiWVruRLDT7C2GqfbsMnicHJ7ePq2GE8UJeWS34YbNP6yDhwUA== +"@babel/plugin-syntax-decorators@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz#986b4ca8b7b5df3f67cee889cedeffc2e2bf14b3" + integrity sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -507,13 +447,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.18.6.tgz#8df076711a4818c4ce4f23e61d622b0ba2ff84bc" - integrity sha512-Kr//z3ujSVNx6E9z9ih5xXXMqK07VVTuqPmqGe6Mss/zW5XPeLZeSDZoP9ab/hT4wPKqAgjl2PnhPrcpk8Seew== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" @@ -521,35 +454,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-function-bind@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.18.6.tgz#3214e8bfc71ec1de636ddbc01838c2829e560b19" - integrity sha512-wZN0Aq/AScknI9mKGcR3TpHdASMufFGaeJgc1rhPmLtZ/PniwjePSh8cfh8tXMB3U4kh/3cRKrLjDtedejg8jQ== +"@babel/plugin-syntax-import-assertions@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz#620412405058efa56e4a564903b79355020f445f" + integrity sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-function-sent@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.18.6.tgz#ce2e8e9979f8a26246bba81534e605c6d1369e5e" - integrity sha512-f3OJHIlFIkg+cP1Hfo2SInLhsg0pz2Ikmgo7jMdIIKC+3jVXQlHB0bgSapOWxeWI0SU28qIWmfn5ZKu1yPJHkg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== +"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" + integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-import-attributes@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz#d7168f22b9b49a6cc1792cec78e06a18ad2e7b4b" - integrity sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -563,14 +482,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" - integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== +"@babel/plugin-syntax-jsx@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" + integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== @@ -584,7 +503,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -612,12 +531,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-pipeline-operator@^7.18.6": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.21.4.tgz#d468ec120d3503c447383bd065f6864bd439d86b" - integrity sha512-F8QyQgVj3lNxFUokPRLpdzJul0iQUYpnZZhlPEIY5Hr3hg1xU/Juz4m88NiX6dG8Zdex+q9yXUMHWnwDif6yaw== +"@babel/plugin-syntax-pipeline-operator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.25.9.tgz#5488436b3e0a313716b4ff05d3a4f47970639dd4" + integrity sha512-W0KjBvv8uT4A8DUoRNpXEHkKekqO/PC57doaWCqbJeG0lGxKFh7w7/PHYPmwgF+jKxekNnc+YOMQNCo94d8MJg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" @@ -626,14 +545,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-throw-expressions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.18.6.tgz#50889d493f7ef9631d79bae6b30f58fa8c06449f" - integrity sha512-rp1CqEZXGv1z1YZ3qYffBH3rhnOxrTwQG8fh2yqulTurwv9zu3Gthfd+niZBLSOi1rY6146TgF+JmVeDXaX4TQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== @@ -641,11 +553,11 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8" - integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" + integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -655,593 +567,570 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929" - integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA== +"@babel/plugin-transform-arrow-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz#7821d4410bee5daaadbb4cdd9a6649704e176845" + integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-async-generator-functions@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz#3ed99924c354fb9e80dabb2cc8d002c702e94527" - integrity sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA== +"@babel/plugin-transform-async-generator-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz#1b18530b077d18a407c494eb3d1d72da505283a2" + integrity sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw== dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-async-to-generator@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== +"@babel/plugin-transform-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71" + integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== +"@babel/plugin-transform-block-scoped-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz#5700691dbd7abb93de300ca7be94203764fce458" + integrity sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-block-scoping@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" - integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== +"@babel/plugin-transform-block-scoping@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz#c33665e46b06759c93687ca0f84395b80c0473a1" + integrity sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-class-properties@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz#3407145e513830df77f0cef828b8b231c166fe4c" - integrity sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw== +"@babel/plugin-transform-class-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz#a8ce84fedb9ad512549984101fa84080a9f5f51f" + integrity sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-class-static-block@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz#e352cf33567385c731a8f21192efeba760358773" - integrity sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw== +"@babel/plugin-transform-class-static-block@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz#6c8da219f4eb15cae9834ec4348ff8e9e09664a0" + integrity sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-classes@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" - integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" +"@babel/plugin-transform-classes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52" + integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/traverse" "^7.25.9" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44" - integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q== +"@babel/plugin-transform-computed-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b" + integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/template" "^7.20.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/template" "^7.25.9" -"@babel/plugin-transform-destructuring@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" - integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== +"@babel/plugin-transform-destructuring@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" + integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== +"@babel/plugin-transform-dotall-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz#bad7945dd07734ca52fe3ad4e872b40ed09bb09a" + integrity sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== +"@babel/plugin-transform-duplicate-keys@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz#8850ddf57dce2aebb4394bb434a7598031059e6d" + integrity sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-dynamic-import@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz#6c56afaf896a07026330cf39714532abed8d9ed1" - integrity sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ== +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz#6f7259b4de127721a08f1e5165b852fcaa696d31" + integrity sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== +"@babel/plugin-transform-dynamic-import@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz#23e917de63ed23c6600c5dd06d94669dce79f7b8" + integrity sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-export-namespace-from@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz#9b8700aa495007d3bebac8358d1c562434b680b9" - integrity sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g== +"@babel/plugin-transform-exponentiation-operator@^7.25.9": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc" + integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-for-of@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc" - integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ== +"@babel/plugin-transform-export-namespace-from@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz#90745fe55053394f554e40584cda81f2c8a402a2" + integrity sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== +"@babel/plugin-transform-for-of@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz#4bdc7d42a213397905d89f02350c5267866d5755" + integrity sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A== dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-json-strings@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz#a181b8679cf7c93e9d0e3baa5b1776d65be601a9" - integrity sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw== +"@babel/plugin-transform-function-name@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97" + integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== +"@babel/plugin-transform-json-strings@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz#c86db407cb827cded902a90c707d2781aaa89660" + integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-logical-assignment-operators@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz#9e021455810f33b0baccb82fb759b194f5dc36f0" - integrity sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA== +"@babel/plugin-transform-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz#1a1c6b4d4aa59bc4cad5b6b3a223a0abd685c9de" + integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== +"@babel/plugin-transform-logical-assignment-operators@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz#b19441a8c39a2fda0902900b306ea05ae1055db7" + integrity sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-amd@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== +"@babel/plugin-transform-member-expression-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz#63dff19763ea64a31f5e6c20957e6a25e41ed5de" + integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA== dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-commonjs@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" - integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== +"@babel/plugin-transform-modules-amd@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz#49ba478f2295101544abd794486cd3088dddb6c5" + integrity sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw== dependencies: - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-simple-access" "^7.21.5" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-systemjs@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz#cc507e03e88d87b016feaeb5dae941e6ef50d91e" - integrity sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw== +"@babel/plugin-transform-modules-commonjs@^7.25.9": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" + integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== +"@babel/plugin-transform-modules-systemjs@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz#8bd1b43836269e3d33307151a114bcf3ba6793f8" + integrity sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz#db6fb77e6b3b53ec3b8d370246f0b7cf67d35ab4" - integrity sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q== +"@babel/plugin-transform-modules-umd@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz#6710079cdd7c694db36529a1e8411e49fcbf14c9" + integrity sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-new-target@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz#deb0377d741cbee2f45305868b9026dcd6dd96e2" - integrity sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w== +"@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a" + integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz#8c519f8bf5af94a9ca6f65cf422a9d3396e542b9" - integrity sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw== +"@babel/plugin-transform-new-target@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz#42e61711294b105c248336dcb04b77054ea8becd" + integrity sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-numeric-separator@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz#02493070ca6685884b0eee705363ee4da2132ab0" - integrity sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ== +"@babel/plugin-transform-nullish-coalescing-operator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz#bcb1b0d9e948168102d5f7104375ca21c3266949" + integrity sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-object-rest-spread@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz#da6fba693effb8c203d8c3bdf7bf4e2567e802e9" - integrity sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw== +"@babel/plugin-transform-numeric-separator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz#bfed75866261a8b643468b0ccfd275f2033214a1" + integrity sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q== dependencies: - "@babel/compat-data" "^7.22.3" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== +"@babel/plugin-transform-object-rest-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz#0203725025074164808bcf1a2cfa90c652c99f18" + integrity sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" -"@babel/plugin-transform-optional-catch-binding@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz#e971a083fc7d209d9cd18253853af1db6d8dc42f" - integrity sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g== +"@babel/plugin-transform-object-super@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz#385d5de135162933beb4a3d227a2b7e52bb4cf03" + integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" -"@babel/plugin-transform-optional-chaining@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz#5fd24a4a7843b76da6aeec23c7f551da5d365290" - integrity sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg== +"@babel/plugin-transform-optional-catch-binding@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz#10e70d96d52bb1f10c5caaac59ac545ea2ba7ff3" + integrity sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-parameters@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz#24477acfd2fd2bc901df906c9bf17fbcfeee900d" - integrity sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw== +"@babel/plugin-transform-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz#e142eb899d26ef715435f201ab6e139541eee7dd" + integrity sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-private-methods@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz#adac38020bab5047482d3297107c1f58e9c574f6" - integrity sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug== +"@babel/plugin-transform-parameters@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257" + integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-private-property-in-object@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz#031621b02c7b7d95389de1a3dba2fe9e8c548e56" - integrity sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw== +"@babel/plugin-transform-private-methods@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz#847f4139263577526455d7d3223cd8bda51e3b57" + integrity sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== +"@babel/plugin-transform-private-property-in-object@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz#9c8b73e64e6cc3cbb2743633885a7dd2c385fe33" + integrity sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-display-name@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== +"@babel/plugin-transform-property-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz#d72d588bd88b0dec8b62e36f6fda91cedfe28e3f" + integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-jsx-development@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== +"@babel/plugin-transform-react-display-name@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz#4b79746b59efa1f38c8695065a92a9f5afb24f7d" + integrity sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ== dependencies: - "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-jsx@^7.18.6", "@babel/plugin-transform-react-jsx@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.3.tgz#5a1f380df3703ba92eb1a930a539c6d88836f690" - integrity sha512-JEulRWG2f04a7L8VWaOngWiK6p+JOSpB+DAtwfJgOaej1qdbNxqtK7MwTBHjUA10NeFcszlFNqCdbRcirzh2uQ== +"@babel/plugin-transform-react-jsx-development@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz#8fd220a77dd139c07e25225a903b8be8c829e0d7" + integrity sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-jsx" "^7.21.4" - "@babel/types" "^7.22.3" + "@babel/plugin-transform-react-jsx" "^7.25.9" -"@babel/plugin-transform-react-pure-annotations@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" - integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== +"@babel/plugin-transform-react-jsx@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz#06367940d8325b36edff5e2b9cbe782947ca4166" + integrity sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/plugin-transform-regenerator@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e" - integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w== +"@babel/plugin-transform-react-pure-annotations@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz#ea1c11b2f9dbb8e2d97025f43a3b5bc47e18ae62" + integrity sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - regenerator-transform "^0.15.1" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== +"@babel/plugin-transform-regenerator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz#03a8a4670d6cebae95305ac6defac81ece77740b" + integrity sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.25.9" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-regexp-modifiers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz#2f5837a5b5cd3842a919d8147e9903cc7455b850" + integrity sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-reserved-words@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz#0398aed2f1f10ba3f78a93db219b27ef417fb9ce" + integrity sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-runtime@^7.18.5": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.4.tgz#f8353f313f18c3ce1315688631ec48657b97af42" - integrity sha512-Urkiz1m4zqiRo17klj+l3nXgiRTFQng91Bc1eiLF7BMQu1e7wE5Gcq9xSv062IF068NHjcutSbIMev60gXxAvA== - dependencies: - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.21.5" - babel-plugin-polyfill-corejs2 "^0.4.3" - babel-plugin-polyfill-corejs3 "^0.8.1" - babel-plugin-polyfill-regenerator "^0.5.0" - semver "^6.3.0" + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz#62723ea3f5b31ffbe676da9d6dae17138ae580ea" + integrity sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.6" + babel-plugin-polyfill-regenerator "^0.6.1" + semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== +"@babel/plugin-transform-shorthand-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz#bb785e6091f99f826a95f9894fc16fde61c163f2" + integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-spread@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== +"@babel/plugin-transform-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9" + integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== +"@babel/plugin-transform-sticky-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32" + integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== +"@babel/plugin-transform-template-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz#6dbd4a24e8fad024df76d1fac6a03cf413f60fe1" + integrity sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== +"@babel/plugin-transform-typeof-symbol@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz#224ba48a92869ddbf81f9b4a5f1204bbf5a2bc4b" + integrity sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-escapes@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2" - integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg== +"@babel/plugin-transform-unicode-escapes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz#a75ef3947ce15363fccaa38e2dd9bc70b2788b82" + integrity sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-property-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz#597b6a614dc93eaae605ee293e674d79d32eb380" - integrity sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg== +"@babel/plugin-transform-unicode-property-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz#a901e96f2c1d071b0d1bb5dc0d3c880ce8f53dd3" + integrity sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== +"@babel/plugin-transform-unicode-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz#5eae747fe39eacf13a8bd006a4fb0b5d1fa5e9b1" + integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-sets-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz#7c14ee33fa69782b0101d0f7143d3fc73ce00700" - integrity sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw== +"@babel/plugin-transform-unicode-sets-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz#65114c17b4ffc20fa5b163c63c70c0d25621fabe" + integrity sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.13.15": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.4.tgz#c86a82630f0e8c61d9bb9327b7b896732028cbed" - integrity sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ== - dependencies: - "@babel/compat-data" "^7.22.3" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.3" - "@babel/plugin-proposal-private-property-in-object" "^7.21.0" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" - "@babel/plugin-syntax-import-attributes" "^7.22.3" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.0.tgz#30e5c6bc1bcc54865bff0c5a30f6d4ccdc7fa8b1" + integrity sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw== + dependencies: + "@babel/compat-data" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions" "^7.26.0" + "@babel/plugin-syntax-import-attributes" "^7.26.0" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.21.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.3" - "@babel/plugin-transform-async-to-generator" "^7.20.7" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.21.0" - "@babel/plugin-transform-class-properties" "^7.22.3" - "@babel/plugin-transform-class-static-block" "^7.22.3" - "@babel/plugin-transform-classes" "^7.21.0" - "@babel/plugin-transform-computed-properties" "^7.21.5" - "@babel/plugin-transform-destructuring" "^7.21.3" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-dynamic-import" "^7.22.1" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-export-namespace-from" "^7.22.3" - "@babel/plugin-transform-for-of" "^7.21.5" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-json-strings" "^7.22.3" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.3" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.20.11" - "@babel/plugin-transform-modules-commonjs" "^7.21.5" - "@babel/plugin-transform-modules-systemjs" "^7.22.3" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.3" - "@babel/plugin-transform-new-target" "^7.22.3" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.3" - "@babel/plugin-transform-numeric-separator" "^7.22.3" - "@babel/plugin-transform-object-rest-spread" "^7.22.3" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-optional-catch-binding" "^7.22.3" - "@babel/plugin-transform-optional-chaining" "^7.22.3" - "@babel/plugin-transform-parameters" "^7.22.3" - "@babel/plugin-transform-private-methods" "^7.22.3" - "@babel/plugin-transform-private-property-in-object" "^7.22.3" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.21.5" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.20.7" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.21.5" - "@babel/plugin-transform-unicode-property-regex" "^7.22.3" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/plugin-transform-unicode-sets-regex" "^7.22.3" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.22.4" - babel-plugin-polyfill-corejs2 "^0.4.3" - babel-plugin-polyfill-corejs3 "^0.8.1" - babel-plugin-polyfill-regenerator "^0.5.0" - core-js-compat "^3.30.2" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + "@babel/plugin-transform-arrow-functions" "^7.25.9" + "@babel/plugin-transform-async-generator-functions" "^7.25.9" + "@babel/plugin-transform-async-to-generator" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions" "^7.25.9" + "@babel/plugin-transform-block-scoping" "^7.25.9" + "@babel/plugin-transform-class-properties" "^7.25.9" + "@babel/plugin-transform-class-static-block" "^7.26.0" + "@babel/plugin-transform-classes" "^7.25.9" + "@babel/plugin-transform-computed-properties" "^7.25.9" + "@babel/plugin-transform-destructuring" "^7.25.9" + "@babel/plugin-transform-dotall-regex" "^7.25.9" + "@babel/plugin-transform-duplicate-keys" "^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-dynamic-import" "^7.25.9" + "@babel/plugin-transform-exponentiation-operator" "^7.25.9" + "@babel/plugin-transform-export-namespace-from" "^7.25.9" + "@babel/plugin-transform-for-of" "^7.25.9" + "@babel/plugin-transform-function-name" "^7.25.9" + "@babel/plugin-transform-json-strings" "^7.25.9" + "@babel/plugin-transform-literals" "^7.25.9" + "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" + "@babel/plugin-transform-member-expression-literals" "^7.25.9" + "@babel/plugin-transform-modules-amd" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-modules-systemjs" "^7.25.9" + "@babel/plugin-transform-modules-umd" "^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-new-target" "^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.9" + "@babel/plugin-transform-numeric-separator" "^7.25.9" + "@babel/plugin-transform-object-rest-spread" "^7.25.9" + "@babel/plugin-transform-object-super" "^7.25.9" + "@babel/plugin-transform-optional-catch-binding" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" + "@babel/plugin-transform-private-methods" "^7.25.9" + "@babel/plugin-transform-private-property-in-object" "^7.25.9" + "@babel/plugin-transform-property-literals" "^7.25.9" + "@babel/plugin-transform-regenerator" "^7.25.9" + "@babel/plugin-transform-regexp-modifiers" "^7.26.0" + "@babel/plugin-transform-reserved-words" "^7.25.9" + "@babel/plugin-transform-shorthand-properties" "^7.25.9" + "@babel/plugin-transform-spread" "^7.25.9" + "@babel/plugin-transform-sticky-regex" "^7.25.9" + "@babel/plugin-transform-template-literals" "^7.25.9" + "@babel/plugin-transform-typeof-symbol" "^7.25.9" + "@babel/plugin-transform-unicode-escapes" "^7.25.9" + "@babel/plugin-transform-unicode-property-regex" "^7.25.9" + "@babel/plugin-transform-unicode-regex" "^7.25.9" + "@babel/plugin-transform-unicode-sets-regex" "^7.25.9" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.6" + babel-plugin-polyfill-regenerator "^0.6.1" + core-js-compat "^3.38.1" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/types" "^7.4.4" esutils "^2.0.2" "@babel/preset-react@^7.13.13": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.3.tgz#2ec7f91d0c924fa2ea0c7cfbbf690bc62b79cd84" - integrity sha512-lxDz1mnZ9polqClBCVBjIVUypoB4qV3/tZUDb/IlYbW1kiiLaXaX+bInbRjl+lNQ/iUZraQ3+S8daEmoELMWug== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-transform-react-display-name" "^7.18.6" - "@babel/plugin-transform-react-jsx" "^7.22.3" - "@babel/plugin-transform-react-jsx-development" "^7.18.6" - "@babel/plugin-transform-react-pure-annotations" "^7.18.6" - -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== - -"@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.20.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.3.tgz#0a7fce51d43adbf0f7b517a71f4c3aaca92ebcbb" - integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.21.9", "@babel/template@^7.3.3": - version "7.21.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb" - integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/parser" "^7.21.9" - "@babel/types" "^7.21.5" - -"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.20.5", "@babel/traverse@^7.22.1", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0" - integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.22.3" - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.22.4" - "@babel/types" "^7.22.4" - debug "^4.1.0" + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.26.3.tgz#7c5e028d623b4683c1f83a0bd4713b9100560caa" + integrity sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-transform-react-display-name" "^7.25.9" + "@babel/plugin-transform-react-jsx" "^7.25.9" + "@babel/plugin-transform-react-jsx-development" "^7.25.9" + "@babel/plugin-transform-react-pure-annotations" "^7.25.9" + +"@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" + integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.25.9", "@babel/template@^7.3.3": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.25.9", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.26.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" + integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.3" + "@babel/parser" "^7.26.3" + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.3" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.4.tgz#56a2653ae7e7591365dabf20b76295410684c071" - integrity sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" + integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== dependencies: - "@babel/helper-string-parser" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" "@bcoe/v8-coverage@^0.2.3": version "0.2.3" @@ -1254,25 +1143,25 @@ integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== "@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + version "4.4.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" + integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== dependencies: - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.3" -"@eslint-community/regexpp@^4.4.0": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" - integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== +"@eslint-community/regexpp@^4.6.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== -"@eslint/eslintrc@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" - integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.5.2" + espree "^9.6.0" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -1280,23 +1169,23 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.41.0": - version "8.41.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.41.0.tgz#080321c3b68253522f7646b55b577dd99d2950b3" - integrity sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA== +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== "@gar/promisify@^1.0.1": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@humanwhocodes/config-array@^0.11.8": - version "0.11.8" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" - integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -1304,10 +1193,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -1831,55 +1720,50 @@ "@babel/runtime" "^7.7.2" regenerator-runtime "^0.13.3" -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: - "@jridgewell/set-array" "^1.0.1" + "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== -"@jridgewell/source-map@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" - integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" "@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" @@ -1943,10 +1827,99 @@ mkdirp "^1.0.4" rimraf "^3.0.2" -"@polka/url@^1.0.0-next.20": - version "1.0.0-next.21" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" - integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== +"@parcel/watcher-android-arm64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz#e32d3dda6647791ee930556aee206fcd5ea0fb7a" + integrity sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ== + +"@parcel/watcher-darwin-arm64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz#0d9e680b7e9ec1c8f54944f1b945aa8755afb12f" + integrity sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw== + +"@parcel/watcher-darwin-x64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz#f9f1d5ce9d5878d344f14ef1856b7a830c59d1bb" + integrity sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA== + +"@parcel/watcher-freebsd-x64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz#2b77f0c82d19e84ff4c21de6da7f7d096b1a7e82" + integrity sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw== + +"@parcel/watcher-linux-arm-glibc@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz#92ed322c56dbafa3d2545dcf2803334aee131e42" + integrity sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA== + +"@parcel/watcher-linux-arm-musl@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz#cd48e9bfde0cdbbd2ecd9accfc52967e22f849a4" + integrity sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA== + +"@parcel/watcher-linux-arm64-glibc@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz#7b81f6d5a442bb89fbabaf6c13573e94a46feb03" + integrity sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA== + +"@parcel/watcher-linux-arm64-musl@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz#dcb8ff01077cdf59a18d9e0a4dff7a0cfe5fd732" + integrity sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q== + +"@parcel/watcher-linux-x64-glibc@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz#2e254600fda4e32d83942384d1106e1eed84494d" + integrity sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw== + +"@parcel/watcher-linux-x64-musl@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz#01fcea60fedbb3225af808d3f0a7b11229792eef" + integrity sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA== + +"@parcel/watcher-win32-arm64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz#87cdb16e0783e770197e52fb1dc027bb0c847154" + integrity sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig== + +"@parcel/watcher-win32-ia32@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz#778c39b56da33e045ba21c678c31a9f9d7c6b220" + integrity sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA== + +"@parcel/watcher-win32-x64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz#33873876d0bbc588aacce38e90d1d7480ce81cb7" + integrity sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw== + +"@parcel/watcher@^2.4.1": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.0.tgz#5c88818b12b8de4307a9d3e6dc3e28eba0dfbd10" + integrity sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ== + dependencies: + detect-libc "^1.0.3" + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.5.0" + "@parcel/watcher-darwin-arm64" "2.5.0" + "@parcel/watcher-darwin-x64" "2.5.0" + "@parcel/watcher-freebsd-x64" "2.5.0" + "@parcel/watcher-linux-arm-glibc" "2.5.0" + "@parcel/watcher-linux-arm-musl" "2.5.0" + "@parcel/watcher-linux-arm64-glibc" "2.5.0" + "@parcel/watcher-linux-arm64-musl" "2.5.0" + "@parcel/watcher-linux-x64-glibc" "2.5.0" + "@parcel/watcher-linux-x64-musl" "2.5.0" + "@parcel/watcher-win32-arm64" "2.5.0" + "@parcel/watcher-win32-ia32" "2.5.0" + "@parcel/watcher-win32-x64" "2.5.0" + +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.28" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.28.tgz#d45e01c4a56f143ee69c54dd6b12eade9e270a73" + integrity sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw== "@rollup/plugin-babel@^5.2.0": version "5.3.1" @@ -1985,6 +1958,11 @@ estree-walker "^1.0.1" picomatch "^2.2.2" +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + "@sinclair/typebox@^0.24.1": version "0.24.51" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" @@ -2025,9 +2003,9 @@ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@types/babel__core@^7.1.14": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" - integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -2036,104 +2014,124 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.0.tgz#4709d34d3eba3e1dad1950d40e80c6b5e0b81fc9" - integrity sha512-TBOjqAGf0hmaqRwpii5LLkJLg7c6OMm4nHLmpsUxwk9bBHtoTC6dAHdVWdGv4TBxj2CZOZY8Xfq8WmfoVi7n4Q== + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: "@babel/types" "^7.20.7" "@types/body-parser@*": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== dependencies: "@types/connect" "*" "@types/node" "*" "@types/bonjour@^3.5.9": - version "3.5.10" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" - integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + version "3.5.13" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== dependencies: "@types/node" "*" "@types/connect-history-api-fallback@^1.3.5": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#9fd20b3974bdc2bcd4ac6567e2e0f6885cb2cf41" - integrity sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig== + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" + integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" "@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" "@types/debug@^4.0.0": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.8.tgz#cef723a5d0a90990313faec2d1e22aee5eecb317" - integrity sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ== + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== dependencies: "@types/ms" "*" -"@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== +"@types/eslint-scope@^3.7.7": + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.40.0.tgz#ae73dc9ec5237f2794c4f79efd6a4c73b13daf23" - integrity sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g== + version "9.6.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" + integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== +"@types/estree@*", "@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.35" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f" - integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz#812d2871e5eea17fb0bd5214dda7a7b748c0e12a" + integrity sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/send" "*" -"@types/express@*", "@types/express@^4.17.13": - version "4.17.17" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" - integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== +"@types/express-serve-static-core@^4.17.33": + version "4.19.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" + integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" + integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/express@^4.17.13": + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" @@ -2149,54 +2147,59 @@ "@types/node" "*" "@types/graceful-fs@^4.1.3": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: "@types/node" "*" "@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== + version "2.3.10" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" + integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== dependencies: - "@types/unist" "*" + "@types/unist" "^2" "@types/html-minifier-terser@^6.0.0": version "6.1.0" resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + "@types/http-proxy@^1.17.8": - version "1.17.11" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.11.tgz#0ca21949a5588d55ac2b659b69035c84bd5da293" - integrity sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA== + version "1.17.15" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.15.tgz#12118141ce9775a6499ecb4c01d02f90fc839d36" + integrity sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" "@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": version "0.0.29" @@ -2204,21 +2207,16 @@ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/mdast@^3.0.0": - version "3.0.11" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.11.tgz#dc130f7e7d9306124286f6d6cee40cf4d14a3dc0" - integrity sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw== + version "3.0.15" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" + integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== dependencies: - "@types/unist" "*" - -"@types/mime@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + "@types/unist" "^2" "@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/minimatch@*": version "5.1.2" @@ -2226,19 +2224,28 @@ integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== "@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + +"@types/node-forge@^1.3.0": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" "@types/node@*": - version "20.2.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.5.tgz#26d295f3570323b2837d322180dfbf1ba156fefb" - integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== + version "22.10.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.1.tgz#41ffeee127b8975a05f8c4f83fb89bcb2987d766" + integrity sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ== + dependencies: + undici-types "~6.20.0" "@types/node@16.9.1": version "16.9.1" @@ -2246,9 +2253,9 @@ integrity sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g== "@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== "@types/prettier@^2.1.5": version "2.7.3" @@ -2256,19 +2263,19 @@ integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/prop-types@^15.0.0": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + version "15.7.14" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.14.tgz#1433419d73b2a7ebfc6918dcefd2ec0d5cd698f2" + integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== "@types/qs@*": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + version "6.9.17" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.17.tgz#fc560f60946d0aeff2f914eb41679659d3310e1a" + integrity sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ== "@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== "@types/resolve@1.17.1": version "1.17.1" @@ -2283,101 +2290,102 @@ integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/semver@^7.3.12": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" - integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== "@types/send@*": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" - integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== dependencies: "@types/mime" "^1" "@types/node" "*" "@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + version "1.9.4" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== dependencies: "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.1" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" - integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== dependencies: - "@types/mime" "*" + "@types/http-errors" "*" "@types/node" "*" + "@types/send" "*" "@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + version "0.3.36" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== dependencies: "@types/node" "*" "@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== "@types/trusted-types@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.3.tgz#a136f83b0758698df454e328759dbd3d44555311" - integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== -"@types/unist@*", "@types/unist@^2.0.0": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== +"@types/unist@^2", "@types/unist@^2.0.0": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== -"@types/ws@^8.5.1": - version "8.5.4" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" - integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== +"@types/ws@^8.5.5": + version "8.5.13" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.13.tgz#6414c280875e2691d0d1e080b05addbf5cb91e20" + integrity sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA== dependencies: "@types/node" "*" "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^15.0.0": - version "15.0.15" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.15.tgz#e609a2b1ef9e05d90489c2f5f45bbfb2be092158" - integrity sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg== + version "15.0.19" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.19.tgz#328fb89e46109ecbdb70c295d96ff2f46dfd01b9" + integrity sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA== dependencies: "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.24" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" - integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/scope-manager@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz#ff4ad4fec6433647b817c4a7d4b4165d18ea2fa8" - integrity sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig== +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: - "@typescript-eslint/types" "5.59.8" - "@typescript-eslint/visitor-keys" "5.59.8" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/types@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.8.tgz#212e54414733618f5d0fd50b2da2717f630aebf8" - integrity sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w== +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/typescript-estree@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz#801a7b1766481629481b3b0878148bd7a1f345d7" - integrity sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg== +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: - "@typescript-eslint/types" "5.59.8" - "@typescript-eslint/visitor-keys" "5.59.8" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -2385,146 +2393,151 @@ tsutils "^3.21.0" "@typescript-eslint/utils@^5.10.0": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.8.tgz#34d129f35a2134c67fdaf024941e8f96050dca2b" - integrity sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg== + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.59.8" - "@typescript-eslint/types" "5.59.8" - "@typescript-eslint/typescript-estree" "5.59.8" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz#aa6a7ef862add919401470c09e1609392ef3cc40" - integrity sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ== +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: - "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" - integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== +"@ungap/structured-clone@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.1.tgz#28fa185f67daaf7b7a1a8c1d445132c5d979f8bd" + integrity sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA== + +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" + integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-numbers" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" -"@webassemblyjs/floating-point-hex-parser@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" - integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== +"@webassemblyjs/floating-point-hex-parser@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" + integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== -"@webassemblyjs/helper-api-error@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" - integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== +"@webassemblyjs/helper-api-error@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" + integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== -"@webassemblyjs/helper-buffer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" - integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== +"@webassemblyjs/helper-buffer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" + integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== +"@webassemblyjs/helper-numbers@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" + integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/floating-point-hex-parser" "1.13.2" + "@webassemblyjs/helper-api-error" "1.13.2" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" - integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== +"@webassemblyjs/helper-wasm-bytecode@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" + integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== -"@webassemblyjs/helper-wasm-section@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" - integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== +"@webassemblyjs/helper-wasm-section@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" + integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/wasm-gen" "1.14.1" -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== +"@webassemblyjs/ieee754@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" + integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== +"@webassemblyjs/leb128@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" + integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" - integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== - -"@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" - integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-opt" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - "@webassemblyjs/wast-printer" "1.11.6" - -"@webassemblyjs/wasm-gen@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" - integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wasm-opt@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" - integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" - integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wast-printer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" - integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== - dependencies: - "@webassemblyjs/ast" "1.11.6" +"@webassemblyjs/utf8@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" + integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== + +"@webassemblyjs/wasm-edit@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" + integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/helper-wasm-section" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-opt" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + "@webassemblyjs/wast-printer" "1.14.1" + +"@webassemblyjs/wasm-gen@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" + integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + +"@webassemblyjs/wasm-opt@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" + integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" + integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-api-error" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + +"@webassemblyjs/wast-printer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" + integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== + dependencies: + "@webassemblyjs/ast" "1.14.1" "@xtuc/long" "4.2.2" "@webpack-cli/configtest@^1.2.0": @@ -2559,7 +2572,7 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: +accepts@~1.3.4, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -2567,30 +2580,27 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-import-assertions@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" - integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== - acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.0.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" acorn@^6.0.7: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^8.0.4, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +acorn@^8.0.4, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.8.2, acorn@^8.9.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== agent-base@6, agent-base@^6.0.2: version "6.0.2" @@ -2600,12 +2610,10 @@ agent-base@6, agent-base@^6.0.2: debug "4" agentkeepalive@^4.1.3: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" - integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== dependencies: - debug "^4.1.0" - depd "^2.0.0" humanize-ms "^1.2.1" aggregate-error@^3.0.0: @@ -2635,7 +2643,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: +ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2646,14 +2654,14 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.6.0, ajv@^8.9.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: - fast-deep-equal "^3.1.1" + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.2.2" ansi-escapes@^3.2.0: version "3.2.0" @@ -2757,12 +2765,10 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" - integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== - dependencies: - deep-equal "^2.0.5" +aria-query@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" + integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== arr-diff@^4.0.0: version "4.0.0" @@ -2779,33 +2785,29 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" + call-bind "^1.0.5" + is-array-buffer "^3.0.4" array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-includes@^3.1.5, array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== +array-includes@^3.1.6, array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" is-string "^1.0.7" array-union@^1.0.2: @@ -2830,36 +2832,74 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== -array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.findlastindex@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.tosorted@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" - integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" arrify@^1.0.1: version "1.0.1" @@ -2883,10 +2923,10 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== -ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== +ast-types-flow@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" + integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== astral-regex@^1.0.0: version "1.0.0" @@ -2899,9 +2939,9 @@ async-foreach@^0.1.3: integrity sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA== async@^3.2.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" @@ -2918,10 +2958,12 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" aws-sign2@~0.7.0: version "0.7.0" @@ -2929,21 +2971,19 @@ aws-sign2@~0.7.0: integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" - integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + version "1.13.2" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.2.tgz#0aa167216965ac9474ccfa83892cfb6b3e1e52ef" + integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw== -axe-core@^4.6.2: - version "4.7.2" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.2.tgz#040a7342b20765cb18bb50b628394c21bccc17a0" - integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== +axe-core@^4.10.0: + version "4.10.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.2.tgz#85228e3e1d8b8532a27659b332e39b7fa0e022df" + integrity sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w== -axobject-query@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" - integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== - dependencies: - deep-equal "^2.0.5" +axobject-query@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" + integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== babel-eslint@^10.0.3: version "10.1.0" @@ -2971,12 +3011,12 @@ babel-jest@^28.1.1, babel-jest@^28.1.3: slash "^3.0.0" babel-loader@^8.2.2: - version "8.3.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" - integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== + version "8.4.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.4.1.tgz#6ccb75c66e62c3b144e1c5f2eaec5b8f6c08c675" + integrity sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA== dependencies: find-cache-dir "^3.3.1" - loader-utils "^2.0.0" + loader-utils "^2.0.4" make-dir "^3.1.0" schema-utils "^2.6.5" @@ -3001,47 +3041,61 @@ babel-plugin-jest-hoist@^28.1.3: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" -babel-plugin-polyfill-corejs2@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz#75044d90ba5043a5fb559ac98496f62f3eb668fd" - integrity sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw== +babel-plugin-lodash@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz#4f6844358a1340baed182adbeffa8df9967bc196" + integrity sha512-yDZLjK7TCkWl1gpBeBGmuaDIFhZKmkoL+Cu2MUUjv5VxUZx/z7tBGBCBcQs5RI1Bkz5LLmNdjx7paOyQtMovyg== dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.4.0" - semver "^6.1.1" + "@babel/helper-module-imports" "^7.0.0-beta.49" + "@babel/types" "^7.0.0-beta.49" + glob "^7.1.1" + lodash "^4.17.10" + require-package-name "^2.0.1" -babel-plugin-polyfill-corejs3@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz#39248263c38191f0d226f928d666e6db1b4b3a8a" - integrity sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q== +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.12" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz#ca55bbec8ab0edeeef3d7b8ffd75322e210879a9" + integrity sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.0" - core-js-compat "^3.30.1" + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.6.3" + semver "^6.3.1" -babel-plugin-polyfill-regenerator@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz#e7344d88d9ef18a3c47ded99362ae4a757609380" - integrity sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g== +babel-plugin-polyfill-corejs3@^0.10.6: + version "0.10.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" + integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.0" + "@babel/helper-define-polyfill-provider" "^0.6.2" + core-js-compat "^3.38.0" + +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz#abeb1f3f1c762eace37587f42548b08b57789bc8" + integrity sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.3" babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" babel-preset-jest@^28.1.3: version "28.1.3" @@ -3097,30 +3151,30 @@ big.js@^5.2.2: integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== bmp-js@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233" integrity sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw== -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== +body-parser@1.20.3: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== dependencies: bytes "3.1.2" - content-type "~1.0.4" + content-type "~1.0.5" debug "2.6.9" depd "2.0.0" destroy "1.2.0" http-errors "2.0.0" iconv-lite "0.4.24" on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" + qs "6.13.0" + raw-body "2.5.2" type-is "~1.6.18" unpipe "1.0.0" @@ -3130,12 +3184,10 @@ body-scroll-lock@^3.1.5: integrity sha512-Yi1Xaml0EvNA0OYWxXiYNqY24AfWkbA6w5vxE7GWxtKfzIbZM+Qw+aSmkgsbWzbHiy/RCSkUZBplVxTA+E4jJg== bonjour-service@^1.0.11: - version "1.1.1" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" - integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== + version "1.3.0" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.3.0.tgz#80d867430b5a0da64e82a8047fc1e355bdb71722" + integrity sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA== dependencies: - array-flatten "^2.1.2" - dns-equal "^1.0.0" fast-deep-equal "^3.1.3" multicast-dns "^7.2.5" @@ -3175,22 +3227,22 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" -browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.5: - version "4.21.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.7.tgz#e2b420947e5fb0a58e8f4668ae6e23488127e551" - integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA== +browserslist@^4.24.0, browserslist@^4.24.2: + version "4.24.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" + integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== dependencies: - caniuse-lite "^1.0.30001489" - electron-to-chromium "^1.4.411" - node-releases "^2.0.12" - update-browserslist-db "^1.0.11" + caniuse-lite "^1.0.30001669" + electron-to-chromium "^1.5.41" + node-releases "^2.0.18" + update-browserslist-db "^1.1.1" bser@2.1.1: version "2.1.1" @@ -3222,11 +3274,6 @@ builtin-modules@^3.1.0, builtin-modules@^3.3.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -3271,13 +3318,23 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== +call-bind-apply-helpers@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" + integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" call-me-maybe@^1.0.1: version "1.0.2" @@ -3335,17 +3392,24 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001489: - version "1.0.30001492" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz#4a06861788a52b4c81fd3344573b68cc87fe062b" - integrity sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw== +caniuse-lite@^1.0.30001669: + version "1.0.30001687" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz#d0ac634d043648498eedf7a3932836beba90ebae" + integrity sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ== caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: +centra@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/centra/-/centra-2.7.0.tgz#4c8312a58436e8a718302011561db7e6a2b0ec18" + integrity sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg== + dependencies: + follow-redirects "^1.15.6" + +chalk@^2.1.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3377,10 +3441,10 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.0, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== +chokidar@^3.5.3, chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -3392,15 +3456,22 @@ chardet@^0.7.0: optionalDependencies: fsevents "~2.3.2" +chokidar@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41" + integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA== + dependencies: + readdirp "^4.0.1" + chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + version "1.0.4" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" + integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== ci-info@^2.0.0: version "2.0.0" @@ -3408,14 +3479,14 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== class-utils@^0.3.5: version "0.3.6" @@ -3428,9 +3499,9 @@ class-utils@^0.3.5: static-extend "^0.1.1" clean-css@^5.2.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" - integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== + version "5.3.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" + integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== dependencies: source-map "~0.6.0" @@ -3494,9 +3565,9 @@ code-point-at@^1.0.0: integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== collection-visit@^1.0.0: version "1.0.0" @@ -3557,10 +3628,10 @@ commander@^2.19.0, commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== commander@^7.0.0, commander@^7.2.0: version "7.2.0" @@ -3583,11 +3654,11 @@ commondir@^1.0.1: integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + version "1.3.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" + integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== -compressible@~2.0.16: +compressible@~2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== @@ -3595,16 +3666,16 @@ compressible@~2.0.16: mime-db ">= 1.43.0 < 2" compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + version "1.7.5" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.5.tgz#fdd256c0a642e39e314c478f6c2cd654edd74c93" + integrity sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q== dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" + bytes "3.1.2" + compressible "~2.0.18" debug "2.6.9" + negotiator "~0.6.4" on-headers "~1.0.2" - safe-buffer "5.1.2" + safe-buffer "5.2.1" vary "~1.1.2" concat-map@0.0.1: @@ -3634,25 +3705,30 @@ content-disposition@0.5.4: dependencies: safe-buffer "5.2.1" -content-type@~1.0.4: +content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.4.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== copy-descriptor@^0.1.0: version "0.1.1" @@ -3678,12 +3754,12 @@ copy-webpack-plugin@^11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.30.1, core-js-compat@^3.30.2: - version "3.30.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.2.tgz#83f136e375babdb8c80ad3c22d67c69098c1dd8b" - integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA== +core-js-compat@^3.38.0, core-js-compat@^3.38.1: + version "3.39.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.39.0.tgz#b12dccb495f2601dc860bdbe7b4e3ffa8ba63f61" + integrity sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw== dependencies: - browserslist "^4.21.5" + browserslist "^4.24.2" core-util-is@1.0.2: version "1.0.2" @@ -3706,16 +3782,16 @@ cosmiconfig@^5.0.5: parse-json "^4.0.0" cross-fetch@^3.0.4: - version "3.1.6" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.6.tgz#bae05aa31a4da760969756318feeee6e70f15d6c" - integrity sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g== + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== dependencies: - node-fetch "^2.6.11" + node-fetch "^2.6.12" cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + version "6.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57" + integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== dependencies: nice-try "^1.0.4" path-key "^2.0.1" @@ -3724,9 +3800,9 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: which "^1.2.9" cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -3743,18 +3819,18 @@ css-color-names@1.0.1: integrity sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA== css-loader@^6.7.1: - version "6.8.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" - integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== + version "6.11.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.11.0.tgz#33bae3bf6363d0a7c2cf9031c96c744ff54d85ba" + integrity sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g== dependencies: icss-utils "^5.1.0" - postcss "^8.4.21" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.3" - postcss-modules-scope "^3.0.0" + postcss "^8.4.33" + postcss-modules-extract-imports "^3.1.0" + postcss-modules-local-by-default "^4.0.5" + postcss-modules-scope "^3.2.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" - semver "^7.3.8" + semver "^7.5.4" css-select@^4.1.3: version "4.3.0" @@ -3778,9 +3854,9 @@ cssesc@^3.0.0: integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== damerau-levenshtein@^1.0.8: version "1.0.8" @@ -3794,6 +3870,38 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -3801,12 +3909,12 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: - ms "2.1.2" + ms "^2.1.3" debug@^3.2.7: version "3.2.7" @@ -3845,30 +3953,6 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== -deep-equal@^2.0.5: - version "2.2.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.1.tgz#c72ab22f3a7d3503a4ca87dde976fe9978816739" - integrity sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - es-get-iterator "^1.1.3" - get-intrinsic "^1.2.0" - is-arguments "^1.1.1" - is-array-buffer "^3.0.2" - is-date-object "^1.0.5" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - isarray "^2.0.5" - object-is "^1.1.5" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - side-channel "^1.0.4" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -3886,16 +3970,26 @@ default-gateway@^6.0.3: dependencies: execa "^5.0.0" +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -3931,7 +4025,7 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -depd@2.0.0, depd@^2.0.0: +depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -3982,9 +4076,9 @@ diff@^4.0.1: integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== diff@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== dir-glob@^2.2.2: version "2.2.2" @@ -4000,15 +4094,10 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== - dns-packet@^5.2.2: - version "5.6.0" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.0.tgz#2202c947845c7a63c23ece58f2f70ff6ab4c2f7d" - integrity sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ== + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" @@ -4084,6 +4173,15 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" +dunder-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.0.tgz#c2fce098b3c8f8899554905f4377b6d85dabaa80" + integrity sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-errors "^1.3.0" + gopd "^1.2.0" + duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -4103,16 +4201,16 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== ejs@^3.1.6: - version "3.1.9" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" - integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + version "3.1.10" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.411: - version "1.4.416" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.416.tgz#7291f704168d3842ae4da3ae9fdc7bfbeb97d116" - integrity sha512-AUYh0XDTb2vrj0rj82jb3P9hHSyzQNdTPYWZIhPdCOui7/vpme7+HTE07BE5jwuqg/34TZ8ktlRz6GImJ4IXjA== +electron-to-chromium@^1.5.41: + version "1.5.72" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.72.tgz#a732805986d3a5b5fedd438ddf4616c7d78ac2df" + integrity sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw== emittery@^0.10.2: version "0.10.2" @@ -4144,6 +4242,11 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + encoding@^0.1.12: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -4158,10 +4261,10 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^5.14.1: - version "5.14.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz#de684b6803724477a4af5d74ccae5de52c25f6b3" - integrity sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow== +enhanced-resolve@^5.17.1: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -4177,9 +4280,9 @@ env-paths@^2.2.0: integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== envinfo@^7.7.3: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + version "7.14.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae" + integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== err-code@^2.0.2: version "2.0.3" @@ -4193,95 +4296,130 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.21.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" - integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== - dependencies: - array-buffer-byte-length "^1.0.0" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" +es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5: + version "1.23.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.5.tgz#f4599a4946d57ed467515ed10e4f157289cd52fb" + integrity sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.0" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.4" gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" has-symbols "^1.0.3" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" is-callable "^1.2.7" - is-negative-zero "^2.0.2" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" + is-shared-array-buffer "^1.0.3" is-string "^1.0.7" - is-typed-array "^1.1.10" + is-typed-array "^1.1.13" is-weakref "^1.0.2" - object-inspect "^1.12.3" + object-inspect "^1.13.3" object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-length "^1.0.4" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.3" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" + which-typed-array "^1.1.15" -es-get-iterator@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" - integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-iterator-helpers@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz#2f1a3ab998b30cb2d10b195b587c6d9ebdebf152" + integrity sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" has-symbols "^1.0.3" - is-arguments "^1.1.1" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.7" - isarray "^2.0.5" - stop-iteration-iterator "^1.0.0" + internal-slot "^1.0.7" + iterator.prototype "^1.1.3" + safe-array-concat "^1.1.2" es-module-lexer@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" - integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== + version "1.5.4" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" + integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" + es-errors "^1.3.0" -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== dependencies: - has "^1.0.3" + hasown "^2.0.0" es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@~1.0.3: version "1.0.3" @@ -4323,46 +4461,50 @@ eslint-config-airbnb@^19.0.4: object.entries "^1.1.5" eslint-config-prettier@^8.2.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz#bfda738d412adc917fd7b038857110efe98c9348" - integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== -eslint-import-resolver-node@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" - integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" - is-core-module "^2.11.0" - resolve "^1.22.1" + is-core-module "^2.13.0" + resolve "^1.22.4" -eslint-module-utils@^2.7.4: - version "2.8.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== +eslint-module-utils@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" + integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== dependencies: debug "^3.2.7" eslint-plugin-import@^2.22.1: - version "2.27.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" - integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" + version "2.31.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" + integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== + dependencies: + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.8" + array.prototype.findlastindex "^1.2.5" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.7.4" - has "^1.0.3" - is-core-module "^2.11.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.12.0" + hasown "^2.0.2" + is-core-module "^2.15.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.values "^1.1.6" - resolve "^1.22.1" - semver "^6.3.0" - tsconfig-paths "^3.14.1" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.0" + semver "^6.3.1" + string.prototype.trimend "^1.0.8" + tsconfig-paths "^3.15.0" eslint-plugin-jest@^26.5.3: version "26.9.0" @@ -4372,26 +4514,25 @@ eslint-plugin-jest@^26.5.3: "@typescript-eslint/utils" "^5.10.0" eslint-plugin-jsx-a11y@^6.4.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" - integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== - dependencies: - "@babel/runtime" "^7.20.7" - aria-query "^5.1.3" - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - ast-types-flow "^0.0.7" - axe-core "^4.6.2" - axobject-query "^3.1.1" + version "6.10.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz#d2812bb23bf1ab4665f1718ea442e8372e638483" + integrity sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q== + dependencies: + aria-query "^5.3.2" + array-includes "^3.1.8" + array.prototype.flatmap "^1.3.2" + ast-types-flow "^0.0.8" + axe-core "^4.10.0" + axobject-query "^4.1.0" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" - has "^1.0.3" - jsx-ast-utils "^3.3.3" - language-tags "=1.0.5" + hasown "^2.0.2" + jsx-ast-utils "^3.3.5" + language-tags "^1.0.9" minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - semver "^6.3.0" + object.fromentries "^2.0.8" + safe-regex-test "^1.0.3" + string.prototype.includes "^2.0.1" eslint-plugin-prettier@^4.0.0: version "4.2.1" @@ -4401,30 +4542,33 @@ eslint-plugin-prettier@^4.0.0: prettier-linter-helpers "^1.0.0" eslint-plugin-react-hooks@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.23.2: - version "7.32.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" - integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== - dependencies: - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - array.prototype.tosorted "^1.1.1" + version "7.37.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz#cd0935987876ba2900df2f58339f6d92305acc7a" + integrity sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.2" + array.prototype.tosorted "^1.1.4" doctrine "^2.1.0" + es-iterator-helpers "^1.1.0" estraverse "^5.3.0" + hasown "^2.0.2" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - object.hasown "^1.1.2" - object.values "^1.1.6" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.values "^1.2.0" prop-types "^15.8.1" - resolve "^2.0.0-next.4" - semver "^6.3.0" - string.prototype.matchall "^4.0.8" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.11" + string.prototype.repeat "^1.0.0" eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" @@ -4442,10 +4586,10 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" - integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -4467,10 +4611,10 @@ eslint-visitor-keys@^2.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" - integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^5.0.0: version "5.16.0" @@ -4515,26 +4659,27 @@ eslint@^5.0.0: text-table "^0.2.0" eslint@^8.17.0: - version "8.41.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.41.0.tgz#3062ca73363b4714b16dbc1e60f035e6134b6f1c" - integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q== + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.0.3" - "@eslint/js" "8.41.0" - "@humanwhocodes/config-array" "^0.11.8" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.2.0" - eslint-visitor-keys "^3.4.1" - espree "^9.5.2" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -4544,7 +4689,6 @@ eslint@^8.17.0: globals "^13.19.0" graphemer "^1.4.0" ignore "^5.2.0" - import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" @@ -4554,9 +4698,8 @@ eslint@^8.17.0: lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" + optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" text-table "^0.2.0" espree@^5.0.1: @@ -4568,12 +4711,12 @@ espree@^5.0.1: acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" -espree@^9.5.2: - version "9.5.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" - integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^8.8.0" + acorn "^8.9.0" acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" @@ -4583,9 +4726,9 @@ esprima@^4.0.0: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1, esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -4694,36 +4837,36 @@ expect@^28.1.3: jest-util "^28.1.3" express@^4.17.3: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + version "4.21.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" + integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.1" + body-parser "1.20.3" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.5.0" + cookie "0.7.1" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.2.0" + finalhandler "1.3.1" fresh "0.5.2" http-errors "2.0.0" - merge-descriptors "1.0.1" + merge-descriptors "1.0.3" methods "~1.1.2" on-finished "2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.7" + path-to-regexp "0.1.12" proxy-addr "~2.0.7" - qs "6.11.0" + qs "6.13.0" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" + send "0.19.0" + serve-static "1.16.2" setprototypeof "1.2.0" statuses "2.0.1" type-is "~1.6.18" @@ -4805,10 +4948,10 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" -fast-glob@^3.2.11, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== +fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -4826,15 +4969,20 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-uri@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241" + integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw== + fastest-levenshtein@^1.0.12: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" @@ -4852,13 +5000,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fibers@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/fibers/-/fibers-5.0.3.tgz#2fd03acb255db66fe693d15beafbf5ae92193fd7" - integrity sha512-/qYTSoZydQkM21qZpGLDLuCq8c+B8KhuCQ1kLPvnRNhxhVbvrpmH9l2+Lblf5neDuEsY4bfT7LeO553TXQDvJw== - dependencies: - detect-libc "^1.0.3" - figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -4929,10 +5070,10 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -4941,13 +5082,13 @@ filter-obj@^1.1.0: resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== dependencies: debug "2.6.9" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" on-finished "2.4.1" parseurl "~1.3.3" @@ -5006,27 +5147,33 @@ flat-cache@^2.0.1: write "1.0.3" flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: - flatted "^3.1.0" + flatted "^3.2.9" + keyv "^4.5.3" rimraf "^3.0.2" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + flatted@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flatted@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" + integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== -follow-redirects@^1.0.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +follow-redirects@^1.0.0, follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== for-each@^0.3.3: version "0.3.3" @@ -5088,10 +5235,10 @@ fs-minipass@^2.0.0: dependencies: minipass "^3.0.0" -fs-monkey@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.4.tgz#ee8c1b53d3fe8bb7e5d2c5c5dfc0168afdd2f747" - integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== +fs-monkey@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.6.tgz#8ead082953e88d992cf3ff844faa907b26756da2" + integrity sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg== fs-readdir-recursive@^1.1.0: version "1.1.0" @@ -5104,31 +5251,31 @@ fs.realpath@^1.0.0: integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== -functions-have-names@^1.2.2, functions-have-names@^1.2.3: +functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -5184,15 +5331,19 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== +get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.5.tgz#dfe7dd1b30761b464fe51bf4bb00ac7c37b681e7" + integrity sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg== dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-proto "^1.0.1" - has-symbols "^1.0.3" + call-bind-apply-helpers "^1.0.0" + dunder-proto "^1.0.0" + es-define-property "^1.0.1" + es-errors "^1.3.0" + function-bind "^1.1.2" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" @@ -5221,13 +5372,14 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" @@ -5281,7 +5433,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -5319,18 +5471,19 @@ globals@^11.1.0, globals@^11.7.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - define-properties "^1.1.3" + define-properties "^1.2.1" + gopd "^1.0.1" globby@^11.1.0: version "11.1.0" @@ -5345,13 +5498,13 @@ globby@^11.1.0: slash "^3.0.0" globby@^13.1.1: - version "13.1.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" - integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== dependencies: dir-glob "^3.0.1" - fast-glob "^3.2.11" - ignore "^5.2.0" + fast-glob "^3.3.0" + ignore "^5.2.4" merge2 "^1.4.1" slash "^4.0.0" @@ -5378,14 +5531,12 @@ globule@^1.0.0: lodash "^4.17.21" minimatch "~3.0.2" -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" +gopd@^1.0.1, gopd@^1.1.0, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -5430,7 +5581,7 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== -has-bigints@^1.0.1, has-bigints@^1.0.2: +has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== @@ -5445,29 +5596,31 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.1.1" + es-define-property "^1.0.0" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +has-proto@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - has-symbols "^1.0.2" + has-symbols "^1.0.3" has-unicode@^2.0.1: version "2.0.1" @@ -5505,12 +5658,12 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: - function-bind "^1.1.1" + function-bind "^1.1.2" hast-util-whitespace@^2.0.0: version "2.0.1" @@ -5545,11 +5698,11 @@ hpack.js@^2.1.6: wbuf "^1.1.0" html-entities@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" - integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + version "2.5.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.5.2.tgz#201a3cf95d3a15be7099521620d19dfb4f65359f" + integrity sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA== -html-escaper@^2.0.0: +html-escaper@^2.0.0, html-escaper@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== @@ -5568,9 +5721,9 @@ html-minifier-terser@^6.0.2: terser "^5.10.0" html-webpack-plugin@^5.3.1: - version "5.5.1" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz#826838e31b427f5f7f30971f8d8fa2422dfa6763" - integrity sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA== + version "5.6.3" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz#a31145f0fee4184d53a794f9513147df1e653685" + integrity sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg== dependencies: "@types/html-minifier-terser" "^6.0.0" html-minifier-terser "^6.0.2" @@ -5634,9 +5787,9 @@ http-proxy-agent@^4.0.1: debug "4" http-proxy-middleware@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + version "2.0.7" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz#915f236d92ae98ef48278a95dedf17e991936ec6" + integrity sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" @@ -5721,10 +5874,10 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +ignore@^5.2.0, ignore@^5.2.4: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== image-q@^4.0.0: version "4.0.0" @@ -5738,10 +5891,15 @@ immediate@~3.0.5: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== -immutable@^4.0.0, immutable@^4.0.0-rc.12: - version "4.3.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" - integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== +immutable@^4.0.0-rc.12: + version "4.3.7" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" + integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== + +immutable@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.0.3.tgz#aa037e2313ea7b5d400cd9298fa14e404c933db1" + integrity sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw== import-fresh@^2.0.0: version "2.0.0" @@ -5760,9 +5918,9 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: resolve-from "^4.0.0" import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -5896,13 +6054,13 @@ inquirer@^6.2.2: strip-ansi "^5.1.0" through "^2.3.6" -internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" + es-errors "^1.3.0" + hasown "^2.0.0" side-channel "^1.0.4" interpret@^2.2.0: @@ -5915,10 +6073,13 @@ invert-kv@^2.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== -ip@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" - integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" ipaddr.js@1.9.1: version "1.9.1" @@ -5926,52 +6087,43 @@ ipaddr.js@1.9.1: integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== ipaddr.js@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" - integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" + version "2.2.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" + integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== -is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== +is-accessor-descriptor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4" + integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + hasown "^2.0.0" -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" + get-intrinsic "^1.2.1" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== dependencies: - has-bigints "^1.0.1" + has-bigints "^1.0.2" is-binary-path@~2.1.0: version "2.1.0" @@ -5980,13 +6132,13 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== +is-boolean-object@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.0.tgz#9743641e80a62c094b5941c5bb791d66a88e497a" + integrity sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bind "^1.0.7" + has-tostringtag "^1.0.2" is-buffer@^1.1.5: version "1.1.6" @@ -6005,7 +6157,7 @@ is-builtin-module@^3.0.0: dependencies: builtin-modules "^3.3.0" -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: +is-callable@^1.1.3, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -6017,28 +6169,28 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.9.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== +is-core-module@^2.13.0, is-core-module@^2.15.1, is-core-module@^2.5.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: - has "^1.0.3" + hasown "^2.0.2" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== +is-data-descriptor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb" + integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw== dependencies: - kind-of "^3.0.2" + hasown "^2.0.0" -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== dependencies: - kind-of "^6.0.0" + is-typed-array "^1.1.13" -is-date-object@^1.0.1, is-date-object@^1.0.5: +is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -6046,22 +6198,20 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: has-tostringtag "^1.0.0" is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + version "0.1.7" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33" + integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg== dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" + is-accessor-descriptor "^1.0.1" + is-data-descriptor "^1.0.1" is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306" + integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw== dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" + is-accessor-descriptor "^1.0.1" + is-data-descriptor "^1.0.1" is-directory@^0.3.1: version "0.3.1" @@ -6090,6 +6240,13 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz#d74a7d0c5f3578e34a20729e69202e578d495dc2" + integrity sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA== + dependencies: + call-bind "^1.0.7" + is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -6117,6 +6274,13 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -6136,27 +6300,28 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== -is-map@^2.0.1, is-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" - integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== +is-number-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.0.tgz#5a867e9ecc3d294dda740d9f127835857af7eb05" + integrity sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw== dependencies: - has-tostringtag "^1.0.0" + call-bind "^1.0.7" + has-tostringtag "^1.0.2" is-number@^3.0.0: version "3.0.0" @@ -6203,29 +6368,31 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: isobject "^3.0.1" is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.0.tgz#41b9d266e7eb7451312c64efc37e8a7d453077cf" + integrity sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bind "^1.0.7" + gopd "^1.1.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== -is-set@^2.0.1, is-set@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" - integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" is-stream@^1.1.0: version "1.1.0" @@ -6237,40 +6404,39 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== +is-string@^1.0.7, is-string@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.0.tgz#8cb83c5d57311bf8058bc6c8db294711641da45d" + integrity sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g== dependencies: - has-tostringtag "^1.0.0" + call-bind "^1.0.7" + has-tostringtag "^1.0.2" -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== +is-symbol@^1.0.4, is-symbol@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.0.tgz#ae993830a56d4781886d39f9f0a46b3e89b7b60b" + integrity sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A== dependencies: - has-symbols "^1.0.2" + call-bind "^1.0.7" + has-symbols "^1.0.3" + safe-regex-test "^1.0.3" -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" + which-typed-array "^1.1.14" is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2: version "1.0.2" @@ -6279,13 +6445,13 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" -is-weakset@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" - integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bind "^1.0.7" + get-intrinsic "^1.2.4" is-windows@^1.0.2: version "1.0.2" @@ -6332,9 +6498,9 @@ isstream@~0.1.2: integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: version "5.2.1" @@ -6348,12 +6514,12 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: semver "^6.3.0" istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" + make-dir "^4.0.0" supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: @@ -6366,17 +6532,28 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +iterator.prototype@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.3.tgz#016c2abe0be3bbdb8319852884f60908ac62bf9c" + integrity sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + jake@^10.8.5: - version "10.8.7" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" - integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + version "10.9.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== dependencies: async "^3.2.3" chalk "^4.0.2" @@ -6852,20 +7029,25 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^3.0.2, jsesc@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-parse-better-errors@^1.0.1: version "1.0.2" @@ -6909,7 +7091,7 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.0, json5@^2.2.2: +json5@^2.1.2, json5@^2.2.0, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -6938,13 +7120,15 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" - integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: - array-includes "^3.1.5" - object.assign "^4.1.3" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" jszip@^3.6.0: version "3.10.1" @@ -6956,6 +7140,13 @@ jszip@^3.6.0: readable-stream "~2.3.6" setimmediate "^1.0.5" +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -6970,12 +7161,7 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -6990,30 +7176,25 @@ kleur@^4.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== -klona@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" - integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== - -language-subtag-registry@~0.3.2: - version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== +language-subtag-registry@^0.3.20: + version "0.3.23" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" + integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== -language-tags@=1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" - integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== +language-tags@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" + integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== dependencies: - language-subtag-registry "~0.3.2" + language-subtag-registry "^0.3.20" launch-editor@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" - integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + version "2.9.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.9.1.tgz#253f173bd441e342d4344b4dae58291abb425047" + integrity sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w== dependencies: picocolors "^1.0.0" - shell-quote "^1.7.3" + shell-quote "^1.8.1" lcid@^2.0.0: version "2.0.0" @@ -7056,16 +7237,16 @@ lines-and-columns@^1.1.6: integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== load-bmfont@^1.3.1, load-bmfont@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.1.tgz#c0f5f4711a1e2ccff725a7b6078087ccfcddd3e9" - integrity sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA== + version "1.4.2" + resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.2.tgz#e0f4516064fa5be8439f9c3696c01423a64e8717" + integrity sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog== dependencies: buffer-equal "0.0.1" mime "^1.3.4" parse-bmfont-ascii "^1.0.3" parse-bmfont-binary "^1.0.5" parse-bmfont-xml "^1.1.4" - phin "^2.9.1" + phin "^3.7.1" xhr "^2.0.1" xtend "^4.0.0" @@ -7074,7 +7255,7 @@ loader-runner@^4.2.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@^2.0.0: +loader-utils@^2.0.0, loader-utils@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== @@ -7105,26 +7286,23 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash-webpack-plugin@^0.11.6: + version "0.11.6" + resolved "https://registry.yarnpkg.com/lodash-webpack-plugin/-/lodash-webpack-plugin-0.11.6.tgz#8204c6b78beb62ce5211217dfe783c21557ecd33" + integrity sha512-nsHN/+IxZK/C425vGC8pAxkKJ8KQH2+NJnhDul14zYNWr6HJcA95w+oRR7Cp0oZpOdMplDZXmjVROp8prPk7ig== + dependencies: + lodash "^4.17.20" + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.set@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" - integrity sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg== - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -7163,6 +7341,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +luxon@^3.4.4: + version "3.5.0" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.5.0.tgz#6b6f65c5cd1d61d1fd19dbf07ee87a50bf4b8e20" + integrity sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ== + magic-string@^0.25.0, magic-string@^0.25.7: version "0.25.9" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" @@ -7178,13 +7361,20 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: +make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + make-fetch-happen@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" @@ -7306,11 +7496,11 @@ mem@^4.0.0: p-is-promise "^2.0.0" memfs@^3.4.3: - version "3.5.1" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.5.1.tgz#f0cd1e2bfaef58f6fe09bfb9c2288f07fea099ec" - integrity sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA== + version "3.6.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== dependencies: - fs-monkey "^1.0.3" + fs-monkey "^1.0.4" meow@^9.0.0: version "9.0.0" @@ -7330,10 +7520,10 @@ meow@^9.0.0: type-fest "^0.18.0" yargs-parser "^20.2.3" -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== merge-stream@^2.0.0: version "2.0.0" @@ -7563,19 +7753,24 @@ micromatch@^3.1.10: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== +"mime-db@>= 1.43.0 < 2": + version "1.53.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447" + integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== + mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" @@ -7739,22 +7934,17 @@ mri@^1.1.0: resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== -mrmime@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" - integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== +mrmime@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" + integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.0.0, ms@^2.1.1: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -7773,14 +7963,14 @@ mute-stream@0.0.7: integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== nan@^2.13.2: - version "2.17.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" - integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + version "2.22.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" + integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== -nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +nanoid@^3.3.7: + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== nanomatch@^1.2.9: version "1.2.13" @@ -7804,11 +7994,16 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@0.6.3, negotiator@^0.6.2: +negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +negotiator@^0.6.2, negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -7827,10 +8022,15 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-fetch@^2.6.11: - version "2.6.11" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" - integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + +node-fetch@^2.6.12: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" @@ -7860,10 +8060,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" - integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== +node-releases@^2.0.18: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== node-sass@^7.0.1: version "7.0.3" @@ -7983,18 +8183,10 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" +object-inspect@^1.13.1, object-inspect@^1.13.3: + version "1.13.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" + integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== object-keys@^1.1.1: version "1.1.1" @@ -8008,41 +8200,43 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.2, object.assign@^4.1.3, object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== +object.assign@^4.1.2, object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" + call-bind "^1.0.5" + define-properties "^1.2.1" has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.5, object.entries@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" - integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== +object.entries@^1.1.5, object.entries@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -object.fromentries@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" - integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" -object.hasown@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" - integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== +object.groupby@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" object.pick@^1.3.0: version "1.3.0" @@ -8051,14 +8245,14 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== +object.values@^1.1.6, object.values@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" @@ -8129,17 +8323,17 @@ optionator@^0.8.2: type-check "~0.3.2" word-wrap "~1.2.3" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" + word-wrap "^1.2.5" os-locale@^3.0.0: version "3.1.0" @@ -8256,12 +8450,12 @@ parse-bmfont-binary@^1.0.5: integrity sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA== parse-bmfont-xml@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389" - integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ== + version "1.1.6" + resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz#016b655da7aebe6da38c906aca16bf0415773767" + integrity sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA== dependencies: xml-parse-from-string "^1.0.0" - xml2js "^0.4.5" + xml2js "^0.5.0" parse-headers@^2.0.0: version "2.0.5" @@ -8344,10 +8538,10 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-to-regexp@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== path-type@^3.0.0: version "3.0.0" @@ -8384,10 +8578,17 @@ phin@^2.9.1: resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +phin@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/phin/-/phin-3.7.1.tgz#bf841da75ee91286691b10e41522a662aa628fd6" + integrity sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ== + dependencies: + centra "^2.7.0" + +picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -8405,9 +8606,9 @@ pify@^4.0.1: integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pixelmatch@^4.0.2: version "4.0.2" @@ -8433,26 +8634,31 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== -postcss-modules-local-by-default@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" - integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== +postcss-modules-extract-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== + +postcss-modules-local-by-default@^4.0.5: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz#b0db6bc81ffc7bdc52eb0f84d6ca0bedf0e36d21" + integrity sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q== dependencies: icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" + postcss-selector-parser "^7.0.0" postcss-value-parser "^4.1.0" -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== +postcss-modules-scope@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz#1bbccddcb398f1d7a511e0a2d1d047718af4078c" + integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== dependencies: - postcss-selector-parser "^6.0.4" + postcss-selector-parser "^7.0.0" postcss-modules-values@^4.0.0: version "4.0.0" @@ -8461,10 +8667,10 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.13" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== +postcss-selector-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz#41bd8b56f177c093ca49435f65731befe25d6b9c" + integrity sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -8474,14 +8680,14 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.21: - version "8.4.24" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" - integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== +postcss@^8.4.33: + version "8.4.49" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" + integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" + nanoid "^3.3.7" + picocolors "^1.1.1" + source-map-js "^1.2.1" prelude-ls@^1.2.1: version "1.2.1" @@ -8599,9 +8805,9 @@ prop-types@^15.0.0, prop-types@^15.5.6, prop-types@^15.6.1, prop-types@^15.6.2, react-is "^16.13.1" property-information@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d" - integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== + version "6.5.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" + integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== proxy-addr@~2.0.7: version "2.0.7" @@ -8612,29 +8818,31 @@ proxy-addr@~2.0.7: ipaddr.js "1.9.1" psl@^1.1.28: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + version "1.15.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" + integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== + dependencies: + punycode "^2.3.1" pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0, punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== dependencies: - side-channel "^1.0.4" + side-channel "^1.0.6" qs@~6.5.2: version "6.5.3" @@ -8678,10 +8886,10 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" http-errors "2.0.0" @@ -8705,12 +8913,12 @@ react-copy-to-clipboard@^5.0.3: prop-types "^15.8.1" react-dom@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" - scheduler "^0.23.0" + scheduler "^0.23.2" react-hotkeys@^2.0.0: version "2.0.0" @@ -8719,10 +8927,10 @@ react-hotkeys@^2.0.0: dependencies: prop-types "^15.6.1" -"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== react-is@^16.13.1: version "16.13.1" @@ -8769,13 +8977,13 @@ react-shallow-renderer@^16.15.0: integrity sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw== react-test-renderer@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.2.0.tgz#1dd912bd908ff26da5b9fca4fd1c489b9523d37e" - integrity sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.3.1.tgz#e693608a1f96283400d4a3afead6893f958b80b4" + integrity sha512-KkAgygexHUkQqtvvx/otwxtuFu5cVjfzTCtjXLH9boS19/Nbtg84zS7wIQn39G8IlrhThBpQsMKkq5ZHZIYFXA== dependencies: - react-is "^18.2.0" + react-is "^18.3.1" react-shallow-renderer "^16.15.0" - scheduler "^0.23.0" + scheduler "^0.23.2" react-toastify@^9.0.4: version "9.1.3" @@ -8795,9 +9003,9 @@ react-transition-group@^4.4.1: prop-types "^15.6.2" react@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" @@ -8849,6 +9057,11 @@ readable-web-to-node-stream@^3.0.0: dependencies: readable-stream "^3.6.0" +readdirp@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" + integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -8871,10 +9084,24 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== +reflect.getprototypeof@^1.0.4, reflect.getprototypeof@^1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.8.tgz#c58afb17a4007b4d1118c07b92c23fca422c5d82" + integrity sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + dunder-proto "^1.0.0" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + gopd "^1.2.0" + which-builtin-type "^1.2.0" + +regenerate-unicode-properties@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" + integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== dependencies: regenerate "^1.4.2" @@ -8883,15 +9110,20 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.3: +regenerator-runtime@^0.13.3: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" @@ -8903,38 +9135,44 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== +regexp.prototype.flags@^1.5.2, regexp.prototype.flags@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" + integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - functions-have-names "^1.2.3" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.2" regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpu-core@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" - integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== +regexpu-core@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.2.0.tgz#0e5190d79e542bf294955dccabae04d3c7d53826" + integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== dependencies: - "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" + regenerate-unicode-properties "^10.2.0" + regjsgen "^0.8.0" + regjsparser "^0.12.0" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc" + integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== dependencies: - jsesc "~0.5.0" + jsesc "~3.0.2" relateurl@^0.2.7: version "0.2.7" @@ -9022,6 +9260,11 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== +require-package-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" + integrity sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q== + requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -9059,21 +9302,21 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.8.1, resolve@^1.9.0: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.4, resolve@^1.8.1, resolve@^1.9.0: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: - is-core-module "^2.11.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.4: - version "2.0.0-next.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" - integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -9130,9 +9373,9 @@ rollup-plugin-terser@^7.0.0: terser "^5.0.0" rollup@^2.43.1: - version "2.79.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" - integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + version "2.79.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.2.tgz#f150e4a5db4b121a21a747d762f701e5e9f49090" + integrity sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ== optionalDependencies: fsevents "~2.3.2" @@ -9162,23 +9405,33 @@ sade@^1.7.3: dependencies: mri "^1.1.0" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" + call-bind "^1.0.6" + es-errors "^1.3.0" is-regex "^1.1.4" safe-regex@^1.1.0: @@ -9204,31 +9457,32 @@ sass-graph@^4.0.1: yargs "^17.2.1" sass-loader@^13.0.0: - version "13.3.1" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.1.tgz#32ee5791434b9b4dbd1adcce76fcb4cea49cc12c" - integrity sha512-cBTxmgyVA1nXPvIK4brjJMXOMJ2v2YrQEuHqLw3LylGb3gsR6jAvdjHMcy/+JGTmmIF9SauTrLLR7bsWDMWqgg== + version "13.3.3" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.3.tgz#60df5e858788cffb1a3215e5b92e9cba61e7e133" + integrity sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA== dependencies: - klona "^2.0.6" neo-async "^2.6.2" sass@^1.52.3: - version "1.62.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.62.1.tgz#caa8d6bf098935bc92fc73fa169fb3790cacd029" - integrity sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A== + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.82.0.tgz#30da277af3d0fa6042e9ceabd0d984ed6d07df70" + integrity sha512-j4GMCTa8elGyN9A7x7bEglx0VgSpNUG4W4wNedQ33wSMdnkqQCT8HTwOaVSV4e6yQovcu/3Oc4coJP/l0xhL2Q== dependencies: - chokidar ">=3.0.0 <4.0.0" - immutable "^4.0.0" + chokidar "^4.0.0" + immutable "^5.0.2" source-map-js ">=0.6.2 <2.0.0" + optionalDependencies: + "@parcel/watcher" "^2.4.1" sax@>=0.6.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" @@ -9241,19 +9495,19 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" - integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" schema-utils@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.1.tgz#eb2d042df8b01f4b5c276a2dfd41ba0faab72e8d" - integrity sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ== + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== dependencies: "@types/json-schema" "^7.0.9" ajv "^8.9.0" @@ -9274,33 +9528,32 @@ select-hose@^2.0.0: integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== selfsigned@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== dependencies: + "@types/node-forge" "^1.3.0" node-forge "^1" "semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: - version "7.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" - integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== - dependencies: - lru-cache "^6.0.0" +semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== dependencies: debug "2.6.9" depd "2.0.0" @@ -9324,9 +9577,9 @@ serialize-javascript@^4.0.0: randombytes "^2.1.0" serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" @@ -9343,21 +9596,43 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== dependencies: - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.18.0" + send "0.19.0" set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" @@ -9414,33 +9689,34 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.7.3: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== +shell-quote@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" + integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -sirv@^1.0.7: - version "1.0.19" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" - integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== +sirv@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" + integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== dependencies: - "@polka/url" "^1.0.0-next.20" - mrmime "^1.0.0" - totalist "^1.0.0" + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" sisteransi@^1.0.5: version "1.0.5" @@ -9525,11 +9801,11 @@ socks-proxy-agent@^6.0.0: socks "^2.6.2" socks@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + version "2.8.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" + integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== dependencies: - ip "^2.0.0" + ip-address "^9.0.5" smart-buffer "^4.2.0" source-list-map@^2.0.0: @@ -9537,10 +9813,10 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map-resolve@^0.5.0: version "0.5.3" @@ -9615,9 +9891,9 @@ spdx-correct@^3.0.0: spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: version "3.0.1" @@ -9628,9 +9904,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== + version "3.0.20" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89" + integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== spdy-transport@^3.0.0: version "3.0.0" @@ -9667,15 +9943,20 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + version "1.18.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -9726,13 +10007,6 @@ stdout-stream@^1.4.0: dependencies: readable-stream "^2.0.1" -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== - dependencies: - internal-slot "^1.0.4" - strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -9781,46 +10055,68 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" - integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" +string.prototype.includes@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz#eceef21283640761a81dbe16d6c7171a4edf7d92" + integrity sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + +string.prototype.matchall@^4.0.11, string.prototype.matchall@^4.0.6: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.3" - side-channel "^1.0.4" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.1.3" + es-abstract "^1.17.5" -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" string_decoder@^1.1.1: version "1.3.0" @@ -9910,7 +10206,7 @@ strip-json-comments@^2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -9924,14 +10220,14 @@ strtok3@^6.2.4: peek-readable "^4.1.0" style-loader@^3.3.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff" - integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== + version "3.3.4" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7" + integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== style-to-object@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.1.tgz#53cf856f7cf7f172d72939d9679556469ba5de37" - integrity sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw== + version "0.4.4" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" + integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== dependencies: inline-style-parser "0.1.1" @@ -9985,9 +10281,9 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tar@^6.0.2, tar@^6.1.2: - version "6.1.15" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" - integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -10019,24 +10315,24 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" -terser-webpack-plugin@^5.3.7: - version "5.3.9" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" - integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== +terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== dependencies: - "@jridgewell/trace-mapping" "^0.3.17" + "@jridgewell/trace-mapping" "^0.3.20" jest-worker "^27.4.5" schema-utils "^3.1.1" serialize-javascript "^6.0.1" - terser "^5.16.8" + terser "^5.26.0" -terser@^5.0.0, terser@^5.10.0, terser@^5.16.8: - version "5.17.6" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.6.tgz#d810e75e1bb3350c799cd90ebefe19c9412c12de" - integrity sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ== +terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: + version "5.37.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.37.0.tgz#38aa66d1cfc43d0638fab54e43ff8a4f72a21ba3" + integrity sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA== dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" commander "^2.20.0" source-map-support "~0.5.20" @@ -10086,11 +10382,6 @@ tmpl@1.0.5: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -10141,10 +10432,10 @@ token-types@^4.1.1: "@tokenizer/token" "^0.3.0" ieee754 "^1.2.1" -totalist@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" - integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== tough-cookie@~2.5.0: version "2.5.0" @@ -10177,9 +10468,9 @@ trim-newlines@^3.0.0: integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== trough@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" - integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== + version "2.2.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== "true-case-path@^1.0.2": version "1.0.3" @@ -10188,10 +10479,10 @@ trough@^2.0.0: dependencies: glob "^7.1.2" -tsconfig-paths@^3.14.1: - version "3.14.2" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" - integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.2" @@ -10204,9 +10495,9 @@ tslib@^1.8.1, tslib@^1.9.0: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.3: - version "2.5.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" - integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== tsutils@^3.21.0: version "3.21.0" @@ -10284,14 +10575,50 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz#3fa9f22567700cc86aaf86a1e7176f74b59600f2" + integrity sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + reflect.getprototypeof "^1.0.6" + +typed-array-length@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== + dependencies: + call-bind "^1.0.7" for-each "^0.3.3" - is-typed-array "^1.1.9" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" typescript@^4.7.3: version "4.9.5" @@ -10308,10 +10635,15 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" + integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" @@ -10322,9 +10654,9 @@ unicode-match-property-ecmascript@^2.0.0: unicode-property-aliases-ecmascript "^2.0.0" unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71" + integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" @@ -10419,9 +10751,9 @@ unist-util-visit@^4.0.0: unist-util-visit-parents "^5.1.1" universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" @@ -10441,13 +10773,13 @@ upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== +update-browserslist-db@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.2.0" + picocolors "^1.1.0" uri-js@^4.2.2: version "4.4.1" @@ -10516,13 +10848,13 @@ uvu@^0.5.0: sade "^1.7.3" v8-to-istanbul@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" - integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== + version "9.3.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" + convert-source-map "^2.0.0" validate-npm-package-license@^3.0.1: version "3.0.4" @@ -10571,10 +10903,10 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== +watchpack@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -10597,19 +10929,21 @@ webidl-conversions@^4.0.2: integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== webpack-bundle-analyzer@^4.4.1: - version "4.8.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz#951b8aaf491f665d2ae325d8b84da229157b1d04" - integrity sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg== + version "4.10.2" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz#633af2862c213730be3dbdf40456db171b60d5bd" + integrity sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw== dependencies: "@discoveryjs/json-ext" "0.5.7" acorn "^8.0.4" acorn-walk "^8.0.0" - chalk "^4.1.0" commander "^7.2.0" + debounce "^1.2.1" + escape-string-regexp "^4.0.0" gzip-size "^6.0.0" - lodash "^4.17.20" + html-escaper "^2.0.2" opener "^1.5.2" - sirv "^1.0.7" + picocolors "^1.0.0" + sirv "^2.0.3" ws "^7.3.1" webpack-bundle-size-analyzer@^3.1.0: @@ -10639,10 +10973,10 @@ webpack-cli@^4.10.0: rechoir "^0.7.0" webpack-merge "^5.7.3" -webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== +webpack-dev-middleware@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517" + integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== dependencies: colorette "^2.0.10" memfs "^3.4.3" @@ -10651,9 +10985,9 @@ webpack-dev-middleware@^5.3.1: schema-utils "^4.0.0" webpack-dev-server@^4.9.2: - version "4.15.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz#87ba9006eca53c551607ea0d663f4ae88be7af21" - integrity sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ== + version "4.15.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz#9e0c70a42a012560860adb186986da1248333173" + integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -10661,7 +10995,7 @@ webpack-dev-server@^4.9.2: "@types/serve-index" "^1.9.1" "@types/serve-static" "^1.13.10" "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" + "@types/ws" "^8.5.5" ansi-html-community "^0.0.8" bonjour-service "^1.0.11" chokidar "^3.5.3" @@ -10683,15 +11017,16 @@ webpack-dev-server@^4.9.2: serve-index "^1.9.1" sockjs "^0.3.24" spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" + webpack-dev-middleware "^5.3.4" ws "^8.13.0" webpack-merge@^5.7.3: - version "5.9.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826" - integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== dependencies: clone-deep "^4.0.1" + flat "^5.0.2" wildcard "^2.0.0" webpack-pwa-manifest@^4.3.0: @@ -10717,33 +11052,32 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.73.0: - version "5.85.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.85.0.tgz#c14a6a3a91f84d67c450225661fda8da36bc7f49" - integrity sha512-7gazTiYqwo5OSqwH1tigLDL2r3qDeP2dOKYgd+LlXpsUMqDTklg6tOghexqky0/+6QY38kb/R/uRPUleuL43zg== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.0" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" - acorn "^8.7.1" - acorn-import-assertions "^1.9.0" - browserslist "^4.14.5" + version "5.97.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.97.1.tgz#972a8320a438b56ff0f1d94ade9e82eac155fa58" + integrity sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg== + dependencies: + "@types/eslint-scope" "^3.7.7" + "@types/estree" "^1.0.6" + "@webassemblyjs/ast" "^1.14.1" + "@webassemblyjs/wasm-edit" "^1.14.1" + "@webassemblyjs/wasm-parser" "^1.14.1" + acorn "^8.14.0" + browserslist "^4.24.0" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.14.1" + enhanced-resolve "^5.17.1" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" + graceful-fs "^4.2.11" json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.2" + schema-utils "^3.2.0" tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" - watchpack "^2.4.0" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" webpack-sources "^3.2.3" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: @@ -10778,42 +11112,60 @@ whatwg-url@^7.0.0: webidl-conversions "^4.0.2" which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz#2d850d6c4ac37b95441a67890e19f3fda8b6c6d9" + integrity sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng== dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" + is-bigint "^1.1.0" + is-boolean-object "^1.2.0" + is-number-object "^1.1.0" + is-string "^1.1.0" + is-symbol "^1.1.0" -which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== +which-builtin-type@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.0.tgz#58042ac9602d78a6d117c7e811349df1268ba63c" + integrity sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA== + dependencies: + call-bind "^1.0.7" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.2" + which-typed-array "^1.1.15" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" which-module@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.16" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.16.tgz#db4db429c4706feca2f01677a144278e4a8c216b" + integrity sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" + has-tostringtag "^1.0.2" which@^1.2.9: version "1.3.1" @@ -10841,10 +11193,10 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word-wrap@^1.2.5, word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== workbox-background-sync@6.6.1: version "6.6.1" @@ -11053,14 +11405,14 @@ write@1.0.3: mkdirp "^0.5.1" ws@^7.3.1: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== ws@^8.13.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== xhr@^2.0.1: version "2.6.0" @@ -11077,10 +11429,10 @@ xml-parse-from-string@^1.0.0: resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" integrity sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g== -xml2js@^0.4.5: - version "0.4.23" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== +xml2js@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7" + integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA== dependencies: sax ">=0.6.0" xmlbuilder "~11.0.0" diff --git a/start-site-verification/pom.xml b/start-site-verification/pom.xml index 911947c8e8..55da66153b 100644 --- a/start-site-verification/pom.xml +++ b/start-site-verification/pom.xml @@ -11,10 +11,6 @@ start-site-verification start.spring.io website verification - - 1.8.2 - - io.spring.start @@ -32,22 +28,13 @@ - - - - - org.apache.maven.resolver - maven-resolver-connector-basic - ${maven-resolver.version} - - - org.apache.maven.resolver - maven-resolver-transport-http - ${maven-resolver.version} - - - + + io.spring.start + test-support + test + + diff --git a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java index 72f3f20325..b52007e4c6 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java +++ b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,27 +16,28 @@ package io.spring.start.site; -import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; import java.util.stream.Stream; import io.spring.initializr.metadata.BillOfMaterials; +import io.spring.start.testsupport.Homes; import org.apache.maven.repository.internal.MavenRepositorySystemUtils; import org.eclipse.aether.DefaultRepositorySystemSession; import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.artifact.DefaultArtifact; import org.eclipse.aether.collection.CollectRequest; +import org.eclipse.aether.collection.CollectResult; +import org.eclipse.aether.collection.DependencyCollectionException; import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory; import org.eclipse.aether.graph.Dependency; +import org.eclipse.aether.graph.DependencyFilter; +import org.eclipse.aether.graph.DependencyNode; +import org.eclipse.aether.graph.DependencyVisitor; import org.eclipse.aether.impl.DefaultServiceLocator; import org.eclipse.aether.internal.impl.DefaultRepositorySystem; import org.eclipse.aether.repository.LocalRepository; @@ -45,60 +46,45 @@ import org.eclipse.aether.repository.RepositoryPolicy; import org.eclipse.aether.resolution.ArtifactDescriptorException; import org.eclipse.aether.resolution.ArtifactDescriptorRequest; -import org.eclipse.aether.resolution.ArtifactResult; -import org.eclipse.aether.resolution.DependencyRequest; -import org.eclipse.aether.resolution.DependencyResolutionException; -import org.eclipse.aether.resolution.DependencyResult; import org.eclipse.aether.spi.connector.RepositoryConnectorFactory; -import org.eclipse.aether.spi.connector.transport.GetTask; -import org.eclipse.aether.spi.connector.transport.PeekTask; -import org.eclipse.aether.spi.connector.transport.PutTask; -import org.eclipse.aether.spi.connector.transport.Transporter; import org.eclipse.aether.spi.connector.transport.TransporterFactory; import org.eclipse.aether.spi.locator.ServiceLocator; -import org.eclipse.aether.transfer.NoTransporterException; +import org.eclipse.aether.transfer.AbstractTransferListener; +import org.eclipse.aether.transfer.TransferEvent; +import org.eclipse.aether.transfer.TransferResource; import org.eclipse.aether.transport.http.HttpTransporterFactory; import org.eclipse.aether.util.artifact.JavaScopes; import org.eclipse.aether.util.filter.DependencyFilterUtils; +import org.eclipse.aether.util.graph.visitor.FilteringDependencyVisitor; import org.eclipse.aether.util.repository.SimpleArtifactDescriptorPolicy; - -import org.springframework.util.FileSystemUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; final class DependencyResolver { - private static final Collection instances = new ArrayList<>(); - - private static final ThreadLocal instanceForThread = ThreadLocal.withInitial(() -> { - DependencyResolver instance = new DependencyResolver(); - instances.add(instance); - return instance; - }); - - private static final RepositoryPolicy repositoryPolicy = new RepositoryPolicy(true, - RepositoryPolicy.UPDATE_POLICY_NEVER, RepositoryPolicy.CHECKSUM_POLICY_IGNORE); + private static final Logger LOGGER = LoggerFactory.getLogger(DependencyResolver.class); static final RemoteRepository mavenCentral = createRemoteRepository("central", "https://repo1.maven.org/maven2", false); private static final Map> managedDependencies = new ConcurrentHashMap<>(); - private final Path localRepositoryLocation; - private final RepositorySystemSession repositorySystemSession; private final RepositorySystem repositorySystem; - DependencyResolver() { + DependencyResolver(Path localRepositoryLocation) { try { ServiceLocator serviceLocator = createServiceLocator(); DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); + session.setTransferListener(new Slf4jTransferListener()); session.setArtifactDescriptorPolicy(new SimpleArtifactDescriptorPolicy(false, false)); - this.localRepositoryLocation = Files.createTempDirectory("metadata-validation-m2"); - LocalRepository localRepository = new LocalRepository(this.localRepositoryLocation.toFile()); + LocalRepository localRepository = new LocalRepository(localRepositoryLocation.toFile()); this.repositorySystem = serviceLocator.getService(RepositorySystem.class); session .setLocalRepositoryManager(this.repositorySystem.newLocalRepositoryManager(session, localRepository)); session.setUserProperties(System.getProperties()); + session.setIgnoreArtifactDescriptorRepositories(true); session.setReadOnly(); this.repositorySystemSession = session; } @@ -107,71 +93,52 @@ final class DependencyResolver { } } + private static RepositoryPolicy repositoryPolicy(boolean enabled) { + return new RepositoryPolicy(enabled, RepositoryPolicy.UPDATE_POLICY_NEVER, + RepositoryPolicy.CHECKSUM_POLICY_IGNORE); + } + static RemoteRepository createRemoteRepository(String id, String url, boolean snapshot) { Builder repositoryBuilder = new Builder(id, "default", url); - if (snapshot) { - repositoryBuilder.setSnapshotPolicy(repositoryPolicy); - } - else { - repositoryBuilder.setReleasePolicy(repositoryPolicy); - } + repositoryBuilder.setSnapshotPolicy(repositoryPolicy(snapshot)); + repositoryBuilder.setReleasePolicy(repositoryPolicy(!snapshot)); return repositoryBuilder.build(); } - static List resolveDependencies(String groupId, String artifactId, String version, + static List resolveDependencies(Homes homes, String groupId, String artifactId, String version, List boms, List repositories) { - DependencyResolver instance = instanceForThread.get(); - List managedDependencies = instance.getManagedDependencies(boms, repositories); + DependencyResolver resolver = new DependencyResolver(homes.get().resolve("repository")); + List managedDependencies = resolver.getManagedDependencies(boms, repositories); Dependency aetherDependency = new Dependency(new DefaultArtifact(groupId, artifactId, "pom", - instance.getVersion(groupId, artifactId, version, managedDependencies)), "compile"); - CollectRequest collectRequest = new CollectRequest((org.eclipse.aether.graph.Dependency) null, - Collections.singletonList(aetherDependency), repositories); + resolver.getVersion(groupId, artifactId, version, managedDependencies)), "compile"); + CollectRequest collectRequest = new CollectRequest(aetherDependency, repositories); collectRequest.setManagedDependencies(managedDependencies); - DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, - DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE, JavaScopes.RUNTIME)); try { - return instance.resolveDependencies(dependencyRequest) - .getArtifactResults() - .stream() - .map(ArtifactResult::getArtifact) - .map((artifact) -> artifact.getGroupId() + ":" + artifact.getArtifactId()) - .collect(Collectors.toList()); + CollectResult result = resolver.collectDependencies(collectRequest); + return DependencyCollector.collect(result.getRoot(), RuntimeTransitiveOnlyDependencyFilter.INSTANCE); } - catch (DependencyResolutionException ex) { + catch (DependencyCollectionException ex) { throw new RuntimeException(ex); } } - static void cleanUp() { - instances.forEach(DependencyResolver::deleteLocalRepository); - } - - void deleteLocalRepository() { - try { - FileSystemUtils.deleteRecursively(this.localRepositoryLocation); - } - catch (IOException ex) { - // Continue - } - } - private List getManagedDependencies(List boms, List repositories) { return boms.stream() .flatMap((bom) -> getManagedDependencies(bom.getGroupId(), bom.getArtifactId(), bom.getVersion(), repositories)) - .collect(Collectors.toList()); + .toList(); } private Stream getManagedDependencies(String groupId, String artifactId, String version, List repositories) { String key = groupId + ":" + artifactId + ":" + version; - List managedDependencies = DependencyResolver.managedDependencies - .computeIfAbsent(key, (coords) -> resolveManagedDependencies(groupId, artifactId, version, repositories)); + List managedDependencies = DependencyResolver.managedDependencies.computeIfAbsent(key, + (coords) -> resolveManagedDependencies(groupId, artifactId, version, repositories)); return managedDependencies.stream(); } - private List resolveManagedDependencies(String groupId, String artifactId, - String version, List repositories) { + private List resolveManagedDependencies(String groupId, String artifactId, String version, + List repositories) { try { return this.repositorySystem .readArtifactDescriptor(this.repositorySystemSession, @@ -184,19 +151,15 @@ private List resolveManagedDependencies(Str } } - private DependencyResult resolveDependencies(DependencyRequest dependencyRequest) - throws DependencyResolutionException { - DependencyResult resolved = this.repositorySystem.resolveDependencies(this.repositorySystemSession, - dependencyRequest); - return resolved; + private CollectResult collectDependencies(CollectRequest dependencyRequest) throws DependencyCollectionException { + return this.repositorySystem.collectDependencies(this.repositorySystemSession, dependencyRequest); } - private String getVersion(String groupId, String artifactId, String version, - List managedDependencies) { + private String getVersion(String groupId, String artifactId, String version, List managedDependencies) { if (version != null) { return version; } - for (org.eclipse.aether.graph.Dependency managedDependency : managedDependencies) { + for (Dependency managedDependency : managedDependencies) { if (groupId.equals(managedDependency.getArtifact().getGroupId()) && artifactId.equals(managedDependency.getArtifact().getArtifactId())) { return managedDependency.getArtifact().getVersion(); @@ -209,61 +172,72 @@ private static ServiceLocator createServiceLocator() { DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator(); locator.addService(RepositorySystem.class, DefaultRepositorySystem.class); locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class); - locator.addService(TransporterFactory.class, DependencyResolver.JarSkippingHttpTransporterFactory.class); + locator.addService(TransporterFactory.class, HttpTransporterFactory.class); return locator; } - private static class JarSkippingHttpTransporterFactory implements TransporterFactory { + static class DependencyCollector implements DependencyVisitor { + + private final List dependencies = new ArrayList<>(); - private final HttpTransporterFactory delegate = new HttpTransporterFactory(); + static List collect(DependencyNode node, DependencyFilter filter) { + DependencyCollector collector = new DependencyCollector(); + node.accept(new FilteringDependencyVisitor(collector, filter)); + return collector.dependencies; + } @Override - public Transporter newInstance(RepositorySystemSession session, RemoteRepository repository) - throws NoTransporterException { - return new JarGetSkippingTransporter(this.delegate.newInstance(session, repository)); + public boolean visitEnter(DependencyNode node) { + return this.dependencies.add(node.getDependency().getArtifact().getGroupId() + ":" + + node.getDependency().getArtifact().getArtifactId()); } @Override - public float getPriority() { - return 5.0f; + public boolean visitLeave(DependencyNode node) { + return true; } - private static final class JarGetSkippingTransporter implements Transporter { + } - private final Transporter delegate; + static class RuntimeTransitiveOnlyDependencyFilter implements DependencyFilter { - private JarGetSkippingTransporter(Transporter delegate) { - this.delegate = delegate; - } + private static final RuntimeTransitiveOnlyDependencyFilter INSTANCE = new RuntimeTransitiveOnlyDependencyFilter(); - @Override - public int classify(Throwable error) { - return this.delegate.classify(error); - } + private final DependencyFilter runtimeFilter = DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE, + JavaScopes.RUNTIME); - @Override - public void peek(PeekTask task) throws Exception { - this.delegate.peek(task); - } + @Override + public boolean accept(DependencyNode node, List parents) { + return !node.getDependency().isOptional() && this.runtimeFilter.accept(node, parents); + } - @Override - public void get(GetTask task) throws Exception { - if (task.getLocation().getPath().endsWith(".jar")) { - return; - } - this.delegate.get(task); - } + } - @Override - public void put(PutTask task) throws Exception { - this.delegate.put(task); - } + private static final class Slf4jTransferListener extends AbstractTransferListener { - @Override - public void close() { - this.delegate.close(); - } + @Override + public void transferStarted(TransferEvent event) { + LOGGER.info("Started downloading {}", resourceToString(event.getResource())); + } + + @Override + public void transferCorrupted(TransferEvent event) { + LOGGER.warn("Found corrupted download {}", resourceToString(event.getResource())); + } + + @Override + public void transferSucceeded(TransferEvent event) { + LOGGER.info("Done downloading {} bytes for {}", event.getTransferredBytes(), + resourceToString(event.getResource())); + } + + @Override + public void transferFailed(TransferEvent event) { + LOGGER.info("Failed downloading {}", resourceToString(event.getResource())); + } + private String resourceToString(TransferResource resource) { + return resource.getRepositoryUrl() + resource.getResourceName(); } } diff --git a/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java b/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java index 7d689ebea6..81a46c6fb6 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java +++ b/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,14 +16,12 @@ package io.spring.start.site; -import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Consumer; -import java.util.stream.Collectors; import java.util.stream.Stream; import io.spring.initializr.generator.version.Version; @@ -35,8 +33,8 @@ import io.spring.initializr.metadata.InitializrMetadata; import io.spring.initializr.metadata.InitializrMetadataProvider; import io.spring.initializr.metadata.Repository; +import io.spring.start.testsupport.Homes; import org.eclipse.aether.repository.RemoteRepository; -import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.parallel.Execution; @@ -47,6 +45,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; import static org.assertj.core.api.Assertions.assertThat; @@ -58,19 +57,15 @@ @SpringBootTest @TestInstance(Lifecycle.PER_CLASS) @Execution(ExecutionMode.CONCURRENT) +@ActiveProfiles("test") class MetadataVerificationTests { private final InitializrMetadata metadata; - MetadataVerificationTests(@Autowired InitializrMetadataProvider metadataProvider) throws IOException { + MetadataVerificationTests(@Autowired InitializrMetadataProvider metadataProvider) { this.metadata = metadataProvider.get(); } - @AfterAll - static void cleanUp() { - DependencyResolver.cleanUp(); - } - @ParameterizedTest(name = "{3}") @MethodSource("parameters") void dependencyStarterConfigurationIsCorrect(Dependency dependency, List boms, @@ -88,24 +83,8 @@ void dependencyStarterConfigurationIsCorrect(Dependency dependency, List collectDependencies(Dependency dependency, List boms, List repositories) { - try { - return DependencyResolver.resolveDependencies(dependency.getGroupId(), dependency.getArtifactId(), - dependency.getVersion(), boms, repositories); - } - catch (RuntimeException ex) { - // ActiveMQ starter does not exist with Spring Boot 3.0 - if (ex.getMessage().contains("rg.springframework.boot:spring-boot-starter-activemq:pom:")) { - return null; - } - // Known issue with Spring Cloud Contract to be fixed in the next release - // See - // https://github.com/spring-cloud/spring-cloud-contract/commit/13c7d477fbbc856b319600874a11aabcef283df7 - if (ex.getMessage() - .contains("org.springframework.cloud:spring-cloud-starter-contract-verifier:pom:2.2.3.RELEASE")) { - return null; - } - throw ex; - } + return DependencyResolver.resolveDependencies(Homes.MAVEN, dependency.getGroupId(), dependency.getArtifactId(), + dependency.getVersion(), boms, repositories); } Stream parameters() { @@ -159,11 +138,12 @@ private List getRepositories(Dependency dependency, Version bo } if (bootVersion.getQualifier() != null) { String qualifier = bootVersion.getQualifier().getId(); - if (!qualifier.equals("RELEASE")) { + if (qualifier.contains("SNAPSHOT")) { + repositories.computeIfAbsent("spring-snapshots", this::repositoryForId); + repositories.computeIfAbsent("spring-milestones", this::repositoryForId); + } + else if (qualifier.equals("M")) { repositories.computeIfAbsent("spring-milestones", this::repositoryForId); - if (qualifier.contains("SNAPSHOT")) { - repositories.computeIfAbsent("spring-snapshots", this::repositoryForId); - } } } return new ArrayList<>(repositories.values()); @@ -181,7 +161,7 @@ private Collection bootVersions() { .stream() .map(DefaultMetadataElement::getId) .map(VersionParser.DEFAULT::parse) - .collect(Collectors.toList()); + .toList(); } private Collection groups() { @@ -189,10 +169,7 @@ private Collection groups() { } private Collection dependenciesForBootVersion(DependencyGroup group, Version bootVersion) { - return group.getContent() - .stream() - .filter((dependency) -> dependency.match(bootVersion)) - .collect(Collectors.toList()); + return group.getContent().stream().filter((dependency) -> dependency.match(bootVersion)).toList(); } } diff --git a/start-site-verification/src/test/resources/application-test.yml b/start-site-verification/src/test/resources/application-test.yml new file mode 100644 index 0000000000..604ee888f6 --- /dev/null +++ b/start-site-verification/src/test/resources/application-test.yml @@ -0,0 +1,3 @@ +application: + maven-version-resolver: + cache-directory: "${START_SPRING_IO_TMPDIR:${java.io.tmpdir}}/maven-version-resolver-cache" diff --git a/start-site-verification/src/test/resources/junit-platform.properties b/start-site-verification/src/test/resources/junit-platform.properties index 1d27b78fbb..5c068dfbba 100644 --- a/start-site-verification/src/test/resources/junit-platform.properties +++ b/start-site-verification/src/test/resources/junit-platform.properties @@ -1 +1,19 @@ +# +# Copyright 2012-2024 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + junit.jupiter.execution.parallel.enabled=true +junit.jupiter.execution.parallel.config.strategy=custom +junit.jupiter.execution.parallel.config.custom.class=io.spring.start.testsupport.JunitMaxParallelismStrategy diff --git a/start-site/pom.xml b/start-site/pom.xml index e75d6d8959..044ab775b6 100644 --- a/start-site/pom.xml +++ b/start-site/pom.xml @@ -1,4 +1,20 @@ + + @@ -54,6 +70,12 @@ jakarta + + com.azure.spring + spring-cloud-azure-starter-keyvault-secrets + runtime + + org.springframework.boot spring-boot-devtools @@ -70,6 +92,11 @@ initializr-generator-test test + + io.spring.start + test-support + test + diff --git a/start-site/src/main/java/io/spring/start/site/StartApplication.java b/start-site/src/main/java/io/spring/start/site/StartApplication.java index d851f51eb8..757acc26e7 100644 --- a/start-site/src/main/java/io/spring/start/site/StartApplication.java +++ b/start-site/src/main/java/io/spring/start/site/StartApplication.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,23 +18,28 @@ import java.io.IOException; import java.nio.file.Files; +import java.nio.file.Path; import com.fasterxml.jackson.databind.ObjectMapper; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; import io.spring.start.site.container.SimpleDockerServiceResolver; import io.spring.start.site.project.ProjectDescriptionCustomizerConfiguration; -import io.spring.start.site.support.CacheableDependencyManagementVersionResolver; +import io.spring.start.site.support.CacheableMavenVersionResolver; import io.spring.start.site.support.StartInitializrMetadataUpdateStrategy; import io.spring.start.site.web.HomeController; import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; +import org.springframework.http.HttpHeaders; import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.util.StringUtils; +import org.springframework.web.client.RestTemplate; /** * Initializr website application. @@ -46,6 +51,7 @@ @Import(ProjectDescriptionCustomizerConfiguration.class) @EnableCaching @EnableAsync +@EnableConfigurationProperties(StartConfigurationProperties.class) public class StartApplication { public static void main(String[] args) { @@ -60,13 +66,22 @@ public HomeController homeController() { @Bean public StartInitializrMetadataUpdateStrategy initializrMetadataUpdateStrategy( RestTemplateBuilder restTemplateBuilder, ObjectMapper objectMapper) { - return new StartInitializrMetadataUpdateStrategy(restTemplateBuilder.build(), objectMapper); + RestTemplate restTemplate = restTemplateBuilder.defaultHeader(HttpHeaders.USER_AGENT, "start.spring.io") + .build(); + return new StartInitializrMetadataUpdateStrategy(restTemplate, objectMapper); } @Bean - public DependencyManagementVersionResolver dependencyManagementVersionResolver() throws IOException { - return new CacheableDependencyManagementVersionResolver(DependencyManagementVersionResolver - .withCacheLocation(Files.createTempDirectory("version-resolver-cache-"))); + public CacheableMavenVersionResolver mavenVersionResolver(StartConfigurationProperties properties) + throws IOException { + Path location; + if (StringUtils.hasText(properties.getMavenVersionResolver().getCacheDirectory())) { + location = Path.of(properties.getMavenVersionResolver().getCacheDirectory()); + } + else { + location = Files.createTempDirectory("version-resolver-cache-"); + } + return new CacheableMavenVersionResolver(MavenVersionResolver.withCacheLocation(location)); } @Bean diff --git a/start-site/src/main/java/io/spring/start/site/StartConfigurationProperties.java b/start-site/src/main/java/io/spring/start/site/StartConfigurationProperties.java new file mode 100644 index 0000000000..0ab293cfa2 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/StartConfigurationProperties.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * Configuration properties for the application. + * + * @author Moritz Halbritter + */ +@ConfigurationProperties(prefix = "application") +public class StartConfigurationProperties { + + /** + * Configuration for the Maven version resolver. + */ + private final MavenVersionResolver mavenVersionResolver = new MavenVersionResolver(); + + public MavenVersionResolver getMavenVersionResolver() { + return this.mavenVersionResolver; + } + + public static class MavenVersionResolver { + + /** + * Directory to use for the cache. If not set, a newly created temporary directory + * will be used. + */ + private String cacheDirectory; + + public String getCacheDirectory() { + return this.cacheDirectory; + } + + public void setCacheDirectory(String cacheDirectory) { + this.cacheDirectory = cacheDirectory; + } + + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/container/DockerService.java b/start-site/src/main/java/io/spring/start/site/container/DockerService.java index d7ec540b98..b730acb366 100644 --- a/start-site/src/main/java/io/spring/start/site/container/DockerService.java +++ b/start-site/src/main/java/io/spring/start/site/container/DockerService.java @@ -16,16 +16,21 @@ package io.spring.start.site.container; +import java.util.Arrays; +import java.util.Collection; +import java.util.Set; +import java.util.TreeSet; import java.util.function.Consumer; -import io.spring.initializr.generator.container.docker.compose.ComposeService.Builder; +import io.spring.initializr.generator.container.docker.compose.ComposeService; /** * Description of a Docker service. * * @author Stephane Nicoll + * @author Chris Bono */ -public class DockerService implements Consumer { +public final class DockerService implements Consumer { private final String image; @@ -33,13 +38,25 @@ public class DockerService implements Consumer { private final String website; + private final String command; + private final int[] ports; - DockerService(String image, String imageTag, String website, int... ports) { - this.image = image; - this.imageTag = imageTag; - this.website = website; - this.ports = ports; + private DockerService(Builder builder) { + this.image = builder.image; + this.imageTag = builder.imageTag; + this.website = builder.website; + this.command = builder.command; + this.ports = builder.ports.stream().mapToInt(Integer::intValue).toArray(); + } + + /** + * Create a new builder using the specified image and optional tag. + * @param imageAndTag the image (and optional tag) to use for the service + * @return the new builder instance. + */ + public static DockerService.Builder withImageAndTag(String imageAndTag) { + return new DockerService.Builder(imageAndTag); } /** @@ -67,6 +84,14 @@ public String getWebsite() { return this.website; } + /** + * Return the command to use, if any. + * @return the command + */ + public String getCommand() { + return this.command; + } + /** * Return the ports that should be exposed by the service. * @return the ports to expose @@ -76,8 +101,72 @@ public int[] getPorts() { } @Override - public void accept(Builder builder) { - builder.image(this.image).imageTag(this.imageTag).imageWebsite(this.website).ports(this.ports); + public void accept(ComposeService.Builder builder) { + builder.image(this.image) + .imageTag(this.imageTag) + .imageWebsite(this.website) + .command(this.command) + .ports(this.ports); + } + + /** + * Builder for {@link DockerService}. + */ + public static class Builder { + + private String image; + + private String imageTag = "latest"; + + private String website; + + private String command; + + private final Set ports = new TreeSet<>(); + + protected Builder(String imageAndTag) { + String[] split = imageAndTag.split(":", 2); + String tag = (split.length == 1) ? "latest" : split[1]; + image(split[0]).imageTag(tag); + } + + public Builder image(String image) { + this.image = image; + return this; + } + + public Builder imageTag(String imageTag) { + this.imageTag = imageTag; + return this; + } + + public Builder website(String website) { + this.website = website; + return this; + } + + public Builder command(String command) { + this.command = command; + return this; + } + + public Builder ports(Collection ports) { + this.ports.addAll(ports); + return this; + } + + public Builder ports(int... ports) { + return ports(Arrays.stream(ports).boxed().toList()); + } + + /** + * Build a {@link DockerService} with the current state of this builder. + * @return a {@link DockerService} + */ + public DockerService build() { + return new DockerService(this); + } + } } diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index f44c1d2d6f..bd9342b5c3 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,8 @@ * * @author Stephane Nicoll * @author Moritz Halbritter + * @author Chris Bono + * @author Eddú Meléndez */ public class SimpleDockerServiceResolver implements DockerServiceResolver { @@ -32,64 +34,209 @@ public class SimpleDockerServiceResolver implements DockerServiceResolver { public SimpleDockerServiceResolver() { this.dockerServices = new HashMap<>(); - this.dockerServices.put("elasticsearch", elasticsearch()); + this.dockerServices.put("activeMQ", activeMQ()); + this.dockerServices.put("activeMQClassic", activeMQClassic()); + this.dockerServices.put("artemis", artemis()); + this.dockerServices.put("azurite", azurite()); this.dockerServices.put("cassandra", cassandra()); + this.dockerServices.put("chroma", chroma()); + this.dockerServices.put("elasticsearch", elasticsearch()); + this.dockerServices.put("kafka", kafka()); + this.dockerServices.put("kafka-native", kafkaNative()); this.dockerServices.put("mariaDb", mariaDb()); + this.dockerServices.put("milvus", milvus()); this.dockerServices.put("mongoDb", mongoDb()); + this.dockerServices.put("mongoDbAtlas", mongoDbAtlas()); this.dockerServices.put("mysql", mysql()); - this.dockerServices.put("oracle", oracle()); + this.dockerServices.put("neo4j", neo4j()); + this.dockerServices.put("ollama", ollama()); + this.dockerServices.put("oracleFree", oracleFree()); + this.dockerServices.put("pgvector", pgvector()); this.dockerServices.put("postgres", postgres()); + this.dockerServices.put("pulsar", pulsar()); + this.dockerServices.put("qdrant", qdrant()); this.dockerServices.put("rabbit", rabbit()); this.dockerServices.put("redis", redis()); + this.dockerServices.put("redisStack", redisStack()); this.dockerServices.put("sqlServer", sqlServer()); + this.dockerServices.put("weaviate", weaviate()); this.dockerServices.put("zipkin", zipkin()); } + private static DockerService activeMQ() { + return DockerService.withImageAndTag("symptoma/activemq") + .website("https://hub.docker.com/r/symptoma/activemq") + .ports(61616) + .build(); + } + + private static DockerService activeMQClassic() { + return DockerService.withImageAndTag("apache/activemq-classic") + .website("https://hub.docker.com/r/apache/activemq-classic") + .ports(61616) + .build(); + } + + private static DockerService artemis() { + return DockerService.withImageAndTag("apache/activemq-artemis") + .website("https://hub.docker.com/r/apache/activemq-artemis") + .ports(61616) + .build(); + } + + private static DockerService azurite() { + return DockerService.withImageAndTag("mcr.microsoft.com/azure-storage/azurite") + .website("https://github.com/Azure/Azurite?tab=readme-ov-file#dockerhub") + .ports(10000, 10001, 10002) + .build(); + } + + private static DockerService cassandra() { + return DockerService.withImageAndTag("cassandra") + .website("https://hub.docker.com/_/cassandra") + .ports(9042) + .build(); + } + + private static DockerService chroma() { + return DockerService.withImageAndTag("chromadb/chroma") + .website("https://hub.docker.com/r/chromadb/chroma") + .ports(8000) + .build(); + } + private static DockerService elasticsearch() { // They don't provide a 'latest' tag - return new DockerService("docker.elastic.co/elasticsearch/elasticsearch", "7.17.10", - "https://www.docker.elastic.co/r/elasticsearch", 9200, 9300); + return DockerService.withImageAndTag("docker.elastic.co/elasticsearch/elasticsearch:7.17.10") + .website("https://www.docker.elastic.co/r/elasticsearch") + .ports(9200, 9300) + .build(); } - private static DockerService cassandra() { - return new DockerService("cassandra", "latest", "https://hub.docker.com/_/cassandra", 9042); + private static DockerService kafka() { + return DockerService.withImageAndTag("confluentinc/cp-kafka") + .website("https://hub.docker.com/r/confluentinc/cp-kafka") + .ports(9092) + .build(); + } + + private static DockerService kafkaNative() { + return DockerService.withImageAndTag("apache/kafka-native") + .website("https://hub.docker.com/r/apache/kafka-native") + .ports(9092) + .build(); } private static DockerService mariaDb() { - return new DockerService("mariadb", "latest", "https://hub.docker.com/_/mariadb", 3306); + return DockerService.withImageAndTag("mariadb").website("https://hub.docker.com/_/mariadb").ports(3306).build(); + } + + private static DockerService milvus() { + return DockerService.withImageAndTag("milvusdb/milvus") + .website("https://hub.docker.com/r/milvusdb/milvus") + .ports(19530) + .build(); } private static DockerService mongoDb() { - return new DockerService("mongo", "latest", "https://hub.docker.com/_/mongo", 27017); + return DockerService.withImageAndTag("mongo").website("https://hub.docker.com/_/mongo").ports(27017).build(); + } + + private static DockerService mongoDbAtlas() { + return DockerService.withImageAndTag("mongodb/mongodb-atlas-local") + .website("https://hub.docker.com/r/mongodb/mongodb-atlas-local") + .ports(27017) + .build(); } private static DockerService mysql() { - return new DockerService("mysql", "latest", "https://hub.docker.com/_/mysql", 3306); + return DockerService.withImageAndTag("mysql").website("https://hub.docker.com/_/mysql").ports(3306).build(); + } + + private static DockerService neo4j() { + return DockerService.withImageAndTag("neo4j").website("https://hub.docker.com/_/neo4j").ports(7687).build(); + } + + private static DockerService ollama() { + return DockerService.withImageAndTag("ollama/ollama") + .website("https://hub.docker.com/r/ollama/ollama") + .ports(11434) + .build(); + } + + private static DockerService oracleFree() { + return DockerService.withImageAndTag("gvenzl/oracle-free") + .website("https://hub.docker.com/r/gvenzl/oracle-free") + .ports(1521) + .build(); } - private static DockerService oracle() { - return new DockerService("gvenzl/oracle-xe", "latest", "https://hub.docker.com/r/gvenzl/oracle-xe", 1521); + private static DockerService pgvector() { + return DockerService.withImageAndTag("pgvector/pgvector:pg16") + .website("https://hub.docker.com/r/pgvector/pgvector") + .ports(5432) + .build(); } private static DockerService postgres() { - return new DockerService("postgres", "latest", "https://hub.docker.com/_/postgres", 5432); + return DockerService.withImageAndTag("postgres") + .website("https://hub.docker.com/_/postgres") + .ports(5432) + .build(); + } + + private static DockerService pulsar() { + return DockerService.withImageAndTag("apachepulsar/pulsar") + .website("https://hub.docker.com/r/apachepulsar/pulsar") + .command("bin/pulsar standalone") + .ports(8080, 6650) + .build(); + } + + private static DockerService qdrant() { + return DockerService.withImageAndTag("qdrant/qdrant") + .website("https://hub.docker.com/r/qdrant/qdrant") + .ports(6334) + .build(); } private static DockerService rabbit() { - return new DockerService("rabbitmq", "latest", "https://hub.docker.com/_/rabbitmq", 5672); + return DockerService.withImageAndTag("rabbitmq") + .website("https://hub.docker.com/_/rabbitmq") + .ports(5672) + .build(); } private static DockerService redis() { - return new DockerService("redis", "latest", "https://hub.docker.com/_/redis", 6379); + return DockerService.withImageAndTag("redis").website("https://hub.docker.com/_/redis").ports(6379).build(); + } + + private static DockerService redisStack() { + return DockerService.withImageAndTag("redis/redis-stack") + .website("https://hub.docker.com/r/redis/redis-stack") + .ports(6379) + .build(); } private static DockerService sqlServer() { - return new DockerService("mcr.microsoft.com/mssql/server", "latest", - "https://mcr.microsoft.com/en-us/product/mssql/server/about/", 1433); + return DockerService.withImageAndTag("mcr.microsoft.com/mssql/server") + .website("https://mcr.microsoft.com/en-us/product/mssql/server/about/") + .ports(1433) + .build(); + } + + private static DockerService weaviate() { + return DockerService.withImageAndTag("semitechnologies/weaviate") + .website("https://hub.docker.com/r/semitechnologies/weaviate") + .ports(8080) + .build(); } private static DockerService zipkin() { - return new DockerService("openzipkin/zipkin", "latest", "https://hub.docker.com/r/openzipkin/zipkin/", 9411); + return DockerService.withImageAndTag("openzipkin/zipkin") + .website("https://hub.docker.com/r/openzipkin/zipkin/") + .ports(9411) + .build(); } @Override diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java index 525701030d..ecf0796c19 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java @@ -20,8 +20,6 @@ import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; /** * A {@link HelpDocumentCustomizer} that adds reference links for Gradle. @@ -31,15 +29,12 @@ */ class GradleBuildSystemHelpDocumentCustomizer implements HelpDocumentCustomizer { - private static final VersionRange SPRING_BOOT_2_3_OR_LATER = VersionParser.DEFAULT.parseRange("2.3.0.M1"); + private static final String SPRING_BOOT_DOCS_URL = "https://docs.spring.io/spring-boot"; private final Version springBootVersion; - private final boolean buildImageAvailable; - GradleBuildSystemHelpDocumentCustomizer(ProjectDescription description) { this.springBootVersion = description.getPlatformVersion(); - this.buildImageAvailable = SPRING_BOOT_2_3_OR_LATER.match(this.springBootVersion); } @Override @@ -49,16 +44,14 @@ public void customize(HelpDocument document) { "Gradle Build Scans – insights for your project's build"); document.gettingStarted().addReferenceDocLink("https://docs.gradle.org", "Official Gradle documentation"); document.gettingStarted() - .addReferenceDocLink( - String.format("https://docs.spring.io/spring-boot/docs/%s/gradle-plugin/reference/html/", - this.springBootVersion), - "Spring Boot Gradle Plugin Reference Guide"); - if (this.buildImageAvailable) { - document.gettingStarted() - .addReferenceDocLink(String.format( - "https://docs.spring.io/spring-boot/docs/%s/gradle-plugin/reference/html/#build-image", - this.springBootVersion), "Create an OCI image"); - } + .addReferenceDocLink(generateReferenceGuideUrl(), "Spring Boot Gradle Plugin Reference Guide"); + document.gettingStarted() + .addReferenceDocLink(generateReferenceGuideUrl() + "/packaging-oci-image.html", "Create an OCI image"); + } + + private String generateReferenceGuideUrl() { + String baseUrlFormat = SPRING_BOOT_DOCS_URL + "/%s/gradle-plugin"; + return baseUrlFormat.formatted(this.springBootVersion); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleProjectGenerationConfiguration.java index 55567b2495..631bc0a608 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleProjectGenerationConfiguration.java @@ -23,7 +23,7 @@ import io.spring.initializr.generator.spring.build.gradle.DependencyManagementPluginVersionResolver; import io.spring.initializr.generator.spring.build.gradle.InitializrDependencyManagementPluginVersionResolver; import io.spring.initializr.metadata.InitializrMetadata; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; import org.springframework.context.annotation.Bean; @@ -44,7 +44,7 @@ GradleBuildSystemHelpDocumentCustomizer gradleBuildSystemHelpDocumentCustomizer( @Bean DependencyManagementPluginVersionResolver dependencyManagementPluginVersionResolver( - DependencyManagementVersionResolver versionResolver, InitializrMetadata metadata) { + MavenVersionResolver versionResolver, InitializrMetadata metadata) { return new ManagedDependenciesDependencyManagementPluginVersionResolver(versionResolver, (description) -> new InitializrDependencyManagementPluginVersionResolver(metadata) .resolveDependencyManagementPluginVersion(description)); diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolver.java b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolver.java index 1d5236289c..81d1e9a82d 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolver.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolver.java @@ -20,7 +20,7 @@ import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.gradle.DependencyManagementPluginVersionResolver; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; /** * {@link DependencyManagementPluginVersionResolver} that determines the dependency @@ -32,20 +32,20 @@ public class ManagedDependenciesDependencyManagementPluginVersionResolver implements DependencyManagementPluginVersionResolver { - private final DependencyManagementVersionResolver resolver; + private final MavenVersionResolver versionResolver; private final Function fallback; - public ManagedDependenciesDependencyManagementPluginVersionResolver(DependencyManagementVersionResolver resolver, + public ManagedDependenciesDependencyManagementPluginVersionResolver(MavenVersionResolver versionResolver, Function fallback) { - this.resolver = resolver; + this.versionResolver = versionResolver; this.fallback = fallback; } @Override public String resolveDependencyManagementPluginVersion(ProjectDescription description) { - String pluginVersion = this.resolver - .resolve("org.springframework.boot", "spring-boot-dependencies", + String pluginVersion = this.versionResolver + .resolveDependencies("org.springframework.boot", "spring-boot-dependencies", description.getPlatformVersion().toString()) .get("io.spring.gradle:dependency-management-plugin"); return (pluginVersion != null) ? pluginVersion : this.fallback.apply(description); diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/maven/AnnotationProcessorExclusionBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/build/maven/AnnotationProcessorExclusionBuildCustomizer.java index 912549ddad..71e024ef0b 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/maven/AnnotationProcessorExclusionBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/maven/AnnotationProcessorExclusionBuildCustomizer.java @@ -21,9 +21,6 @@ import io.spring.initializr.generator.buildsystem.maven.MavenBuild; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; import io.spring.initializr.metadata.Dependency; import io.spring.initializr.metadata.InitializrMetadata; @@ -35,18 +32,13 @@ */ class AnnotationProcessorExclusionBuildCustomizer implements BuildCustomizer { - private static final VersionRange SPRING_BOOT_2_4_0_M3_0R_LATER = VersionParser.DEFAULT.parseRange("2.4.0-M3"); - private static final List KNOWN_ANNOTATION_PROCESSORS = Collections .singletonList("configuration-processor"); private final InitializrMetadata metadata; - private final boolean hasSmartExclude; - - AnnotationProcessorExclusionBuildCustomizer(InitializrMetadata metadata, Version platformVersion) { + AnnotationProcessorExclusionBuildCustomizer(InitializrMetadata metadata) { this.metadata = metadata; - this.hasSmartExclude = SPRING_BOOT_2_4_0_M3_0R_LATER.match(platformVersion); } @Override @@ -57,7 +49,7 @@ public void customize(MavenBuild build) { List dependencies = build.dependencies() .ids() .filter(this::isAnnotationProcessor) - .filter((id) -> !this.hasSmartExclude || !KNOWN_ANNOTATION_PROCESSORS.contains(id)) + .filter((id) -> !KNOWN_ANNOTATION_PROCESSORS.contains(id)) .map((id) -> build.dependencies().get(id)) .toList(); if (!dependencies.isEmpty()) { diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java index f110e77356..92171bec00 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java @@ -20,8 +20,6 @@ import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; /** * A {@link HelpDocumentCustomizer} that adds reference links for Apache Maven. @@ -31,20 +29,12 @@ */ class MavenBuildSystemHelpDocumentCustomizer implements HelpDocumentCustomizer { - private static final VersionRange SPRING_BOOT_2_3_OR_LATER = VersionParser.DEFAULT.parseRange("2.3.0.M1"); - - private static final VersionRange NEW_DOC_STRUCTURE = VersionParser.DEFAULT.parseRange("2.3.0.M4"); + private static final String SPRING_BOOT_DOCS_URL = "https://docs.spring.io/spring-boot"; private final Version springBootVersion; - private final boolean springBoot23; - - private final boolean newDocStructure; - MavenBuildSystemHelpDocumentCustomizer(ProjectDescription description) { this.springBootVersion = description.getPlatformVersion(); - this.springBoot23 = SPRING_BOOT_2_3_OR_LATER.match(this.springBootVersion); - this.newDocStructure = NEW_DOC_STRUCTURE.match(this.springBootVersion); } @Override @@ -53,19 +43,13 @@ public void customize(HelpDocument document) { .addReferenceDocLink("https://maven.apache.org/guides/index.html", "Official Apache Maven documentation"); String referenceGuideUrl = generateReferenceGuideUrl(); document.gettingStarted().addReferenceDocLink(referenceGuideUrl, "Spring Boot Maven Plugin Reference Guide"); - if (this.springBoot23) { - String buildImageSection = referenceGuideUrl + "#build-image"; - document.gettingStarted().addReferenceDocLink(buildImageSection, "Create an OCI image"); - } + String buildImageSection = referenceGuideUrl + "/build-image.html"; + document.gettingStarted().addReferenceDocLink(buildImageSection, "Create an OCI image"); } private String generateReferenceGuideUrl() { - String baseUrlFormat = "https://docs.spring.io/spring-boot/docs/%s/maven-plugin/"; - if (this.springBoot23) { - String location = (this.newDocStructure) ? "reference/html/" : "html/"; - baseUrlFormat = baseUrlFormat + location; - } - return String.format(baseUrlFormat, this.springBootVersion); + String baseUrlFormat = SPRING_BOOT_DOCS_URL + "/%s/maven-plugin"; + return baseUrlFormat.formatted(this.springBootVersion); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenProjectGenerationConfiguration.java index 2393bf794f..d14e02808d 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,7 @@ * {@link ProjectGenerationConfiguration} for generation of projects that depend on Maven. * * @author Stephane Nicoll + * @author Moritz Halbritter */ @ProjectGenerationConfiguration @ConditionalOnBuildSystem(MavenBuildSystem.ID) @@ -39,9 +40,15 @@ MavenBuildSystemHelpDocumentCustomizer mavenBuildSystemHelpDocumentCustomizer(Pr } @Bean - AnnotationProcessorExclusionBuildCustomizer annotationProcessorExclusionBuildCustomizer(InitializrMetadata metadata, - ProjectDescription description) { - return new AnnotationProcessorExclusionBuildCustomizer(metadata, description.getPlatformVersion()); + AnnotationProcessorExclusionBuildCustomizer annotationProcessorExclusionBuildCustomizer( + InitializrMetadata metadata) { + return new AnnotationProcessorExclusionBuildCustomizer(metadata); + } + + @Bean + RegisterAnnotationProcessorsBuildCustomizer registerAnnotationProcessorsBuildCustomizer(InitializrMetadata metadata, + ProjectDescription projectDescription) { + return new RegisterAnnotationProcessorsBuildCustomizer(metadata, projectDescription); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/maven/RegisterAnnotationProcessorsBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/build/maven/RegisterAnnotationProcessorsBuildCustomizer.java new file mode 100644 index 0000000000..8285940191 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/build/maven/RegisterAnnotationProcessorsBuildCustomizer.java @@ -0,0 +1,83 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.build.maven; + +import java.util.List; + +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.language.java.JavaLanguage; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.spring.build.BuildCustomizer; +import io.spring.initializr.metadata.InitializrMetadata; + +/** + * Register annotation processor dependencies on the Maven compiler plugin. + * + * @author Moritz Halbritter + */ +class RegisterAnnotationProcessorsBuildCustomizer implements BuildCustomizer { + + private final InitializrMetadata metadata; + + private final ProjectDescription projectDescription; + + RegisterAnnotationProcessorsBuildCustomizer(InitializrMetadata metadata, ProjectDescription projectDescription) { + this.metadata = metadata; + this.projectDescription = projectDescription; + } + + @Override + public void customize(MavenBuild build) { + if (!isJava()) { + return; + } + List annotationProcessors = build.dependencies() + .ids() + .filter(this::isAnnotationProcessor) + .map((id) -> build.dependencies().get(id)) + .toList(); + if (annotationProcessors.isEmpty()) { + return; + } + build.plugins().add("org.apache.maven.plugins", "maven-compiler-plugin", (plugin) -> { + plugin.configuration((configuration) -> { + configuration.add("annotationProcessorPaths", (annotationProcessorPaths) -> { + for (Dependency annotationProcessor : annotationProcessors) { + annotationProcessorPaths.add("path", (path) -> { + path.add("groupId", annotationProcessor.getGroupId()); + path.add("artifactId", annotationProcessor.getArtifactId()); + }); + + } + }); + }); + }); + + } + + private boolean isAnnotationProcessor(String id) { + io.spring.initializr.metadata.Dependency dependency = this.metadata.getDependencies().get(id); + return (dependency != null) + && io.spring.initializr.metadata.Dependency.SCOPE_ANNOTATION_PROCESSOR.equals(dependency.getScope()); + } + + private boolean isJava() { + return this.projectDescription.getLanguage().id().equals(JavaLanguage.ID); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java index 22c1c2229e..31dfe75140 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +24,7 @@ import io.spring.initializr.generator.spring.build.BuildMetadataResolver; import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.metadata.InitializrMetadata; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; /** * A project customizer for Kotlin Coroutines. @@ -37,11 +37,11 @@ public class KotlinCoroutinesCustomizer { private final ProjectDescription description; - private final DependencyManagementVersionResolver versionResolver; + private final MavenVersionResolver versionResolver; public KotlinCoroutinesCustomizer(InitializrMetadata metadata, ProjectDescription description, - DependencyManagementVersionResolver versionResolver) { - this.buildResolver = new BuildMetadataResolver(metadata); + MavenVersionResolver versionResolver) { + this.buildResolver = new BuildMetadataResolver(metadata, description.getPlatformVersion()); this.description = description; this.versionResolver = versionResolver; } @@ -56,12 +56,12 @@ public void customize(Build build) { public void customize(HelpDocument document, Build build) { if (hasReactiveFacet(build)) { - Map resolve = this.versionResolver.resolve("org.springframework.boot", + Map resolve = this.versionResolver.resolveDependencies("org.springframework.boot", "spring-boot-dependencies", this.description.getPlatformVersion().toString()); String frameworkVersion = resolve.get("org.springframework:spring-core"); String versionToUse = (frameworkVersion != null) ? frameworkVersion : "current"; String href = String.format( - "https://docs.spring.io/spring/docs/%s/spring-framework-reference/languages.html#coroutines", + "https://docs.spring.io/spring-framework/reference/%s/languages/kotlin/coroutines.html", versionToUse); document.gettingStarted() .addReferenceDocLink(href, "Coroutines section of the Spring Framework Documentation"); diff --git a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinProjectGenerationConfiguration.java index dfd1eec674..54d7310c28 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ import io.spring.initializr.generator.spring.code.kotlin.KotlinVersionResolver; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.initializr.metadata.InitializrMetadata; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -43,16 +43,16 @@ class KotlinProjectGenerationConfiguration { @Bean - KotlinVersionResolver kotlinVersionResolver(DependencyManagementVersionResolver versionResolver, - InitializrMetadata metadata) { + KotlinVersionResolver kotlinVersionResolver(MavenVersionResolver versionResolver, InitializrMetadata metadata) { return new ManagedDependenciesKotlinVersionResolver(versionResolver, (description) -> new InitializrMetadataKotlinVersionResolver(metadata) .resolveKotlinVersion(description)); } @Bean - ReactorKotlinExtensionsCustomizer reactorKotlinExtensionsCustomizer(InitializrMetadata metadata) { - return new ReactorKotlinExtensionsCustomizer(metadata); + ReactorKotlinExtensionsCustomizer reactorKotlinExtensionsCustomizer(InitializrMetadata metadata, + ProjectDescription description) { + return new ReactorKotlinExtensionsCustomizer(metadata, description); } @Configuration @@ -61,7 +61,7 @@ static class KotlinCoroutinesCustomizerConfiguration { private final KotlinCoroutinesCustomizer customizer; KotlinCoroutinesCustomizerConfiguration(InitializrMetadata metadata, ProjectDescription description, - DependencyManagementVersionResolver versionResolver) { + MavenVersionResolver versionResolver) { this.customizer = new KotlinCoroutinesCustomizer(metadata, description, versionResolver); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolver.java b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolver.java index 7357a7d8a5..61574a1ac6 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolver.java +++ b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolver.java @@ -20,7 +20,7 @@ import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.code.kotlin.KotlinVersionResolver; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; /** * {@link KotlinVersionResolver} that determines the Kotlin version using the dependency @@ -31,20 +31,20 @@ */ public class ManagedDependenciesKotlinVersionResolver implements KotlinVersionResolver { - private final DependencyManagementVersionResolver resolver; + private final MavenVersionResolver versionResolver; private final Function fallback; - public ManagedDependenciesKotlinVersionResolver(DependencyManagementVersionResolver resolver, + public ManagedDependenciesKotlinVersionResolver(MavenVersionResolver versionResolver, Function fallback) { - this.resolver = resolver; + this.versionResolver = versionResolver; this.fallback = fallback; } @Override public String resolveKotlinVersion(ProjectDescription description) { - String kotlinVersion = this.resolver - .resolve("org.springframework.boot", "spring-boot-dependencies", + String kotlinVersion = this.versionResolver + .resolveDependencies("org.springframework.boot", "spring-boot-dependencies", description.getPlatformVersion().toString()) .get("org.jetbrains.kotlin:kotlin-reflect"); return (kotlinVersion != null) ? kotlinVersion : this.fallback.apply(description); diff --git a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionsCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionsCustomizer.java index d813c43196..12673ac225 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionsCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionsCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.BuildCustomizer; import io.spring.initializr.generator.spring.build.BuildMetadataResolver; import io.spring.initializr.metadata.InitializrMetadata; @@ -32,8 +33,8 @@ class ReactorKotlinExtensionsCustomizer implements BuildCustomizer { private final BuildMetadataResolver buildResolver; - ReactorKotlinExtensionsCustomizer(InitializrMetadata metadata) { - this.buildResolver = new BuildMetadataResolver(metadata); + ReactorKotlinExtensionsCustomizer(InitializrMetadata metadata, ProjectDescription description) { + this.buildResolver = new BuildMetadataResolver(metadata, description.getPlatformVersion()); } @Override diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java index 45c13da2d8..bc152085c6 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,6 @@ import io.spring.initializr.generator.io.template.MustacheTemplateRenderer; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; -import io.spring.initializr.generator.spring.build.gradle.ConditionalOnGradleVersion; import io.spring.initializr.metadata.InitializrMetadata; import io.spring.start.site.extension.dependency.liquibase.LiquibaseProjectContributor; import io.spring.start.site.extension.dependency.lombok.LombokGradleBuildCustomizer; @@ -30,10 +29,10 @@ import io.spring.start.site.extension.dependency.okta.OktaHelpDocumentCustomizer; import io.spring.start.site.extension.dependency.reactor.ReactorTestBuildCustomizer; import io.spring.start.site.extension.dependency.springbatch.SpringBatchTestBuildCustomizer; -import io.spring.start.site.extension.dependency.springkafka.SpringKafkaBuildCustomizer; import io.spring.start.site.extension.dependency.springsecurity.SpringSecurityRSocketBuildCustomizer; import io.spring.start.site.extension.dependency.springsecurity.SpringSecurityTestBuildCustomizer; import io.spring.start.site.extension.dependency.springsession.SpringSessionBuildCustomizer; +import io.spring.start.site.extension.dependency.springshell.SpringShellTestBuildCustomizer; import io.spring.start.site.extension.dependency.thymeleaf.ThymeleafBuildCustomizer; import org.springframework.context.annotation.Bean; @@ -46,6 +45,7 @@ * @author Stephane Nicoll * @author Eddú Meléndez * @author Kazuki Shimizu + * @author Moritz Halbritter */ @ProjectGenerationConfiguration public class DependencyProjectGenerationConfiguration { @@ -57,8 +57,8 @@ public DependencyProjectGenerationConfiguration(InitializrMetadata metadata) { } @Bean - public ReactorTestBuildCustomizer reactorTestBuildCustomizer() { - return new ReactorTestBuildCustomizer(this.metadata); + public ReactorTestBuildCustomizer reactorTestBuildCustomizer(ProjectDescription description) { + return new ReactorTestBuildCustomizer(this.metadata, description); } @Bean @@ -67,6 +67,12 @@ public SpringSecurityTestBuildCustomizer securityTestBuildCustomizer() { return new SpringSecurityTestBuildCustomizer(); } + @Bean + @ConditionalOnRequestedDependency("oauth2-client") + SpringSecurityTestBuildCustomizer oauth2ClientTestBuildCustomizer() { + return new SpringSecurityTestBuildCustomizer(); + } + @Bean @ConditionalOnRequestedDependency("security") public SpringSecurityRSocketBuildCustomizer securityRSocketBuildCustomizer() { @@ -80,18 +86,12 @@ public SpringBatchTestBuildCustomizer batchTestBuildCustomizer() { } @Bean - @ConditionalOnGradleVersion({ "6", "7", "8" }) @ConditionalOnBuildSystem(GradleBuildSystem.ID) @ConditionalOnRequestedDependency("lombok") public LombokGradleBuildCustomizer lombokGradleBuildCustomizer() { return new LombokGradleBuildCustomizer(this.metadata); } - @Bean - public SpringKafkaBuildCustomizer springKafkaBuildCustomizer() { - return new SpringKafkaBuildCustomizer(); - } - @Bean @ConditionalOnRequestedDependency("session") public SpringSessionBuildCustomizer springSessionBuildCustomizer() { @@ -100,8 +100,8 @@ public SpringSessionBuildCustomizer springSessionBuildCustomizer() { @Bean @ConditionalOnRequestedDependency("thymeleaf") - public ThymeleafBuildCustomizer thymeleafBuildCustomizer(ProjectDescription description) { - return new ThymeleafBuildCustomizer(description.getPlatformVersion()); + public ThymeleafBuildCustomizer thymeleafBuildCustomizer() { + return new ThymeleafBuildCustomizer(); } @Bean @@ -122,4 +122,10 @@ public MyBatisTestBuildCustomizer mybatisTestBuildCustomizer() { return new MyBatisTestBuildCustomizer(); } + @Bean + @ConditionalOnRequestedDependency("spring-shell") + public SpringShellTestBuildCustomizer springShellTestBuildCustomizer() { + return new SpringShellTestBuildCustomizer(); + } + } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java index 2feeec815b..cf9f686645 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,14 +16,14 @@ package io.spring.start.site.extension.dependency.activemq; -import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; -import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; import org.springframework.context.annotation.Bean; -import org.springframework.core.Ordered; /** * Configuration for generation of projects that depend on ActiveMQ. @@ -34,21 +34,21 @@ @ConditionalOnRequestedDependency("activemq") public class ActiveMQProjectGenerationConfiguration { - @ConditionalOnPlatformVersion("[3.0.0-M1,3.1.0-RC1)") - static class SpringBoot30Configuration { + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.activemq.ActiveMQContainer"; - @Bean - BuildCustomizer activeMQNotSupportedBuildCustomizer() { - return BuildCustomizer.ordered(Ordered.HIGHEST_PRECEDENCE + 5, - (build) -> build.dependencies().remove("activemq")); - } - - @Bean - HelpDocumentCustomizer activeMQNotSupportedHelpDocumentCustomizer() { - return (helpDocument) -> helpDocument.getWarnings() - .addItem("ActiveMQ is not supported with Spring Boot 3.0"); - } + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer activeMQClassicServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("activeMQClassic", + (service) -> serviceConnections.addServiceConnection( + ServiceConnection.ofContainer("activemq", service, TESTCONTAINERS_CLASS_NAME, false))); + } + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer activeMQClassicComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("activeMQClassic", + (service) -> composeFile.services().add("activemq", service)); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfiguration.java new file mode 100644 index 0000000000..42c46e53d9 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfiguration.java @@ -0,0 +1,53 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.activemq; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on ActiveMQ Artemis. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("artemis") +public class ArtemisProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.activemq.ArtemisContainer"; + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer artemisServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("artemis", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("artemis", service, TESTCONTAINERS_CLASS_NAME, false))); + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer artemisComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("artemis", + (service) -> composeFile.services().add("artemis", service)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfiguration.java index e4f3d4a818..08a1d8388a 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,7 @@ * * @author Moritz Halbritter * @author Stephane Nicoll + * @author Eddú Meléndez */ @Configuration(proxyBeanMethods = false) class CassandraProjectGenerationConfiguration { @@ -63,7 +64,8 @@ ComposeFileCustomizer cassandraComposeFileCustomizer(Build build, DockerServiceR } private boolean isCassandraEnabled(Build build) { - return build.dependencies().has("data-cassandra") || build.dependencies().has("data-cassandra-reactive"); + return build.dependencies().has("data-cassandra") || build.dependencies().has("data-cassandra-reactive") + || build.dependencies().has("spring-ai-vectordb-cassandra"); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/derby/DerbyProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/derby/DerbyProjectGenerationConfiguration.java new file mode 100644 index 0000000000..315255089e --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/derby/DerbyProjectGenerationConfiguration.java @@ -0,0 +1,41 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.derby; + +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Derby. + * + * @author Stephane Nicoll + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("derby") +class DerbyProjectGenerationConfiguration { + + @Bean + BuildCustomizer derbyToolsBuilderCustomizer() { + return (build) -> build.dependencies() + .add("derbytools", "org.apache.derby", "derbytools", DependencyScope.RUNTIME); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/derby/package-info.java similarity index 76% rename from start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/package-info.java rename to start-site/src/main/java/io/spring/start/site/extension/dependency/derby/package-info.java index eb88fcb9a9..47324302b4 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/package-info.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/derby/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,6 @@ */ /** - * Extensions for generation of projects that depend on Picocli. + * Extensions for generation of projects that depend on Derby. */ -package io.spring.start.site.extension.dependency.picocli; +package io.spring.start.site.extension.dependency.derby; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizer.java new file mode 100644 index 0000000000..349ba5b921 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizer.java @@ -0,0 +1,40 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * A {@link BuildCustomizer} that automatically adds + * "graphql-dgs-spring-graphql-starter-test" when the {@code dgs} dependency is present. + * + * @author Brian Clozel + */ +class DgsBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(Build build) { + build.dependencies() + .add("graphql-dgs-spring-graphql-starter-test", + Dependency.withCoordinates("com.netflix.graphql.dgs", "graphql-dgs-spring-graphql-starter-test") + .scope(DependencyScope.TEST_COMPILE)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenBuildCustomizer.java new file mode 100644 index 0000000000..1a495c74aa --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenBuildCustomizer.java @@ -0,0 +1,42 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +import org.springframework.core.Ordered; + +/** + * {@link BuildCustomizer} that removes the "dgs-codegen" dependency as this is a build + * plugin only dependency. + * + * @author Brian Clozel + */ +class DgsCodegenBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(Build build) { + build.dependencies().remove("dgs-codegen"); + } + + @Override + public int getOrder() { + return Ordered.LOWEST_PRECEDENCE - 10; + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenGroovyDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenGroovyDslGradleBuildCustomizer.java new file mode 100644 index 0000000000..48b7ffe7ce --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenGroovyDslGradleBuildCustomizer.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} for Gradle Groovy DSL projects using DGS Codegen. + * + * @author Brian Clozel + */ +class DgsCodegenGroovyDslGradleBuildCustomizer implements BuildCustomizer { + + private final String pluginVersion; + + private final String packageName; + + DgsCodegenGroovyDslGradleBuildCustomizer(String pluginVersion, String packageName) { + this.pluginVersion = pluginVersion; + this.packageName = packageName; + } + + @Override + public void customize(GradleBuild build) { + build.plugins().add("com.netflix.dgs.codegen", (plugin) -> plugin.setVersion(this.pluginVersion)); + build.extensions().customize("generateJava", (generateJava) -> { + generateJava.attribute("schemaPaths", "[\"${projectDir}/src/main/resources/graphql-client\"]"); + generateJava.attribute("packageName", "'" + this.packageName + ".codegen'"); + generateJava.attribute("generateClient", "true"); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenHelpDocumentCustomizer.java new file mode 100644 index 0000000000..a216c5c915 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenHelpDocumentCustomizer.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import java.util.HashMap; +import java.util.Map; + +import io.spring.initializr.generator.buildsystem.BuildSystem; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.spring.documentation.HelpDocument; +import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; + +/** + * Provide additional information when DGS Codegen Support is selected. + * + * @author Brian Clozel + */ +class DgsCodegenHelpDocumentCustomizer implements HelpDocumentCustomizer { + + private final BuildSystem buildSystem; + + DgsCodegenHelpDocumentCustomizer(ProjectDescription description) { + this.buildSystem = description.getBuildSystem(); + } + + @Override + public void customize(HelpDocument document) { + Map model = new HashMap<>(); + + if (MavenBuildSystem.ID.equals(this.buildSystem.id())) { + model.put("dsgCodegenOptionsLink", "https://github.com/deweyjose/graphqlcodegen"); + } + else if (GradleBuildSystem.ID.equals(this.buildSystem.id())) { + model.put("dsgCodegenOptionsLink", + "https://netflix.github.io/dgs/generating-code-from-schema/#configuring-code-generation"); + } + document.addSection("dgscodegen", model); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenKotlinDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenKotlinDslGradleBuildCustomizer.java new file mode 100644 index 0000000000..85dd43bf70 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenKotlinDslGradleBuildCustomizer.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} for Gradle Kotlin DSL projects using DGS Codegen. + * + * @author Brian Clozel + */ +class DgsCodegenKotlinDslGradleBuildCustomizer implements BuildCustomizer { + + private final String pluginVersion; + + private final String packageName; + + DgsCodegenKotlinDslGradleBuildCustomizer(String pluginVersion, String packageName) { + this.pluginVersion = pluginVersion; + this.packageName = packageName; + } + + @Override + public void customize(GradleBuild build) { + build.plugins().add("com.netflix.dgs.codegen", (plugin) -> plugin.setVersion(this.pluginVersion)); + build.extensions().customize("tasks.generateJava", (generateJava) -> { + generateJava.invoke("schemaPaths.add", "\"${projectDir}/src/main/resources/graphql-client\""); + generateJava.attribute("packageName", "\"" + this.packageName + ".codegen\""); + generateJava.attribute("generateClient", "true"); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenMavenBuildCustomizer.java new file mode 100644 index 0000000000..ae3378e563 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenMavenBuildCustomizer.java @@ -0,0 +1,61 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} for Maven projects using DGS Codegen (community maintained). + * + * @author Brian Clozel + * @see Maven GraphQL Codegen + * plugin + */ +public class DgsCodegenMavenBuildCustomizer implements BuildCustomizer { + + private final String pluginVersion; + + private final String packageName; + + public DgsCodegenMavenBuildCustomizer(String pluginVersion, String packageName) { + this.pluginVersion = pluginVersion; + this.packageName = packageName; + } + + @Override + public void customize(MavenBuild build) { + build.plugins() + .add("io.github.deweyjose", "graphqlcodegen-maven-plugin", + (plugin) -> plugin.version(this.pluginVersion) + .execution("dgs-codegen", + (execution) -> execution.goal("generate") + .configuration((configuration) -> configuration + .add("schemaPaths", + (schemaPaths) -> schemaPaths.add("param", + "src/main/resources/graphql-client")) + .add("packageName", this.packageName + ".codegen") + .add("addGeneratedAnnotation", "true")))); + build.plugins() + .add("org.codehaus.mojo", "build-helper-maven-plugin", + (plugin) -> plugin.execution("add-dgs-source", (execution) -> execution.goal("add-source") + .phase("generate-sources") + .configuration((configuration) -> configuration.add("sources", + (sources) -> sources.add("source", "${project.build.directory}/generated-sources"))))); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectContributor.java new file mode 100644 index 0000000000..55ee0c4687 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectContributor.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import io.spring.initializr.generator.project.contributor.ProjectContributor; + +/** + * A {@link ProjectContributor} that creates the "graphql-client" resources directory when + * the DGS Codegen build plugin is requested. + * + * @author Brian Clozel + */ +class DgsCodegenProjectContributor implements ProjectContributor { + + @Override + public void contribute(Path projectRoot) throws IOException { + Path graphQlDirectory = projectRoot.resolve("src/main/resources/graphql-client"); + Files.createDirectories(graphQlDirectory); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfiguration.java new file mode 100644 index 0000000000..4967169150 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfiguration.java @@ -0,0 +1,81 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.metadata.InitializrMetadata; + +import org.springframework.context.annotation.Bean; + +/** + * {@link ProjectGenerationConfiguration} for generation of projects that use the Netflix + * DGS codegen. + * + * @author Brian Clozel + * @see Netflix DGS + * codegen + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("dgs-codegen") +class DgsCodegenProjectGenerationConfiguration { + + private final String dgsCodegenPluginVersion; + + DgsCodegenProjectGenerationConfiguration(InitializrMetadata metadata, ProjectDescription description) { + this.dgsCodegenPluginVersion = DgsCodegenVersionResolver.resolve(metadata, description.getPlatformVersion(), + description.getBuildSystem()); + } + + @Bean + DgsCodegenBuildCustomizer dgsCodegenBuildCustomizer() { + return new DgsCodegenBuildCustomizer(); + } + + @Bean + DgsCodegenProjectContributor dgsCodegenProjectContributor() { + return new DgsCodegenProjectContributor(); + } + + @Bean + DgsCodegenHelpDocumentCustomizer dgsCodegenHelpDocumentCustomizer(ProjectDescription description) { + return new DgsCodegenHelpDocumentCustomizer(description); + } + + @Bean + @ConditionalOnBuildSystem(id = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_GROOVY) + DgsCodegenGroovyDslGradleBuildCustomizer dgsCodegenGroovyDslGradleBuildCustomizer(ProjectDescription description) { + return new DgsCodegenGroovyDslGradleBuildCustomizer(this.dgsCodegenPluginVersion, description.getPackageName()); + } + + @Bean + @ConditionalOnBuildSystem(id = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_KOTLIN) + DgsCodegenKotlinDslGradleBuildCustomizer dgsCodegenKotlinDslGradleBuildCustomizer(ProjectDescription description) { + return new DgsCodegenKotlinDslGradleBuildCustomizer(this.dgsCodegenPluginVersion, description.getPackageName()); + } + + @Bean + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + DgsCodegenMavenBuildCustomizer dgsCodegenMavenBuildCustomizer(ProjectDescription description) { + return new DgsCodegenMavenBuildCustomizer(this.dgsCodegenPluginVersion, description.getPackageName()); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenVersionResolver.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenVersionResolver.java new file mode 100644 index 0000000000..7fd96a0c26 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenVersionResolver.java @@ -0,0 +1,44 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.buildsystem.BuildSystem; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.version.Version; +import io.spring.initializr.metadata.InitializrMetadata; + +/** + * Resolve DGS Codegen plugin version to use based on the platform version and build + * system. + * + * @author Brian Clozel + */ +abstract class DgsCodegenVersionResolver { + + static String resolve(InitializrMetadata metadata, Version platformVersion, BuildSystem build) { + if (GradleBuildSystem.ID.equals(build.id())) { + return metadata.getDependencies().get("dgs-codegen").resolve(platformVersion).getVersion(); + } + else if (MavenBuildSystem.ID.equals(build.id())) { + // https://github.com/deweyjose/graphqlcodegen/releases + return "1.61.5"; + } + throw new IllegalArgumentException("Could not resolve DGS Codegen version for build system " + build.id()); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/PicocliProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsProjectGenerationConfiguration.java similarity index 62% rename from start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/PicocliProjectGenerationConfiguration.java rename to start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsProjectGenerationConfiguration.java index 20a66a86d8..be1387b6c1 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/PicocliProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,27 +14,26 @@ * limitations under the License. */ -package io.spring.start.site.extension.dependency.picocli; +package io.spring.start.site.extension.dependency.dgs; -import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import org.springframework.context.annotation.Bean; /** - * Configuration for generation of projects that use observability. + * {@link ProjectGenerationConfiguration} for generation of projects that use the Netflix + * DGS. * * @author Brian Clozel */ @ProjectGenerationConfiguration -@ConditionalOnRequestedDependency("picocli") -@ConditionalOnPlatformVersion("3.0.0-M1") -public class PicocliProjectGenerationConfiguration { +@ConditionalOnRequestedDependency("netflix-dgs") +class DgsProjectGenerationConfiguration { @Bean - PicocliCodegenBuildCustomizer picocliCodegenBuildCustomizer() { - return new PicocliCodegenBuildCustomizer(); + DgsBuildCustomizer dgsBuildCustomizer() { + return new DgsBuildCustomizer(); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/package-info.java similarity index 54% rename from start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizer.java rename to start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/package-info.java index acaa875898..ce368058ce 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,19 +14,7 @@ * limitations under the License. */ -package io.spring.start.site.extension.dependency.graalvm; - -import io.spring.initializr.generator.version.Version; - /** - * {@link GraalVmGradleBuildCustomizer} implementations for projects using the Kotlin DSL. - * - * @author Stephane Nicoll + * Extensions for generation of projects that use the Netflix Domain Graph Service. */ -class GraalVmKotlinDslGradleBuildCustomizer extends GraalVmGradleBuildCustomizer { - - GraalVmKotlinDslGradleBuildCustomizer(Version platformVersion) { - super(platformVersion); - } - -} +package io.spring.start.site.extension.dependency.dgs; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfiguration.java index 18a96d257e..818d3614cb 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package io.spring.start.site.extension.dependency.elasticsearch; +import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.start.site.container.ComposeFileCustomizer; import io.spring.start.site.container.DockerServiceResolver; @@ -30,30 +31,43 @@ * * @author Moritz Halbritter * @author Stephane Nicoll + * @author Eddú Meléndez */ @Configuration(proxyBeanMethods = false) -@ConditionalOnRequestedDependency("data-elasticsearch") class ElasticsearchProjectGenerationConfiguration { - private static String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.elasticsearch.ElasticsearchContainer"; + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.elasticsearch.ElasticsearchContainer"; @Bean @ConditionalOnRequestedDependency("testcontainers") - ServiceConnectionsCustomizer elasticsearchServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { - return (serviceConnections) -> serviceResolver.doWith("elasticsearch", - (service) -> serviceConnections.addServiceConnection( + ServiceConnectionsCustomizer elasticsearchServiceConnectionsCustomizer(Build build, + DockerServiceResolver serviceResolver) { + return (serviceConnections) -> { + if (isElasticsearchEnabled(build)) { + serviceResolver.doWith("elasticsearch", (service) -> serviceConnections.addServiceConnection( ServiceConnection.ofContainer("elasticsearch", service, TESTCONTAINERS_CLASS_NAME, false))); + } + }; } @Bean @ConditionalOnRequestedDependency("docker-compose") - ComposeFileCustomizer elasticsearchComposeFileCustomizer(DockerServiceResolver serviceResolver) { - return (composeFile) -> serviceResolver.doWith("elasticsearch", - (service) -> composeFile.services() - .add("elasticsearch", - service.andThen((builder) -> builder.environment("ELASTIC_PASSWORD", "secret") - .environment("xpack.security.enabled", "false") - .environment("discovery.type", "single-node")))); + ComposeFileCustomizer elasticsearchComposeFileCustomizer(Build build, DockerServiceResolver serviceResolver) { + return (composeFile) -> { + if (isElasticsearchEnabled(build)) { + serviceResolver.doWith("elasticsearch", + (service) -> composeFile.services() + .add("elasticsearch", + service.andThen((builder) -> builder.environment("ELASTIC_PASSWORD", "secret") + .environment("xpack.security.enabled", "false") + .environment("discovery.type", "single-node")))); + } + }; + } + + private boolean isElasticsearchEnabled(Build build) { + return build.dependencies().has("data-elasticsearch") + || build.dependencies().has("spring-ai-vectordb-elasticsearch"); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java index 0cf05aa416..9f61351ae6 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,37 +19,42 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.DependencyContainer; import io.spring.initializr.generator.buildsystem.DependencyScope; -import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; /** * Determine the appropriate Flyway dependency according to the database. * * @author Eddú Meléndez * @author Stephane Nicoll + * @author Moritz Halbritter */ class FlywayBuildCustomizer implements BuildCustomizer { - private static final VersionRange SPRING_BOOT_2_7_0_OR_LATER = VersionParser.DEFAULT.parseRange("2.7.0"); - - private final boolean isSpringBoot27OrLater; - - FlywayBuildCustomizer(ProjectDescription projectDescription) { - this.isSpringBoot27OrLater = SPRING_BOOT_2_7_0_OR_LATER.match(projectDescription.getPlatformVersion()); - } - @Override public void customize(Build build) { - if (this.isSpringBoot27OrLater) { - DependencyContainer dependencies = build.dependencies(); - if ((dependencies.has("mysql") || dependencies.has("mariadb"))) { - dependencies.add("flyway-mysql", "org.flywaydb", "flyway-mysql", DependencyScope.COMPILE); - } - if (dependencies.has("sqlserver")) { - dependencies.add("flyway-sqlserver", "org.flywaydb", "flyway-sqlserver", DependencyScope.COMPILE); - } + DependencyContainer dependencies = build.dependencies(); + if ((dependencies.has("mysql") || dependencies.has("mariadb"))) { + dependencies.add("flyway-mysql", "org.flywaydb", "flyway-mysql", DependencyScope.COMPILE); + } + if (dependencies.has("sqlserver")) { + dependencies.add("flyway-sqlserver", "org.flywaydb", "flyway-sqlserver", DependencyScope.COMPILE); + } + if (dependencies.has("oracle")) { + dependencies.add("flyway-oracle", "org.flywaydb", "flyway-database-oracle", DependencyScope.COMPILE); + } + if (dependencies.has("db2")) { + dependencies.add("flyway-database-db2", "org.flywaydb", "flyway-database-db2", DependencyScope.COMPILE); + } + if (dependencies.has("derby")) { + dependencies.add("flyway-database-derby", "org.flywaydb", "flyway-database-derby", DependencyScope.COMPILE); + } + if (dependencies.has("hsql")) { + dependencies.add("flyway-database-hsqldb", "org.flywaydb", "flyway-database-hsqldb", + DependencyScope.COMPILE); + } + if (dependencies.has("postgresql")) { + dependencies.add("flyway-database-postgresql", "org.flywaydb", "flyway-database-postgresql", + DependencyScope.COMPILE); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayProjectGenerationConfiguration.java index 343f31f458..848f1caf92 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ package io.spring.start.site.extension.dependency.flyway; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; -import io.spring.initializr.generator.project.ProjectDescription; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -37,9 +36,8 @@ FlywayProjectContributor flywayProjectContributor() { } @Bean - @ConditionalOnRequestedDependency("flyway") - FlywayBuildCustomizer flywayBuildCustomizer(ProjectDescription projectDescription) { - return new FlywayBuildCustomizer(projectDescription); + FlywayBuildCustomizer flywayBuildCustomizer() { + return new FlywayBuildCustomizer(); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmBuildCustomizer.java index 8dddcafd26..70a84e0e21 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,7 +27,7 @@ * * @author Stephane Nicoll */ -class GraalVmBuildCustomizer implements BuildCustomizer, Ordered { +class GraalVmBuildCustomizer implements BuildCustomizer { @Override public void customize(Build build) { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizer.java index 73c1309529..9041b1f01c 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,6 @@ import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.Version; /** * {@link BuildCustomizer} abstraction for Gradle projects using GraalVM. @@ -29,8 +28,8 @@ class GraalVmGradleBuildCustomizer implements BuildCustomizer { private final String nbtVersion; - protected GraalVmGradleBuildCustomizer(Version platformVersion) { - this.nbtVersion = NativeBuildtoolsVersionResolver.resolve(platformVersion); + protected GraalVmGradleBuildCustomizer(String nbtVersion) { + this.nbtVersion = nbtVersion; } @Override @@ -38,12 +37,6 @@ public final void customize(GradleBuild build) { if (this.nbtVersion != null) { build.plugins().add("org.graalvm.buildtools.native", (plugin) -> plugin.setVersion(this.nbtVersion)); } - // Spring Boot plugin - customizeSpringBootPlugin(build); - } - - protected void customizeSpringBootPlugin(GradleBuild build) { - } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java index e1af26e55e..2cf9cf2c30 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import java.util.stream.Stream; import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.buildsystem.maven.MavenBuild; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.documentation.HelpDocument; @@ -56,14 +57,15 @@ class GraalVmHelpDocumentCustomizer implements HelpDocumentCustomizer { public void customize(HelpDocument document) { document.gettingStarted() .addReferenceDocLink(String.format( - "https://docs.spring.io/spring-boot/docs/%s/reference/html/native-image.html#native-image", + "https://docs.spring.io/spring-boot/%s/reference/packaging/native-image/introducing-graalvm-native-images.html", this.platformVersion), "GraalVM Native Image Support"); boolean mavenBuild = this.build instanceof MavenBuild; - String url = String.format("https://docs.spring.io/spring-boot/docs/%s/%s/reference/htmlsingle/#aot", - this.platformVersion, (mavenBuild) ? "maven-plugin" : "gradle-plugin"); + boolean gradleBuild = this.build instanceof GradleBuild; + String url = String.format("https://docs.spring.io/spring-boot/%s/how-to/aot.html", this.platformVersion); document.gettingStarted().addAdditionalLink(url, "Configure AOT settings in Build Plugin"); Map model = new HashMap<>(); + model.put("gradleBuild", gradleBuild); // Cloud native buildpacks model.put("cnbBuildImageCommand", mavenBuild ? "./mvnw spring-boot:build-image -Pnative" : "./gradlew bootBuildImage"); diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java index 80419d3993..ff53be8702 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,22 +17,28 @@ package io.spring.start.site.extension.dependency.graalvm; import java.util.Map; +import java.util.function.Supplier; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; -import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.condition.ProjectGenerationCondition; +import io.spring.initializr.generator.language.groovy.GroovyLanguage; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionReference; import io.spring.initializr.metadata.InitializrMetadata; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; +import io.spring.start.site.extension.dependency.graalvm.GraalVmProjectGenerationConfiguration.CompatibleLanguageCondition; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; +import org.springframework.core.type.AnnotatedTypeMetadata; +import org.springframework.util.function.SingletonSupplier; /** * {@link ProjectGenerationConfiguration} for generation of projects that use GraalVM. @@ -41,13 +47,14 @@ */ @ProjectGenerationConfiguration @ConditionalOnRequestedDependency("native") -@ConditionalOnPlatformVersion("3.0.0-M1") +@Conditional(CompatibleLanguageCondition.class) class GraalVmProjectGenerationConfiguration { - private final Version platformVersion; + private final Supplier nbtVersion; - GraalVmProjectGenerationConfiguration(ProjectDescription description) { - this.platformVersion = description.getPlatformVersion(); + GraalVmProjectGenerationConfiguration(ProjectDescription description, MavenVersionResolver versionResolver) { + this.nbtVersion = SingletonSupplier + .of(() -> NativeBuildtoolsVersionResolver.resolve(versionResolver, description.getPlatformVersion())); } @Bean @@ -62,15 +69,9 @@ GraalVmMavenBuildCustomizer graalVmMavenBuildCustomizer() { } @Bean - @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_GROOVY) - GraalVmGroovyDslGradleBuildCustomizer graalVmGroovyDslGradleBuildCustomizer() { - return new GraalVmGroovyDslGradleBuildCustomizer(this.platformVersion); - } - - @Bean - @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_KOTLIN) - GraalVmKotlinDslGradleBuildCustomizer graalVmKotlinDslGradleBuildCustomizer() { - return new GraalVmKotlinDslGradleBuildCustomizer(this.platformVersion); + @ConditionalOnBuildSystem(GradleBuildSystem.ID) + GraalVmGradleBuildCustomizer graalVmGradleBuildCustomizer() { + return new GraalVmGradleBuildCustomizer(this.nbtVersion.get()); } @Bean @@ -96,21 +97,34 @@ HibernatePluginMavenBuildCustomizer hibernatePluginMavenBuildCustomizer() { } @Bean - @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_GROOVY) - HibernatePluginGroovyDslGradleBuildCustomizer hibernatePluginGroovyDslGradleBuildCustomizer( - DependencyManagementVersionResolver versionResolver) { - return new HibernatePluginGroovyDslGradleBuildCustomizer(determineHibernateVersion(versionResolver)); + @ConditionalOnBuildSystem(GradleBuildSystem.ID) + HibernatePluginGradleBuildCustomizer hibernatePluginGroovyDslGradleBuildCustomizer( + MavenVersionResolver versionResolver) { + return new HibernatePluginGradleBuildCustomizer(determineHibernateVersion(versionResolver)); } - private VersionReference determineHibernateVersion(DependencyManagementVersionResolver versionResolver) { - Map resolve = versionResolver.resolve("org.springframework.boot", + private Version determineHibernateVersion(MavenVersionResolver versionResolver) { + Map resolve = versionResolver.resolveDependencies("org.springframework.boot", "spring-boot-dependencies", this.platformVersion.toString()); String hibernateVersion = resolve.get("org.hibernate.orm" + ":hibernate-core"); if (hibernateVersion == null) { throw new IllegalStateException( "Failed to determine Hibernate version for Spring Boot " + this.platformVersion); } - return VersionReference.ofValue(hibernateVersion); + return Version.parse(hibernateVersion); + } + + } + + /** + * A {@link ProjectGenerationCondition} that match for any language that isn't Groovy. + */ + static class CompatibleLanguageCondition extends ProjectGenerationCondition { + + @Override + protected boolean matches(ProjectDescription description, ConditionContext context, + AnnotatedTypeMetadata metadata) { + return !GroovyLanguage.ID.equals(description.getLanguage().id()); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGradleBuildCustomizer.java similarity index 60% rename from start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizer.java rename to start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGradleBuildCustomizer.java index 49ab506488..52b6bae816 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGradleBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,37 +18,27 @@ import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.VersionReference; +import io.spring.initializr.generator.version.Version; /** * A {@link BuildCustomizer} for projects using the Groovy DSL with GraalVm and Hibernate. * * @author Stephane Nicoll */ -class HibernatePluginGroovyDslGradleBuildCustomizer implements BuildCustomizer { +class HibernatePluginGradleBuildCustomizer implements BuildCustomizer { - private final VersionReference hibernateVersion; + private final Version hibernateVersion; - HibernatePluginGroovyDslGradleBuildCustomizer(VersionReference hibernateVersion) { + HibernatePluginGradleBuildCustomizer(Version hibernateVersion) { this.hibernateVersion = hibernateVersion; } @Override public void customize(GradleBuild build) { build.plugins().add("org.hibernate.orm", (plugin) -> plugin.setVersion(this.hibernateVersion.toString())); - build.snippets().add((writer) -> { - writer.println("hibernate {"); - writer.indented(() -> { - writer.println("enhancement {"); - writer.indented(() -> { - writer.println("lazyInitialization true"); - writer.println("dirtyTracking true"); - writer.println("associationManagement true"); - }); - writer.println("}"); - }); - writer.println("}"); - }); + build.extensions() + .customize("hibernate", (hibernate) -> hibernate.nested("enhancement", + (enhancement) -> enhancement.attribute("enableAssociationManagement", "true"))); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolver.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolver.java index aa5df78c2b..bdca1f594e 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolver.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolver.java @@ -16,11 +16,10 @@ package io.spring.start.site.extension.dependency.graalvm; -import java.util.List; +import java.util.Map; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; +import io.spring.initializr.versionresolver.MavenVersionResolver; /** * Resolve the Native Build Tools version to use based on the platform version. @@ -29,45 +28,10 @@ */ abstract class NativeBuildtoolsVersionResolver { - private static final List ranges = List.of( - new NativeBuildtoolsRange("[3.0.0-M1,3.0.0-RC1)", "0.9.14"), - new NativeBuildtoolsRange("[3.0.0-RC1,3.0.0-RC2)", "0.9.16"), - new NativeBuildtoolsRange("[3.0.0-RC2,3.0.0)", "0.9.17"), - new NativeBuildtoolsRange("[3.0.0,3.0.1)", "0.9.18"), new NativeBuildtoolsRange("[3.0.1,3.0.3)", "0.9.19"), - new NativeBuildtoolsRange("[3.0.3,3.0.6)", "0.9.20"), new NativeBuildtoolsRange("[3.0.6,3.0.7)", "0.9.21"), - new NativeBuildtoolsRange("[3.0.7,3.1.1)", "0.9.22"), new NativeBuildtoolsRange("3.1.1", "0.9.23")); - - static String resolve(Version platformVersion) { - return ranges.stream() - .filter((range) -> range.match(platformVersion)) - .findFirst() - .map(NativeBuildtoolsRange::getVersion) - .orElse(null); - } - - private static class NativeBuildtoolsRange { - - private final VersionRange range; - - private final String version; - - NativeBuildtoolsRange(String range, String version) { - this.range = parseRange(range); - this.version = version; - } - - String getVersion() { - return this.version; - } - - private static VersionRange parseRange(String s) { - return VersionParser.DEFAULT.parseRange(s); - } - - boolean match(Version version) { - return this.range.match(version); - } - + static String resolve(MavenVersionResolver versionResolver, Version platformVersion) { + Map resolve = versionResolver.resolvePlugins("org.springframework.boot", + "spring-boot-dependencies", platformVersion.toString()); + return resolve.get("org.graalvm.buildtools:native-maven-plugin"); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizer.java index 57a22722ee..e07bf52471 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.BuildCustomizer; import io.spring.initializr.generator.spring.build.BuildMetadataResolver; import io.spring.initializr.metadata.InitializrMetadata; @@ -34,8 +35,8 @@ class SpringGraphQlBuildCustomizer implements BuildCustomizer { private final BuildMetadataResolver buildResolver; - SpringGraphQlBuildCustomizer(InitializrMetadata metadata) { - this.buildResolver = new BuildMetadataResolver(metadata); + SpringGraphQlBuildCustomizer(InitializrMetadata metadata, ProjectDescription description) { + this.buildResolver = new BuildMetadataResolver(metadata, description.getPlatformVersion()); } @Override diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectGenerationConfiguration.java index 6fd3c04195..f676f89fad 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package io.spring.start.site.extension.dependency.graphql; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.metadata.InitializrMetadata; import org.springframework.context.annotation.Bean; @@ -37,8 +38,9 @@ SpringGraphQlProjectContributor SpringGraphQlProjectContributor() { } @Bean - SpringGraphQlBuildCustomizer SpringGraphQlBuildCustomizer(InitializrMetadata initializrMetadata) { - return new SpringGraphQlBuildCustomizer(initializrMetadata); + SpringGraphQlBuildCustomizer SpringGraphQlBuildCustomizer(InitializrMetadata initializrMetadata, + ProjectDescription description) { + return new SpringGraphQlBuildCustomizer(initializrMetadata, description); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaMavenBuildCustomizer.java deleted file mode 100644 index f9ff726fe8..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaMavenBuildCustomizer.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.hilla; - -import io.spring.initializr.generator.buildsystem.maven.MavenBuild; -import io.spring.initializr.generator.spring.build.BuildCustomizer; - -/** - * A {@link BuildCustomizer} that adds a production profile to enable Hilla's production - * mode. - * - * @author Luciano Vernaschi - * @author Stephane Nicoll - */ -class HillaMavenBuildCustomizer implements BuildCustomizer { - - @Override - public void customize(MavenBuild build) { - build.plugins() - .add("dev.hilla", "hilla-maven-plugin", (plugin) -> plugin.version("${hilla.version}") - .execution("frontend", (execution) -> execution.goal("prepare-frontend"))); - build.profiles() - .id("production") - .plugins() - .add("dev.hilla", "hilla-maven-plugin", - (plugin) -> plugin.version("${hilla.version}") - .execution("frontend", - (execution) -> execution.goal("build-frontend") - .phase("compile") - .configuration((configuration) -> configuration.add("productionMode", "true")))); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizer.java new file mode 100644 index 0000000000..456646c24e --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizer.java @@ -0,0 +1,44 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.htmx; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * A {@link BuildCustomizer} that replaces {@code htmx-spring-boot} with + * {@code htmx-spring-boot-thymeleaf} if Thymeleaf is selected. + * + * @author Moritz Halbritter + */ +class HtmxBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(Build build) { + if (build.dependencies().has("thymeleaf")) { + Dependency htmx = build.dependencies().get("htmx"); + build.dependencies().remove("htmx"); + build.dependencies() + .add("htmx-thymeleaf", + Dependency.withCoordinates(htmx.getGroupId(), "htmx-spring-boot-thymeleaf") + .version(htmx.getVersion()) + .build()); + } + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxProjectGenerationConfiguration.java new file mode 100644 index 0000000000..7360d24bd9 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxProjectGenerationConfiguration.java @@ -0,0 +1,38 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.htmx; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Configuration for generation of projects that depend on htmx. + * + * @author Moritz Halbritter + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnRequestedDependency("htmx") +class HtmxProjectGenerationConfiguration { + + @Bean + HtmxBuildCustomizer htmxBuildCustomizer() { + return new HtmxBuildCustomizer(); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/package-info.java similarity index 84% rename from start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/package-info.java rename to start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/package-info.java index 342c0856b6..b0e25f8f18 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/package-info.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/package-info.java @@ -15,6 +15,6 @@ */ /** - * Extensions for generation of projects that depend on Hilla. + * Extensions for generation of projects that depend on htmx. */ -package io.spring.start.site.extension.dependency.hilla; +package io.spring.start.site.extension.dependency.htmx; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteGradleBuildCustomizer.java new file mode 100644 index 0000000000..fa81d81522 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteGradleBuildCustomizer.java @@ -0,0 +1,40 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.jte; + +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} to configure the JTE Gradle plugin. + * + * @author Moritz Halbritter + */ +class JteGradleBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(GradleBuild build) { + Dependency jteStarter = build.dependencies().get("jte"); + build.plugins().add("gg.jte.gradle", (plugin) -> plugin.setVersion(jteStarter.getVersion().getValue())); + build.extensions().customize("jte", (jte) -> { + jte.invoke("generate"); + jte.attribute("binaryStaticContent", "true"); + }); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizerTests.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteHelpDocumentCustomizer.java similarity index 52% rename from start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizerTests.java rename to start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteHelpDocumentCustomizer.java index a6ffcfb8d1..7671f76c4b 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizerTests.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteHelpDocumentCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,20 +14,23 @@ * limitations under the License. */ -package io.spring.start.site.extension.dependency.graalvm; +package io.spring.start.site.extension.dependency.jte; -import io.spring.initializr.generator.version.Version; +import java.util.Collections; + +import io.spring.initializr.generator.spring.documentation.HelpDocument; +import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; /** - * Tests for {@link GraalVmGroovyDslGradleBuildCustomizer}. + * {@link HelpDocumentCustomizer} to add a JTE section. * - * @author Stephane Nicoll + * @author Moritz Halbritter */ -class GraalVmGroovyDslGradleBuildCustomizerTests extends GraalVmGradleBuildCustomizerTests { +class JteHelpDocumentCustomizer implements HelpDocumentCustomizer { @Override - protected GraalVmGroovyDslGradleBuildCustomizer createCustomizer(String platformVersion) { - return new GraalVmGroovyDslGradleBuildCustomizer(Version.parse(platformVersion)); + public void customize(HelpDocument document) { + document.addSection("jte", Collections.emptyMap()); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteMavenBuildCustomizer.java new file mode 100644 index 0000000000..b918cb3452 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteMavenBuildCustomizer.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.jte; + +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} to configure the JTE Maven plugin. + * + * @author Moritz Halbritter + */ +class JteMavenBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(MavenBuild build) { + Dependency jteStarter = build.dependencies().get("jte"); + build.plugins().add("gg.jte", "jte-maven-plugin", (plugin) -> { + plugin.version(jteStarter.getVersion().getValue()); + plugin.execution("jte-generate", (execution) -> { + execution.phase("generate-sources"); + execution.goal("generate"); + execution.configuration((configuration) -> { + configuration.add("sourceDirectory", "${project.basedir}/src/main/jte"); + configuration.add("contentType", "Html"); + configuration.add("binaryStaticContent", "true"); + configuration.add("targetResourceDirectory", "${project.build.outputDirectory}"); + }); + }); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteProjectGenerationConfiguration.java new file mode 100644 index 0000000000..ffa3c81e94 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteProjectGenerationConfiguration.java @@ -0,0 +1,90 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.jte; + +import java.nio.file.Files; +import java.nio.file.Path; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.generator.project.contributor.ProjectContributor; +import io.spring.initializr.generator.spring.build.BuildCustomizer; +import io.spring.initializr.generator.spring.properties.ApplicationPropertiesCustomizer; +import io.spring.initializr.generator.spring.scm.git.GitIgnoreCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * {@link ProjectGenerationConfiguration} for JTE. + * + * @author Moritz Halbritter + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("jte") +class JteProjectGenerationConfiguration { + + @Bean + ProjectContributor jteTemplateDirectoryProjectContributor() { + return (projectRoot) -> { + Path templatesDirectory = projectRoot.resolve("src/main/jte"); + Files.createDirectories(templatesDirectory); + }; + } + + @Bean + ApplicationPropertiesCustomizer jteApplicationPropertiesCustomizer() { + return (properties) -> properties.add("gg.jte.development-mode", true); + } + + @Bean + BuildCustomizer jteBuildCustomizer() { + // https://github.com/casid/jte/issues/381 + return (build) -> { + Dependency jteStarter = build.dependencies().get("jte"); + build.dependencies() + .add("jte-core", Dependency.withCoordinates("gg.jte", "jte").version(jteStarter.getVersion()).build()); + }; + } + + @Bean + GitIgnoreCustomizer jteGitIgnoreCustomizer() { + return (gitignore) -> gitignore.addSectionIfAbsent("JTE").add("/jte-classes/"); + } + + @Bean + JteHelpDocumentCustomizer jteHelpDocumentCustomizer() { + return new JteHelpDocumentCustomizer(); + } + + @Bean + @ConditionalOnBuildSystem(GradleBuildSystem.ID) + JteGradleBuildCustomizer jteGradleBuildCustomizer() { + return new JteGradleBuildCustomizer(); + } + + @Bean + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + JteMavenBuildCustomizer jteMavenBuildCustomizer() { + return new JteMavenBuildCustomizer(); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/package-info.java new file mode 100644 index 0000000000..ddc28f9e2a --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for generation of projects that depend on JTE. + */ +package io.spring.start.site.extension.dependency.jte; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/mysql/MysqlProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/mysql/MysqlProjectGenerationConfiguration.java index 95a95520cf..49e35d8545 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/mysql/MysqlProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/mysql/MysqlProjectGenerationConfiguration.java @@ -35,7 +35,7 @@ @ConditionalOnRequestedDependency("mysql") class MysqlProjectGenerationConfiguration { - private static String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.MySQLContainer"; + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.MySQLContainer"; @Bean @ConditionalOnRequestedDependency("testcontainers") diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfiguration.java new file mode 100644 index 0000000000..78037d1c7d --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfiguration.java @@ -0,0 +1,66 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.neo4j; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Configuration for generation of projects that depend on Neo4j. + * + * @author Eddú Meléndez + */ +@Configuration(proxyBeanMethods = false) +public class Neo4jProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.Neo4jContainer"; + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer neo4jServiceConnectionsCustomizer(Build build, DockerServiceResolver serviceResolver) { + return (serviceConnections) -> { + if (isNeo4jEnabled(build)) { + serviceResolver.doWith("neo4j", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("neo4j", service, TESTCONTAINERS_CLASS_NAME))); + } + }; + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer neo4jComposeFileCustomizer(Build build, DockerServiceResolver serviceResolver) { + return (composeFile) -> { + if (isNeo4jEnabled(build)) { + serviceResolver.doWith("neo4j", (service) -> composeFile.services() + .add("neo4j", + service.andThen((builder) -> builder.environment("NEO4J_AUTH", "neo4j/notverysecret")))); + } + }; + } + + private boolean isNeo4jEnabled(Build build) { + return build.dependencies().has("data-neo4j") || build.dependencies().has("spring-ai-vectordb-neo4j"); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/neo4j/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/neo4j/package-info.java new file mode 100644 index 0000000000..65f1fa66e2 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/neo4j/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for generation of projects that depend on Neo4j. + */ +package io.spring.start.site.extension.dependency.neo4j; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/Observability2xHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/Observability2xHelpDocumentCustomizer.java deleted file mode 100644 index 046950be52..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/Observability2xHelpDocumentCustomizer.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.observability; - -import io.spring.initializr.generator.buildsystem.Build; -import io.spring.initializr.generator.spring.documentation.HelpDocument; -import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; - -/** - * {@link HelpDocumentCustomizer} implementation for Observability with Spring Boot 2.x. - * - * @author Stephane Nicoll - */ -public class Observability2xHelpDocumentCustomizer implements HelpDocumentCustomizer { - - private final Build build; - - public Observability2xHelpDocumentCustomizer(Build build) { - this.build = build; - } - - @Override - public void customize(HelpDocument document) { - if (this.build.dependencies().has("distributed-tracing")) { - document.gettingStarted() - .addReferenceDocLink( - "https://docs.spring.io/spring-cloud-sleuth/docs/current/reference/htmlsingle/spring-cloud-sleuth.html", - "Spring Cloud Sleuth Reference Guide"); - } - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizer.java index ae673dd736..12937c1a84 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizer.java @@ -30,14 +30,8 @@ */ class ObservabilityActuatorBuildCustomizer implements BuildCustomizer { - static final List STANDARD_REGISTRY_IDS = Arrays.asList("datadog", "dynatrace", "graphite", "influx", - "new-relic"); - - private final List dependencyIds; - - ObservabilityActuatorBuildCustomizer(List dependencyIds) { - this.dependencyIds = dependencyIds; - } + private static final List STANDARD_REGISTRY_IDS = Arrays.asList("datadog", "distributed-tracing", + "dynatrace", "graphite", "influx", "new-relic", "otlp-metrics", "prometheus", "wavefront", "zipkin"); @Override public void customize(Build build) { @@ -47,7 +41,7 @@ public void customize(Build build) { } protected boolean match(DependencyContainer dependencies) { - return dependencies.ids().anyMatch(this.dependencyIds::contains); + return dependencies.ids().anyMatch(STANDARD_REGISTRY_IDS::contains); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java index a14175982a..e772756e22 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java @@ -42,12 +42,11 @@ public ObservabilityHelpDocumentCustomizer(ProjectDescription description, Build public void customize(HelpDocument document) { if (this.build.dependencies().has("distributed-tracing")) { document.gettingStarted() - .addReferenceDocLink("https://micrometer.io/docs/tracing", "Distributed Tracing Reference Guide"); + .addReferenceDocLink("https://docs.micrometer.io/tracing/reference/index.html", + "Distributed Tracing Reference Guide"); document.gettingStarted() - .addReferenceDocLink(String.format( - "https://docs.spring.io/spring-boot/docs/%s/reference/html/actuator.html#actuator.micrometer-tracing.getting-started", - this.platformVersion), "Getting Started with Distributed Tracing"); - + .addReferenceDocLink("https://docs.spring.io/spring-boot/%s/reference/actuator/tracing.html" + .formatted(this.platformVersion), "Getting Started with Distributed Tracing"); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java index 065fdea047..7d5ace1bc9 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,17 +16,11 @@ package io.spring.start.site.extension.dependency.observability; -import java.util.ArrayList; -import java.util.List; - import io.spring.initializr.generator.buildsystem.Build; -import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; -import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; /** * Configuration for generation of projects that use observability. @@ -36,56 +30,20 @@ @ProjectGenerationConfiguration class ObservabilityProjectGenerationConfiguration { - @Configuration(proxyBeanMethods = false) - @ConditionalOnPlatformVersion("3.0.0-M1") - static class ObservabilityConfiguration { - - @Bean - ObservabilityActuatorBuildCustomizer observabilityActuatorBuildCustomizer() { - List dependencyIds = new ArrayList<>(ObservabilityActuatorBuildCustomizer.STANDARD_REGISTRY_IDS); - dependencyIds.addAll(List.of("distributed-tracing", "wavefront", "zipkin")); - return new ObservabilityActuatorBuildCustomizer(dependencyIds); - } - - @Bean - ObservabilityDistributedTracingBuildCustomizer observabilityDistributedTracingBuildCustomizer() { - return new ObservabilityDistributedTracingBuildCustomizer(); - } - - @Bean - ObservabilityHelpDocumentCustomizer observabilityHelpDocumentCustomizer(ProjectDescription description, - Build build) { - return new ObservabilityHelpDocumentCustomizer(description, build); - } - - @Bean - @ConditionalOnRequestedDependency("wavefront") - WavefrontHelpDocumentCustomizer wavefrontHelpDocumentCustomizer(Build build) { - return new WavefrontHelpDocumentCustomizer("https://docs.wavefront.com/wavefront_springboot3.html", build); - } - + @Bean + ObservabilityActuatorBuildCustomizer observabilityActuatorBuildCustomizer() { + return new ObservabilityActuatorBuildCustomizer(); } - @Configuration(proxyBeanMethods = false) - @ConditionalOnPlatformVersion("[2.0.0,3.0.0-M1)") - static class Observability2xConfiguration { - - @Bean - ObservabilityActuatorBuildCustomizer observabilityActuatorBuildCustomizer() { - return new ObservabilityActuatorBuildCustomizer(ObservabilityActuatorBuildCustomizer.STANDARD_REGISTRY_IDS); - } - - @Bean - Observability2xHelpDocumentCustomizer observabilityHelpDocumentCustomizer(Build build) { - return new Observability2xHelpDocumentCustomizer(build); - } - - @Bean - @ConditionalOnRequestedDependency("wavefront") - WavefrontHelpDocumentCustomizer wavefrontHelpDocumentCustomizer(Build build) { - return new WavefrontHelpDocumentCustomizer("https://docs.wavefront.com/wavefront_springboot.html", build); - } + @Bean + ObservabilityDistributedTracingBuildCustomizer observabilityDistributedTracingBuildCustomizer() { + return new ObservabilityDistributedTracingBuildCustomizer(); + } + @Bean + ObservabilityHelpDocumentCustomizer observabilityHelpDocumentCustomizer(ProjectDescription description, + Build build) { + return new ObservabilityHelpDocumentCustomizer(description, build); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java deleted file mode 100644 index 290470dd0e..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.observability; - -import io.spring.initializr.generator.buildsystem.Build; -import io.spring.initializr.generator.spring.documentation.HelpDocument; -import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; - -/** - * A {@link HelpDocumentCustomizer} that provides additional references when Wavefront is - * selected. - * - * @author Stephane Nicoll - * @author Brian Clozel - */ -class WavefrontHelpDocumentCustomizer implements HelpDocumentCustomizer { - - private final Build build; - - private final String referenceLink; - - WavefrontHelpDocumentCustomizer(String referenceLink, Build build) { - this.referenceLink = referenceLink; - this.build = build; - } - - @Override - public void customize(HelpDocument document) { - document.gettingStarted().addReferenceDocLink(this.referenceLink, "Wavefront for Spring Boot documentation"); - - StringBuilder sb = new StringBuilder(); - sb.append(String.format("## Observability with Wavefront%n%n")); - sb.append(String - .format("If you don't have a Wavefront account, the starter will create a freemium account for you.%n")); - sb.append(String.format("The URL to access the Wavefront Service dashboard is logged on startup.%n")); - - if (this.build.dependencies().has("web") || this.build.dependencies().has("webflux")) { - sb.append( - String.format("%nYou can also access your dashboard using the `/actuator/wavefront` endpoint.%n")); - } - - if (!this.build.dependencies().has("distributed-tracing")) { - sb.append(String.format( - "%nFinally, you can opt-in for distributed tracing by adding the 'Distributed Tracing' entry.%n")); - } - document.addSection((writer) -> writer.print(sb)); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java index 0eb8346722..7310d312fb 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package io.spring.start.site.extension.dependency.oracle; +import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.start.site.container.ComposeFileCustomizer; import io.spring.start.site.container.DockerServiceResolver; @@ -30,25 +31,38 @@ * * @author Moritz Halbritter * @author Stephane Nicoll + * @author Eddú Meléndez */ @Configuration(proxyBeanMethods = false) -@ConditionalOnRequestedDependency("oracle") class OracleProjectGenerationConfiguration { - private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.OracleContainer"; + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.oracle.OracleContainer"; @Bean @ConditionalOnRequestedDependency("testcontainers") - ServiceConnectionsCustomizer oracleServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { - return (serviceConnections) -> serviceResolver.doWith("oracle", (service) -> serviceConnections - .addServiceConnection(ServiceConnection.ofContainer("oracle", service, TESTCONTAINERS_CLASS_NAME, false))); + ServiceConnectionsCustomizer oracleServiceConnectionsCustomizer(Build build, + DockerServiceResolver serviceResolver) { + return (serviceConnections) -> { + if (isOracleEnabled(build)) { + serviceResolver.doWith("oracleFree", (service) -> serviceConnections.addServiceConnection( + ServiceConnection.ofContainer("oracleFree", service, TESTCONTAINERS_CLASS_NAME, false))); + } + }; } @Bean @ConditionalOnRequestedDependency("docker-compose") - ComposeFileCustomizer oracleComposeFileCustomizer(DockerServiceResolver serviceResolver) { - return (composeFile) -> serviceResolver.doWith("oracle", (service) -> composeFile.services() - .add("oracle", service.andThen((builder) -> builder.environment("ORACLE_PASSWORD", "secret")))); + ComposeFileCustomizer oracleComposeFileCustomizer(Build build, DockerServiceResolver serviceResolver) { + return (composeFile) -> { + if (isOracleEnabled(build)) { + serviceResolver.doWith("oracleFree", (service) -> composeFile.services() + .add("oracle", service.andThen((builder) -> builder.environment("ORACLE_PASSWORD", "secret")))); + } + }; + } + + private boolean isOracleEnabled(Build build) { + return build.dependencies().has("oracle") || build.dependencies().has("spring-ai-vectordb-oracle"); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java new file mode 100644 index 0000000000..261e8521de --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java @@ -0,0 +1,61 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.postgresql; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Configuration for generation of projects that depend on PgVector. + * + * @author Eddú Meléndez + * @author Moritz Halbritter + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnRequestedDependency("spring-ai-vectordb-pgvector") +class PgVectorProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.PostgreSQLContainer"; + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer pgvectorServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("pgvector", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("pgvector", service, TESTCONTAINERS_CLASS_NAME))); + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer pgvectorComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("pgvector", (service) -> { + composeFile.services().remove("postgres"); + composeFile.services() + .add("pgvector", + service.andThen((builder) -> builder.environment("POSTGRES_USER", "myuser") + .environment("POSTGRES_DB", "mydatabase") + .environment("POSTGRES_PASSWORD", "secret") + .label("org.springframework.boot.service-connection", "postgres"))); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PostgresqlProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PostgresqlProjectGenerationConfiguration.java index db471c5ae8..53aa1f075d 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PostgresqlProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PostgresqlProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,12 +47,16 @@ ServiceConnectionsCustomizer postgresqlServiceConnectionsCustomizer(DockerServic @Bean @ConditionalOnRequestedDependency("docker-compose") ComposeFileCustomizer postgresqlComposeFileCustomizer(DockerServiceResolver serviceResolver) { - return (composeFile) -> serviceResolver.doWith("postgres", - (service) -> composeFile.services() - .add("postgres", - service.andThen((builder) -> builder.environment("POSTGRES_USER", "myuser") - .environment("POSTGRES_DB", "mydatabase") - .environment("POSTGRES_PASSWORD", "secret")))); + return (composeFile) -> serviceResolver.doWith("postgres", (service) -> { + if (composeFile.services().has("pgvector")) { + return; + } + composeFile.services() + .add("postgres", + service.andThen((builder) -> builder.environment("POSTGRES_USER", "myuser") + .environment("POSTGRES_DB", "mydatabase") + .environment("POSTGRES_PASSWORD", "secret"))); + }); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizer.java index 277c8227c0..6b0eed8b20 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.BuildCustomizer; import io.spring.initializr.generator.spring.build.BuildMetadataResolver; import io.spring.initializr.metadata.InitializrMetadata; @@ -34,8 +35,8 @@ public class ReactorTestBuildCustomizer implements BuildCustomizer { private final BuildMetadataResolver buildResolver; - public ReactorTestBuildCustomizer(InitializrMetadata metadata) { - this.buildResolver = new BuildMetadataResolver(metadata); + public ReactorTestBuildCustomizer(InitializrMetadata metadata, ProjectDescription description) { + this.buildResolver = new BuildMetadataResolver(metadata, description.getPlatformVersion()); } @Override diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfiguration.java new file mode 100644 index 0000000000..0351fa9caa --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfiguration.java @@ -0,0 +1,53 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.redis; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Configuration for generation of projects that depend on Redis Stack. + * + * @author Eddú Meléndez + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnRequestedDependency("spring-ai-vectordb-redis") +class RedisStackProjectGenerationConfiguration { + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer redisStackServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("redisStack", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofGenericContainer("redisStack", service, "redis"))); + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer redisStackComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("redisStack", + (service) -> composeFile.services() + .add("redis", service + .andThen((builder) -> builder.label("org.springframework.boot.service-connection", "redis")))); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxBuildCustomizer.java new file mode 100644 index 0000000000..0b08f1d88c --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxBuildCustomizer.java @@ -0,0 +1,42 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.sbom; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +import org.springframework.core.Ordered; + +/** + * {@link BuildCustomizer} that removes the CycloneDX SBOM dependency as SBOM support does + * not require any dependency. + * + * @author Moritz Halbritter + */ +class SbomCycloneDxBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(Build build) { + build.dependencies().remove("sbom-cyclone-dx"); + } + + @Override + public int getOrder() { + return Ordered.LOWEST_PRECEDENCE - 10; + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxGradleBuildCustomizer.java similarity index 55% rename from start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizer.java rename to start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxGradleBuildCustomizer.java index 28e3329aad..879875bf54 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxGradleBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,25 +14,23 @@ * limitations under the License. */ -package io.spring.start.site.extension.dependency.graalvm; +package io.spring.start.site.extension.dependency.sbom; import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; -import io.spring.initializr.generator.version.Version; +import io.spring.initializr.generator.spring.build.BuildCustomizer; /** - * {@link GraalVmGradleBuildCustomizer} implementations for projects using the Groovy DSL. + * {@link BuildCustomizer} that adds the CycloneDX Gradle plugin. * - * @author Stephane Nicoll + * @author Moritz Halbritter */ -class GraalVmGroovyDslGradleBuildCustomizer extends GraalVmGradleBuildCustomizer { +class SbomCycloneDxGradleBuildCustomizer implements BuildCustomizer { - GraalVmGroovyDslGradleBuildCustomizer(Version platformVersion) { - super(platformVersion); - } + private static final String PLUGIN_VERSION = "1.10.0"; @Override - protected void customizeSpringBootPlugin(GradleBuild build) { - + public void customize(GradleBuild build) { + build.plugins().add("org.cyclonedx.bom", (plugin) -> plugin.setVersion(PLUGIN_VERSION)); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizerTests.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxMavenBuildCustomizer.java similarity index 53% rename from start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizerTests.java rename to start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxMavenBuildCustomizer.java index 435ae840b6..3282385f4f 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizerTests.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxMavenBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,20 +14,21 @@ * limitations under the License. */ -package io.spring.start.site.extension.dependency.graalvm; +package io.spring.start.site.extension.dependency.sbom; -import io.spring.initializr.generator.version.Version; +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; /** - * Tests for {@link GraalVmKotlinDslGradleBuildCustomizer}. + * {@link BuildCustomizer} that adds the CycloneDX Maven plugin. * - * @author Stephane Nicoll + * @author Moritz Halbritter */ -class GraalVmKotlinDslGradleBuildCustomizerTests extends GraalVmGradleBuildCustomizerTests { +class SbomCycloneDxMavenBuildCustomizer implements BuildCustomizer { @Override - protected GraalVmKotlinDslGradleBuildCustomizer createCustomizer(String platformVersion) { - return new GraalVmKotlinDslGradleBuildCustomizer(Version.parse(platformVersion)); + public void customize(MavenBuild build) { + build.plugins().add("org.cyclonedx", "cyclonedx-maven-plugin"); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfiguration.java similarity index 55% rename from start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfiguration.java rename to start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfiguration.java index f910ff521f..d6d5528155 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,44 +14,40 @@ * limitations under the License. */ -package io.spring.start.site.extension.dependency.hilla; +package io.spring.start.site.extension.dependency.sbom; import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; -import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; -import io.spring.initializr.generator.spring.scm.git.GitIgnoreCustomizer; -import io.spring.initializr.metadata.InitializrMetadata; import org.springframework.context.annotation.Bean; /** - * Configuration for generation of projects that depend on Hilla. + * {@link ProjectGenerationConfiguration} for generation of projects that use SBOMs. * - * @author Luciano Vernaschi - * @author Stephane Nicoll + * @author Moritz Halbritter */ @ProjectGenerationConfiguration -@ConditionalOnRequestedDependency("hilla") -class HillaProjectGenerationConfiguration { +@ConditionalOnRequestedDependency("sbom-cyclone-dx") +class SbomProjectGenerationConfiguration { @Bean - @ConditionalOnBuildSystem(MavenBuildSystem.ID) - HillaMavenBuildCustomizer hillaMavenBuildCustomizer() { - return new HillaMavenBuildCustomizer(); + SbomCycloneDxBuildCustomizer sbomBuildCustomizer() { + return new SbomCycloneDxBuildCustomizer(); } @Bean - @ConditionalOnBuildSystem(GradleBuildSystem.ID) - HillaGradleBuildCustomizer hillaGradleBuildCustomizer(InitializrMetadata metadata, ProjectDescription description) { - return new HillaGradleBuildCustomizer(metadata, description.getPlatformVersion()); + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + SbomCycloneDxMavenBuildCustomizer sbomCycloneDxMavenBuildCustomizer() { + return new SbomCycloneDxMavenBuildCustomizer(); } @Bean - GitIgnoreCustomizer hillaGitIgnoreCustomizer() { - return (gitignore) -> gitignore.getGeneral().add("node_modules/", "frontend/generated/"); + @ConditionalOnBuildSystem(GradleBuildSystem.ID) + SbomCycloneDxGradleBuildCustomizer sbomCycloneDxGradleBuildCustomizer() { + return new SbomCycloneDxGradleBuildCustomizer(); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/package-info.java new file mode 100644 index 0000000000..81b08a0254 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for generation of projects that use SBOMs. + */ +package io.spring.start.site.extension.dependency.sbom; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/ConditionalOnRequestedSpringAiDependency.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/ConditionalOnRequestedSpringAiDependency.java new file mode 100644 index 0000000000..7c9d263077 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/ConditionalOnRequestedSpringAiDependency.java @@ -0,0 +1,43 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import io.spring.initializr.generator.project.ProjectDescription; + +import org.springframework.context.annotation.Conditional; + +/** + * Condition that matches when a {@link ProjectDescription} defines a dependency on Spring + * AI. A generated project may ultimately define a different set of dependencies according + * to the contributors that have been executed. To contribute to the project according to + * the real set, prefer querying the model itself rather than using this condition. + * + * @author Moritz Halbritter + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.TYPE, ElementType.METHOD }) +@Documented +@Conditional(OnRequestedSpringAiDependencyCondition.class) +@interface ConditionalOnRequestedSpringAiDependency { + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/OnRequestedSpringAiDependencyCondition.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/OnRequestedSpringAiDependencyCondition.java new file mode 100644 index 0000000000..9546f27758 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/OnRequestedSpringAiDependencyCondition.java @@ -0,0 +1,45 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.condition.ProjectGenerationCondition; +import io.spring.initializr.generator.project.ProjectDescription; + +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +/** + * {@link ProjectGenerationCondition} implementation for + * {@link ConditionalOnRequestedSpringAiDependency}. + * + * @author Moritz Halbritter + */ +class OnRequestedSpringAiDependencyCondition extends ProjectGenerationCondition { + + @Override + protected boolean matches(ProjectDescription description, ConditionContext context, + AnnotatedTypeMetadata metadata) { + for (Dependency dependency : description.getRequestedDependencies().values()) { + if (dependency.getGroupId().equals("org.springframework.ai")) { + return true; + } + } + return false; + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfiguration.java new file mode 100644 index 0000000000..c45ff6da9a --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfiguration.java @@ -0,0 +1,53 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Chroma. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("spring-ai-vectordb-chroma") +class SpringAiChromaProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.chromadb.ChromaDBContainer"; + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer chromaServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("chroma", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("chroma", service, TESTCONTAINERS_CLASS_NAME, false))); + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer chromaComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("chroma", + (service) -> composeFile.services().add("chroma", service)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java new file mode 100644 index 0000000000..db4af6a76b --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java @@ -0,0 +1,77 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.generator.spring.build.BuildCustomizer; +import io.spring.initializr.generator.spring.build.gradle.DevelopmentOnlyDependencyGradleBuildCustomizer; +import io.spring.initializr.generator.spring.build.maven.OptionalDependencyMavenBuildCustomizer; +import io.spring.initializr.generator.version.VersionProperty; +import io.spring.initializr.metadata.InitializrMetadata; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Spring AI Docker Compose. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("docker-compose") +@ConditionalOnRequestedSpringAiDependency +public class SpringAiDockerComposeProjectGenerationConfiguration { + + /** + * Dependency id of + * {@code org.springframework.ai:spring-ai-spring-boot-docker-compose}. + */ + private static final String DEPENDENCY_ID = "spring-ai-docker-compose"; + + @Bean + BuildCustomizer springAiDockerComposeBuildCustomizer(InitializrMetadata metadata) { + return (build) -> build.dependencies() + .add(DEPENDENCY_ID, + Dependency.withCoordinates("org.springframework.ai", "spring-ai-spring-boot-docker-compose") + .scope(DependencyScope.RUNTIME)); + } + + @Bean + @ConditionalOnBuildSystem(GradleBuildSystem.ID) + DevelopmentOnlyDependencyGradleBuildCustomizer springAiDockerComposeGradleBuildCustomizer() { + return new DevelopmentOnlyDependencyGradleBuildCustomizer( + SpringAiDockerComposeProjectGenerationConfiguration.DEPENDENCY_ID); + } + + @Bean + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + OptionalDependencyMavenBuildCustomizer springAiDockerComposeMavenBuildCustomizer() { + return new OptionalDependencyMavenBuildCustomizer( + SpringAiDockerComposeProjectGenerationConfiguration.DEPENDENCY_ID); + } + + private static VersionProperty getSpringAiVersion(InitializrMetadata metadata) { + return metadata.getConfiguration().getEnv().getBoms().get("spring-ai").getVersionProperty(); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiMilvusProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiMilvusProjectGenerationConfiguration.java new file mode 100644 index 0000000000..2a20b5117f --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiMilvusProjectGenerationConfiguration.java @@ -0,0 +1,45 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Milvus. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("spring-ai-vectordb-milvus") +class SpringAiMilvusProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.milvus.MilvusContainer"; + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer milvusServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("milvus", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("milvus", service, TESTCONTAINERS_CLASS_NAME, false))); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiMongoDbAtlasProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiMongoDbAtlasProjectGenerationConfiguration.java new file mode 100644 index 0000000000..6f6bde95e6 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiMongoDbAtlasProjectGenerationConfiguration.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on MongoDb Atlas. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnPlatformVersion("3.4.0") +@ConditionalOnRequestedDependency("spring-ai-vectordb-mongodb-atlas") +class SpringAiMongoDbAtlasProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.mongodb.MongoDBAtlasLocalContainer"; + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer mongodbAtlasServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("mongoDbAtlas", + (service) -> serviceConnections.addServiceConnection( + ServiceConnection.ofContainer("mongoDbAtlas", service, TESTCONTAINERS_CLASS_NAME, false))); + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer mongodbAtlasComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("mongoDbAtlas", + (service) -> composeFile.services().add("mongodbatlas", service)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfiguration.java new file mode 100644 index 0000000000..be2561d3e9 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfiguration.java @@ -0,0 +1,53 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Ollama. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("spring-ai-ollama") +class SpringAiOllamaProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.ollama.OllamaContainer"; + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer ollamaServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("ollama", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("ollama", service, TESTCONTAINERS_CLASS_NAME, false))); + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer ollamaComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("ollama", + (service) -> composeFile.services().add("ollama", service)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfiguration.java new file mode 100644 index 0000000000..23c6721983 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfiguration.java @@ -0,0 +1,53 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Qdrant. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("spring-ai-vectordb-qdrant") +class SpringAiQdrantProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.qdrant.QdrantContainer"; + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer qdrantServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("qdrant", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("qdrant", service, TESTCONTAINERS_CLASS_NAME, false))); + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer qdrantComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("qdrant", + (service) -> composeFile.services().add("qdrant", service)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfiguration.java new file mode 100644 index 0000000000..2cad68a947 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfiguration.java @@ -0,0 +1,46 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Spring AI Testcontainers. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("testcontainers") +@ConditionalOnRequestedSpringAiDependency +class SpringAiTestcontainersProjectGenerationConfiguration { + + @Bean + BuildCustomizer springAiTestcontainersBuildCustomizer() { + return (build) -> build.dependencies() + .add("spring-ai-testcontainers", + Dependency.withCoordinates("org.springframework.ai", "spring-ai-spring-boot-testcontainers") + .scope(DependencyScope.TEST_COMPILE)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfiguration.java new file mode 100644 index 0000000000..eabc301e8c --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfiguration.java @@ -0,0 +1,54 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Weaviate. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("spring-ai-vectordb-weaviate") +class SpringAiWeaviateProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.weaviate.WeaviateContainer"; + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer weaviateServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("weaviate", + (service) -> serviceConnections.addServiceConnection( + ServiceConnection.ofContainer("weaviate", service, TESTCONTAINERS_CLASS_NAME, false))); + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer weaviateComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("weaviate", + (service) -> composeFile.services().add("weaviate", service)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/package-info.java new file mode 100644 index 0000000000..94f77d1eaa --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for generation of projects that depend on Spring AI. + */ +package io.spring.start.site.extension.dependency.springai; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springamqp/SpringAmqpProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springamqp/SpringAmqpProjectGenerationConfiguration.java index 6c5a457f9f..29ccafce5c 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springamqp/SpringAmqpProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springamqp/SpringAmqpProjectGenerationConfiguration.java @@ -35,7 +35,7 @@ @ConditionalOnRequestedDependency("amqp") class SpringAmqpProjectGenerationConfiguration { - private static String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.RabbitMQContainer"; + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.RabbitMQContainer"; @Bean SpringRabbitTestBuildCustomizer springAmqpTestBuildCustomizer() { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfiguration.java new file mode 100644 index 0000000000..f7ba912a97 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfiguration.java @@ -0,0 +1,74 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springazure; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.generator.spring.build.BuildCustomizer; +import io.spring.initializr.generator.spring.build.gradle.DevelopmentOnlyDependencyGradleBuildCustomizer; +import io.spring.initializr.generator.spring.build.maven.OptionalDependencyMavenBuildCustomizer; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Spring Azure Docker Compose. + * + * @author Eddú Meléndez + * @author Moritz Halbritter + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("azure-storage") +class SpringAzureDockerComposeProjectGenerationConfiguration { + + private static final String DEPENDENCY_ID = "spring-azure-docker-compose"; + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + BuildCustomizer springAzureDockerComposeBuildCustomizer() { + return (build) -> build.dependencies() + .add(DEPENDENCY_ID, Dependency.withCoordinates("com.azure.spring", "spring-cloud-azure-docker-compose") + .scope(DependencyScope.RUNTIME)); + } + + @Bean + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + OptionalDependencyMavenBuildCustomizer springAzureDockerComposeMavenBuildCustomizer() { + return new OptionalDependencyMavenBuildCustomizer(DEPENDENCY_ID); + } + + @Bean + @ConditionalOnBuildSystem(GradleBuildSystem.ID) + DevelopmentOnlyDependencyGradleBuildCustomizer springAzureDockerComposeGradleBuildCustomizer() { + return new DevelopmentOnlyDependencyGradleBuildCustomizer(DEPENDENCY_ID); + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer azureStorageComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("azurite", + (service) -> composeFile.services().add("azurite", service)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizer.java new file mode 100644 index 0000000000..1cc42bae4b --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizer.java @@ -0,0 +1,66 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springazure; + +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * A {@link BuildCustomizer} that adds a Maven plugin when azure-support is selected. + * + * @author Muyao Feng + */ +class SpringAzureMavenBuildCustomizer implements BuildCustomizer { + + private static final String PLUGIN_VERSION = "0.1.0"; + + private final ProjectDescription projectDescription; + + SpringAzureMavenBuildCustomizer(ProjectDescription projectDescription) { + this.projectDescription = projectDescription; + } + + @Override + public void customize(MavenBuild build) { + build.plugins().add("com.microsoft.azure", "azure-container-apps-maven-plugin", (plugin) -> { + plugin.version(PLUGIN_VERSION); + plugin.configuration((configuration) -> { + configuration.add("subscriptionId", "your-subscription-id"); + configuration.add("resourceGroup", "your-resource-group"); + configuration.add("appEnvironmentName", "your-app-environment-name"); + configuration.add("region", "your-region"); + configuration.add("appName", this.projectDescription.getName()); + configuration.add("containers", (containers) -> { + containers.add("container", (container) -> { + container.add("type", "code"); + container.add("directory", "${project.basedir}"); + }); + }); + configuration.add("ingress", (ingress) -> { + ingress.add("external", "true"); + ingress.add("targetPort", "8080"); + }); + configuration.add("scale", (scale) -> { + scale.add("minReplicas", "0"); + scale.add("maxReplicas", "10"); + }); + }); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java index 99b374f904..c208fc57ab 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,6 @@ import java.util.Arrays; import java.util.function.Consumer; -import java.util.stream.Collectors; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; @@ -33,11 +32,12 @@ * @author Andy Wilkinson * @author Yonghui Ye * @author Stephane Nicoll + * @author Eddú Meléndez */ abstract class SpringAzureModuleRegistry { static Iterable createSpringBootRegistry() { - return create( + return create(onDependencies("azure-support").customizeHelpDocument(addDeploySection()), onDependencies("actuator").customizeBuild(addDependency("spring-cloud-azure-starter-actuator")) .customizeHelpDocument(addReferenceLink("actuator", "Azure Actuator")), onDependencies("integration", "azure-storage") @@ -54,28 +54,8 @@ static Iterable createSpringBootRegistry() { .addReferenceDocLink("https://aka.ms/spring/msdocs/postgresql", "Azure PostgreSQL support"))); } - static Iterable createSpringBoot2Registry() { - return create( - onDependencies("actuator").customizeBuild(addDependency("spring-cloud-azure-starter-actuator")) - .customizeHelpDocument(addReferenceLink("actuator", "Azure Actuator")), - onDependencies("distributed-tracing").customizeBuild(addDependency("spring-cloud-azure-trace-sleuth")) - .customizeHelpDocument(addReferenceLink("sleuth", "Azure Sleuth")), - onDependencies("integration", "azure-storage") - .customizeBuild(addDependency("spring-cloud-azure-starter-integration-storage-queue")) - .customizeHelpDocument( - addReferenceLink("spring-integration/storage-queue", "Azure Integration Storage Queue")), - onDependencies("mysql", "azure-support") - .customizeBuild(addDependency("spring-cloud-azure-starter-jdbc-mysql")) - .customizeHelpDocument((helpDocument) -> helpDocument.gettingStarted() - .addReferenceDocLink("https://aka.ms/spring/msdocs/mysql", "Azure MySQL support")), - onDependencies("postgresql", "azure-support") - .customizeBuild(addDependency("spring-cloud-azure-starter-jdbc-postgresql")) - .customizeHelpDocument((helpDocument) -> helpDocument.gettingStarted() - .addReferenceDocLink("https://aka.ms/spring/msdocs/postgresql", "Azure PostgreSQL support"))); - } - private static Iterable create(ImplicitDependency.Builder... dependencies) { - return Arrays.stream(dependencies).map(Builder::build).collect(Collectors.toList()); + return Arrays.stream(dependencies).map(Builder::build).toList(); } private static ImplicitDependency.Builder onDependencies(String... dependencyIds) { @@ -101,4 +81,31 @@ private static Consumer addReferenceLink(String id, String descrip }; } + private static Consumer addDeploySection() { + return (helpDocument) -> { + helpDocument.addSection((writer) -> { + writer.println("### Deploy to Azure"); + writer.println(); + writer.println("This project can be deployed to Azure with Maven."); + writer.println(); + writer.println( + "To get started, replace the following placeholder in your `pom.xml` with your specific Azure details:"); + writer.println(); + writer.println("- `subscriptionId`"); + writer.println("- `resourceGroup`"); + writer.println("- `appEnvironmentName`"); + writer.println("- `region`"); + writer.println(); + writer.println("Now you can deploy your application:"); + writer.println(""" + ```bash + ./mvnw azure-container-apps:deploy + ``` + """); + writer.println( + "Learn more about [Java on Azure Container Apps](https://learn.microsoft.com/azure/container-apps/java-overview)."); + }); + }; + } + } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java index 2a3f61ca44..edb867178d 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,10 +17,11 @@ package io.spring.start.site.extension.dependency.springazure; import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; import io.spring.start.site.support.implicit.ImplicitDependency; import io.spring.start.site.support.implicit.ImplicitDependencyBuildCustomizer; import io.spring.start.site.support.implicit.ImplicitDependencyHelpDocumentCustomizer; @@ -37,14 +38,10 @@ @ProjectGenerationConfiguration class SpringAzureProjectGenerationConfiguration { - private static final VersionRange SPRING_BOOT_2 = VersionParser.DEFAULT.parseRange("[2.0.0,3.0.0-M1)"); - private final Iterable azureDependencies; - SpringAzureProjectGenerationConfiguration(ProjectDescription description) { - this.azureDependencies = SPRING_BOOT_2.match(description.getPlatformVersion()) - ? SpringAzureModuleRegistry.createSpringBoot2Registry() - : SpringAzureModuleRegistry.createSpringBootRegistry(); + SpringAzureProjectGenerationConfiguration() { + this.azureDependencies = SpringAzureModuleRegistry.createSpringBootRegistry(); } @Bean @@ -57,4 +54,11 @@ ImplicitDependencyHelpDocumentCustomizer azureDependencyHelpDocumentCustomizer(B return new ImplicitDependencyHelpDocumentCustomizer(this.azureDependencies, build); } + @Bean + @ConditionalOnRequestedDependency("azure-support") + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + SpringAzureMavenBuildCustomizer azureDependencyMavenBuildCustomizer(ProjectDescription projectDescription) { + return new SpringAzureMavenBuildCustomizer(projectDescription); + } + } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfiguration.java new file mode 100644 index 0000000000..f2f3500f8e --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfiguration.java @@ -0,0 +1,57 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springazure; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.generator.spring.build.BuildCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Spring Azure Testcontainers. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("azure-storage") +class SpringAzureTestcontainersProjectGenerationConfiguration { + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + BuildCustomizer springAzureTestcontainersBuildCustomizer() { + return (build) -> build.dependencies() + .add("spring-azure-testcontainers", + Dependency.withCoordinates("com.azure.spring", "spring-cloud-azure-testcontainers") + .scope(DependencyScope.TEST_COMPILE)); + } + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer azureStorageServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("azurite", + (service) -> serviceConnections.addServiceConnection(ServiceConnections.ServiceConnection + .ofGenericContainer("azurite", service, "azure-storage/azurite"))); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java index 33b539b08f..eecae228c6 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java @@ -25,6 +25,7 @@ import io.spring.initializr.generator.spring.build.maven.OptionalDependencyMavenBuildCustomizer; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; /** * {@link ProjectGenerationConfiguration} for customizations relevant for Spring Boot. @@ -33,38 +34,42 @@ * @author Moritz Halbritter */ @ProjectGenerationConfiguration -public class SpringBootProjectGenerationConfiguration { +class SpringBootProjectGenerationConfiguration { - private static final String DEVTOOLS_ID = "devtools"; + @Configuration(proxyBeanMethods = false) + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + static class MavenConfiguration { - private static final String DOCKER_COMPOSE_ID = "docker-compose"; + @Bean + @ConditionalOnRequestedDependency("devtools") + OptionalDependencyMavenBuildCustomizer devToolsMavenBuildCustomizer() { + return new OptionalDependencyMavenBuildCustomizer("devtools"); + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + OptionalDependencyMavenBuildCustomizer dockerComposeMavenBuildCustomizer() { + return new OptionalDependencyMavenBuildCustomizer("docker-compose"); + } - @Bean - @ConditionalOnRequestedDependency(DEVTOOLS_ID) - @ConditionalOnBuildSystem(MavenBuildSystem.ID) - public OptionalDependencyMavenBuildCustomizer devToolsMavenBuildCustomizer() { - return new OptionalDependencyMavenBuildCustomizer(DEVTOOLS_ID); } - @Bean - @ConditionalOnRequestedDependency(DEVTOOLS_ID) + @Configuration(proxyBeanMethods = false) @ConditionalOnBuildSystem(GradleBuildSystem.ID) - public DevelopmentOnlyDependencyGradleBuildCustomizer devToolsGradleBuildCustomizer() { - return new DevelopmentOnlyDependencyGradleBuildCustomizer(DEVTOOLS_ID); - } + static class GradleConfiguration { - @Bean - @ConditionalOnRequestedDependency(DOCKER_COMPOSE_ID) - @ConditionalOnBuildSystem(MavenBuildSystem.ID) - public OptionalDependencyMavenBuildCustomizer dockerComposeMavenBuildCustomizer() { - return new OptionalDependencyMavenBuildCustomizer(DOCKER_COMPOSE_ID); - } + @Bean + @ConditionalOnRequestedDependency("devtools") + DevelopmentOnlyDependencyGradleBuildCustomizer devToolsGradleBuildCustomizer() { + return new DevelopmentOnlyDependencyGradleBuildCustomizer("devtools"); + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + DevelopmentOnlyDependencyGradleBuildCustomizer dockerComposeGradleBuildCustomizer() { + return new DevelopmentOnlyDependencyGradleBuildCustomizer("docker-compose"); + } - @Bean - @ConditionalOnRequestedDependency(DOCKER_COMPOSE_ID) - @ConditionalOnBuildSystem(GradleBuildSystem.ID) - public DevelopmentOnlyDependencyGradleBuildCustomizer dockerComposeGradleBuildCustomizer() { - return new DevelopmentOnlyDependencyGradleBuildCustomizer(DOCKER_COMPOSE_ID); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizer.java index 420374e020..569cd725e6 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,7 +43,7 @@ public class SpringCloudCircuitBreakerBuildCustomizer implements BuildCustomizer private final ProjectDescription description; public SpringCloudCircuitBreakerBuildCustomizer(InitializrMetadata metadata, ProjectDescription description) { - this.buildResolver = new BuildMetadataResolver(metadata); + this.buildResolver = new BuildMetadataResolver(metadata, description.getPlatformVersion()); this.metadata = metadata; this.description = description; } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizer.java index 409723441e..a620e363f5 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizer.java @@ -23,8 +23,6 @@ import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.BuildCustomizer; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -39,8 +37,6 @@ abstract class SpringCloudContractGradleBuildCustomizer implements BuildCustomiz private static final Log logger = LogFactory.getLog(SpringCloudContractGradleBuildCustomizer.class); - private static final VersionRange SPRING_CLOUD_CONTRACT_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.0.0.M4"); - private static final MavenRepository SPRING_MILESTONES = MavenRepository .withIdAndUrl("spring-milestones", "https://repo.spring.io/milestone") .name("Spring Milestones") @@ -81,9 +77,7 @@ public void customize(GradleBuild build) { Dependency.withCoordinates("io.rest-assured", "spring-web-test-client") .scope(DependencyScope.TEST_COMPILE)); } - if (SPRING_CLOUD_CONTRACT_3_0_OR_LATER.match(VersionParser.DEFAULT.parse(sccPluginVersion))) { - build.tasks().customize("contractTest", (task) -> task.invoke("useJUnitPlatform")); - } + build.tasks().customize("contractTest", (task) -> task.invoke("useJUnitPlatform")); configurePluginRepositories(build, sccPluginVersion); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGroovyDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGroovyDslGradleBuildCustomizer.java index cdb092ff19..08c3f65509 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGroovyDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGroovyDslGradleBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,14 +33,10 @@ class SpringCloudContractGroovyDslGradleBuildCustomizer extends SpringCloudContr @Override protected void configureContractsDsl(GradleBuild build) { - build.snippets().add((indentingWriter) -> { - indentingWriter.println("contracts {"); - indentingWriter.indented(() -> { - if (build.dependencies().has("webflux")) { - indentingWriter.println("testMode = 'WebTestClient'"); - } - }); - indentingWriter.println("}"); + build.extensions().customize("contracts", (contracts) -> { + if (build.dependencies().has("webflux")) { + contracts.attribute("testMode", "'WebTestClient'"); + } }); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractKotlinDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractKotlinDslGradleBuildCustomizer.java index 91b8b09887..1e7d064934 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractKotlinDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractKotlinDslGradleBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,6 @@ package io.spring.start.site.extension.dependency.springcloud; -import java.util.LinkedHashSet; -import java.util.Set; - import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.project.ProjectDescription; @@ -36,19 +33,11 @@ class SpringCloudContractKotlinDslGradleBuildCustomizer extends SpringCloudContr @Override protected void configureContractsDsl(GradleBuild build) { - boolean hasWebflux = build.dependencies().has("webflux"); - Set imports = new LinkedHashSet<>(); - if (hasWebflux) { - imports.add("org.springframework.cloud.contract.verifier.config.TestMode"); - } - build.snippets().add(imports, (indentingWriter) -> { - indentingWriter.println("contracts {"); - indentingWriter.indented(() -> { - if (hasWebflux) { - indentingWriter.println("testMode.set(TestMode.WEBTESTCLIENT)"); - } - }); - indentingWriter.println("}"); + build.extensions().customize("contracts", (contracts) -> { + if (build.dependencies().has("webflux")) { + contracts.attributeWithType("testMode", "TestMode.WEBTESTCLIENT", + "org.springframework.cloud.contract.verifier.config.TestMode"); + } }); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudGatewayHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudGatewayHelpDocumentCustomizer.java deleted file mode 100644 index 6e51ed7a8b..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudGatewayHelpDocumentCustomizer.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.springcloud; - -import java.util.Map; - -import io.spring.initializr.generator.buildsystem.Dependency; -import io.spring.initializr.generator.project.ProjectDescriptionDiff; -import io.spring.initializr.generator.spring.documentation.HelpDocument; -import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; - -/** - * A {@link HelpDocumentCustomizer} that adds a warning if Spring Cloud Gateway is used - * with Spring MVC. - * - * @author Stephane Nicoll - */ -public class SpringCloudGatewayHelpDocumentCustomizer implements HelpDocumentCustomizer { - - private final ProjectDescriptionDiff diff; - - public SpringCloudGatewayHelpDocumentCustomizer(ProjectDescriptionDiff diff) { - this.diff = diff; - } - - @Override - public void customize(HelpDocument document) { - Map originalDependencies = this.diff.getOriginal().getRequestedDependencies(); - if (originalDependencies.containsKey("cloud-gateway") && originalDependencies.containsKey("web")) { - document.getWarnings() - .addItem( - "Spring Cloud Gateway requires Spring WebFlux, your choice of Spring Web has been replaced accordingly."); - } - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java index 5161e6dd30..0c668f7f7f 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,11 +27,10 @@ import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.io.template.MustacheTemplateRenderer; import io.spring.initializr.generator.project.ProjectDescription; -import io.spring.initializr.generator.project.ProjectDescriptionDiff; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.project.contributor.ProjectContributor; import io.spring.initializr.metadata.InitializrMetadata; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -43,52 +42,44 @@ * @author Stephane Nicoll */ @ProjectGenerationConfiguration -public class SpringCloudProjectGenerationConfiguration { +class SpringCloudProjectGenerationConfiguration { private final InitializrMetadata metadata; private final ProjectDescription description; - public SpringCloudProjectGenerationConfiguration(InitializrMetadata metadata, ProjectDescription description) { + SpringCloudProjectGenerationConfiguration(InitializrMetadata metadata, ProjectDescription description) { this.metadata = metadata; this.description = description; } @Bean - public SpringCloudFunctionBuildCustomizer springCloudFunctionBuildCustomizer() { + SpringCloudFunctionBuildCustomizer springCloudFunctionBuildCustomizer() { return new SpringCloudFunctionBuildCustomizer(this.metadata, this.description); } @Bean - public SpringCloudStreamBuildCustomizer springCloudStreamBuildCustomizer() { - return new SpringCloudStreamBuildCustomizer(this.description); + SpringCloudStreamBuildCustomizer springCloudStreamBuildCustomizer() { + return new SpringCloudStreamBuildCustomizer(); } @Bean - SpringCloudProjectVersionResolver springCloudProjectVersionResolver( - DependencyManagementVersionResolver versionResolver) { + SpringCloudProjectVersionResolver springCloudProjectVersionResolver(MavenVersionResolver versionResolver) { return new SpringCloudProjectVersionResolver(this.metadata, versionResolver); } @Bean - public SpringCloudFunctionHelpDocumentCustomizer springCloudFunctionHelpDocumentCustomizer(Build build, + SpringCloudFunctionHelpDocumentCustomizer springCloudFunctionHelpDocumentCustomizer(Build build, MustacheTemplateRenderer templateRenderer, SpringCloudProjectVersionResolver versionResolver) { return new SpringCloudFunctionHelpDocumentCustomizer(build, this.description, templateRenderer, versionResolver); } @Bean - public SpringCloudCircuitBreakerBuildCustomizer springCloudCircuitBreakerBuildCustomizer() { + SpringCloudCircuitBreakerBuildCustomizer springCloudCircuitBreakerBuildCustomizer() { return new SpringCloudCircuitBreakerBuildCustomizer(this.metadata, this.description); } - @Bean - @ConditionalOnRequestedDependency("cloud-gateway") - public SpringCloudGatewayHelpDocumentCustomizer springCloudGatewayHelpDocumentCustomizer( - ProjectDescriptionDiff diff) { - return new SpringCloudGatewayHelpDocumentCustomizer(diff); - } - @Configuration(proxyBeanMethods = false) @ConditionalOnRequestedDependency("cloud-contract-verifier") static class SpringCloudContractConfiguration { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectVersionResolver.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectVersionResolver.java index b0e49ac9c7..a94fcaa2df 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectVersionResolver.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectVersionResolver.java @@ -19,13 +19,12 @@ import io.spring.initializr.generator.version.Version; import io.spring.initializr.metadata.BillOfMaterials; import io.spring.initializr.metadata.InitializrMetadata; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** - * Resolve Spring Cloud artifact versions using a - * {@link DependencyManagementVersionResolver}. + * Resolve Spring Cloud artifact versions using a {@link MavenVersionResolver}. * * @author Olga Maciaszek-Sharma * @author Stephane Nicoll @@ -36,11 +35,11 @@ class SpringCloudProjectVersionResolver { private final InitializrMetadata metadata; - private final DependencyManagementVersionResolver resolver; + private final MavenVersionResolver versionResolver; - SpringCloudProjectVersionResolver(InitializrMetadata metadata, DependencyManagementVersionResolver resolver) { + SpringCloudProjectVersionResolver(InitializrMetadata metadata, MavenVersionResolver versionResolver) { this.metadata = metadata; - this.resolver = resolver; + this.versionResolver = versionResolver; } /** @@ -60,7 +59,8 @@ String resolveVersion(Version platformVersion, String dependencyId) { String releaseTrainVersion = bom.resolve(platformVersion).getVersion(); logger.info("Retrieving version for artifact: " + dependencyId + " and release train version: " + releaseTrainVersion); - return this.resolver.resolve("org.springframework.cloud", "spring-cloud-dependencies", releaseTrainVersion) + return this.versionResolver + .resolveDependencies("org.springframework.cloud", "spring-cloud-dependencies", releaseTrainVersion) .get(dependencyId); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizer.java index 8476da598b..54cef29212 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizer.java @@ -19,10 +19,7 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; -import io.spring.initializr.generator.buildsystem.maven.MavenBuild; -import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.Version; /** * Determine the appropriate Spring Cloud stream dependency to use based on the selected @@ -38,12 +35,6 @@ */ class SpringCloudStreamBuildCustomizer implements BuildCustomizer { - private final ProjectDescription description; - - SpringCloudStreamBuildCustomizer(ProjectDescription description) { - this.description = description; - } - @Override public void customize(Build build) { if (hasDependency("cloud-stream", build) || hasDependency("cloud-bus", build)) { @@ -57,6 +48,11 @@ public void customize(Build build) { .add("cloud-stream-binder-kafka", "org.springframework.cloud", "spring-cloud-stream-binder-kafka", DependencyScope.COMPILE); } + if (hasDependency("pulsar", build)) { + build.dependencies() + .add("cloud-stream-binder-pulsar", "org.springframework.cloud", "spring-cloud-stream-binder-pulsar", + DependencyScope.COMPILE); + } } // Spring Cloud Stream specific if (hasDependency("cloud-stream", build)) { @@ -65,21 +61,10 @@ public void customize(Build build) { .add("cloud-stream-binder-kafka-streams", "org.springframework.cloud", "spring-cloud-stream-binder-kafka-streams", DependencyScope.COMPILE); } - if (isSpringBoot3x()) { - build.dependencies() - .add("cloud-stream-test", - Dependency.withCoordinates("org.springframework.cloud", "spring-cloud-stream-test-binder") - .scope(DependencyScope.TEST_COMPILE)); - } - else if (build instanceof MavenBuild) { - // TODO: https://github.com/spring-io/initializr/issues/1159 - build.dependencies() - .add("cloud-stream-test", - Dependency.withCoordinates("org.springframework.cloud", "spring-cloud-stream") - .classifier("test-binder") - .type("test-jar") - .scope(DependencyScope.TEST_COMPILE)); - } + build.dependencies() + .add("cloud-stream-test", + Dependency.withCoordinates("org.springframework.cloud", "spring-cloud-stream-test-binder") + .scope(DependencyScope.TEST_COMPILE)); } } @@ -87,9 +72,4 @@ protected boolean hasDependency(String id, Build build) { return build.dependencies().has(id); } - protected boolean isSpringBoot3x() { - Version platformVersion = this.description.getPlatformVersion(); - return platformVersion.compareTo(Version.parse("3.0.0-M1")) > 0; - } - } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java index 9bf352c5ba..11c1c5b879 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java @@ -25,9 +25,6 @@ import io.spring.initializr.generator.buildsystem.DependencyContainer; import io.spring.initializr.generator.buildsystem.DependencyScope; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; import io.spring.initializr.generator.version.VersionReference; /** @@ -38,48 +35,30 @@ * @author Stephane Nicoll * @author Andy Wilkinson * @author Brian Clozel + * @author Eddú Meléndez */ public class R2dbcBuildCustomizer implements BuildCustomizer { private static final List JDBC_DEPENDENCY_IDS = Arrays.asList("jdbc", "data-jdbc", "data-jpa"); - private static final VersionRange SPRING_BOOT_2_7_0_OR_LATER = VersionParser.DEFAULT.parseRange("2.7.0-M1"); - - private static final VersionRange SPRING_BOOT_3_0_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.0.0-M1"); - - private final boolean borcaOrLater; - - private final boolean mariaDbIsUnmanaged; - - private final boolean sqlServerIsUnmanaged; - - public R2dbcBuildCustomizer(Version platformVersion) { - this.borcaOrLater = SPRING_BOOT_2_7_0_OR_LATER.match(platformVersion); - this.mariaDbIsUnmanaged = SPRING_BOOT_3_0_0_OR_LATER.match(platformVersion); - this.sqlServerIsUnmanaged = SPRING_BOOT_3_0_0_OR_LATER.match(platformVersion); - } - @Override public void customize(Build build) { if (build.dependencies().has("h2")) { addManagedDriver(build.dependencies(), "io.r2dbc", "r2dbc-h2"); } if (build.dependencies().has("mariadb")) { - addManagedDriver(build.dependencies(), "org.mariadb", "r2dbc-mariadb", - this.mariaDbIsUnmanaged ? "1.1.3" : null); + addManagedDriver(build.dependencies(), "org.mariadb", "r2dbc-mariadb", "1.1.3"); } - if (build.dependencies().has("mysql") && !this.borcaOrLater) { - addManagedDriver(build.dependencies(), "dev.miku", "r2dbc-mysql"); + if (build.dependencies().has("mysql")) { + addManagedDriver(build.dependencies(), "io.asyncer", "r2dbc-mysql"); } if (build.dependencies().has("postgresql")) { - String groupId = this.borcaOrLater ? "org.postgresql" : "io.r2dbc"; - addManagedDriver(build.dependencies(), groupId, "r2dbc-postgresql"); + addManagedDriver(build.dependencies(), "org.postgresql", "r2dbc-postgresql"); } if (build.dependencies().has("sqlserver")) { - addManagedDriver(build.dependencies(), "io.r2dbc", "r2dbc-mssql", - this.sqlServerIsUnmanaged ? "1.0.0.RELEASE" : null); + addManagedDriver(build.dependencies(), "io.r2dbc", "r2dbc-mssql", "1.0.0.RELEASE"); } - if (build.dependencies().has("oracle") && this.borcaOrLater) { + if (build.dependencies().has("oracle")) { addManagedDriver(build.dependencies(), "com.oracle.database.r2dbc", "oracle-r2dbc"); } if (build.dependencies().has("flyway") || build.dependencies().has("liquibase")) { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizer.java index e81eb4709c..b3e5bca39d 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizer.java @@ -16,7 +16,6 @@ package io.spring.start.site.extension.dependency.springdata; -import java.util.Arrays; import java.util.List; import io.spring.initializr.generator.buildsystem.Build; @@ -31,7 +30,7 @@ */ public class R2dbcHelpDocumentCustomizer implements HelpDocumentCustomizer { - private static final List DRIVERS = Arrays.asList("h2", "mariadb", "postgresql", "sqlserver", "oracle"); + private static final List DRIVERS = List.of("h2", "mariadb", "mysql", "postgresql", "sqlserver", "oracle"); private final Build build; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/SpringDataProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/SpringDataProjectGenerationConfiguration.java index 4ba833ac69..3471702f7f 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/SpringDataProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/SpringDataProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,6 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; -import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import org.springframework.context.annotation.Bean; @@ -33,8 +32,8 @@ public class SpringDataProjectGenerationConfiguration { @Bean @ConditionalOnRequestedDependency("data-r2dbc") - public R2dbcBuildCustomizer r2dbcBuildCustomizer(ProjectDescription description) { - return new R2dbcBuildCustomizer(description.getPlatformVersion()); + public R2dbcBuildCustomizer r2dbcBuildCustomizer() { + return new R2dbcBuildCustomizer(); } @Bean diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/AbstractGrpcGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/AbstractGrpcGradleBuildCustomizer.java new file mode 100644 index 0000000000..8717c165d4 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/AbstractGrpcGradleBuildCustomizer.java @@ -0,0 +1,51 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springgrpc; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.buildsystem.gradle.GradleExtensionContainer; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * Abstract base class for {@link BuildCustomizer} to deal withj Gradle based gRPC + * projects. + * + * @author Moritz Halbritter + */ +abstract class AbstractGrpcGradleBuildCustomizer implements BuildCustomizer { + + private static final String GRPC_PLUGIN_VERSION = "0.9.4"; + + private final char quote; + + AbstractGrpcGradleBuildCustomizer(char quote) { + this.quote = quote; + } + + @Override + public void customize(GradleBuild build) { + build.plugins().add("com.google.protobuf", (plugin) -> plugin.setVersion(GRPC_PLUGIN_VERSION)); + customizeExtensions(build.extensions()); + } + + protected abstract void customizeExtensions(GradleExtensionContainer extensions); + + protected String quote(String value) { + return this.quote + value + this.quote; + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcAdditionalDependenciesBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcAdditionalDependenciesBuildCustomizer.java new file mode 100644 index 0000000000..0b4f1a8e64 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcAdditionalDependenciesBuildCustomizer.java @@ -0,0 +1,37 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springgrpc; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} to add additional dependencies for Spring gRPC. + * + * @author Moritz Halbritter + */ +class GrpcAdditionalDependenciesBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(Build build) { + build.dependencies().add("grpc-services", "io.grpc", "grpc-services", DependencyScope.COMPILE); + build.dependencies() + .add("spring-grpc-test", "org.springframework.grpc", "spring-grpc-test", DependencyScope.TEST_COMPILE); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleGroovyBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleGroovyBuildCustomizer.java new file mode 100644 index 0000000000..080c63de77 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleGroovyBuildCustomizer.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springgrpc; + +import io.spring.initializr.generator.buildsystem.gradle.GradleExtensionContainer; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} to customize the Groovy DSL Gradle build to build gRPC + * projects. + * + * @author Moritz Halbritter + */ +class GrpcGradleGroovyBuildCustomizer extends AbstractGrpcGradleBuildCustomizer { + + GrpcGradleGroovyBuildCustomizer() { + super('\''); + } + + @Override + protected void customizeExtensions(GradleExtensionContainer extensions) { + extensions.customize("protobuf", (protobuf) -> { + protobuf.nested("protoc", (protoc) -> protoc.attribute("artifact", quote("com.google.protobuf:protoc"))); + protobuf.nested("plugins", (plugins) -> plugins.nested("grpc", + (grpc) -> grpc.attribute("artifact", quote("io.grpc:protoc-gen-grpc-java")))); + protobuf.nested("generateProtoTasks", (generateProtoTasks) -> generateProtoTasks.nested("all()*.plugins", + (plugins) -> plugins.nested("grpc", (grpc) -> { + grpc.invoke("option", quote("jakarta_omit")); + grpc.invoke("option", quote("@generated=omit")); + }))); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleKotlinBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleKotlinBuildCustomizer.java new file mode 100644 index 0000000000..123643a64b --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleKotlinBuildCustomizer.java @@ -0,0 +1,49 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springgrpc; + +import io.spring.initializr.generator.buildsystem.gradle.GradleExtensionContainer; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} to customize the Kotlin DSL Gradle build to build gRPC + * projects. + * + * @author Moritz Halbritter + */ +class GrpcGradleKotlinBuildCustomizer extends AbstractGrpcGradleBuildCustomizer { + + GrpcGradleKotlinBuildCustomizer() { + super('\"'); + } + + @Override + protected void customizeExtensions(GradleExtensionContainer extensions) { + extensions.customize("protobuf", (protobuf) -> { + protobuf.nested("protoc", (protoc) -> protoc.attribute("artifact", quote("com.google.protobuf:protoc"))); + protobuf.importType("com.google.protobuf.gradle.id"); + protobuf.nested("plugins", (plugins) -> plugins.nested("id(\"grpc\")", + (grpc) -> grpc.attribute("artifact", quote("io.grpc:protoc-gen-grpc-java")))); + protobuf.nested("generateProtoTasks", (generateProtoTasks) -> generateProtoTasks.nested("all().forEach", + (forEach) -> forEach.nested("it.plugins", (plugins) -> plugins.nested("id(\"grpc\")", (grpc) -> { + grpc.invoke("option", quote("jakarta_omit")); + grpc.invoke("option", quote("@generated=omit")); + })))); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java new file mode 100644 index 0000000000..3534cde4f9 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java @@ -0,0 +1,88 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springgrpc; + +import io.spring.initializr.generator.buildsystem.PropertyContainer; +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.buildsystem.maven.MavenPluginContainer; +import io.spring.initializr.generator.spring.build.BuildCustomizer; +import io.spring.initializr.generator.version.VersionProperty; + +/** + * {@link BuildCustomizer} to customize the Maven build to build gRPC projects. + * + * @author Moritz Halbritter + */ +class GrpcMavenBuildCustomizer implements BuildCustomizer { + + private static final String OS_PLUGIN_VERSION = "1.7.1"; + + private static final String PROTOBUF_PLUGIN_VERSION = "0.6.1"; + + private final String protobufJavaVersion; + + private final String grpcVersion; + + GrpcMavenBuildCustomizer(String protobufJavaVersion, String grpcVersion) { + this.protobufJavaVersion = protobufJavaVersion; + this.grpcVersion = grpcVersion; + } + + @Override + public void customize(MavenBuild build) { + VersionProperty protobufJava = VersionProperty.of("protobuf-java.version"); + VersionProperty grpc = VersionProperty.of("grpc.version"); + addVersionProperties(build.properties(), protobufJava, grpc); + addOsPlugin(build.plugins()); + addProtobufPlugin(build.plugins(), protobufJava, grpc); + } + + private void addVersionProperties(PropertyContainer properties, VersionProperty protobufJava, + VersionProperty grpc) { + properties.version(protobufJava, this.protobufJavaVersion); + properties.version(grpc, this.grpcVersion); + } + + private void addOsPlugin(MavenPluginContainer plugins) { + plugins.add("kr.motd.maven", "os-maven-plugin", (plugin) -> { + plugin.version(OS_PLUGIN_VERSION); + plugin.execution("initialize", (execution) -> { + execution.phase("initialize"); + execution.goal("detect"); + }); + }); + } + + private void addProtobufPlugin(MavenPluginContainer plugins, VersionProperty protobufJava, VersionProperty grpc) { + plugins.add("org.xolstice.maven.plugins", "protobuf-maven-plugin", (plugin) -> { + plugin.version(PROTOBUF_PLUGIN_VERSION); + plugin.configuration((configuration) -> { + configuration.add("protocArtifact", "com.google.protobuf:protoc:${%s}:exe:${os.detected.classifier}" + .formatted(protobufJava.toStandardFormat())); + configuration.add("pluginId", "grpc-java"); + configuration.add("pluginArtifact", "io.grpc:protoc-gen-grpc-java:${%s}:exe:${os.detected.classifier}" + .formatted(grpc.toStandardFormat())); + }); + plugin.execution("compile", (execution) -> { + execution.goal("compile").goal("compile-custom"); + execution.configuration( + (configuration) -> configuration.add("pluginParameter", "jakarta_omit,@generated=omit")); + }); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcProjectContributor.java new file mode 100644 index 0000000000..13a3cdfb34 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcProjectContributor.java @@ -0,0 +1,38 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springgrpc; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import io.spring.initializr.generator.project.contributor.ProjectContributor; + +/** + * A {@link ProjectContributor} that creates the "src/main/proto" directory. + * + * @author Moritz Halbritter + */ +class GrpcProjectContributor implements ProjectContributor { + + @Override + public void contribute(Path projectRoot) throws IOException { + Path protoDirectory = projectRoot.resolve("src/main/proto"); + Files.createDirectories(protoDirectory); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcVersionResolver.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcVersionResolver.java new file mode 100644 index 0000000000..992c6c304b --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcVersionResolver.java @@ -0,0 +1,47 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springgrpc; + +import java.util.Map; + +import io.spring.initializr.versionresolver.MavenVersionResolver; + +import org.springframework.util.function.SingletonSupplier; + +/** + * Resolves dependency versions from 'org.springframework.grpc:spring-grpc-dependencies'. + * + * @author Moritz Halbritter + */ +class GrpcVersionResolver { + + private final SingletonSupplier> versions; + + GrpcVersionResolver(MavenVersionResolver versionResolver, String springGrpcVersion) { + this.versions = SingletonSupplier.of(() -> versionResolver.resolveDependencies("org.springframework.grpc", + "spring-grpc-dependencies", springGrpcVersion)); + } + + String resolveProtobufJavaVersion() { + return this.versions.obtain().get("com.google.protobuf:protobuf-java"); + } + + String resolveGrpcVersion() { + return this.versions.obtain().get("io.grpc:grpc-core"); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfiguration.java new file mode 100644 index 0000000000..f9f0047843 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfiguration.java @@ -0,0 +1,80 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springgrpc; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.metadata.InitializrMetadata; +import io.spring.initializr.versionresolver.MavenVersionResolver; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Spring gRPC. + * + * @author Moritz Halbritter + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("spring-grpc") +class SpringGrpcProjectGenerationConfiguration { + + @Bean + GrpcVersionResolver grpcVersionResolver(ProjectDescription description, InitializrMetadata metadata, + MavenVersionResolver versionResolver) { + String springGrpcVersion = metadata.getConfiguration() + .getEnv() + .getBoms() + .get("spring-grpc") + .resolve(description.getPlatformVersion()) + .getVersion(); + return new GrpcVersionResolver(versionResolver, springGrpcVersion); + } + + @Bean + GrpcAdditionalDependenciesBuildCustomizer grpcAdditionalDependenciesBuildCustomizer() { + return new GrpcAdditionalDependenciesBuildCustomizer(); + } + + @Bean + @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_GROOVY) + GrpcGradleGroovyBuildCustomizer grpcGradleGroovyBuildCustomizer() { + return new GrpcGradleGroovyBuildCustomizer(); + } + + @Bean + @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_KOTLIN) + GrpcGradleKotlinBuildCustomizer grpcGradleKotlinBuildCustomizer() { + return new GrpcGradleKotlinBuildCustomizer(); + } + + @Bean + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + GrpcMavenBuildCustomizer grpcMavenBuildCustomizer(GrpcVersionResolver versionResolver) { + return new GrpcMavenBuildCustomizer(versionResolver.resolveProtobufJavaVersion(), + versionResolver.resolveGrpcVersion()); + } + + @Bean + GrpcProjectContributor grpcProjectContributor() { + return new GrpcProjectContributor(); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/package-info.java new file mode 100644 index 0000000000..6735fc2e50 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for generation of projects that depend on Spring gRPC. + */ +package io.spring.start.site.extension.dependency.springgrpc; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java index cee0e7aa03..de0ec93505 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,14 +16,15 @@ package io.spring.start.site.extension.dependency.springintegration; -import java.util.Arrays; +import java.util.ArrayList; +import java.util.List; import java.util.function.Consumer; -import java.util.stream.Collectors; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; import io.spring.initializr.generator.spring.documentation.HelpDocument; +import io.spring.initializr.generator.version.Version; import io.spring.start.site.support.implicit.ImplicitDependency; import io.spring.start.site.support.implicit.ImplicitDependency.Builder; @@ -32,48 +33,50 @@ * * @author Artem Bilan * @author Stephane Nicoll + * @author Moritz Halbritter + * @author Eddú Meléndez */ abstract class SpringIntegrationModuleRegistry { - static Iterable create() { - return create( - onDependencies("activemq", "artemis").customizeBuild(addDependency("jms")) - .customizeHelpDocument(addReferenceLink("JMS Module", "jms")), - onDependencies("amqp").customizeBuild(addDependency("amqp")) - .customizeHelpDocument(addReferenceLink("AMQP Module", "amqp")), - onDependencies("data-jdbc", "jdbc").customizeBuild(addDependency("jdbc")) - .customizeHelpDocument(addReferenceLink("JDBC Module", "jdbc")), - onDependencies("data-jpa").customizeBuild(addDependency("jpa")) - .customizeHelpDocument(addReferenceLink("JPA Module", "jpa")), - onDependencies("data-mongodb", "data-mongodb-reactive").customizeBuild(addDependency("mongodb")) - .customizeHelpDocument(addReferenceLink("MongoDB Module", "mongodb")), - onDependencies("data-r2dbc").customizeBuild(addDependency("r2dbc")) - .customizeHelpDocument(addReferenceLink("R2DBC Module", "r2dbc")), - onDependencies("data-redis", "data-redis-reactive").customizeBuild(addDependency("redis")) - .customizeHelpDocument(addReferenceLink("Redis Module", "redis")), - onDependencies("integration").customizeBuild(addDependency("test", DependencyScope.TEST_COMPILE)) - .customizeHelpDocument(addReferenceLink("Test Module", "testing")), - onDependencies("kafka", "kafka-streams").customizeBuild(addDependency("kafka")) - .customizeHelpDocument(addReferenceLink("Apache Kafka Module", "kafka")), - onDependencies("mail").customizeBuild(addDependency("mail")) - .customizeHelpDocument(addReferenceLink("Mail Module", "mail")), - onDependencies("rsocket").customizeBuild(addDependency("rsocket")) - .customizeHelpDocument(addReferenceLink("RSocket Module", "rsocket")), - onDependencies("security").customizeBuild(addDependency("security")) - .customizeHelpDocument(addReferenceLink("Security Module", "security")), - onDependencies("web").customizeBuild(addDependency("http")) - .customizeHelpDocument(addReferenceLink("HTTP Module", "http")), - onDependencies("webflux").customizeBuild(addDependency("webflux")) - .customizeHelpDocument(addReferenceLink("WebFlux Module", "webflux")), - onDependencies("websocket").customizeBuild(addDependency("stomp").andThen(addDependency("websocket"))) - .customizeHelpDocument(addReferenceLink("STOMP Module", "stomp") - .andThen(addReferenceLink("WebSocket Module", "web-sockets"))), - onDependencies("web-services").customizeBuild(addDependency("ws")) - .customizeHelpDocument(addReferenceLink("Web Services Module", "ws"))); - } - - private static Iterable create(ImplicitDependency.Builder... dependencies) { - return Arrays.stream(dependencies).map(Builder::build).collect(Collectors.toList()); + static Iterable create(Version platformVersion) { + List builders = new ArrayList<>(); + builders.add(onDependencies("activemq", "artemis").customizeBuild(addDependency("jms")) + .customizeHelpDocument(addReferenceLink("JMS Module", "jms"))); + builders.add(onDependencies("amqp", "amqp-streams").customizeBuild(addDependency("amqp")) + .customizeHelpDocument(addReferenceLink("AMQP Module", "amqp"))); + builders.add(onDependencies("data-jdbc", "jdbc").customizeBuild(addDependency("jdbc")) + .customizeHelpDocument(addReferenceLink("JDBC Module", "jdbc"))); + builders.add(onDependencies("data-jpa").customizeBuild(addDependency("jpa")) + .customizeHelpDocument(addReferenceLink("JPA Module", "jpa"))); + builders.add(onDependencies("data-mongodb", "data-mongodb-reactive").customizeBuild(addDependency("mongodb")) + .customizeHelpDocument(addReferenceLink("MongoDB Module", "mongodb"))); + builders.add(onDependencies("data-r2dbc").customizeBuild(addDependency("r2dbc")) + .customizeHelpDocument(addReferenceLink("R2DBC Module", "r2dbc"))); + builders.add(onDependencies("data-redis", "data-redis-reactive").customizeBuild(addDependency("redis")) + .customizeHelpDocument(addReferenceLink("Redis Module", "redis"))); + builders.add(onDependencies("integration").customizeBuild(addDependency("test", DependencyScope.TEST_COMPILE)) + .customizeHelpDocument(addReferenceLink("Test Module", "testing"))); + builders.add(onDependencies("kafka", "kafka-streams").customizeBuild(addDependency("kafka")) + .customizeHelpDocument(addReferenceLink("Apache Kafka Module", "kafka"))); + builders.add(onDependencies("mail").customizeBuild(addDependency("mail")) + .customizeHelpDocument(addReferenceLink("Mail Module", "mail"))); + builders.add(onDependencies("rsocket").customizeBuild(addDependency("rsocket")) + .customizeHelpDocument(addReferenceLink("RSocket Module", "rsocket"))); + builders.add(onDependencies("security") + .customizeBuild(addDependency("spring-security-messaging", "org.springframework.security", + "spring-security-messaging", DependencyScope.COMPILE)) + .customizeHelpDocument(addReferenceLink("Security Module", "security"))); + builders.add(onDependencies("web").customizeBuild(addDependency("http")) + .customizeHelpDocument(addReferenceLink("HTTP Module", "http"))); + builders.add(onDependencies("webflux").customizeBuild(addDependency("webflux")) + .customizeHelpDocument(addReferenceLink("WebFlux Module", "webflux"))); + builders + .add(onDependencies("websocket").customizeBuild(addDependency("stomp").andThen(addDependency("websocket"))) + .customizeHelpDocument(addReferenceLink("STOMP Module", "stomp") + .andThen(addReferenceLink("WebSocket Module", "web-sockets")))); + builders.add(onDependencies("web-services").customizeBuild(addDependency("ws")) + .customizeHelpDocument(addReferenceLink("Web Services Module", "ws"))); + return builders.stream().map(Builder::build).toList(); } private static ImplicitDependency.Builder onDependencies(String... dependencyIds) { @@ -85,15 +88,16 @@ private static Consumer addDependency(String id) { } private static Consumer addDependency(String id, DependencyScope scope) { - return (build) -> build.dependencies() - .add("integration-" + id, - Dependency.withCoordinates("org.springframework.integration", "spring-integration-" + id) - .scope(scope)); + return addDependency("integration-" + id, "org.springframework.integration", "spring-integration-" + id, scope); + } + + private static Consumer addDependency(String id, String groupId, String artifactId, DependencyScope scope) { + return (build) -> build.dependencies().add(id, Dependency.withCoordinates(groupId, artifactId).scope(scope)); } private static Consumer addReferenceLink(String name, String id) { return (helpDocument) -> { - String href = String.format("https://docs.spring.io/spring-integration/reference/html/%s.html", id); + String href = "https://docs.spring.io/spring-integration/reference/%s.html".formatted(id); String description = String.format("Spring Integration %s Reference Guide", name); helpDocument.gettingStarted().addReferenceDocLink(href, description); }; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfiguration.java index 89cef27b63..b91e06f4db 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfiguration.java @@ -18,6 +18,7 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.start.site.support.implicit.ImplicitDependency; import io.spring.start.site.support.implicit.ImplicitDependencyBuildCustomizer; @@ -37,8 +38,8 @@ class SpringIntegrationProjectGenerationConfiguration { private final Iterable dependencies; - SpringIntegrationProjectGenerationConfiguration() { - this.dependencies = SpringIntegrationModuleRegistry.create(); + SpringIntegrationProjectGenerationConfiguration(ProjectDescription projectDescription) { + this.dependencies = SpringIntegrationModuleRegistry.create(projectDescription.getPlatformVersion()); } @Bean diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaBuildCustomizer.java index e06dd509c6..adb2b72535 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaBuildCustomizer.java @@ -29,15 +29,14 @@ * @author Stephane Nicoll * @author Madhura Bhave */ -public class SpringKafkaBuildCustomizer implements BuildCustomizer { +class SpringKafkaBuildCustomizer implements BuildCustomizer { @Override public void customize(Build build) { - if (build.dependencies().has("kafka")) { - build.dependencies() - .add("spring-kafka-test", Dependency.withCoordinates("org.springframework.kafka", "spring-kafka-test") - .scope(DependencyScope.TEST_COMPILE)); - } + build.dependencies() + .add("spring-kafka-test", Dependency.withCoordinates("org.springframework.kafka", "spring-kafka-test") + .scope(DependencyScope.TEST_COMPILE)); + } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java new file mode 100644 index 0000000000..32f57f6580 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java @@ -0,0 +1,105 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springkafka; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Spring Kafka and Kafka Streams. + * + * @author Stephane Nicoll + * @author Eddú Meléndez + * @author Moritz Halbritter + */ +@ProjectGenerationConfiguration +class SpringKafkaProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CONFLUENT_CLASS_NAME = "org.testcontainers.containers.KafkaContainer"; + + private static final String TESTCONTAINERS_APACHE_CLASS_NAME = "org.testcontainers.kafka.KafkaContainer"; + + private static final VersionRange SPRING_BOOT_3_4_M2_OR_LATER = VersionParser.DEFAULT.parseRange("3.4.0-M2"); + + private final boolean isSpringBoot34OrLater; + + SpringKafkaProjectGenerationConfiguration(ProjectDescription projectDescription) { + this.isSpringBoot34OrLater = SPRING_BOOT_3_4_M2_OR_LATER.match(projectDescription.getPlatformVersion()); + } + + @Bean + @ConditionalOnRequestedDependency("kafka") + SpringKafkaBuildCustomizer springKafkaBuildCustomizer() { + return new SpringKafkaBuildCustomizer(); + } + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer kafkaServiceConnectionsCustomizer(Build build, DockerServiceResolver serviceResolver) { + return (serviceConnections) -> { + if (isKafkaEnabled(build)) { + if (this.isSpringBoot34OrLater) { + serviceResolver.doWith("kafka-native", (service) -> serviceConnections.addServiceConnection( + ServiceConnection.ofContainer("kafka", service, TESTCONTAINERS_APACHE_CLASS_NAME, false))); + } + else { + serviceResolver.doWith("kafka", + (service) -> serviceConnections.addServiceConnection(ServiceConnection.ofContainer("kafka", + service, TESTCONTAINERS_CONFLUENT_CLASS_NAME, false))); + } + } + }; + } + + @Bean + @ConditionalOnRequestedDependency("kafka-streams") + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + SpringKafkaStreamsMavenBuildCustomizer springKafkaStreamsMavenBuildCustomizer() { + return new SpringKafkaStreamsMavenBuildCustomizer(); + } + + @Bean + @ConditionalOnRequestedDependency("kafka-streams") + @ConditionalOnBuildSystem(id = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_GROOVY) + SpringKafkaStreamsGradleBuildCustomizer springKafkaStreamsGradleBuildCustomizer() { + return new SpringKafkaStreamsGradleBuildCustomizer('\''); + } + + @Bean + @ConditionalOnRequestedDependency("kafka-streams") + @ConditionalOnBuildSystem(id = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_KOTLIN) + SpringKafkaStreamsGradleBuildCustomizer springKafkaStreamsGradleKotlinBuildCustomizer() { + return new SpringKafkaStreamsGradleBuildCustomizer('\"'); + } + + private boolean isKafkaEnabled(Build build) { + return build.dependencies().has("kafka") || build.dependencies().has("kafka-streams"); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaStreamsGradleBuildCustomizer.java similarity index 50% rename from start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaGradleBuildCustomizer.java rename to start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaStreamsGradleBuildCustomizer.java index 7280f73651..0436f0d87f 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaStreamsGradleBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,35 +14,31 @@ * limitations under the License. */ -package io.spring.start.site.extension.dependency.hilla; +package io.spring.start.site.extension.dependency.springkafka; import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.Version; -import io.spring.initializr.metadata.InitializrMetadata; /** - * A {@link BuildCustomizer} that registers Hilla's Gradle plugin. + * {@link BuildCustomizer} for Gradle builds to configure the buildpack builder. * - * @author Luciano Vernaschi - * @author Stephane Nicoll + * @author Moritz Halbritter */ -class HillaGradleBuildCustomizer implements BuildCustomizer { +class SpringKafkaStreamsGradleBuildCustomizer implements BuildCustomizer { - private final String hillaVersion; + private static final String BUILDER = "paketobuildpacks/builder-jammy-base:latest"; - HillaGradleBuildCustomizer(InitializrMetadata metadata, Version platformVersion) { - this.hillaVersion = metadata.getConfiguration() - .getEnv() - .getBoms() - .get("hilla") - .resolve(platformVersion) - .getVersion(); + private final char quote; + + SpringKafkaStreamsGradleBuildCustomizer(char quote) { + this.quote = quote; } @Override public void customize(GradleBuild build) { - build.plugins().add("dev.hilla", (plugin) -> plugin.setVersion(this.hillaVersion)); + build.tasks() + .customize("bootBuildImage", + (bootBuildImage) -> bootBuildImage.attribute("builder", this.quote + BUILDER + this.quote)); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaStreamsMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaStreamsMavenBuildCustomizer.java new file mode 100644 index 0000000000..1e04863486 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaStreamsMavenBuildCustomizer.java @@ -0,0 +1,38 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springkafka; + +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} for Maven builds to configure the buildpack builder. + * + * @author Moritz Halbritter + */ +class SpringKafkaStreamsMavenBuildCustomizer implements BuildCustomizer { + + private static final String BUILDER = "paketobuildpacks/builder-jammy-base:latest"; + + @Override + public void customize(MavenBuild build) { + build.plugins() + .add("org.springframework.boot", "spring-boot-maven-plugin", (plugin) -> plugin.configuration( + (configuration) -> configuration.configure("image", (image) -> image.add("builder", BUILDER)))); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java new file mode 100644 index 0000000000..c5f0a5fe65 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java @@ -0,0 +1,102 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springmodulith; + +import java.util.Collection; +import java.util.List; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.Dependency.Builder; +import io.spring.initializr.generator.buildsystem.DependencyContainer; +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * Registers Spring Modulith dependencies to the build file of the project to be created, + * in particular registering integration dependencies depending on others registered for + * inclusion as well (observability and persistence). + * + * @author Oliver Drotbohm + * @author Stephane Nicoll + */ +class SpringModulithBuildCustomizer implements BuildCustomizer { + + private static final Collection OBSERVABILITY_DEPENDENCIES = List.of("actuator", "datadog", "graphite", + "influx", "new-relic", "otlp-metrics", "prometheus", "wavefront", "zipkin"); + + private static final Collection PERSISTENCE = List.of("jdbc", "jpa", "mongodb"); + + private static final Collection BROKERS = List.of("activemq", "amqp", "artemis", "kafka"); + + @Override + public void customize(Build build) { + DependencyContainer dependencies = build.dependencies(); + if (dependencies.has("actuator")) { + dependencies.add("modulith-actuator", modulithDependency("actuator").scope(DependencyScope.RUNTIME)); + } + if (OBSERVABILITY_DEPENDENCIES.stream().anyMatch(dependencies::has)) { + dependencies.add("modulith-observability", + modulithDependency("observability").scope(DependencyScope.RUNTIME)); + } + addEventPublicationRegistryBackend(build); + if (addEventExternalizationDependency(build)) { + dependencies.add("modulith-events-api", modulithDependency("events-api")); + } + dependencies.add("modulith-starter-test", + modulithDependency("starter-test").scope(DependencyScope.TEST_COMPILE)); + } + + private boolean addEventPublicationRegistryBackend(Build build) { + DependencyContainer dependencies = build.dependencies(); + return PERSISTENCE.stream() + .map((persistence) -> addPersistenceDependency(persistence, dependencies)) + .reduce(false, (l, r) -> l || r); + } + + private boolean addPersistenceDependency(String store, DependencyContainer dependencies) { + if (!dependencies.has("data-" + store)) { + return false; + } + dependencies.add("modulith-starter-" + store, modulithDependency("starter-" + store)); + return true; + } + + private Builder modulithDependency(String name) { + return Dependency.withCoordinates("org.springframework.modulith", "spring-modulith-" + name); + } + + private boolean addEventExternalizationDependency(Build build) { + DependencyContainer dependencies = build.dependencies(); + return BROKERS.stream() + .filter(dependencies::has) + .map(this::getModulithBrokerKey) + .peek((it) -> dependencies.add("modulith-events-" + it, + modulithDependency("events-" + it).scope(DependencyScope.RUNTIME))) + .findAny() + .isPresent(); + } + + private String getModulithBrokerKey(String broker) { + return switch (broker) { + case "kafka", "amqp" -> broker; + case "artemis", "activemq" -> "jms"; + default -> throw new IllegalArgumentException("Unsupported broker!"); + }; + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithProjectGenerationConfiguration.java new file mode 100644 index 0000000000..b9c2eacff7 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithProjectGenerationConfiguration.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springmodulith; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; + +import org.springframework.context.annotation.Bean; + +/** + * Registers {@link SpringModulithBuildCustomizer} with the context to allow selecting + * Spring Modulith dependencies. + * + * @author Oliver Drotbohm + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("modulith") +class SpringModulithProjectGenerationConfiguration { + + @Bean + SpringModulithBuildCustomizer springModulithBuildCustomizer() { + return new SpringModulithBuildCustomizer(); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/package-info.java new file mode 100644 index 0000000000..f8b2174973 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for generation of projects that depend on Spring Modulith. + */ +package io.spring.start.site.extension.dependency.springmodulith; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarBinderBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarBinderBuildCustomizer.java deleted file mode 100644 index 01694502ae..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarBinderBuildCustomizer.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.springpulsar; - -import io.spring.initializr.generator.buildsystem.Build; -import io.spring.initializr.generator.buildsystem.Dependency; -import io.spring.initializr.generator.project.ProjectDescription; -import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.VersionReference; -import io.spring.initializr.metadata.InitializrMetadata; - -/** - * A {@link BuildCustomizer} that automatically adds - * {@code spring-pulsar-spring-cloud-stream-binder} when Pulsar and Spring Cloud Stream - * are both selected. - * - * @author Chris Bono - */ -class SpringPulsarBinderBuildCustomizer implements BuildCustomizer { - - private final String pulsarVersion; - - SpringPulsarBinderBuildCustomizer(InitializrMetadata metadata, ProjectDescription description) { - this.pulsarVersion = metadata.getDependencies() - .get("pulsar") - .resolve(description.getPlatformVersion()) - .getVersion(); - } - - @Override - public void customize(Build build) { - build.dependencies() - .add("pulsar-binder", - Dependency.withCoordinates("org.springframework.pulsar", "spring-pulsar-spring-cloud-stream-binder") - .version(VersionReference.ofValue(this.pulsarVersion))); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java index 38fc039d8b..0b1f90462f 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java @@ -16,12 +16,23 @@ package io.spring.start.site.extension.dependency.springpulsar; +import java.util.Map; + +import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.condition.ProjectGenerationCondition; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; -import io.spring.initializr.metadata.InitializrMetadata; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections; +import io.spring.start.site.container.ServiceConnectionsCustomizer; +import io.spring.start.site.extension.dependency.springpulsar.SpringPulsarProjectGenerationConfiguration.OnPulsarDependencyCondition; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.context.annotation.Conditional; +import org.springframework.core.type.AnnotatedTypeMetadata; /** * Configuration for generation of projects that depend on Pulsar. @@ -29,14 +40,35 @@ * @author Chris Bono */ @ProjectGenerationConfiguration -@ConditionalOnRequestedDependency("pulsar") +@Conditional(OnPulsarDependencyCondition.class) class SpringPulsarProjectGenerationConfiguration { + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.PulsarContainer"; + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer pulsarServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("pulsar", + (service) -> serviceConnections.addServiceConnection(ServiceConnections.ServiceConnection + .ofContainer("pulsar", service, TESTCONTAINERS_CLASS_NAME, false))); + } + @Bean - @ConditionalOnRequestedDependency("cloud-stream") - SpringPulsarBinderBuildCustomizer pulsarBinderBuildCustomizer(InitializrMetadata metadata, - ProjectDescription description) { - return new SpringPulsarBinderBuildCustomizer(metadata, description); + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer pulsarComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("pulsar", + (service) -> composeFile.services().add("pulsar", service)); + } + + static class OnPulsarDependencyCondition extends ProjectGenerationCondition { + + @Override + protected boolean matches(ProjectDescription description, ConditionContext context, + AnnotatedTypeMetadata metadata) { + Map requestedDependencies = description.getRequestedDependencies(); + return requestedDependencies.containsKey("pulsar") || requestedDependencies.containsKey("pulsar-reactive"); + } + } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/AbstractSpringRestDocsGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/AbstractSpringRestDocsGradleBuildCustomizer.java new file mode 100644 index 0000000000..17980026c6 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/AbstractSpringRestDocsGradleBuildCustomizer.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springrestdocs; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * Abstract {@link BuildCustomizer Customizer} for a {@link GradleBuild} when the + * generated project * depends on Spring REST Docs. + * + * @author Moritz Halbritter + */ +abstract class AbstractSpringRestDocsGradleBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(GradleBuild build) { + build.plugins().add("org.asciidoctor.jvm.convert", (plugin) -> plugin.setVersion("3.3.2")); + build.properties().property("snippetsDir", "file(\"build/generated-snippets\")"); + customizeForDialect(build); + } + + abstract void customizeForDialect(GradleBuild build); + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizer.java similarity index 68% rename from start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleBuildCustomizer.java rename to start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizer.java index 903b69993e..5bc9ed0306 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,17 +20,15 @@ import io.spring.initializr.generator.spring.build.BuildCustomizer; /** - * {@link BuildCustomizer Customizer} for a {@link GradleBuild} when the generated project - * depends on Spring REST Docs. + * {@link BuildCustomizer Customizer} for a Groovy {@link GradleBuild} when the generated + * project depends on Spring REST Docs. * * @author Andy Wilkinson */ -class SpringRestDocsGradleBuildCustomizer implements BuildCustomizer { +class SpringRestDocsGradleGroovyBuildCustomizer extends AbstractSpringRestDocsGradleBuildCustomizer { @Override - public void customize(GradleBuild build) { - build.plugins().add("org.asciidoctor.jvm.convert", (plugin) -> plugin.setVersion("3.3.2")); - build.properties().property("snippetsDir", "file(\"build/generated-snippets\")"); + void customizeForDialect(GradleBuild build) { build.tasks().customize("test", (task) -> task.invoke("outputs.dir", "snippetsDir")); build.tasks().customize("asciidoctor", (task) -> { task.invoke("inputs.dir", "snippetsDir"); diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizer.java new file mode 100644 index 0000000000..4e04126c44 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizer.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springrestdocs; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer Customizer} for a Kotlin {@link GradleBuild} when the generated + * project depends on Spring REST Docs. + * + * @author Moritz Halbritter + */ +class SpringRestDocsGradleKotlinBuildCustomizer extends AbstractSpringRestDocsGradleBuildCustomizer { + + @Override + void customizeForDialect(GradleBuild build) { + build.tasks().customize("test", (task) -> task.invoke("outputs.dir", "project.extra[\"snippetsDir\"]!!")); + build.tasks().customize("asciidoctor", (task) -> { + task.invoke("inputs.dir", "project.extra[\"snippetsDir\"]!!"); + task.invoke("dependsOn", "tasks.test"); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsProjectGenerationConfiguration.java index e33d30d1f7..3f38b2b1f0 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,25 +29,32 @@ * REST Docs. * * @author Andy Wilkinson + * @author Moritz Halbritter */ @ProjectGenerationConfiguration @ConditionalOnRequestedDependency("restdocs") public class SpringRestDocsProjectGenerationConfiguration { @Bean - public SpringRestDocsBuildCustomizer springRestDocsBuildCustomizer() { + SpringRestDocsBuildCustomizer springRestDocsBuildCustomizer() { return new SpringRestDocsBuildCustomizer(); } @Bean - @ConditionalOnBuildSystem(GradleBuildSystem.ID) - public SpringRestDocsGradleBuildCustomizer restDocsGradleBuildCustomizer() { - return new SpringRestDocsGradleBuildCustomizer(); + @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_GROOVY) + SpringRestDocsGradleGroovyBuildCustomizer restDocsGradleGroovyBuildCustomizer() { + return new SpringRestDocsGradleGroovyBuildCustomizer(); + } + + @Bean + @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_KOTLIN) + SpringRestDocsGradleKotlinBuildCustomizer restDocsGradleKotlinBuildCustomizer() { + return new SpringRestDocsGradleKotlinBuildCustomizer(); } @Bean @ConditionalOnBuildSystem(MavenBuildSystem.ID) - public SpringRestDocsMavenBuildCustomizer restDocsMavenBuildCustomizer() { + SpringRestDocsMavenBuildCustomizer restDocsMavenBuildCustomizer() { return new SpringRestDocsMavenBuildCustomizer(); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/PicocliCodegenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizer.java similarity index 51% rename from start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/PicocliCodegenBuildCustomizer.java rename to start-site/src/main/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizer.java index 9054e13ba6..f404a8824d 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/PicocliCodegenBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizer.java @@ -14,35 +14,27 @@ * limitations under the License. */ -package io.spring.start.site.extension.dependency.picocli; +package io.spring.start.site.extension.dependency.springshell; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.VersionReference; /** - * A {@link BuildCustomizer} that automatically adds "picocli-codegen" when the - * {@code native} dependency is selected in addition to {@code picocli}. - *

    - * This annotation processor is required by Picocli to generate the reachability metadata - * for native applications. + * A {@link BuildCustomizer} that automatically adds {@code spring-shell-test} when Spring + * Shell is selected. * - * @author Brian Clozel + * @author DaShaun Carter */ -class PicocliCodegenBuildCustomizer implements BuildCustomizer { +public class SpringShellTestBuildCustomizer implements BuildCustomizer { @Override public void customize(Build build) { - if (build.dependencies().has("native")) { - VersionReference picocliVersion = build.dependencies().get("picocli").getVersion(); - Dependency picocliCodegen = Dependency.withCoordinates("info.picocli", "picocli-codegen") - .scope(DependencyScope.ANNOTATION_PROCESSOR) - .version(picocliVersion) - .build(); - build.dependencies().add("picocli-codegen", picocliCodegen); - } + build.dependencies() + .add("spring-shell-starter-test", + Dependency.withCoordinates("org.springframework.shell", "spring-shell-starter-test") + .scope(DependencyScope.TEST_COMPILE)); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springshell/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springshell/package-info.java new file mode 100644 index 0000000000..a5ccdfc497 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springshell/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for generation of projects that depend on Spring Shell. + */ +package io.spring.start.site.extension.dependency.springshell; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/sqlserver/SqlServerProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/sqlserver/SqlServerProjectGenerationConfiguration.java index 50ad4fe5f1..1005a1d60b 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/sqlserver/SqlServerProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/sqlserver/SqlServerProjectGenerationConfiguration.java @@ -35,7 +35,7 @@ @ConditionalOnRequestedDependency("sqlserver") class SqlServerProjectGenerationConfiguration { - private static String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.MSSQLServerContainer"; + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.MSSQLServerContainer"; @Bean @ConditionalOnRequestedDependency("testcontainers") diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/GroovyTestContainersApplicationCodeProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/GroovyTestContainersApplicationCodeProjectContributor.java index 0f1a5968f3..460aabba43 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/GroovyTestContainersApplicationCodeProjectContributor.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/GroovyTestContainersApplicationCodeProjectContributor.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,14 +52,15 @@ class GroovyTestContainersApplicationCodeProjectContributor extends @Override protected void contributeCode(GroovySourceCode sourceCode) { + super.contributeCode(sourceCode); customizeApplicationTypeDeclaration(sourceCode, (type) -> { type.modifiers(Modifier.PUBLIC); type.addMethodDeclaration(GroovyMethodDeclaration.method("main") .modifiers(Modifier.PUBLIC | Modifier.STATIC) .returning("void") .parameters(Parameter.of("args", String[].class)) - .body(CodeBlock.ofStatement("$T.from($L::main).with($L).run(args)", SpringApplication.class, - getDescription().getApplicationName(), getTestApplicationName()))); + .body(CodeBlock.ofStatement("$T.from($L::main).with($T).run(args)", SpringApplication.class, + getDescription().getApplicationName(), TESTCONTAINERS_CONFIGURATION_CLASS_NAME))); }); } @@ -85,18 +86,19 @@ private GroovyMethodDeclaration usingGenericContainer(String methodName, String String portsParameter = Arrays.stream(ports).mapToObj(String::valueOf).collect(Collectors.joining(", ")); GroovyMethodDeclaration method = GroovyMethodDeclaration.method(methodName) .returning("GenericContainer") - .body(CodeBlock.ofStatement("new $T<>($S).withExposedPorts($L)", - "org.testcontainers.containers.GenericContainer", imageId, portsParameter)); + .body(CodeBlock.ofStatement("new $T<>($L).withExposedPorts($L)", + "org.testcontainers.containers.GenericContainer", generatedDockerImageNameCode(imageId), + portsParameter)); annotateContainerMethod(method, connectionName); return method; } private GroovyMethodDeclaration usingSpecificContainer(String methodName, String imageId, String containerClassName, boolean containerClassNameGeneric) { - String statementFormat = containerClassNameGeneric ? "new $T<>($S)" : "new $T(\"$L\")"; + String statementFormat = containerClassNameGeneric ? "new $T<>($L)" : "new $T($L)"; GroovyMethodDeclaration method = GroovyMethodDeclaration.method(methodName) .returning(containerClassName) - .body(CodeBlock.ofStatement(statementFormat, containerClassName, imageId)); + .body(CodeBlock.ofStatement(statementFormat, containerClassName, generatedDockerImageNameCode(imageId))); annotateContainerMethod(method, null); return method; } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/ImportTestcontainersConfigurationTestApplicationTypeCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/ImportTestcontainersConfigurationTestApplicationTypeCustomizer.java new file mode 100644 index 0000000000..98fedf7594 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/ImportTestcontainersConfigurationTestApplicationTypeCustomizer.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.testcontainers; + +import io.spring.initializr.generator.language.ClassName; +import io.spring.initializr.generator.language.TypeDeclaration; +import io.spring.initializr.generator.spring.code.TestApplicationTypeCustomizer; + +/** + * {@link TestApplicationTypeCustomizer} that imports the generated Testcontainers test + * configuration. + * + * @author Moritz Halbritter + */ +class ImportTestcontainersConfigurationTestApplicationTypeCustomizer + implements TestApplicationTypeCustomizer { + + @Override + public void customize(TypeDeclaration typeDeclaration) { + typeDeclaration.annotations() + .add(ClassName.of("org.springframework.context.annotation.Import"), (annotation) -> annotation.set("value", + TestContainersApplicationCodeProjectContributor.TESTCONTAINERS_CONFIGURATION_CLASS_NAME)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/JavaTestContainersApplicationCodeProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/JavaTestContainersApplicationCodeProjectContributor.java index 6f542d5ca8..6bd9717be1 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/JavaTestContainersApplicationCodeProjectContributor.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/JavaTestContainersApplicationCodeProjectContributor.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,14 +52,15 @@ class JavaTestContainersApplicationCodeProjectContributor extends @Override protected void contributeCode(JavaSourceCode sourceCode) { + super.contributeCode(sourceCode); customizeApplicationTypeDeclaration(sourceCode, (type) -> { type.modifiers(Modifier.PUBLIC); type.addMethodDeclaration(JavaMethodDeclaration.method("main") .modifiers(Modifier.PUBLIC | Modifier.STATIC) .returning("void") .parameters(Parameter.of("args", String[].class)) - .body(CodeBlock.ofStatement("$T.from($L::main).with($L.class).run(args)", SpringApplication.class, - getDescription().getApplicationName(), getTestApplicationName()))); + .body(CodeBlock.ofStatement("$T.from($L::main).with($T.class).run(args)", SpringApplication.class, + getDescription().getApplicationName(), TESTCONTAINERS_CONFIGURATION_CLASS_NAME))); }); } @@ -84,8 +85,9 @@ private JavaMethodDeclaration usingGenericContainer(String methodName, String im String portsParameter = Arrays.stream(ports).mapToObj(String::valueOf).collect(Collectors.joining(", ")); JavaMethodDeclaration method = JavaMethodDeclaration.method(methodName) .returning("GenericContainer") - .body(CodeBlock.ofStatement("return new $T<>($S).withExposedPorts($L)", - "org.testcontainers.containers.GenericContainer", imageId, portsParameter)); + .body(CodeBlock.ofStatement("return new $T<>($L).withExposedPorts($L)", + "org.testcontainers.containers.GenericContainer", generatedDockerImageNameCode(imageId), + portsParameter)); annotateContainerMethod(method, connectionName); return method; } @@ -94,10 +96,10 @@ private JavaMethodDeclaration usingSpecificContainer(String methodName, String i boolean containerClassNameGeneric) { String returnType = (containerClassNameGeneric) ? ClassUtils.getShortName(containerClassName) + "" : containerClassName; - String statementFormat = (containerClassNameGeneric) ? "return new $T<>($S)" : "return new $T(\"$L\")"; + String statementFormat = (containerClassNameGeneric) ? "return new $T<>($L)" : "return new $T($L)"; JavaMethodDeclaration method = JavaMethodDeclaration.method(methodName) .returning(returnType) - .body(CodeBlock.ofStatement(statementFormat, containerClassName, imageId)); + .body(CodeBlock.ofStatement(statementFormat, containerClassName, generatedDockerImageNameCode(imageId))); annotateContainerMethod(method, null); return method; } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java index 6bff25799a..bd9ba8b5e9 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ package io.spring.start.site.extension.dependency.testcontainers; import java.util.Arrays; -import java.util.function.Consumer; import java.util.stream.Collectors; import io.spring.initializr.generator.io.IndentingWriterFactory; @@ -25,7 +24,6 @@ import io.spring.initializr.generator.language.Parameter; import io.spring.initializr.generator.language.kotlin.KotlinCompilationUnit; import io.spring.initializr.generator.language.kotlin.KotlinFunctionDeclaration; -import io.spring.initializr.generator.language.kotlin.KotlinModifier; import io.spring.initializr.generator.language.kotlin.KotlinSourceCode; import io.spring.initializr.generator.language.kotlin.KotlinSourceCodeWriter; import io.spring.initializr.generator.language.kotlin.KotlinTypeDeclaration; @@ -48,23 +46,18 @@ class KotlinTestContainersApplicationCodeProjectContributor extends KotlinTestContainersApplicationCodeProjectContributor(IndentingWriterFactory indentingWriterFactory, ProjectDescription description, ServiceConnections serviceConnections) { super(description, serviceConnections, KotlinSourceCode::new, - new KotlinSourceCodeWriter(indentingWriterFactory)); + new KotlinSourceCodeWriter(description.getLanguage(), indentingWriterFactory)); } @Override protected void contributeCode(KotlinSourceCode sourceCode) { - customizeApplicationTypeDeclaration(sourceCode, (type) -> type.modifiers(KotlinModifier.PUBLIC)); - } - - @Override - protected void customizeApplicationCompilationUnit(KotlinSourceCode sourceCode, - Consumer customizer) { - super.customizeApplicationCompilationUnit(sourceCode, customizer - .andThen((compilationUnit) -> compilationUnit.addTopLevelFunction(KotlinFunctionDeclaration.function("main") - .parameters(Parameter.of("args", "Array")) - .body(CodeBlock.ofStatement("$T<$L>().$T($L::class).run(*args)", - "org.springframework.boot.fromApplication", getDescription().getApplicationName(), - "org.springframework.boot.with", getTestApplicationName()))))); + super.contributeCode(sourceCode); + customizeApplicationCompilationUnit(sourceCode, + (compilationUnit) -> compilationUnit.addTopLevelFunction(KotlinFunctionDeclaration.function("main") + .parameters(Parameter.of("args", "Array")) + .body(CodeBlock.ofStatement("$T<$L>().$T($T::class).run(*args)", + "org.springframework.boot.fromApplication", getDescription().getApplicationName(), + "org.springframework.boot.with", TESTCONTAINERS_CONFIGURATION_CLASS_NAME)))); } @Override @@ -88,8 +81,9 @@ private KotlinFunctionDeclaration usingGenericContainer(String functionName, Str String portsParameter = Arrays.stream(ports).mapToObj(String::valueOf).collect(Collectors.joining(", ")); KotlinFunctionDeclaration method = KotlinFunctionDeclaration.function(functionName) .returning("GenericContainer<*>") - .body(CodeBlock.ofStatement("return $T($S).withExposedPorts($L)", - "org.testcontainers.containers.GenericContainer", imageId, portsParameter)); + .body(CodeBlock.ofStatement("return $T($L).withExposedPorts($L)", + "org.testcontainers.containers.GenericContainer", generatedDockerImageNameCode(imageId), + portsParameter)); annotateContainerMethod(method, connectionName); return method; } @@ -100,7 +94,7 @@ private KotlinFunctionDeclaration usingSpecificContainer(String functionName, St : containerClassName; KotlinFunctionDeclaration method = KotlinFunctionDeclaration.function(functionName) .returning(returnType) - .body(CodeBlock.ofStatement("return $T($S)", containerClassName, imageId)); + .body(CodeBlock.ofStatement("return $T($L)", containerClassName, generatedDockerImageNameCode(imageId))); annotateContainerMethod(method, null); return method; } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersApplicationCodeProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersApplicationCodeProjectContributor.java index 3bc1983643..1d87858037 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersApplicationCodeProjectContributor.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersApplicationCodeProjectContributor.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ import io.spring.initializr.generator.language.Annotatable; import io.spring.initializr.generator.language.ClassName; +import io.spring.initializr.generator.language.CodeBlock; import io.spring.initializr.generator.language.CompilationUnit; import io.spring.initializr.generator.language.SourceCode; import io.spring.initializr.generator.language.SourceCodeWriter; @@ -39,6 +40,7 @@ * @param language-specific compilation unit * @param language-specific source code * @author Stephane Nicoll + * @author Moritz Halbritter */ abstract class TestContainersApplicationCodeProjectContributor, S extends SourceCode> implements ProjectContributor { @@ -51,6 +53,11 @@ abstract class TestContainersApplicationCodeProjectContributor annotation.set("proxyBeanMethods", false)); + this.serviceConnections.values() + .forEach((serviceConnection) -> configureServiceConnection(testcontainersConfiguration, serviceConnection)); + } protected abstract void configureServiceConnection(T typeDeclaration, ServiceConnection serviceConnection); @@ -97,10 +117,6 @@ protected void customizeApplicationCompilationUnit(S sourceCode, Consumer cus protected void customizeApplicationTypeDeclaration(S sourceCode, Consumer customizer) { customizeApplicationCompilationUnit(sourceCode, (compilationUnit) -> { T applicationType = compilationUnit.createTypeDeclaration(getTestApplicationName()); - applicationType.annotations() - .add(TEST_CONFIGURATION_CLASS_NAME, (annotation) -> annotation.set("proxyBeanMethods", false)); - this.serviceConnections.values() - .forEach((serviceConnection) -> configureServiceConnection(applicationType, serviceConnection)); customizer.accept(applicationType); }); } @@ -114,8 +130,12 @@ protected void annotateContainerMethod(Annotatable annotable, String name) { }); } - protected String getTestApplicationName() { + private String getTestApplicationName() { return "Test" + this.description.getApplicationName(); } + protected CodeBlock generatedDockerImageNameCode(String imageId) { + return CodeBlock.of("$T.parse($S)", DOCKER_IMAGE_NAME_CLASS_NAME, imageId); + } + } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java new file mode 100644 index 0000000000..eee58ec883 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java @@ -0,0 +1,63 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.testcontainers; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.spring.documentation.HelpDocument; +import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; +import io.spring.start.site.container.DockerService; +import io.spring.start.site.container.ServiceConnections; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; + +/** + * A {@link HelpDocumentCustomizer} that provide additional information about the + * Testcontainers that are defined for the project. + * + * @author Moritz Halbritter + */ +class TestContainersHelpDocumentCustomizer implements HelpDocumentCustomizer { + + private final ProjectDescription description; + + private final ServiceConnections serviceConnections; + + TestContainersHelpDocumentCustomizer(ProjectDescription description, ServiceConnections serviceConnections) { + this.description = description; + this.serviceConnections = serviceConnections; + } + + @Override + public void customize(HelpDocument document) { + String referenceDocUrl = "https://docs.spring.io/spring-boot/%s/reference/testing/testcontainers.html#testing.testcontainers" + .formatted(this.description.getPlatformVersion()); + document.gettingStarted().addReferenceDocLink(referenceDocUrl, "Spring Boot Testcontainers support"); + Map model = new HashMap<>(); + List dockerServices = this.serviceConnections.values() + .map(ServiceConnection::dockerService) + .toList(); + model.put("services", dockerServices); + model.put("testcontainersAtDevelopmentTimeLink", + "https://docs.spring.io/spring-boot/%s/reference/features/dev-services.html#features.dev-services.testcontainers" + .formatted(this.description.getPlatformVersion())); + document.addSection("testcontainers", model); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index caf5a98c1e..dcfc7156ac 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,15 +16,15 @@ package io.spring.start.site.extension.dependency.testcontainers; -import java.util.Arrays; +import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; -import java.util.stream.Collectors; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; import io.spring.initializr.generator.spring.documentation.HelpDocument; +import io.spring.initializr.generator.version.Version; import io.spring.start.site.support.implicit.ImplicitDependency; import io.spring.start.site.support.implicit.ImplicitDependency.Builder; @@ -37,46 +37,64 @@ */ abstract class TestcontainersModuleRegistry { - static Iterable create() { - return create( - onDependencies("amqp").customizeBuild(addModule("rabbitmq")) - .customizeHelpDocument(addReferenceLink("RabbitMQ Module", "rabbitmq/")), - onDependencies("cloud-starter-consul-config").customizeBuild(addModule("consul")) - .customizeHelpDocument(addReferenceLink("Consul Module", "consul/")), - onDependencies("cloud-starter-vault-config").customizeBuild(addModule("vault")) - .customizeHelpDocument(addReferenceLink("Vault Module", "vault/")), - onDependencies("data-cassandra", "data-cassandra-reactive").customizeBuild(addModule("cassandra")) - .customizeHelpDocument(addReferenceLink("Cassandra Module", "databases/cassandra/")), - onDependencies("data-couchbase", "data-couchbase-reactive").customizeBuild(addModule("couchbase")) - .customizeHelpDocument(addReferenceLink("Couchbase Module", "databases/couchbase/")), - onDependencies("data-elasticsearch").customizeBuild(addModule("elasticsearch")) - .customizeHelpDocument(addReferenceLink("Elasticsearch Container", "elasticsearch/")), - onDependencies("data-mongodb", "data-mongodb-reactive").customizeBuild(addModule("mongodb")) - .customizeHelpDocument(addReferenceLink("MongoDB Module", "databases/mongodb/")), - onDependencies("data-neo4j").customizeBuild(addModule("neo4j")) - .customizeHelpDocument(addReferenceLink("Neo4j Module", "databases/neo4j/")), - onDependencies("data-r2dbc").customizeBuild(addModule("r2dbc")) - .customizeHelpDocument(addReferenceLink("R2DBC support", "databases/r2dbc/")), - onDependencies("db2").customizeBuild(addModule("db2")) - .customizeHelpDocument(addReferenceLink("DB2 Module", "databases/db2/")), - onDependencies("kafka", "kafka-streams").customizeBuild(addModule("kafka")) - .customizeHelpDocument(addReferenceLink("Kafka Modules", "kafka/")), - onDependencies("mariadb").customizeBuild(addModule("mariadb")) - .customizeHelpDocument(addReferenceLink("MariaDB Module", "databases/mariadb/")), - onDependencies("mysql").customizeBuild(addModule("mysql")) - .customizeHelpDocument(addReferenceLink("MySQL Module", "databases/mysql/")), - onDependencies("oracle").customizeBuild(addModule("oracle-xe")) - .customizeHelpDocument(addReferenceLink("Oracle-XE Module", "databases/oraclexe/")), - onDependencies("postgresql").customizeBuild(addModule("postgresql")) - .customizeHelpDocument(addReferenceLink("Postgres Module", "databases/postgres/")), - onDependencies("pulsar", "pulsar-reactive").customizeBuild(addModule("pulsar")) - .customizeHelpDocument(addReferenceLink("Pulsar Module", "pulsar/")), - onDependencies("sqlserver").customizeBuild(addModule("mssqlserver")) - .customizeHelpDocument(addReferenceLink("MS SQL Server Module", "databases/mssqlserver/"))); - } - - private static List create(ImplicitDependency.Builder... dependencies) { - return Arrays.stream(dependencies).map(Builder::build).collect(Collectors.toList()); + static Iterable create(Version platformVersion) { + List builders = new ArrayList<>(); + builders.add(onDependencies("activemq").customizeBuild(addModule("activemq")) + .customizeHelpDocument(addReferenceLink("ActiveMQ Module", "activemq/"))); + builders.add(onDependencies("artemis").customizeBuild(addModule("activemq")) + .customizeHelpDocument(addReferenceLink("ActiveMQ Module", "activemq/"))); + builders.add(onDependencies("amqp", "amqp-streams").customizeBuild(addModule("rabbitmq")) + .customizeHelpDocument(addReferenceLink("RabbitMQ Module", "rabbitmq/"))); + builders.add(onDependencies("cloud-gcp", "cloud-gcp-pubsub").customizeBuild(addModule("gcloud")) + .customizeHelpDocument(addReferenceLink("GCloud Module", "gcloud/"))); + builders.add(onDependencies("cloud-starter-consul-config").customizeBuild(addModule("consul")) + .customizeHelpDocument(addReferenceLink("Consul Module", "consul/"))); + builders.add(onDependencies("cloud-starter-vault-config").customizeBuild(addModule("vault")) + .customizeHelpDocument(addReferenceLink("Vault Module", "vault/"))); + builders.add(onDependencies("data-cassandra", "data-cassandra-reactive", "spring-ai-vectordb-cassandra") + .customizeBuild(addModule("cassandra")) + .customizeHelpDocument(addReferenceLink("Cassandra Module", "databases/cassandra/"))); + builders.add(onDependencies("data-couchbase", "data-couchbase-reactive").customizeBuild(addModule("couchbase")) + .customizeHelpDocument(addReferenceLink("Couchbase Module", "databases/couchbase/"))); + builders.add(onDependencies("data-elasticsearch", "spring-ai-vectordb-elasticsearch") + .customizeBuild(addModule("elasticsearch")) + .customizeHelpDocument(addReferenceLink("Elasticsearch Container", "elasticsearch/"))); + builders.add(onDependencies("data-mongodb", "data-mongodb-reactive", "spring-ai-vectordb-mongodb-atlas") + .customizeBuild(addModule("mongodb")) + .customizeHelpDocument(addReferenceLink("MongoDB Module", "databases/mongodb/"))); + builders.add(onDependencies("data-neo4j", "spring-ai-vectordb-neo4j").customizeBuild(addModule("neo4j")) + .customizeHelpDocument(addReferenceLink("Neo4j Module", "databases/neo4j/"))); + builders.add(onDependencies("data-r2dbc").customizeBuild(addModule("r2dbc")) + .customizeHelpDocument(addReferenceLink("R2DBC support", "databases/r2dbc/"))); + builders.add(onDependencies("db2").customizeBuild(addModule("db2")) + .customizeHelpDocument(addReferenceLink("DB2 Module", "databases/db2/"))); + builders.add(onDependencies("kafka", "kafka-streams").customizeBuild(addModule("kafka")) + .customizeHelpDocument(addReferenceLink("Kafka Modules", "kafka/"))); + builders.add(onDependencies("mariadb").customizeBuild(addModule("mariadb")) + .customizeHelpDocument(addReferenceLink("MariaDB Module", "databases/mariadb/"))); + builders.add(onDependencies("mysql").customizeBuild(addModule("mysql")) + .customizeHelpDocument(addReferenceLink("MySQL Module", "databases/mysql/"))); + builders.add(onDependencies("oracle", "spring-ai-vectordb-oracle").customizeBuild(addModule("oracle-free")) + .customizeHelpDocument(addReferenceLink("Oracle-Free Module", "databases/oraclefree/"))); + builders.add(onDependencies("postgresql", "spring-ai-vectordb-pgvector").customizeBuild(addModule("postgresql")) + .customizeHelpDocument(addReferenceLink("Postgres Module", "databases/postgres/"))); + builders.add(onDependencies("pulsar", "pulsar-reactive").customizeBuild(addModule("pulsar")) + .customizeHelpDocument(addReferenceLink("Pulsar Module", "pulsar/"))); + builders.add(onDependencies("solace").customizeBuild(addModule("solace")) + .customizeHelpDocument(addReferenceLink("Solace Module", "solace/"))); + builders.add(onDependencies("sqlserver").customizeBuild(addModule("mssqlserver")) + .customizeHelpDocument(addReferenceLink("MS SQL Server Module", "databases/mssqlserver/"))); + builders.add(onDependencies("spring-ai-vectordb-chroma").customizeBuild(addModule("chromadb")) + .customizeHelpDocument(addReferenceLink("Chroma Module", "testcontainers/"))); + builders.add(onDependencies("spring-ai-vectordb-milvus").customizeBuild(addModule("milvus")) + .customizeHelpDocument(addReferenceLink("Milvus Module", "testcontainers/"))); + builders.add(onDependencies("spring-ai-ollama").customizeBuild(addModule("ollama")) + .customizeHelpDocument(addReferenceLink("Ollama Module", "testcontainers/"))); + builders.add(onDependencies("spring-ai-vectordb-qdrant").customizeBuild(addModule("qdrant")) + .customizeHelpDocument(addReferenceLink("Qdrant Module", "testcontainers/"))); + builders.add(onDependencies("spring-ai-vectordb-weaviate").customizeBuild(addModule("weaviate")) + .customizeHelpDocument(addReferenceLink("Weaviate Module", "testcontainers/"))); + return builders.stream().map(Builder::build).toList(); } private static ImplicitDependency.Builder onDependencies(String... dependencyIds) { @@ -91,7 +109,7 @@ private static Consumer addModule(String id) { private static Consumer addReferenceLink(String name, String modulePath) { return (helpDocument) -> { - String href = String.format("https://www.testcontainers.org/modules/%s", modulePath); + String href = String.format("https://java.testcontainers.org/modules/%s", modulePath); String description = String.format("Testcontainers %s Reference Guide", name); helpDocument.gettingStarted().addReferenceDocLink(href, description); }; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java index 701beeb6ea..3de0c8dfab 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,6 @@ import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; import io.spring.initializr.generator.condition.ConditionalOnLanguage; -import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.io.IndentingWriterFactory; import io.spring.initializr.generator.language.groovy.GroovyLanguage; @@ -29,7 +28,6 @@ import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.start.site.container.ServiceConnections; import io.spring.start.site.container.ServiceConnectionsCustomizer; import io.spring.start.site.support.implicit.ImplicitDependency; @@ -45,6 +43,7 @@ * * @author Maciej Walkowiak * @author Stephane Nicoll + * @author Moritz Halbritter */ @ProjectGenerationConfiguration @ConditionalOnRequestedDependency("testcontainers") @@ -52,8 +51,8 @@ public class TestcontainersProjectGenerationConfiguration { private final Iterable dependencies; - public TestcontainersProjectGenerationConfiguration() { - this.dependencies = TestcontainersModuleRegistry.create(); + public TestcontainersProjectGenerationConfiguration(ProjectDescription projectDescription) { + this.dependencies = TestcontainersModuleRegistry.create(projectDescription.getPlatformVersion()); } @Bean @@ -66,8 +65,14 @@ public ImplicitDependencyHelpDocumentCustomizer testcontainersHelpCustomizer(Bui return new ImplicitDependencyHelpDocumentCustomizer(this.dependencies, build); } + @Bean + ServiceConnections serviceConnections(ObjectProvider customizers) { + ServiceConnections serviceConnections = new ServiceConnections(); + customizers.orderedStream().forEach((customizer) -> customizer.customize(serviceConnections)); + return serviceConnections; + } + @Configuration(proxyBeanMethods = false) - @ConditionalOnPlatformVersion("3.1.0-RC1") static class SpringBootSupportConfiguration { @Bean @@ -76,24 +81,17 @@ BuildCustomizer springBootTestcontainersBuildCustomizer() { .add("spring-boot-testcontainers", Dependency.withCoordinates("org.springframework.boot", "spring-boot-testcontainers") .scope(DependencyScope.TEST_COMPILE)); - } @Bean - HelpDocumentCustomizer springBootTestcontainersHelpDocumentCustomizer(ProjectDescription description) { - return (helpDocument) -> { - String referenceDocUrl = String.format( - "https://docs.spring.io/spring-boot/docs/%s/reference/html/features.html#features.testing.testcontainers", - description.getPlatformVersion()); - helpDocument.gettingStarted() - .addReferenceDocLink(referenceDocUrl, "Spring Boot Testcontainers support"); - }; + TestContainersHelpDocumentCustomizer springBootTestcontainersHelpDocumentCustomizer( + ProjectDescription description, ServiceConnections serviceConnections) { + return new TestContainersHelpDocumentCustomizer(description, serviceConnections); } } @Configuration(proxyBeanMethods = false) - @ConditionalOnPlatformVersion("3.1.0-RC1") static class TestApplicationConfiguration { private final ProjectDescription description; @@ -105,13 +103,6 @@ static class TestApplicationConfiguration { this.indentingWriterFactory = indentingWriterFactory; } - @Bean - ServiceConnections serviceConnections(ObjectProvider customizers) { - ServiceConnections serviceConnections = new ServiceConnections(); - customizers.orderedStream().forEach((customizer) -> customizer.customize(serviceConnections)); - return serviceConnections; - } - @Bean @ConditionalOnLanguage(GroovyLanguage.ID) GroovyTestContainersApplicationCodeProjectContributor groovyTestContainersApplicationCodeProjectContributor( @@ -122,7 +113,6 @@ GroovyTestContainersApplicationCodeProjectContributor groovyTestContainersApplic @Bean @ConditionalOnLanguage(KotlinLanguage.ID) - @ConditionalOnPlatformVersion("3.1.1-SNAPSHOT") // https://github.com/spring-projects/spring-boot/issues/35756 KotlinTestContainersApplicationCodeProjectContributor kotlinTestContainersApplicationCodeProjectContributor( ServiceConnections serviceConnections) { return new KotlinTestContainersApplicationCodeProjectContributor(this.indentingWriterFactory, @@ -137,6 +127,11 @@ JavaTestContainersApplicationCodeProjectContributor javaTestContainersApplicatio this.description, serviceConnections); } + @Bean + ImportTestcontainersConfigurationTestApplicationTypeCustomizer importTestcontainersConfigurationTestApplicationTypeCustomizer() { + return new ImportTestcontainersConfigurationTestApplicationTypeCustomizer(); + } + } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizer.java index 3e740b4a62..236bdfd0ea 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizer.java @@ -19,33 +19,21 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; /** * A {@link BuildCustomizer} for Thymeleaf. * * @author Stephane Nicoll + * @author Moritz Halbritter */ public class ThymeleafBuildCustomizer implements BuildCustomizer { - private static final VersionRange SPRING_BOOT_3_OR_ABOVE = VersionParser.DEFAULT.parseRange("3.0.0-M1"); - - private final boolean springBoot3OrAbove; - - public ThymeleafBuildCustomizer(Version platformVersion) { - this.springBoot3OrAbove = SPRING_BOOT_3_OR_ABOVE.match(platformVersion); - } - @Override public void customize(Build build) { - if (build.dependencies().has("security")) { - String artifactId = (this.springBoot3OrAbove) ? "thymeleaf-extras-springsecurity6" - : "thymeleaf-extras-springsecurity5"; + if (build.dependencies().has("security") || build.dependencies().has("oauth2-client")) { build.dependencies() .add("thymeleaf-extras-spring-security", - Dependency.withCoordinates("org.thymeleaf.extras", artifactId)); + Dependency.withCoordinates("org.thymeleaf.extras", "thymeleaf-extras-springsecurity6")); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizer.java index ffa80ad4a0..740cde0ae4 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizer.java @@ -16,44 +16,32 @@ package io.spring.start.site.extension.dependency.vaadin; +import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.buildsystem.maven.MavenProfile; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; /** * A {@link BuildCustomizer} that adds a production profile to enable Vaadin's production * mode. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class VaadinMavenBuildCustomizer implements BuildCustomizer { - private static final VersionRange SPRING_BOOT_3_OR_LATER = VersionParser.DEFAULT.parseRange("3.0.0-M1"); - - private final boolean isVaadin24OrLater; - - VaadinMavenBuildCustomizer(Version platformVersion) { - this.isVaadin24OrLater = SPRING_BOOT_3_OR_LATER.match(platformVersion); - } - @Override public void customize(MavenBuild build) { - build.profiles() - .id("production") - .plugins() - .add("com.vaadin", "vaadin-maven-plugin", - (plugin) -> plugin.version("${vaadin.version}") - .execution("frontend", - (execution) -> execution.goal("prepare-frontend") - .goal("build-frontend") - .phase("compile") - .configuration((configuration) -> { - if (!this.isVaadin24OrLater) { - configuration.add("productionMode", "true"); - } - }))); + MavenProfile profile = build.profiles().id("production"); + profile.dependencies() + .add("vaadin-core", + Dependency.withCoordinates("com.vaadin", "vaadin-core") + .exclusions(new Dependency.Exclusion("com.vaadin", "vaadin-dev")) + .build()); + profile.plugins() + .add("com.vaadin", "vaadin-maven-plugin", (plugin) -> plugin.version("${vaadin.version}") + .execution("frontend", + (execution) -> execution.goal("prepare-frontend").goal("build-frontend").phase("compile"))); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfiguration.java index 186f723929..5415099a7e 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfiguration.java @@ -21,6 +21,7 @@ import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.spring.properties.ApplicationPropertiesCustomizer; import io.spring.initializr.generator.spring.scm.git.GitIgnoreCustomizer; import io.spring.initializr.metadata.InitializrMetadata; @@ -31,6 +32,7 @@ * Configuration for generation of projects that depend on Vaadin. * * @author Stephane Nicoll + * @author Moritz Halbritter */ @Configuration(proxyBeanMethods = false) @ConditionalOnRequestedDependency("vaadin") @@ -38,8 +40,8 @@ class VaadinProjectGenerationConfiguration { @Bean @ConditionalOnBuildSystem(MavenBuildSystem.ID) - VaadinMavenBuildCustomizer vaadinMavenBuildCustomizer(ProjectDescription description) { - return new VaadinMavenBuildCustomizer(description.getPlatformVersion()); + VaadinMavenBuildCustomizer vaadinMavenBuildCustomizer() { + return new VaadinMavenBuildCustomizer(); } @Bean @@ -54,4 +56,9 @@ GitIgnoreCustomizer vaadinGitIgnoreCustomizer() { return (gitignore) -> gitignore.getGeneral().add("node_modules"); } + @Bean + ApplicationPropertiesCustomizer launchBrowserApplicationPropertiesCustomizer() { + return (properties) -> properties.add("vaadin.launch-browser", true); + } + } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/zipkin/ZipkinProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/zipkin/ZipkinProjectGenerationConfiguration.java index 700c3bea4e..a5ad0dc5e2 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/zipkin/ZipkinProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/zipkin/ZipkinProjectGenerationConfiguration.java @@ -37,7 +37,7 @@ class ZipkinProjectGenerationConfiguration { @Bean @ConditionalOnRequestedDependency("testcontainers") - ServiceConnectionsCustomizer oracleServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + ServiceConnectionsCustomizer zipkinServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { return (serviceConnections) -> serviceResolver.doWith("zipkin", (service) -> serviceConnections .addServiceConnection(ServiceConnection.ofGenericContainer("zipkin", service, "openzipkin/zipkin"))); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizer.java index 9dd6d1af4d..06aaa7f400 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizer.java @@ -17,7 +17,9 @@ package io.spring.start.site.extension.description; import java.util.Objects; +import java.util.function.Consumer; +import io.spring.initializr.generator.language.kotlin.KotlinLanguage; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectDescriptionDiff; import io.spring.initializr.generator.spring.documentation.HelpDocument; @@ -43,15 +45,30 @@ public InvalidJvmVersionHelpDocumentCustomizer(ProjectDescriptionDiff diff, Proj public void customize(HelpDocument document) { this.diff.ifLanguageChanged(this.description, (original, current) -> { String originalJvmVersion = original.jvmVersion(); - String currentJvmVersion = current.jvmVersion(); - if (!Objects.equals(originalJvmVersion, currentJvmVersion)) { - document.getWarnings() - .addItem(String.format( - "The JVM level was changed from '%s' to '%s', review the [JDK Version Range](%s) on the wiki for more details.", - originalJvmVersion, currentJvmVersion, - "https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions#jdk-version-range")); + String actualJvmVersion = current.jvmVersion(); + if (!Objects.equals(originalJvmVersion, actualJvmVersion)) { + processJvmVersionDiff(originalJvmVersion, actualJvmVersion).accept(document); } }); } + protected Consumer processJvmVersionDiff(String originalJvmVersion, String actualJvmVersion) { + return (document) -> { + if (this.description.getLanguage() instanceof KotlinLanguage) { + document.getWarnings() + .addItem( + "The JVM level was changed from '%s' to '%s' as the Kotlin version does not support Java %s yet." + .formatted(originalJvmVersion, actualJvmVersion, originalJvmVersion)); + } + else { + document.getWarnings() + .addItem( + "The JVM level was changed from '%s' to '%s', review the [JDK Version Range](%s) on the wiki for more details." + .formatted(originalJvmVersion, actualJvmVersion, + "https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions#jdk-version-range")); + } + }; + + } + } diff --git a/start-site/src/main/java/io/spring/start/site/extension/properties/ApplicationPropertiesProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/properties/ApplicationPropertiesProjectGenerationConfiguration.java new file mode 100644 index 0000000000..aa3a9c6ea8 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/properties/ApplicationPropertiesProjectGenerationConfiguration.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.properties; + +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; + +import org.springframework.context.annotation.Bean; + +/** + * {@link ProjectGenerationConfiguration} for customizations relevant to the application + * properties. + * + * @author Moritz Halbritter + */ +@ProjectGenerationConfiguration +class ApplicationPropertiesProjectGenerationConfiguration { + + @Bean + DefaultApplicationPropertiesCustomizer defaultApplicationPropertiesContributorCustomizer( + ProjectDescription projectDescription) { + return new DefaultApplicationPropertiesCustomizer(projectDescription); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizer.java new file mode 100644 index 0000000000..19bde0a708 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizer.java @@ -0,0 +1,46 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.properties; + +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.spring.properties.ApplicationProperties; +import io.spring.initializr.generator.spring.properties.ApplicationPropertiesCustomizer; + +import org.springframework.util.StringUtils; + +/** + * {@link ApplicationPropertiesCustomizer} to add default application properties. + * + * @author Moritz Halbritter + */ +class DefaultApplicationPropertiesCustomizer implements ApplicationPropertiesCustomizer { + + private final ProjectDescription projectDescription; + + DefaultApplicationPropertiesCustomizer(ProjectDescription projectDescription) { + this.projectDescription = projectDescription; + } + + @Override + public void customize(ApplicationProperties properties) { + String name = this.projectDescription.getName(); + if (StringUtils.hasLength(name)) { + properties.add("spring.application.name", name); + } + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/properties/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/properties/package-info.java new file mode 100644 index 0000000000..14565bf735 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/properties/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for customization of the application properties. + */ +package io.spring.start.site.extension.properties; diff --git a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java index c229d9e48b..cfa3104577 100644 --- a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,15 +19,10 @@ import java.util.Arrays; import java.util.List; -import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; import io.spring.initializr.generator.language.Language; -import io.spring.initializr.generator.language.groovy.GroovyLanguage; import io.spring.initializr.generator.language.kotlin.KotlinLanguage; import io.spring.initializr.generator.project.MutableProjectDescription; import io.spring.initializr.generator.project.ProjectDescriptionCustomizer; -import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; /** * Validate that the requested java version is compatible with the chosen Spring Boot @@ -35,138 +30,38 @@ * * @author Stephane Nicoll * @author Madhura Bhave + * @author Moritz Halbritter */ public class JavaVersionProjectDescriptionCustomizer implements ProjectDescriptionCustomizer { - private static final List UNSUPPORTED_VERSIONS = Arrays.asList("1.6", "1.7"); - - private static final VersionRange SPRING_BOOT_2_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("2.3.0.RELEASE"); - - private static final VersionRange SPRING_BOOT_2_4_4_OR_LATER = VersionParser.DEFAULT.parseRange("2.4.4"); - - private static final VersionRange SPRING_BOOT_2_5_0_OR_LATER = VersionParser.DEFAULT.parseRange("2.5.0-RC1"); - - private static final VersionRange SPRING_BOOT_2_5_5_OR_LATER = VersionParser.DEFAULT.parseRange("2.5.5"); - - private static final VersionRange SPRING_BOOT_2_5_11_OR_LATER = VersionParser.DEFAULT.parseRange("2.5.11"); - - private static final VersionRange SPRING_BOOT_2_6_0_OR_LATER = VersionParser.DEFAULT.parseRange("2.6.0"); - - private static final VersionRange SPRING_BOOT_2_6_12_OR_LATER = VersionParser.DEFAULT.parseRange("2.6.12"); - - private static final VersionRange SPRING_BOOT_2_7_10_OR_LATER = VersionParser.DEFAULT.parseRange("2.7.10"); - - private static final VersionRange SPRING_BOOT_3_0_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.0.0-M1"); - - private static final VersionRange GRADLE_6 = VersionParser.DEFAULT.parseRange("2.2.2.RELEASE"); + private static final List UNSUPPORTED_VERSIONS = Arrays.asList("1.6", "1.7", "1.8"); @Override public void customize(MutableProjectDescription description) { String javaVersion = description.getLanguage().jvmVersion(); if (UNSUPPORTED_VERSIONS.contains(javaVersion)) { - updateTo(description, "1.8"); + updateTo(description, "17"); return; } Integer javaGeneration = determineJavaGeneration(javaVersion); if (javaGeneration == null) { return; } - Version platformVersion = description.getPlatformVersion(); - // Spring Boot 3 requires Java 17 - if (javaGeneration < 17 && SPRING_BOOT_3_0_0_OR_LATER.match(platformVersion)) { + if (javaGeneration < 17) { updateTo(description, "17"); - return; - } - - // 13 support only as of Gradle 6 - if (javaGeneration == 13 && description.getBuildSystem() instanceof GradleBuildSystem - && !GRADLE_6.match(platformVersion)) { - updateTo(description, "11"); - } - // 15 support only as of 2.2.11 - if (javaGeneration == 15 && !SPRING_BOOT_2_3_0_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); } - if (javaGeneration == 16) { - // Full Support as of Spring Boot 2.5 only. - // 16 support as of Kotlin 1.5 - if (description.getLanguage() instanceof KotlinLanguage - && !SPRING_BOOT_2_5_0_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - // 16 support as of Gradle 7 - if (description.getBuildSystem() instanceof GradleBuildSystem - && !SPRING_BOOT_2_5_0_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - // Groovy 3 only available as of 2.5 - if (description.getLanguage() instanceof GroovyLanguage - && !SPRING_BOOT_2_5_0_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - // 16 support only as of 2.4.4 - if (!SPRING_BOOT_2_4_4_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - } - if (javaGeneration == 17) { - // Java 17 support as of Spring Boot 2.5.5 - if (!SPRING_BOOT_2_5_5_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - // Kotlin 1.6 only - if (description.getLanguage() instanceof KotlinLanguage - && !SPRING_BOOT_2_6_0_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - } - if (javaGeneration == 18) { - // Java 18 support as of Spring Boot 2.5.11 - if (!SPRING_BOOT_2_5_11_OR_LATER.match(platformVersion)) { - updateTo(description, "17"); - } - // Kotlin support to be determined - if (description.getLanguage() instanceof KotlinLanguage) { - if (!SPRING_BOOT_2_6_0_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - else { - updateTo(description, "17"); - } - } - } - if (javaGeneration == 19) { - // Java 19 support as of Spring Boot 2.6.12 - if (!SPRING_BOOT_2_6_12_OR_LATER.match(platformVersion)) { - updateTo(description, "17"); - } - // Kotlin support to be determined - if (description.getLanguage() instanceof KotlinLanguage) { - if (!SPRING_BOOT_2_6_0_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - else { - updateTo(description, "17"); - } - } - } - if (javaGeneration == 20) { - // Java 20 support as of Spring Boot 2.7.10 - if (!SPRING_BOOT_2_7_10_OR_LATER.match(platformVersion)) { - updateTo(description, "17"); - } - // Kotlin support to be determined - if (description.getLanguage() instanceof KotlinLanguage) { - if (!SPRING_BOOT_2_6_0_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - else { - updateTo(description, "17"); - } + if (javaGeneration >= 22) { + if (isKotlin(description)) { + // Kotlin 1.9.x doesn't support Java > 21 + updateTo(description, "21"); } } } + private boolean isKotlin(MutableProjectDescription description) { + return description.getLanguage() instanceof KotlinLanguage; + } + private void updateTo(MutableProjectDescription description, String jvmVersion) { Language language = Language.forId(description.getLanguage().id(), jvmVersion); description.setLanguage(language); @@ -174,11 +69,8 @@ private void updateTo(MutableProjectDescription description, String jvmVersion) private Integer determineJavaGeneration(String javaVersion) { try { - if ("1.8".equals(javaVersion)) { - return 8; - } int generation = Integer.parseInt(javaVersion); - return ((generation > 8 && generation <= 20) ? generation : null); + return ((generation > 9 && generation <= 23) ? generation : null); } catch (NumberFormatException ex) { return null; diff --git a/start-site/src/main/java/io/spring/start/site/project/ProjectDescriptionCustomizerConfiguration.java b/start-site/src/main/java/io/spring/start/site/project/ProjectDescriptionCustomizerConfiguration.java index 0b72707648..7640cadfa5 100644 --- a/start-site/src/main/java/io/spring/start/site/project/ProjectDescriptionCustomizerConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/project/ProjectDescriptionCustomizerConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,7 @@ package io.spring.start.site.project; import io.spring.initializr.generator.project.ProjectDescriptionCustomizer; -import io.spring.start.site.project.dependency.springcloud.SpringCloudGatewayProjectDescriptionCustomizer; +import io.spring.start.site.project.dependency.springcloud.SpringCloudResilience4JProjectDescriptionCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -36,8 +36,8 @@ public JavaVersionProjectDescriptionCustomizer javaVersionProjectDescriptionCust } @Bean - public SpringCloudGatewayProjectDescriptionCustomizer springCloudGatewayProjectDescriptionCustomizer() { - return new SpringCloudGatewayProjectDescriptionCustomizer(); + public SpringCloudResilience4JProjectDescriptionCustomizer springCloudResilience4JProjectDescriptionCustomizer() { + return new SpringCloudResilience4JProjectDescriptionCustomizer(); } } diff --git a/start-site/src/main/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizer.java b/start-site/src/main/java/io/spring/start/site/project/dependency/springcloud/SpringCloudResilience4JProjectDescriptionCustomizer.java similarity index 60% rename from start-site/src/main/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizer.java rename to start-site/src/main/java/io/spring/start/site/project/dependency/springcloud/SpringCloudResilience4JProjectDescriptionCustomizer.java index 2a057e1675..2a485c2bec 100644 --- a/start-site/src/main/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/project/dependency/springcloud/SpringCloudResilience4JProjectDescriptionCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,22 +23,24 @@ import io.spring.initializr.generator.project.ProjectDescriptionCustomizer; /** - * A {@link ProjectDescriptionCustomizer} that checks that Spring Cloud Gateway is not - * used with Spring MVC as only Spring WebFlux is supported. + * A {@link ProjectDescriptionCustomizer} that checks the web stack that is used with + * Spring Cloud Resilience4j as it has a starter for the servlet stack and another one for + * the reactive stack. * * @author Stephane Nicoll */ -public class SpringCloudGatewayProjectDescriptionCustomizer implements ProjectDescriptionCustomizer { +public class SpringCloudResilience4JProjectDescriptionCustomizer implements ProjectDescriptionCustomizer { @Override public void customize(MutableProjectDescription description) { Collection dependencyIds = description.getRequestedDependencies().keySet(); - if (dependencyIds.contains("cloud-gateway") && dependencyIds.contains("web")) { - description.removeDependency("web"); - if (!description.getRequestedDependencies().containsKey("webflux")) { - description.addDependency("webflux", - Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter-webflux")); - } + if (!dependencyIds.contains("cloud-resilience4j")) { + return; + } + if (dependencyIds.contains("webflux")) { + description.addDependency("cloud-resilience4j", + Dependency.from(description.getRequestedDependencies().get("cloud-resilience4j")) + .artifactId("spring-cloud-starter-circuitbreaker-reactor-resilience4j")); } } diff --git a/start-site/src/main/java/io/spring/start/site/support/CacheableDependencyManagementVersionResolver.java b/start-site/src/main/java/io/spring/start/site/support/CacheableDependencyManagementVersionResolver.java deleted file mode 100644 index 8bee84d71d..0000000000 --- a/start-site/src/main/java/io/spring/start/site/support/CacheableDependencyManagementVersionResolver.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2012-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.support; - -import java.util.Map; - -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; - -import org.springframework.cache.annotation.Cacheable; - -/** - * A {@link DependencyManagementVersionResolver} that uses the metadata cache to store - * dependency management resolution. - * - * @author Stephane Nicoll - */ -public class CacheableDependencyManagementVersionResolver implements DependencyManagementVersionResolver { - - private final DependencyManagementVersionResolver delegate; - - public CacheableDependencyManagementVersionResolver(DependencyManagementVersionResolver delegate) { - this.delegate = delegate; - } - - @Override - @Cacheable("initializr.metadata") - public Map resolve(String groupId, String artifactId, String version) { - return this.delegate.resolve(groupId, artifactId, version); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/support/CacheableMavenVersionResolver.java b/start-site/src/main/java/io/spring/start/site/support/CacheableMavenVersionResolver.java new file mode 100644 index 0000000000..844e9026ec --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/support/CacheableMavenVersionResolver.java @@ -0,0 +1,61 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.support; + +import java.lang.reflect.Method; +import java.util.Map; + +import io.spring.initializr.versionresolver.MavenVersionResolver; + +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.interceptor.KeyGenerator; + +/** + * A {@link MavenVersionResolver} that uses the metadata cache to store dependency and + * plugin management resolution. + * + * @author Stephane Nicoll + */ +@CacheConfig(cacheNames = "initializr.metadata", keyGenerator = "mavenVersionResolver") +public class CacheableMavenVersionResolver implements MavenVersionResolver, KeyGenerator { + + private final MavenVersionResolver delegate; + + public CacheableMavenVersionResolver(MavenVersionResolver delegate) { + this.delegate = delegate; + } + + @Override + @Cacheable + public Map resolveDependencies(String groupId, String artifactId, String version) { + return this.delegate.resolveDependencies(groupId, artifactId, version); + } + + @Override + @Cacheable + public Map resolvePlugins(String groupId, String artifactId, String version) { + return this.delegate.resolvePlugins(groupId, artifactId, version); + } + + @Override + public Object generate(Object target, Method method, Object... params) { + String prefix = (method.getName().equals("resolveDependencies")) ? "dependencies" : "plugins"; + return "%s-%s:%s:%s".formatted(prefix, params[0], params[1], params[2]); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java b/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java index 0bbf45781b..9d56aa50c1 100644 --- a/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java +++ b/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ package io.spring.start.site.support; import java.util.List; -import java.util.stream.Collectors; import com.fasterxml.jackson.databind.ObjectMapper; import io.spring.initializr.generator.version.Version; @@ -32,9 +31,13 @@ * versions available on spring.io. * * @author Stephane Nicoll + * @author Moritz Halbritter + * @author Eddú Meléndez */ public class StartInitializrMetadataUpdateStrategy extends SpringIoInitializrMetadataUpdateStrategy { + private static final Version MINIMUM_BOOT_VERSION = Version.parse("3.3.0"); + public StartInitializrMetadataUpdateStrategy(RestTemplate restTemplate, ObjectMapper objectMapper) { super(restTemplate, objectMapper); } @@ -42,13 +45,12 @@ public StartInitializrMetadataUpdateStrategy(RestTemplate restTemplate, ObjectMa @Override protected List fetchSpringBootVersions(String url) { List versions = super.fetchSpringBootVersions(url); - return (versions != null) ? versions.stream().filter(this::isCompatibleVersion).collect(Collectors.toList()) - : null; + return (versions != null) ? versions.stream().filter(this::isCompatibleVersion).toList() : null; } private boolean isCompatibleVersion(DefaultMetadataElement versionMetadata) { Version version = Version.parse(versionMetadata.getId()); - return (version.getMajor() == 2 && version.getMinor() > 6) || (version.getMajor() >= 3); + return version.compareTo(MINIMUM_BOOT_VERSION) >= 0; } } diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index cf085aea04..864a5e907f 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -1,30 +1,52 @@ io.spring.initializr.generator.project.ProjectGenerationConfiguration=\ io.spring.start.site.extension.build.gradle.GradleProjectGenerationConfiguration,\ io.spring.start.site.extension.build.maven.MavenProjectGenerationConfiguration,\ +io.spring.start.site.extension.code.kotlin.KotlinProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.DependencyProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.activemq.ActiveMQProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.activemq.ArtemisProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.cassandra.CassandraProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.derby.DerbyProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.dgs.DgsProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.dgs.DgsCodegenProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.dockercompose.DockerComposeProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.elasticsearch.ElasticsearchProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.flyway.FlywayProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.graalvm.GraalVmProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.graphql.SpringGraphQlProjectGenerationConfiguration,\ -io.spring.start.site.extension.dependency.hilla.HillaProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.htmx.HtmxProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.jte.JteProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.mariadb.MariaDbProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.mongodb.MongoDbProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.mysql.MysqlProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.neo4j.Neo4jProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.observability.ObservabilityProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.oracle.OracleProjectGenerationConfiguration,\ -io.spring.start.site.extension.dependency.picocli.PicocliProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.postgresql.PgVectorProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.postgresql.PostgresqlProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.redis.RedisProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.redis.RedisStackProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.sbom.SbomProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.solace.SolaceProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springai.SpringAiChromaProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springai.SpringAiDockerComposeProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springai.SpringAiMilvusProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springai.SpringAiMongoDbAtlasProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springai.SpringAiOllamaProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springai.SpringAiQdrantProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springai.SpringAiTestcontainersProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springai.SpringAiWeaviateProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springamqp.SpringAmqpProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springazure.SpringAzureDockerComposeProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springazure.SpringAzureProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springazure.SpringAzureTestcontainersProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springboot.SpringBootProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springcloud.SpringCloudProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springdata.SpringDataProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springgrpc.SpringGrpcProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springintegration.SpringIntegrationProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springkafka.SpringKafkaProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springmodulith.SpringModulithProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springpulsar.SpringPulsarProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springrestdocs.SpringRestDocsProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.sqlserver.SqlServerProjectGenerationConfiguration,\ @@ -32,4 +54,4 @@ io.spring.start.site.extension.dependency.testcontainers.TestcontainersProjectGe io.spring.start.site.extension.dependency.vaadin.VaadinProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.zipkin.ZipkinProjectGenerationConfiguration,\ io.spring.start.site.extension.description.DescriptionProjectGenerationConfiguration,\ -io.spring.start.site.extension.code.kotlin.KotlinProjectGenerationConfiguration +io.spring.start.site.extension.properties.ApplicationPropertiesProjectGenerationConfiguration diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8b8f0ccf9c..2a64bb8d96 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -36,6 +36,9 @@ spring: use-last-modified: false initializr: + stats: + elastic: + uri: ${elastic-uri:} env: boms: codecentric-spring-boot-admin: @@ -43,177 +46,140 @@ initializr: artifactId: spring-boot-admin-dependencies versionProperty: spring-boot-admin.version mappings: - - compatibilityRange: "[2.3.0.M1,2.5.0-M1)" - version: 2.4.3 - - compatibilityRange: "[2.5.0.M1,2.6.0-M1)" - version: 2.5.6 - - compatibilityRange: "[2.6.0.M1,2.7.0-M1)" - version: 2.6.8 - - compatibilityRange: "[2.7.0.M1,3.0.0-M1)" - version: 2.7.4 - - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 3.0.4 - hilla: - groupId: dev.hilla - artifactId: hilla-bom - versionProperty: hilla.version + - compatibilityRange: "[3.3.0,3.4.0-M1)" + version: 3.3.6 + - compatibilityRange: "[3.4.0,3.5.0-M1)" + version: 3.4.1 + netflix-dgs: + groupId: com.netflix.graphql.dgs + artifactId: graphql-dgs-platform-dependencies + versionProperty: netflix-dgs.version mappings: - - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" - version: 2.1.1 + - compatibilityRange: "[3.3.0,3.5.0-M1)" + version: 10.0.3 + sentry: + groupId: io.sentry + artifactId: sentry-bom + versionProperty: sentry.version + mappings: + - compatibilityRange: "[3.3.0,3.5.0-M1)" + version: 8.1.0 solace-spring-boot: groupId: com.solace.spring.boot artifactId: solace-spring-boot-bom versionProperty: solace-spring-boot.version mappings: - - compatibilityRange: "[2.3.0.M1,2.6.0-M1)" - version: 1.1.0 - - compatibilityRange: "[2.6.0.M1,3.0.0-M1)" - version: 1.2.2 - - compatibilityRange: "3.0.0-M1" - version: 2.0.0 + - compatibilityRange: "[3.3.0,3.5.0-M1)" + version: 2.2.0 solace-spring-cloud: groupId: com.solace.spring.cloud artifactId: solace-spring-cloud-bom versionProperty: solace-spring-cloud.version mappings: - - compatibilityRange: "[2.3.0.M1,2.4.0-M1)" - version: 1.1.1 - - compatibilityRange: "[2.4.0.M1,2.6.0-M1)" - version: 2.1.0 - - compatibilityRange: "[2.6.0.M1,3.0.0-M1)" - version: 2.3.2 - - compatibilityRange: "3.0.0-M1" - version: 3.0.0 + - compatibilityRange: "[3.3.0,3.5.0-M1)" + version: 4.7.0 + spring-ai: + groupId: org.springframework.ai + artifactId: spring-ai-bom + versionProperty: spring-ai.version + mappings: + - compatibilityRange: "[3.3.0,3.5.0-M1)" + version: 1.0.0-M5 + repositories: spring-milestones spring-cloud: groupId: org.springframework.cloud artifactId: spring-cloud-dependencies versionProperty: spring-cloud.version order: 50 mappings: - - compatibilityRange: "[2.2.0.RELEASE,2.4.0.RELEASE)" - version: Hoxton.SR12 - - compatibilityRange: "[2.4.0.RELEASE,2.6.0)" - version: 2020.0.6 - - compatibilityRange: "[2.6.0,3.0.0)" - version: 2021.0.7 - - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 2022.0.3 + - compatibilityRange: "[3.3.0,3.4.0-M1)" + version: 2023.0.5 + - compatibilityRange: "[3.4.0,3.5.0-M1)" + version: 2024.0.0 + - compatibilityRange: "[3.5.0-M1,3.6.0-M1)" + version: 2025.0.0-M1 + repositories: + - spring-milestones spring-cloud-azure: groupId: com.azure.spring artifactId: spring-cloud-azure-dependencies versionProperty: spring-cloud-azure.version mappings: - - compatibilityRange: "[2.5.0.M1,3.0.0-M1)" - version: 4.8.0 - - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 5.2.0 + - compatibilityRange: "[3.3.0,3.5.0-M1)" + version: 5.19.0 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies versionProperty: spring-cloud-gcp.version additionalBoms: [ spring-cloud ] mappings: - - compatibilityRange: "[2.4.0-M1,2.6.0-M1)" - version: 2.0.11 - - compatibilityRange: "[2.6.0-M1,3.0.0-M1)" - version: 3.5.3 - - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 4.3.1 - - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" - version: 4.5.0 + - compatibilityRange: "[3.3.0,3.4.0-M1)" + version: 5.10.0 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies versionProperty: spring-cloud-services.version - additionalBoms: [spring-cloud] + additionalBoms: [ spring-cloud ] mappings: - - compatibilityRange: "[2.3.0.RELEASE,2.4.0-M1)" - version: 2.3.0.RELEASE - - compatibilityRange: "[2.4.0-M1,2.5.0-M1)" - version: 2.4.1 - - compatibilityRange: "[2.5.0-M1,2.6.0-M1)" - version: 3.3.0 - - compatibilityRange: "[2.6.0-M1,2.7.0-M1)" - version: 3.4.0 - - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 3.5.0 - - compatibilityRange: "[3.0.0,3.1.0-M1)" - version: 4.0.0 + - compatibilityRange: "[3.3.0,3.5.0-M1)" + version: 4.2.0 + spring-grpc: + groupId: org.springframework.grpc + artifactId: spring-grpc-dependencies + versionProperty: spring-grpc.version + mappings: + - compatibilityRange: "[3.4.0,3.5.0-M1)" + version: 0.3.0 + spring-modulith: + groupId: org.springframework.modulith + artifactId: spring-modulith-bom + versionProperty: spring-modulith.version + mappings: + - compatibilityRange: "[3.3.0,3.4.0-M1)" + version: 1.2.7 + - compatibilityRange: "[3.4.0,3.5.0-M1)" + version: 1.3.1 spring-shell: groupId: org.springframework.shell artifactId: spring-shell-dependencies versionProperty: spring-shell.version mappings: - - compatibilityRange: "[2.7.0,3.0.0-M1)" - version: 2.1.11 - - compatibilityRange: "[3.0.0,3.1.0-M1)" - version: 3.0.6 - - compatibilityRange: "[3.1.0,3.2.0-M1)" - version: 3.1.2 - testcontainers: - groupId: org.testcontainers - artifactId: testcontainers-bom - version: 1.18.3 - versionProperty: testcontainers.version + - compatibilityRange: "[3.3.0,3.5.0-M1)" + version: 3.4.0 + timefold-solver: + groupId: ai.timefold.solver + artifactId: timefold-solver-bom + versionProperty: timefold-solver.version + mappings: + - compatibilityRange: "[3.3.0,3.5.0-M1)" + version: 1.18.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom versionProperty: vaadin.version mappings: - - compatibilityRange: "[2.1.0.RELEASE,2.6.0-M1)" - version: 14.10.2 - - compatibilityRange: "[2.6.0-M1,2.7.0-M1)" - version: 23.2.15 - - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 23.3.15 - - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 24.0.8 - - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" - version: 24.1.1 - wavefront: - groupId: com.wavefront - artifactId: wavefront-spring-boot-bom - versionProperty: wavefront.version - mappings: - - compatibilityRange: "[2.1.0.RELEASE,2.4.0-M1)" - version: 2.0.2 - - compatibilityRange: "[2.4.0-M1,2.5.0-M1)" - version: 2.1.1 - - compatibilityRange: "[2.5.0-M1,2.7.0-M1)" - version: 2.2.2 - - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 2.3.4 - - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 3.0.1 - gradle: - dependency-management-plugin-version: 1.0.14.RELEASE - kotlin: - mappings: - - compatibilityRange: "[1.5.0.RELEASE,2.0.0.M1)" - version: 1.2.51 + - compatibilityRange: "[3.3.0,3.4.0-M1)" + version: 24.5.11 + - compatibilityRange: "[3.4.0,3.5.0-M1)" + version: 24.6.4 platform: - compatibility-range: "2.3.0.RELEASE" - v1-format-compatibility-range: "[2.0.0.RELEASE,2.4.0-M1)" - v2-format-compatibility-range: "2.4.0-M1" - repositories: - spring-releases: - name: Spring Releases - url: https://repo.spring.io/release - sonatype-snapshots: - name: Sonatype Snapshots - url: https://oss.sonatype.org/content/repositories/snapshots/ - releasesEnabled: false - snapshotsEnabled: true + compatibilityRange: "3.3.0" dependencies: - name: Developer Tools content: - name: GraalVM Native Support id: native - compatibilityRange: "3.0.0-M1" groupId: org.springframework.boot artifactId: spring-boot description: Support for compiling Spring applications to native executables using the GraalVM native-image compiler. starter: false + - name: GraphQL DGS Code Generation + id: dgs-codegen + groupId: com.netflix.graphql.dgs.codegen + artifactId: graphql-dgs-codegen-gradle + version: 7.0.3 + description: Generate data types and type-safe APIs for querying GraphQL APIs by parsing schema files. + starter: false - name: Spring Boot DevTools id: devtools groupId: org.springframework.boot @@ -223,7 +189,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#using.devtools + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/using/devtools.html - name: Lombok id: lombok groupId: org.projectlombok @@ -240,10 +206,9 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#appendix.configuration-metadata.annotation-processor + href: https://docs.spring.io/spring-boot/{bootVersion}/specification/configuration-metadata/annotation-processor.html - name: Docker Compose Support id: docker-compose - compatibilityRange: "3.1.0-M1" groupId: org.springframework.boot artifactId: spring-boot-docker-compose scope: runtime @@ -251,7 +216,17 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#features.docker-compose + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/features/dev-services.html#features.dev-services.docker-compose + - name: Spring Modulith + id: modulith + bom: spring-modulith + compatibilityRange: "[3.3.0,3.5.0-M1)" + group-id: org.springframework.modulith + artifact-id: spring-modulith-starter-core + description: Support for building modular monolithic applications. + links: + - rel: reference + href: https://docs.spring.io/spring-modulith/reference/ - name: Web content: - name: Spring Web @@ -265,7 +240,7 @@ initializr: href: https://spring.io/guides/gs/rest-service/ description: Building a RESTful Web Service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html - rel: guide href: https://spring.io/guides/gs/serving-web-content/ description: Serving Web Content with Spring MVC @@ -283,10 +258,9 @@ initializr: href: https://spring.io/guides/gs/reactive-rest-service/ description: Building a Reactive RESTful Web Service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.reactive + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/reactive.html - name: Spring for GraphQL id: graphql - compatibilityRange: "2.7.0.M1" description: Build GraphQL applications with Spring for GraphQL and GraphQL Java. facets: - json @@ -295,7 +269,7 @@ initializr: href: https://spring.io/guides/gs/graphql-server/ description: Building a GraphQL service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/html/web.html#web.graphql + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-graphql.html - name: Rest Repositories id: data-rest facets: @@ -312,7 +286,7 @@ initializr: href: https://spring.io/guides/gs/accessing-mongodb-data-rest/ description: Accessing MongoDB Data with REST - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto.data-access.exposing-spring-data-repositories-as-rest + href: https://docs.spring.io/spring-boot/{bootVersion}/how-to/data-access.html#howto.data-access.exposing-spring-data-repositories-as-rest - name: Spring Session id: session groupId: org.springframework.session @@ -336,18 +310,18 @@ initializr: href: https://spring.io/guides/gs/rest-hateoas/ description: Building a Hypermedia-Driven RESTful Web Service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.spring-hateoas + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-hateoas.html - name: Spring Web Services id: web-services description: Facilitates contract-first SOAP development. Allows for the creation of flexible web services using one of the many ways to manipulate XML payloads. aliases: - - ws + - ws links: - - rel: guide - href: https://spring.io/guides/gs/producing-web-service/ - description: Producing a SOAP web service - - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#io.webservices + - rel: guide + href: https://spring.io/guides/gs/producing-web-service/ + description: Producing a SOAP web service + - rel: reference + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/io/webservices.html - name: Jersey id: jersey description: Framework for developing RESTful Web Services in Java that provides support for JAX-RS APIs. @@ -355,37 +329,48 @@ initializr: - json links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.servlet.jersey + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.jersey - name: Vaadin id: vaadin facets: - web groupId: com.vaadin artifactId: vaadin-spring-boot-starter - description: A web framework that allows you to write UI in pure Java without getting bogged down in JS, HTML, and CSS. + description: The full-stack web app platform for Spring. Build views fully in Java with Flow, or in React using Hilla. bom: vaadin - compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" links: - rel: guide href: https://spring.io/guides/gs/crud-with-vaadin/ description: Creating CRUD UI with Vaadin - rel: reference href: https://vaadin.com/docs - - name: Hilla - id: hilla - bom: hilla - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" + - name: Netflix DGS + id: netflix-dgs + groupId: com.netflix.graphql.dgs + artifactId: graphql-dgs-spring-graphql-starter + description: Build GraphQL applications with Netflix DGS and Spring for GraphQL. + compatibilityRange: "[3.3.0,3.5.0-M1)" + bom: netflix-dgs + links: + - rel: reference + href: https://netflix.github.io/dgs/ + - name: htmx + id: htmx facets: - web - groupId: dev.hilla - artifactId: hilla-react-spring-boot-starter - description: An open source framework that integrates a Spring Boot Java backend with a reactive TypeScript frontend. + groupId: io.github.wimdeblauwe + artifactId: htmx-spring-boot + description: Build modern user interfaces with the simplicity and power of hypertext. + compatibilityRange: "[3.4.0,3.5.0-M1)" + mappings: + - compatibilityRange: "[3.4.0,3.5.0-M1)" + version: 4.0.1 links: - - rel: guide - href: https://hilla.dev/docs/react/start/quick/#coming-from-spring-initializr - description: Next Steps with Hilla - rel: reference - href: https://hilla.dev/ + href: https://github.com/wimdeblauwe/htmx-spring-boot + - rel: guide + href: https://www.youtube.com/watch?v=j-rfPoXe5aE - name: Template Engines content: - name: Thymeleaf @@ -396,19 +381,19 @@ initializr: href: https://spring.io/guides/gs/handling-form-submission/ description: Handling Form Submission - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.servlet.spring-mvc.template-engines + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.spring-mvc.template-engines - name: Apache Freemarker id: freemarker description: Java library to generate text output (HTML web pages, e-mails, configuration files, source code, etc.) based on templates and changing data. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.servlet.spring-mvc.template-engines + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.spring-mvc.template-engines - name: Mustache id: mustache - description: Logic-less Templates. There are no if statements, else clauses, or for loops. Instead there are only tags. + description: Logic-less templates for both web and standalone environments. There are no if statements, else clauses, or for loops. Instead there are only tags. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.servlet.spring-mvc.template-engines + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.spring-mvc.template-engines - name: Groovy Templates id: groovy-templates description: Groovy templating engine. @@ -416,7 +401,17 @@ initializr: - web links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.servlet.spring-mvc.template-engines + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.spring-mvc.template-engines + - name: JTE + id: jte + description: Secure and lightweight template engine for Java and Kotlin. + groupId: gg.jte + artifactId: jte-spring-boot-starter-3 + version: 3.1.12 + starter: false # https://github.com/casid/jte/issues/386 + links: + - rel: reference + href: https://jte.gg/ - name: Security content: - name: Spring Security @@ -433,50 +428,40 @@ initializr: href: https://spring.io/guides/gs/authenticating-ldap/ description: Authenticating a User with LDAP - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.security + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-security.html - name: OAuth2 Client id: oauth2-client description: Spring Boot integration for Spring Security's OAuth2/OpenID Connect client features. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.security.oauth2.client + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-security.html#web.security.oauth2.client - name: OAuth2 Authorization Server id: oauth2-authorization-server description: Spring Boot integration for Spring Authorization Server. - compatibilityRange: "3.1.0-RC1" links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.security.oauth2.authorization-server + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-security.html#web.security.oauth2.authorization-server - name: OAuth2 Resource Server id: oauth2-resource-server description: Spring Boot integration for Spring Security's OAuth2 resource server features. - compatibilityRange: "2.1.0.M2" links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.security.oauth2.server + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-security.html#web.security.oauth2.server - name: Spring LDAP id: data-ldap description: Makes it easier to build Spring based applications that use the Lightweight Directory Access Protocol. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.ldap + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.ldap - name: Okta id: okta - compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" + compatibilityRange: "[3.3.0,3.4.0-M1)" description: Okta specific configuration for Spring Security/Spring Boot OAuth2 features. Enable your Spring Boot application to work with Okta via OAuth 2.0/OIDC. groupId: com.okta.spring artifactId: okta-spring-boot-starter mappings: - - compatibilityRange: "[2.2.0.RELEASE,2.4.0-M1)" - version: 1.4.0 - - compatibilityRange: "[2.4.0-M1,2.4.1)" - version: 1.5.1 - - compatibilityRange: "[2.4.1,2.5.0-M1)" - version: 2.0.1 - - compatibilityRange: "[2.5.0-M1,3.0.0-M1)" - version: 2.1.6 - - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 3.0.4 + - compatibilityRange: "[3.3.0,3.4.0-M1)" + version: 3.0.7 links: - rel: guide href: https://github.com/okta/samples-java-spring/tree/master/okta-hosted-login @@ -503,7 +488,7 @@ initializr: href: https://spring.io/guides/gs/managing-transactions/ description: Managing Transactions - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.sql + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html - name: Spring Data JPA id: data-jpa description: Persist data in SQL stores with Java Persistence API using Spring Data and Hibernate. @@ -516,7 +501,7 @@ initializr: href: https://spring.io/guides/gs/accessing-data-jpa/ description: Accessing Data with JPA - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.sql.jpa-and-spring-data + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html#data.sql.jpa-and-spring-data - name: Spring Data JDBC id: data-jdbc description: Persist data in SQL stores with plain JDBC using Spring Data. @@ -525,7 +510,7 @@ initializr: href: https://github.com/spring-projects/spring-data-examples/tree/master/jdbc/basics description: Using Spring Data JDBC - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.sql.jdbc + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html#data.sql.jdbc - name: Spring Data R2DBC id: data-r2dbc description: Provides Reactive Relational Database Connectivity to persist data in SQL stores using Spring Data in reactive applications. @@ -536,31 +521,25 @@ initializr: href: https://spring.io/guides/gs/accessing-data-r2dbc/ description: Accessing data with R2DBC - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.sql.r2dbc + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html#data.sql.r2dbc - rel: home href: https://r2dbc.io description: R2DBC Homepage - name: MyBatis Framework id: mybatis - compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" description: Persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis couples objects with stored procedures or SQL statements using a XML descriptor or annotations. + groupId: org.mybatis.spring.boot + artifactId: mybatis-spring-boot-starter + mappings: + - compatibilityRange: "[3.3.0,3.5.0-M1)" + version: 3.0.4 links: - rel: guide href: https://github.com/mybatis/spring-boot-starter/wiki/Quick-Start description: MyBatis Quick Start - rel: reference href: https://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/ - groupId: org.mybatis.spring.boot - artifactId: mybatis-spring-boot-starter - mappings: - - compatibilityRange: "[2.1.0.RELEASE,2.5.0-M1)" - version: 2.1.4 - - compatibilityRange: "[2.5.0-M1,2.7.0-M1)" - version: 2.2.2 - - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 2.3.1 - - compatibilityRange: "3.0.0-M1" - version: 3.0.2 - name: Liquibase Migration id: liquibase description: Liquibase database migration and source control library. @@ -569,7 +548,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto.data-initialization.migration-tool.liquibase + href: https://docs.spring.io/spring-boot/{bootVersion}/how-to/data-initialization.html#howto.data-initialization.migration-tool.liquibase - name: Flyway Migration id: flyway description: Version control for your database so you can migrate from any version (incl. an empty database) to the latest version of the schema. @@ -578,16 +557,15 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto.data-initialization.migration-tool.flyway + href: https://docs.spring.io/spring-boot/{bootVersion}/how-to/data-initialization.html#howto.data-initialization.migration-tool.flyway - name: JOOQ Access Layer id: jooq description: Generate Java code from your database and build type safe SQL queries through a fluent API. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.sql.jooq + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html#data.sql.jooq - name: IBM DB2 Driver id: db2 - compatibilityRange: "2.2.0.M6" description: A JDBC driver that provides access to IBM DB2. groupId: com.ibm.db2 artifactId: jcc @@ -643,7 +621,7 @@ initializr: id: oracle description: A JDBC driver that provides access to Oracle. groupId: com.oracle.database.jdbc - artifactId: ojdbc8 + artifactId: ojdbc11 scope: runtime starter: false - name: PostgreSQL Driver @@ -665,7 +643,7 @@ initializr: href: https://spring.io/guides/gs/messaging-redis/ description: Messaging with Redis - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.redis + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.redis - name: Spring Data Reactive Redis id: data-redis-reactive description: Access Redis key-value data stores in a reactive fashion with Spring Data Redis. @@ -676,7 +654,7 @@ initializr: href: https://spring.io/guides/gs/messaging-redis/ description: Messaging with Redis - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.redis + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.redis - name: Spring Data MongoDB id: data-mongodb description: Store data in flexible, JSON-like documents, meaning fields can vary from document to document and data structure can be changed over time. @@ -685,48 +663,48 @@ initializr: href: https://spring.io/guides/gs/accessing-data-mongodb/ description: Accessing Data with MongoDB - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.mongodb + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.mongodb - name: Spring Data Reactive MongoDB id: data-mongodb-reactive description: Provides asynchronous stream processing with non-blocking back pressure for MongoDB. facets: - reactive links: - - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.mongodb - rel: guide href: https://spring.io/guides/gs/accessing-data-mongodb/ description: Accessing Data with MongoDB + - rel: reference + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.mongodb - name: Spring Data Elasticsearch (Access+Driver) id: data-elasticsearch description: A distributed, RESTful search and analytics engine with Spring Data Elasticsearch. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.elasticsearch + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.elasticsearch - name: Spring Data for Apache Cassandra id: data-cassandra description: A free and open-source, distributed, NoSQL database management system that offers high-scalability and high-performance. links: - - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.cassandra - rel: guide href: https://spring.io/guides/gs/accessing-data-cassandra/ + - rel: reference + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.cassandra - name: Spring Data Reactive for Apache Cassandra id: data-cassandra-reactive description: Access Cassandra NoSQL Database in a reactive fashion. facets: - reactive links: - - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.cassandra - rel: guide href: https://spring.io/guides/gs/accessing-data-cassandra/ + - rel: reference + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.cassandra - name: Spring Data Couchbase id: data-couchbase description: NoSQL document-oriented database that offers in memory-first architecture, geo-distributed deployments, and workload isolation. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.couchbase + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.couchbase - name: Spring Data Reactive Couchbase id: data-couchbase-reactive description: Access Couchbase NoSQL database in a reactive fashion with Spring Data Couchbase. @@ -734,7 +712,7 @@ initializr: - reactive links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.couchbase + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.couchbase - name: Spring Data Neo4j id: data-neo4j description: An open source NoSQL database that stores data structured as graphs consisting of nodes, connected by relationships. @@ -743,7 +721,7 @@ initializr: href: https://spring.io/guides/gs/accessing-data-neo4j/ description: Accessing Data with Neo4j - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.neo4j + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.neo4j - name: Messaging content: - name: Spring Integration @@ -754,7 +732,7 @@ initializr: href: https://spring.io/guides/gs/integration/ description: Integrating Data - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#messaging.spring-integration + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/spring-integration.html - name: Spring for RabbitMQ id: amqp description: Gives your applications a common platform to send and receive messages, and your messages a safe place to live until received. @@ -763,7 +741,16 @@ initializr: href: https://spring.io/guides/gs/messaging-rabbitmq/ description: Messaging with RabbitMQ - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#messaging.amqp + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/amqp.html + - name: Spring for RabbitMQ Streams + id: amqp-streams + description: Building stream processing applications with RabbitMQ. + groupId: org.springframework.amqp + artifactId: spring-rabbit-stream + starter: false + links: + - rel: reference + href: https://docs.spring.io/spring-amqp/reference/stream.html - name: Spring for Apache Kafka id: kafka description: Publish, subscribe, store, and process streams of records. @@ -772,7 +759,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#messaging.kafka + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/kafka.html - name: Spring for Apache Kafka Streams id: kafka-streams description: Building stream processing applications with Apache Kafka Streams. @@ -784,10 +771,10 @@ initializr: href: https://github.com/spring-cloud/spring-cloud-stream-samples/tree/master/kafka-streams-samples description: Samples for using Apache Kafka Streams with Spring Cloud stream - rel: reference - href: https://docs.spring.io/spring-kafka/docs/current/reference/html/#streams-kafka-streams + href: https://docs.spring.io/spring-kafka/reference/streams.html description: Apache Kafka Streams Support - rel: reference - href: https://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsingle/#_kafka_streams_binding_capabilities_of_spring_cloud_stream + href: https://docs.spring.io/spring-cloud-stream/reference/kafka/kafka-streams-binder/usage.html description: Apache Kafka Streams Binding Capabilities of Spring Cloud Stream - name: Spring for Apache ActiveMQ 5 id: activemq @@ -797,7 +784,7 @@ initializr: href: https://spring.io/guides/gs/messaging-jms/ description: Java Message Service API via Apache ActiveMQ Classic. - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#messaging.jms.activemq + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/jms.html#messaging.jms.activemq - name: Spring for Apache ActiveMQ Artemis id: artemis description: Spring JMS support with Apache ActiveMQ Artemis. @@ -806,46 +793,35 @@ initializr: href: https://spring.io/guides/gs/messaging-jms/ description: Messaging with JMS - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#messaging.jms.artemis + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/jms.html#messaging.jms.artemis - name: Spring for Apache Pulsar id: pulsar - compatibilityRange: "[3.0.0,3.1.0-M1)" - mappings: - - compatibilityRange: "[3.0.0,3.1.0-M1)" - version: 0.2.0 description: Build messaging applications with Apache Pulsar - groupId: org.springframework.pulsar - artifactId: spring-pulsar-spring-boot-starter links: - rel: reference - href: https://docs.spring.io/spring-pulsar/docs/0.2.x/reference/html/ + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/pulsar.html - name: Spring for Apache Pulsar (Reactive) id: pulsar-reactive - compatibilityRange: "[3.0.0,3.1.0-M1)" - mappings: - - compatibilityRange: "[3.0.0,3.1.0-M1)" - version: 0.2.0 description: Build reactive messaging applications with Apache Pulsar facets: - reactive - groupId: org.springframework.pulsar - artifactId: spring-pulsar-reactive-spring-boot-starter links: - rel: reference - href: https://docs.spring.io/spring-pulsar/docs/0.2.x/reference/html/#reactive-pulsar + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/pulsar.html - name: WebSocket id: websocket description: Build Servlet-based WebSocket applications with SockJS and STOMP. + facets: + - json links: - rel: guide href: https://spring.io/guides/gs/messaging-stomp-websocket/ description: Using WebSocket to build an interactive web application - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#messaging.websockets + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/websockets.html - name: RSocket id: rsocket description: RSocket.io applications with Spring Messaging and Netty. - compatibilityRange: "2.2.0.M2" facets: - reactive links: @@ -853,20 +829,12 @@ initializr: href: https://rsocket.io/ - name: Apache Camel id: camel - compatibilityRange: "[2.0.0.M1,3.1.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" mappings: - - compatibilityRange: "[2.3.0.M1,2.4.0-M1)" - version: 3.5.0 - - compatibilityRange: "[2.4.0.M1,2.5.0-M1)" - version: 3.10.0 - - compatibilityRange: "[2.5.0.M1,2.6.0-M1)" - version: 3.13.0 - - compatibilityRange: "[2.6.0.M1,2.7.0-M1)" - version: 3.17.0 - - compatibilityRange: "[2.7.0.M1,3.0.0-M1)" - version: 3.20.6 - - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 4.0.0-M3 + - compatibilityRange: "[3.3.0,3.4.0-M1)" + version: 4.8.1 + - compatibilityRange: "[3.4.0,3.5.0-M1)" + version: 4.9.0 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. groupId: org.apache.camel.springboot artifactId: camel-spring-boot-starter @@ -877,7 +845,7 @@ initializr: - name: Solace PubSub+ bom: solace-spring-boot id: solace - compatibilityRange: "[2.2.0.RELEASE,3.2.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" description: Connect to a Solace PubSub+ Advanced Event Broker to publish, subscribe, request/reply and store/replay messages groupId: com.solace.spring.boot artifactId: solace-spring-boot-starter @@ -898,28 +866,28 @@ initializr: href: https://spring.io/guides/gs/batch-processing/ description: Creating a Batch Service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto.batch + href: https://docs.spring.io/spring-boot/{bootVersion}/how-to/batch.html - name: Validation id: validation description: Bean Validation with Hibernate validator. links: - - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#io.validation - rel: guide href: https://spring.io/guides/gs/validating-form-input/ + - rel: reference + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/io/validation.html - name: Java Mail Sender id: mail description: Send email using Java Mail and Spring Framework's JavaMailSender. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#io.email + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/io/email.html - name: Quartz Scheduler id: quartz description: Schedule jobs using Quartz. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#io.quartz - - name: Spring cache abstraction + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/io/quartz.html + - name: Spring Cache Abstraction id: cache description: Provides cache-related operations, such as the ability to update the content of the cache, but does not provide the actual data store. links: @@ -927,29 +895,30 @@ initializr: href: https://spring.io/guides/gs/caching/ description: Caching Data with Spring - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#io.caching - - name: Picocli - id: picocli - groupId: info.picocli - artifactId: picocli-spring-boot-starter - compatibilityRange: "[2.5.0.RELEASE,3.1.0-M1)" - description: Build command line applications with picocli. - mappings: - - compatibilityRange: "[2.5.0.RELEASE,3.1.0-M1)" - version: 4.7.0 - links: - - rel: reference - href: https://picocli.info/#_spring_boot_example + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/io/caching.html - name: Spring Shell id: spring-shell groupId: org.springframework.shell artifactId: spring-shell-starter + compatibilityRange: "[3.3.0,3.5.0-M1)" description: Build command line applications with spring. - compatibilityRange: "[2.7.0,3.2.0-M1)" bom: spring-shell links: - rel: reference - href: https://spring.io/projects/spring-shell + href: https://docs.spring.io/spring-shell/reference/index.html + - name: Spring gRPC [Experimental] + id: spring-grpc + groupId: org.springframework.grpc + artifactId: spring-grpc-spring-boot-starter + compatibilityRange: "[3.4.0,3.5.0-M1)" + description: Experimental support for gRPC, a high performance, open source universal RPC framework. + bom: spring-grpc + links: + - rel: reference + href: https://docs.spring.io/spring-grpc/reference/index.html + - rel: sample + href: https://github.com/spring-projects-experimental/spring-grpc/tree/main/samples + description: Various sample apps using Spring gRPC - name: Ops content: - name: Spring Boot Actuator @@ -960,13 +929,22 @@ initializr: href: https://spring.io/guides/gs/actuator-service/ description: Building a RESTful Web Service with Spring Boot Actuator - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#actuator + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/index.html + - name: CycloneDX SBOM support + id: sbom-cyclone-dx + description: Creates a Software Bill of Materials in CycloneDX format. + groupId: org.springframework.boot + artifactId: spring-boot + starter: false + links: + - rel: reference + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/endpoints.html#actuator.endpoints.sbom - name: codecentric's Spring Boot Admin (Client) id: codecentric-spring-boot-admin-client groupId: de.codecentric artifactId: spring-boot-admin-starter-client description: Required for your application to register with a Codecentric's Spring Boot Admin Server instance. - compatibilityRange: "[2.0.0.RELEASE,3.1.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference @@ -976,11 +954,24 @@ initializr: groupId: de.codecentric artifactId: spring-boot-admin-starter-server description: A community project to manage and monitor your Spring Boot applications. Provides a UI on top of the Spring Boot Actuator endpoints. - compatibilityRange: "[2.0.0.RELEASE,3.1.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference href: https://codecentric.github.io/spring-boot-admin/current/#getting-started + - name: Sentry + id: sentry + bom: sentry + description: Application performance monitoring and error tracking that help software teams see clearer, solve quicker, and learn continuously. + compatibilityRange: "[3.3.0,3.5.0-M1)" + groupId: io.sentry + artifactId: sentry-spring-boot-starter-jakarta + links: + - rel: guide + href: https://docs.sentry.io/platforms/java/guides/spring-boot/ + description: Getting Started with Sentry + - rel: reference + href: https://docs.sentry.io/platforms/java/ - name: Observability content: - name: Datadog @@ -992,7 +983,7 @@ initializr: description: Publish Micrometer metrics to Datadog, a dimensional time-series SaaS with built-in dashboarding and alerting. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#actuator.metrics.export.datadog + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.datadog - name: Dynatrace id: dynatrace groupId: io.micrometer @@ -1002,7 +993,7 @@ initializr: description: Publish Micrometer metrics to Dynatrace, a platform featuring observability, AIOps, application security and analytics. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics.export.dynatrace + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.dynatrace - name: Influx id: influx groupId: io.micrometer @@ -1012,7 +1003,7 @@ initializr: description: Publish Micrometer metrics to InfluxDB, a dimensional time-series server that support real-time stream processing of data. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#actuator.metrics.export.influx + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.influx - name: Graphite id: graphite groupId: io.micrometer @@ -1022,7 +1013,7 @@ initializr: description: Publish Micrometer metrics to Graphite, a hierarchical metrics system backed by a fixed-size database. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#actuator.metrics.export.graphite + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.graphite - name: New Relic id: new-relic groupId: io.micrometer @@ -1032,7 +1023,17 @@ initializr: description: Publish Micrometer metrics to New Relic, a SaaS offering with a full UI and a query language called NRQL. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#actuator.metrics.export.newrelic + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.newrelic + - name: OTLP for metrics + id: otlp-metrics + groupId: io.micrometer + artifactId: micrometer-registry-otlp + scope: runtime + starter: false + description: Publish Micrometer metrics to an OpenTelemetry Protocol (OTLP) capable backend. + links: + - rel: reference + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.otlp - name: Prometheus id: prometheus groupId: io.micrometer @@ -1042,43 +1043,25 @@ initializr: description: Expose Micrometer metrics in Prometheus format, an in-memory dimensional time series database with a simple built-in UI, a custom query language, and math operations. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#actuator.metrics.export.prometheus + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.prometheus - name: Distributed Tracing id: distributed-tracing description: Enable span and trace IDs in logs. groupId: io.micrometer artifactId: micrometer-tracing-bridge-brave starter: false - mappings: - - compatibility-range: "[2.3.0.M1,3.0.0-M1)" - groupId: org.springframework.cloud - artifactId: spring-cloud-starter-sleuth - bom: spring-cloud - starter: true - name: Wavefront id: wavefront description: Publish metrics and optionally distributed traces to Tanzu Observability by Wavefront, a SaaS-based metrics monitoring and analytics platform that lets you visualize, query, and alert over data from across your entire stack. groupId: io.micrometer artifactId: micrometer-registry-wavefront - scope: runtime starter: false - mappings: - - compatibility-range: "[2.3.0.M1,3.1.0-M1)" - groupId: com.wavefront - artifactId: wavefront-spring-boot-starter - bom: wavefront - starter: true - name: Zipkin id: zipkin description: Enable and expose span and trace IDs to Zipkin. groupId: io.zipkin.reporter2 artifactId: zipkin-reporter-brave starter: false - mappings: - - compatibilityRange: "[2.0.0.RELEASE,3.0.0-M1)" - groupId: org.springframework.cloud - artifactId: spring-cloud-sleuth-zipkin - bom: spring-cloud - name: Testing content: - name: Spring REST Docs @@ -1090,7 +1073,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-restdocs/docs/current/reference/html5/ + href: https://docs.spring.io/spring-restdocs/docs/current/reference/htmlsingle/ - name: Testcontainers id: testcontainers description: Provide lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container. @@ -1098,14 +1081,12 @@ initializr: artifactId: junit-jupiter scope: test starter: false - mappings: - - compatibility-range: "[2.3.0.M1,3.1.0-M2)" - bom: testcontainers links: - rel: reference - href: https://www.testcontainers.org/ + href: https://java.testcontainers.org/ - name: Contract Verifier bom: spring-cloud + compatibilityRange: "[3.3.0,3.6.0-M1)" id: cloud-contract-verifier description: Moves TDD to the level of software architecture by enabling Consumer Driven Contract (CDC) development. groupId: org.springframework.cloud @@ -1113,9 +1094,10 @@ initializr: scope: test links: - rel: reference - href: https://cloud.spring.io/spring-cloud-contract/reference/htmlsingle/ + href: https://docs.spring.io/spring-cloud-contract/reference/ - name: Contract Stub Runner bom: spring-cloud + compatibilityRange: "[3.3.0,3.6.0-M1)" id: cloud-contract-stub-runner description: Stub Runner for HTTP/Messaging based communication. Allows creating WireMock stubs from RestDocs tests. groupId: org.springframework.cloud @@ -1123,7 +1105,7 @@ initializr: scope: test links: - rel: reference - href: https://cloud.spring.io/spring-cloud-contract/reference/htmlsingle/#features-stub-runner + href: https://docs.spring.io/spring-cloud-contract/reference/project-features-stubrunner.html - name: Embedded LDAP Server id: unboundid-ldap description: Provides a platform neutral way for running a LDAP server in unit tests. @@ -1133,20 +1115,10 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.ldap.embedded - - name: Embedded MongoDB Database - id: flapdoodle-mongo - compatibilityRange: "[2.0.0.RELEASE,3.0.0-M1)" - description: Provides a platform neutral way for running MongoDB in unit tests. - groupId: de.flapdoodle.embed - artifactId: de.flapdoodle.embed.mongo - scope: test - starter: false - links: - - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.mongodb.embedded + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.ldap.embedded - name: Spring Cloud bom: spring-cloud + compatibilityRange: "[3.3.0,3.6.0-M1)" content: - name: Cloud Bootstrap id: cloud-starter @@ -1155,7 +1127,7 @@ initializr: artifactId: spring-cloud-starter links: - rel: reference - href: https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/ + href: https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/application-context-services.html - name: Function id: cloud-function groupId: org.springframework.cloud @@ -1164,7 +1136,7 @@ initializr: description: Promotes the implementation of business logic via functions and supports a uniform programming model across serverless providers, as well as the ability to run standalone (locally or in a PaaS). links: - rel: reference - href: https://docs.spring.io/spring-cloud-function/docs/current/reference/html/spring-cloud-function.html + href: https://docs.spring.io/spring-cloud-function/reference/ - rel: sample href: https://github.com/spring-cloud/spring-cloud-function/tree/main/spring-cloud-function-samples description: Various sample apps using Spring Cloud Function @@ -1175,32 +1147,10 @@ initializr: artifactId: spring-cloud-starter-task links: - rel: reference - href: https://docs.spring.io/spring-cloud-task/docs/current/reference/html/ - - name: Spring Cloud Tools - content: - - name: Open Service Broker - id: open-service-broker - compatibilityRange: "[2.0.0.RELEASE,2.7.0-M1)" - description: Framework for building Spring Boot apps that implement the Open Service Broker API, which can deliver services to applications running within cloud native platforms such as Cloud Foundry, Kubernetes and OpenShift. - groupId: org.springframework.cloud - artifactId: spring-cloud-starter-open-service-broker - mappings: - - compatibilityRange: "[2.3.0.M1,2.4.0-M1)" - version: 3.2.0 - - compatibilityRange: "[2.4.0-M1,2.5.0-M1)" - version: 3.3.1 - - compatibilityRange: "[2.5.0-M1,2.6.0-M1)" - version: 3.4.1 - - compatibilityRange: "[2.6.0-M1,2.7.0-M1)" - version: 3.5.0 - links: - - rel: reference - href: https://docs.spring.io/spring-cloud-open-service-broker/docs/current/reference/ - - rel: guide - href: https://github.com/spring-cloud-samples/bookstore-service-broker - description: Using Spring Cloud Open Service Broker + href: https://docs.spring.io/spring-cloud-task/reference/ - name: Spring Cloud Config bom: spring-cloud + compatibilityRange: "[3.3.0,3.6.0-M1)" content: - name: Config Client id: cloud-config-client @@ -1209,19 +1159,18 @@ initializr: artifactId: spring-cloud-starter-config links: - rel: reference - href: https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#_client_side_usage - description: Config Client Quick Start + href: https://docs.spring.io/spring-cloud-config/reference/client.html - name: Config Server id: cloud-config-server description: Central management for configuration via Git, SVN, or HashiCorp Vault. groupId: org.springframework.cloud artifactId: spring-cloud-config-server links: - - rel: reference - href: https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#_spring_cloud_config_server - rel: guide href: https://spring.io/guides/gs/centralized-configuration/ description: Centralized Configuration + - rel: reference + href: https://docs.spring.io/spring-cloud-config/reference/server.html - name: Vault Configuration id: cloud-starter-vault-config description: Provides client-side support for externalized configuration in a distributed system. Using HashiCorp's Vault you have a central place to manage external secret properties for applications across all environments. @@ -1229,8 +1178,7 @@ initializr: artifactId: spring-cloud-starter-vault-config links: - rel: reference - href: https://docs.spring.io/spring-cloud-vault/docs/current/reference/html/#client-side-usage - description: Vault Client Quick Start + href: https://docs.spring.io/spring-cloud-vault/reference/ - name: Apache Zookeeper Configuration id: cloud-starter-zookeeper-config description: Enable and configure common patterns inside your application and build large distributed systems with Apache Zookeeper based components. The provided patterns include Service Discovery and Configuration. @@ -1238,8 +1186,7 @@ initializr: artifactId: spring-cloud-starter-zookeeper-config links: - rel: reference - href: https://docs.spring.io/spring-cloud-zookeeper/docs/current/reference/html/#distributed-configuration-usage - description: Apache Zookeeper Quick Start + href: https://docs.spring.io/spring-cloud-zookeeper/reference/config.html - name: Consul Configuration id: cloud-starter-consul-config description: Enable and configure the common patterns inside your application and build large distributed systems with Hashicorp’s Consul. The patterns provided include Service Discovery, Distributed Configuration and Control Bus. @@ -1247,10 +1194,10 @@ initializr: artifactId: spring-cloud-starter-consul-config links: - rel: reference - href: https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/#distributed-configuration-usage - description: Spring Cloud Consul Quick Start + href: https://docs.spring.io/spring-cloud-consul/reference/ - name: Spring Cloud Discovery bom: spring-cloud + compatibilityRange: "[3.3.0,3.6.0-M1)" content: - name: Eureka Discovery Client id: cloud-eureka @@ -1262,7 +1209,7 @@ initializr: href: https://spring.io/guides/gs/service-registration-and-discovery/ description: Service Registration and Discovery with Eureka and Spring Cloud - rel: reference - href: https://docs.spring.io/spring-cloud-netflix/docs/current/reference/html/#service-discovery-eureka-clients + href: https://docs.spring.io/spring-cloud-netflix/reference/spring-cloud-netflix.html#_service_discovery_eureka_clients - name: Eureka Server id: cloud-eureka-server description: spring-cloud-netflix Eureka Server. @@ -1273,7 +1220,7 @@ initializr: href: https://spring.io/guides/gs/service-registration-and-discovery/ description: Service Registration and Discovery with Eureka and Spring Cloud - rel: reference - href: https://docs.spring.io/spring-cloud-netflix/docs/current/reference/html/#spring-cloud-eureka-server + href: https://docs.spring.io/spring-cloud-netflix/reference/spring-cloud-netflix.html#spring-cloud-eureka-server - name: Apache Zookeeper Discovery id: cloud-starter-zookeeper-discovery description: Service discovery with Apache Zookeeper. @@ -1281,16 +1228,7 @@ initializr: artifactId: spring-cloud-starter-zookeeper-discovery links: - rel: reference - href: https://docs.spring.io/spring-cloud-zookeeper/docs/current/reference/html/#spring-cloud-zookeeper-discovery - - name: Cloud Foundry Discovery - id: cloud-cloudfoundry-discovery - compatibilityRange: "[2.3.0.M1,3.0.0-M1)" - description: Service discovery with Cloud Foundry. - groupId: org.springframework.cloud - artifactId: spring-cloud-cloudfoundry-discovery - links: - - rel: reference - href: https://docs.spring.io/spring-cloud-cloudfoundry/docs/current/reference/html/ + href: https://docs.spring.io/spring-cloud-zookeeper/reference/discovery.html - name: Consul Discovery id: cloud-starter-consul-discovery description: Service discovery with Hashicorp Consul. @@ -1298,18 +1236,39 @@ initializr: artifactId: spring-cloud-starter-consul-discovery links: - rel: reference - href: https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/#spring-cloud-consul-discovery + href: https://docs.spring.io/spring-cloud-consul/reference/discovery.html - name: Spring Cloud Routing bom: spring-cloud + compatibilityRange: "[3.3.0,3.6.0-M1)" content: - name: Gateway id: cloud-gateway - groupId: org.springframework.cloud - artifactId: spring-cloud-starter-gateway - description: Provides a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as security, monitoring/metrics, and resiliency. + mappings: + - compatibility-range: "[3.3.0,3.5.0-M1)" + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-gateway-mvc + - compatibility-range: "[3.5.0-M1,3.6.0-M1)" + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-gateway-server-webmvc + description: Provides a simple, yet effective way to route to APIs in Servlet-based applications. Provides cross-cutting concerns to those APIs such as security, monitoring/metrics, and resiliency. + links: + - rel: reference + href: https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway-server-mvc.html + - name: Reactive Gateway + id: cloud-gateway-reactive + mappings: + - compatibility-range: "[3.3.0,3.5.0-M1)" + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-gateway + - compatibility-range: "[3.5.0-M1,3.6.0-M1)" + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-gateway-server-webflux + description: Provides a simple, yet effective way to route to APIs in reactive applications. Provides cross-cutting concerns to those APIs such as security, monitoring/metrics, and resiliency. + facets: + - reactive links: - rel: reference - href: https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/ + href: https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway.html - rel: guide href: https://github.com/spring-cloud-samples/spring-cloud-gateway-sample description: Using Spring Cloud Gateway @@ -1323,7 +1282,7 @@ initializr: href: https://github.com/spring-cloud-samples/feign-eureka description: Declarative REST calls with Spring Cloud OpenFeign sample - rel: reference - href: https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/ + href: https://docs.spring.io/spring-cloud-openfeign/reference/ - name: Cloud LoadBalancer id: cloud-loadbalancer description: Client-side load-balancing with Spring Cloud LoadBalancer. @@ -1334,9 +1293,10 @@ initializr: href: https://spring.io/guides/gs/spring-cloud-loadbalancer/ description: Client-side load-balancing with Spring Cloud LoadBalancer - rel: reference - href: https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer + href: https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html - name: Spring Cloud Circuit Breaker bom: spring-cloud + compatibilityRange: "[3.3.0,3.6.0-M1)" content: - name: Resilience4J id: cloud-resilience4j @@ -1345,9 +1305,10 @@ initializr: artifactId: spring-cloud-starter-circuitbreaker-resilience4j links: - rel: reference - href: https://docs.spring.io/spring-cloud-circuitbreaker/docs/current/reference/html/#configuring-resilience4j-circuit-breakers + href: https://docs.spring.io/spring-cloud-circuitbreaker/reference/spring-cloud-circuitbreaker-resilience4j.html - name: Spring Cloud Messaging bom: spring-cloud + compatibilityRange: "[3.3.0,3.6.0-M1)" content: - name: Cloud Bus id: cloud-bus @@ -1356,7 +1317,7 @@ initializr: artifactId: spring-cloud-bus links: - rel: reference - href: https://docs.spring.io/spring-cloud-bus/docs/current/reference/html/ + href: https://docs.spring.io/spring-cloud-bus/reference/ - name: Cloud Stream id: cloud-stream description: Framework for building highly scalable event-driven microservices connected with shared messaging systems (requires a binder, e.g. Apache Kafka, Apache Pulsar, RabbitMQ, or Solace PubSub+). @@ -1364,10 +1325,10 @@ initializr: artifactId: spring-cloud-stream links: - rel: reference - href: https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html#spring-cloud-stream-overview-introducing + href: https://docs.spring.io/spring-cloud-stream/reference/ - name: VMware Tanzu Application Service bom: spring-cloud-services - compatibilityRange: "[2.0.0.RELEASE,3.0.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" content: - name: Config Client (TAS) id: scs-config-client @@ -1377,9 +1338,6 @@ initializr: links: - rel: reference href: https://docs.vmware.com/en/Spring-Cloud-Services-for-VMware-Tanzu/index.html - mappings: - - compatibilityRange: "[2.0.0.RELEASE,2.4.0-M1)" - starter: false - name: Service Registry (TAS) id: scs-service-registry description: Eureka service discovery client on VMware Tanzu Application Service. @@ -1390,7 +1348,7 @@ initializr: href: https://docs.vmware.com/en/Spring-Cloud-Services-for-VMware-Tanzu/index.html - name: Microsoft Azure bom: spring-cloud-azure - compatibilityRange: "[2.5.0-M1,3.1.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" content: - name: Azure Support id: azure-support @@ -1423,7 +1381,6 @@ initializr: description: Azure Active Directory Sample - name: Azure Cosmos DB id: azure-cosmos-db - compatibilityRange: "[2.5.0-M1,3.0.0-M1)" groupId: com.azure.spring artifactId: spring-cloud-azure-starter-data-cosmos description: Fully managed NoSQL database service for modern app development, including Spring Data support. @@ -1467,13 +1424,13 @@ initializr: - rel: sample href: https://aka.ms/spring/samples/latest/storage description: Azure Storage Sample - - name: Google Cloud Platform + - name: Google Cloud bom: spring-cloud-gcp - compatibilityRange: "[2.4.0-M1,3.2.0-M1)" + compatibilityRange: "[3.3.0,3.4.0-M1)" content: - - name: GCP Support + - name: Google Cloud Support id: cloud-gcp - description: Contains auto-configuration support for every Spring Cloud GCP integration. Most of the auto-configuration code is only enabled if other dependencies are added to the classpath. + description: Contains auto-configuration support for every Google Cloud integration. Most of the auto-configuration code is only enabled if other dependencies are added to the classpath. groupId: com.google.cloud artifactId: spring-cloud-gcp-starter links: @@ -1481,10 +1438,10 @@ initializr: href: https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/index.html - rel: guide href: https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples - description: GCP Samples - - name: GCP Messaging + description: Google Cloud Samples + - name: Google Cloud Messaging id: cloud-gcp-pubsub - description: Adds the GCP Support entry and all the required dependencies so that the Google Cloud Pub/Sub integration work out of the box. + description: Adds the Google Cloud Support entry and all the required dependencies so that the Google Cloud Pub/Sub integration work out of the box. groupId: com.google.cloud artifactId: spring-cloud-gcp-starter-pubsub links: @@ -1492,10 +1449,10 @@ initializr: href: https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/index.html#cloud-pubsub - rel: guide href: https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples/spring-cloud-gcp-pubsub-sample - description: GCP Pub/Sub Sample - - name: GCP Storage + description: Google Cloud Pub/Sub Sample + - name: Google Cloud Storage id: cloud-gcp-storage - description: Adds the GCP Support entry and all the required dependencies so that the Google Cloud Storage integration work out of the box. + description: Adds the Google Cloud Support entry and all the required dependencies so that the Google Cloud Storage integration work out of the box. groupId: com.google.cloud artifactId: spring-cloud-gcp-starter-storage links: @@ -1503,6 +1460,346 @@ initializr: href: https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/index.html#cloud-storage - rel: guide href: https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples/spring-cloud-gcp-storage-resource-sample + - name: AI + compatibilityRange: "[3.3.0,3.5.0-M1)" + content: + - name: Anthropic Claude + id: spring-ai-anthropic + group-id: org.springframework.ai + artifact-id: spring-ai-anthropic-spring-boot-starter + description: Spring AI support for Anthropic Claude AI models. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/chat/anthropic-chat.html + - name: Azure OpenAI + id: spring-ai-azure-openai + group-id: org.springframework.ai + artifact-id: spring-ai-azure-openai-spring-boot-starter + description: Spring AI support for Azure’s OpenAI offering, powered by ChatGPT. It extends beyond traditional OpenAI capabilities, delivering AI-driven text generation with enhanced functionality. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/chat/azure-openai-chat.html + - name: Azure AI Search + id: spring-ai-vectordb-azure + group-id: org.springframework.ai + artifact-id: spring-ai-azure-store-spring-boot-starter + description: Spring AI vector database support for Azure AI Search. It is an AI-powered information retrieval platform and part of Microsoft’s larger AI platform. Among other features, it allows users to query information using vector-based storage and retrieval. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/azure.html + - name: Amazon Bedrock + id: spring-ai-bedrock + group-id: org.springframework.ai + artifact-id: spring-ai-bedrock-ai-spring-boot-starter + description: Spring AI support for Amazon Bedrock. It is a managed service that provides foundation models from various AI providers, available through a unified API. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/bedrock-chat.html + - name: Amazon Bedrock Converse + id: spring-ai-bedrock-converse + group-id: org.springframework.ai + artifact-id: spring-ai-bedrock-converse-spring-boot-starter + description: Spring AI support for Amazon Bedrock Converse. It provides a unified interface for conversational AI models with enhanced capabilities including function/tool calling, multimodal inputs, and streaming responses. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/bedrock-converse.html + - name: Apache Cassandra Vector Database + id: spring-ai-vectordb-cassandra + group-id: org.springframework.ai + artifact-id: spring-ai-cassandra-store-spring-boot-starter + description: Spring AI vector database support for Apache Cassandra. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/apache-cassandra.html + - name: Chroma Vector Database + id: spring-ai-vectordb-chroma + group-id: org.springframework.ai + artifact-id: spring-ai-chroma-store-spring-boot-starter + description: Spring AI vector database support for Chroma. It is an open-source embedding database and gives you the tools to store document embeddings, content, and metadata. It also allows to search through those embeddings, including metadata filtering. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/chroma.html + - name: Elasticsearch Vector Database + id: spring-ai-vectordb-elasticsearch + group-id: org.springframework.ai + artifact-id: spring-ai-elasticsearch-store-spring-boot-starter + description: Spring AI vector database support for Elasticsearch. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/elasticsearch.html + - name: Milvus Vector Database + id: spring-ai-vectordb-milvus + group-id: org.springframework.ai + artifact-id: spring-ai-milvus-store-spring-boot-starter + description: Spring AI vector database support for Milvus. It is an open-source vector database that has garnered significant attention in the fields of data science and machine learning. One of its standout features lies in its robust support for vector indexing and querying. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/milvus.html + - name: Mistral AI + id: spring-ai-mistral + group-id: org.springframework.ai + artifact-id: spring-ai-mistral-ai-spring-boot-starter + description: Spring AI support for Mistral AI, the open and portable generative AI for devs and businesses. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/chat/mistralai-chat.html + - name: MongoDB Atlas Vector Database + id: spring-ai-vectordb-mongodb-atlas + group-id: org.springframework.ai + artifact-id: spring-ai-mongodb-atlas-store-spring-boot-starter + description: Spring AI vector database support for MongoDB Atlas. Is is a fully managed cloud database service that provides an easy way to deploy, operate, and scale a MongoDB database in the cloud. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/mongodb.html + - name: Neo4j Vector Database + id: spring-ai-vectordb-neo4j + group-id: org.springframework.ai + artifact-id: spring-ai-neo4j-store-spring-boot-starter + description: Spring AI vector database support for Neo4j's Vector Search. It allows users to query vector embeddings from large datasets. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/neo4j.html + - name: Ollama + id: spring-ai-ollama + group-id: org.springframework.ai + artifact-id: spring-ai-ollama-spring-boot-starter + description: Spring AI support for Ollama. It allows you to run various Large Language Models (LLMs) locally and generate text from them. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/chat/ollama-chat.html + - name: OpenAI + id: spring-ai-openai + group-id: org.springframework.ai + artifact-id: spring-ai-openai-spring-boot-starter + description: Spring AI support for ChatGPT, the AI language model and DALL-E, the Image generation model from OpenAI. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/chat/openai-chat.html + - name: Oracle Vector Database + id: spring-ai-vectordb-oracle + group-id: org.springframework.ai + artifact-id: spring-ai-oracle-store-spring-boot-starter + description: Spring AI vector database support for Oracle. Enables storing, indexing and searching vector embeddings in Oracle Database 23ai. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/oracle.html + - name: PGvector Vector Database + id: spring-ai-vectordb-pgvector + group-id: org.springframework.ai + artifact-id: spring-ai-pgvector-store-spring-boot-starter + description: Spring AI vector database support for PGvector. It is an open-source extension for PostgreSQL that enables storing and searching over machine learning-generated embeddings. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/pgvector.html + - name: Pinecone Vector Database + id: spring-ai-vectordb-pinecone + group-id: org.springframework.ai + artifact-id: spring-ai-pinecone-store-spring-boot-starter + description: Spring AI vector database support for Pinecone. It is a popular cloud-based vector database and allows you to store and search vectors efficiently. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/pinecone.html + - name: PostgresML + id: spring-ai-postgresml + group-id: org.springframework.ai + artifact-id: spring-ai-postgresml-spring-boot-starter + description: Spring AI support for the PostgresML text embeddings models. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/embeddings/postgresml-embeddings.html + - name: Redis Search and Query Vector Database + id: spring-ai-vectordb-redis + group-id: org.springframework.ai + artifact-id: spring-ai-redis-store-spring-boot-starter + description: Spring AI vector database support for Redis Search and Query. It extends the core features of Redis OSS and allows you to use Redis as a vector database. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/redis.html + - name: MariaDB Vector Database + id: spring-ai-vectordb-mariadb + group-id: org.springframework.ai + artifact-id: spring-ai-mariadb-store-spring-boot-starter + description: Spring AI support for MariaDB. MariaDB Vector Store support is part of MariaDB 11.7. It provides efficient vector similarity search capabilities using vector indexes, supporting both cosine similarity and Euclidean distance metrics. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/mariadb.html + - name: Oracle Coherence Vector Database + id: spring-ai-vectordb-coherence + group-id: org.springframework.ai + artifact-id: spring-ai-coherence-store-spring-boot-starter + description: Spring AI support for Oracle Coherence. Oracle Coherence Vector Store is a key-value store with optional persistence, offering fault-tolerant automatic sharding, polyglot and REST interfaces, querying, transactions, eventing, and in-place processing, as well as change data capture, multi-site federation, messaging, and integrations with popular frameworks. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs.html + - name: Azure Cosmos DB Vector Store + id: spring-ai-vectordb-azurecosmosdb + group-id: org.springframework.ai + artifact-id: spring-ai-azure-cosmos-db-store-spring-boot-starter + description: Spring AI support for Azure Cosmos DB. Azure Cosmos DB is Microsoft’s globally distributed cloud-native database service designed for mission-critical applications. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/azure-cosmos-db.html + - name: Stability AI + id: spring-ai-stabilityai + group-id: org.springframework.ai + artifact-id: spring-ai-stability-ai-spring-boot-starter + description: Spring AI support for Stability AI's text to image generation model. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/image/stabilityai-image.html + - name: Transformers (ONNX) Embeddings + id: spring-ai-transformers + group-id: org.springframework.ai + artifact-id: spring-ai-transformers-spring-boot-starter + description: Spring AI support for pre-trained transformer models, serialized into the Open Neural Network Exchange (ONNX) format. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/embeddings/onnx.html + - name: Vertex AI Gemini + id: spring-ai-vertexai-gemini + group-id: org.springframework.ai + artifact-id: spring-ai-vertex-ai-gemini-spring-boot-starter + description: Spring AI support for Google Vertex Gemini chat. Doesn't support embeddings. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/chat/vertexai-gemini-chat.html + - name: Vertex AI Embeddings + id: spring-ai-vertexai-embeddings + group-id: org.springframework.ai + artifact-id: spring-ai-vertex-ai-embedding-spring-boot-starter + description: Spring AI support for Google Vertex text and multimodal embedding models. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/embeddings/vertexai-embeddings-text.html + description: Text embedding reference + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/embeddings/vertexai-embeddings-multimodal.html + description: Multimodal embedding reference + - name: Qdrant Vector Database + id: spring-ai-vectordb-qdrant + group-id: org.springframework.ai + artifact-id: spring-ai-qdrant-store-spring-boot-starter + description: Spring AI vector database support for Qdrant. It is an open-source, high-performance vector search engine/database. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/qdrant.html + - name: Typesense Vector Database + id: spring-ai-vectordb-typesense + group-id: org.springframework.ai + artifact-id: spring-ai-typesense-store-spring-boot-starter + description: Spring AI vector database support for Typesense. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/typesense.html + - name: Weaviate Vector Database + id: spring-ai-vectordb-weaviate + group-id: org.springframework.ai + artifact-id: spring-ai-weaviate-store-spring-boot-starter + description: Spring AI vector database support for Weaviate, an open-source vector database. It allows you to store data objects and vector embeddings from your favorite ML-models and scale seamlessly into billions of data objects. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/weaviate.html + - name: Markdown Document Reader + id: spring-ai-markdown-document-reader + group-id: org.springframework.ai + artifact-id: spring-ai-markdown-document-reader + description: Spring AI Markdown document reader. It allows to load Markdown documents, converting them into a list of Spring AI Document objects. + bom: spring-ai + starter: false + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html#_markdown + - name: Tika Document Reader + id: spring-ai-tika-document-reader + group-id: org.springframework.ai + artifact-id: spring-ai-tika-document-reader + description: Spring AI Tika document reader. It uses Apache Tika to extract text from a variety of document formats, such as PDF, DOC/DOCX, PPT/PPTX, and HTML. The documents are converted into a list of Spring AI Document objects. + bom: spring-ai + starter: false + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html#_tika_docx_pptx_html + - name: PDF Document Reader + id: spring-ai-pdf-document-reader + group-id: org.springframework.ai + artifact-id: spring-ai-pdf-document-reader + description: Spring AI PDF document reader. It uses Apache PdfBox to extract text from PDF documents and converting them into a list of Spring AI Document objects. + bom: spring-ai + starter: false + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html#_pdf_page + - name: Timefold Solver + id: timefold-solver + compatibilityRange: "[3.3.0,3.4.0-M1)" + groupId: ai.timefold.solver + artifactId: timefold-solver-spring-boot-starter + description: AI solver to optimize operations and scheduling. + bom: timefold-solver + links: + - rel: reference + href: https://timefold.ai/docs/timefold-solver/latest/quickstart/spring-boot/spring-boot-quickstart#springBootJavaQuickStart + - rel: sample + href: https://github.com/TimefoldAI/timefold-quickstarts/tree/stable/java/spring-boot-integration + description: Timetabling sample. Assign lessons to timeslots and rooms to produce a better schedule for teachers and students types: - name: Gradle - Groovy id: gradle-project @@ -1554,15 +1851,12 @@ initializr: id: war default: false javaVersions: - - id: 20 + - id: 23 + default: false + - id: 21 default: false - id: 17 default: true - - id: 11 - default: false - - id: 1.8 - name: 8 - default: false languages: - name: Java id: java @@ -1574,18 +1868,12 @@ initializr: id: groovy default: false bootVersions: - - name : 3.0.3 (SNAPSHOT) - id: 3.0.3-SNAPSHOT + - name: 3.4.0 (SNAPSHOT) + id: 3.4.0-SNAPSHOT default: false - - name : 3.0.2 - id: 3.0.2 + - name: 3.3.0 + id: 3.3.0 default: true - - name : 2.7.9 (SNAPSHOT) - id: 2.7.9-SNAPSHOT - default: false - - name : 2.7.8 - id: 2.7.8 - default: false --- diff --git a/start-site/src/main/resources/templates/dgscodegen.mustache b/start-site/src/main/resources/templates/dgscodegen.mustache new file mode 100644 index 0000000000..c8bb3adcd1 --- /dev/null +++ b/start-site/src/main/resources/templates/dgscodegen.mustache @@ -0,0 +1,9 @@ +## GraphQL code generation with DGS + +This project has been configured to use the Netflix DGS Codegen plugin. +This plugin can be used to generate client files for accessing remote GraphQL services. +The default setup assumes that the GraphQL schema file for the remote service is added to the `src/main/resources/graphql-client/` location. + +You can learn more about the [plugin configuration options]({{dsgCodegenOptionsLink}}) and +[how to use the generated types](https://netflix.github.io/dgs/generating-code-from-schema/) to adapt the default setup. + diff --git a/start-site/src/main/resources/templates/graalvm.mustache b/start-site/src/main/resources/templates/graalvm.mustache index 9bda7dfc54..ff92955d5b 100644 --- a/start-site/src/main/resources/templates/graalvm.mustache +++ b/start-site/src/main/resources/templates/graalvm.mustache @@ -44,3 +44,12 @@ To run your existing tests in a native image, run the following goal: ``` $ {{testsExecutionCommand}} ``` + +{{#gradleBuild}} +### Gradle Toolchain support + +There are some limitations regarding Native Build Tools and Gradle toolchains. +Native Build Tools disable toolchain support by default. +Effectively, native image compilation is done with the JDK used to execute Gradle. +You can read more about [toolchain support in the Native Build Tools here](https://graalvm.github.io/native-build-tools/latest/gradle-plugin.html#configuration-toolchains). +{{/gradleBuild}} diff --git a/start-site/src/main/resources/templates/jte.mustache b/start-site/src/main/resources/templates/jte.mustache new file mode 100644 index 0000000000..a140ccc64d --- /dev/null +++ b/start-site/src/main/resources/templates/jte.mustache @@ -0,0 +1,19 @@ +## JTE + +This project has been configured to use [JTE precompiled templates](https://jte.gg/pre-compiling/). + +However, to ease development, those are not enabled out of the box. +For production deployments, you should remove + +```properties +gg.jte.development-mode=true +``` + +from the `application.properties` file and set + +```properties +gg.jte.use-precompiled-templates=true +``` + +instead. +For more details, please take a look at [the official documentation](https://jte.gg/spring-boot-starter-3/). diff --git a/start-site/src/main/resources/templates/spring-cloud-function-build-setup-azure.mustache b/start-site/src/main/resources/templates/spring-cloud-function-build-setup-azure.mustache index e76c3eb4d1..f03b507d57 100644 --- a/start-site/src/main/resources/templates/spring-cloud-function-build-setup-azure.mustache +++ b/start-site/src/main/resources/templates/spring-cloud-function-build-setup-azure.mustache @@ -3,6 +3,5 @@ In order to run Spring Cloud Function applications on Microsoft Azure, you can leverage Spring Cloud Function Microsoft Azure adapter and {{buildTool}} plugins offered by {{platform}}. -Check the documentation for detailed information on [using the Azure adapter](https://docs.spring.io/spring-cloud-function/docs/{{version}}/reference/html/azure.html) and [setting -up the {{buildTool}} build, along with a full build setup sample](https://docs.spring.io/spring-cloud-function/docs/{{version}}/reference/html/azure.html#_build_file_setup). - +Check the documentation for detailed information on [using the Azure adapter](https://docs.spring.io/spring-cloud-function/reference/{{version}}/adapters/azure-intro.html) and [setting +up the {{buildTool}} build, along with a full build setup sample](https://docs.spring.io/spring-cloud-function/reference/{{version}}/adapters/azure-intro.html#azure.configuration). diff --git a/start-site/src/main/resources/templates/spring-native-0.9.x.mustache b/start-site/src/main/resources/templates/spring-native-0.9.x.mustache deleted file mode 100644 index cbc1a8759f..0000000000 --- a/start-site/src/main/resources/templates/spring-native-0.9.x.mustache +++ /dev/null @@ -1,16 +0,0 @@ -## Spring Native - -This project has been configured to let you generate a lightweight container running a native executable. -Docker should be installed and configured on your machine prior to creating the image, see [the Getting Started section of the reference guide](https://docs.spring.io/spring-native/docs/{{version}}/reference/htmlsingle/#getting-started-buildpacks). - -To create the image, run the following goal: - -``` -$ {{cnbBuildImageCommand}} -``` - -Then, you can run the app like any other container: - -``` -$ {{cnbRunImageCommand}} -``` \ No newline at end of file diff --git a/start-site/src/main/resources/templates/spring-native.mustache b/start-site/src/main/resources/templates/spring-native.mustache deleted file mode 100644 index c593ab312a..0000000000 --- a/start-site/src/main/resources/templates/spring-native.mustache +++ /dev/null @@ -1,34 +0,0 @@ -## Spring Native - -This project has been configured to let you generate either a lightweight container or a native executable. - -### Lightweight Container with Cloud Native Buildpacks -If you're already familiar with Spring Boot container images support, this is the easiest way to get started with Spring Native. -Docker should be installed and configured on your machine prior to creating the image, see [the Getting Started section of the reference guide](https://docs.spring.io/spring-native/docs/{{version}}/reference/htmlsingle/#getting-started-buildpacks). - -To create the image, run the following goal: - -``` -$ {{cnbBuildImageCommand}} -``` - -Then, you can run the app like any other container: - -``` -$ {{cnbRunImageCommand}} -``` - -### Executable with Native Build Tools -Use this option if you want to explore more options such as running your tests in a native image. -The GraalVM native-image compiler should be installed and configured on your machine, see [the Getting Started section of the reference guide](https://docs.spring.io/spring-native/docs/{{version}}/reference/htmlsingle/#getting-started-native-build-tools). - -To create the executable, run the following goal: - -``` -$ {{nbtBuildImageCommand}} -``` - -Then, you can run the app as follows: -``` -$ {{nbtRunImageCommand}} -``` \ No newline at end of file diff --git a/start-site/src/main/resources/templates/testcontainers.mustache b/start-site/src/main/resources/templates/testcontainers.mustache new file mode 100644 index 0000000000..667388cda5 --- /dev/null +++ b/start-site/src/main/resources/templates/testcontainers.mustache @@ -0,0 +1,13 @@ +### Testcontainers support + +This project uses [Testcontainers at development time]({{testcontainersAtDevelopmentTimeLink}}). + +{{#services.size}} +Testcontainers has been configured to use the following Docker images: + +{{#services}} +* [`{{image}}:{{imageTag}}`]({{website}}) +{{/services}} + +Please review the tags of the used images and set them to the same as you're running in production. +{{/services.size}} diff --git a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java index 78431f2f5a..ebf358a1cd 100644 --- a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java +++ b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,8 +22,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; import java.util.stream.Stream; import io.spring.initializr.generator.buildsystem.BuildSystem; @@ -44,10 +42,11 @@ import io.spring.initializr.web.project.ProjectGenerationInvoker; import io.spring.initializr.web.project.ProjectRequest; import io.spring.initializr.web.project.WebProjectRequest; -import org.junit.jupiter.api.AfterAll; +import io.spring.start.testsupport.Homes; +import io.spring.start.testsupport.TemporaryFiles; +import org.apache.commons.lang3.SystemUtils; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; -import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.parallel.Execution; import org.junit.jupiter.api.parallel.ExecutionMode; import org.junit.jupiter.params.ParameterizedTest; @@ -57,7 +56,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; -import org.springframework.util.FileSystemUtils; +import org.springframework.test.context.ActiveProfiles; import static org.assertj.core.api.Assertions.assertThat; @@ -66,38 +65,14 @@ * * @author Andy Wilkinson * @author Stephane Nicoll + * @author Moritz Halbritter */ @SpringBootTest +@ActiveProfiles("test") @TestInstance(Lifecycle.PER_CLASS) @Execution(ExecutionMode.CONCURRENT) class ProjectGenerationIntegrationTests { - private static final Set mavenHomes = new CopyOnWriteArraySet<>(); - - private static final Set gradleHomes = new CopyOnWriteArraySet<>(); - - private final ThreadLocal mavenHome = ThreadLocal.withInitial(() -> { - try { - Path mavenHome = Files.createTempDirectory("maven-home"); - ProjectGenerationIntegrationTests.mavenHomes.add(mavenHome); - return mavenHome; - } - catch (IOException ex) { - throw new RuntimeException(ex); - } - }); - - private final ThreadLocal gradleHome = ThreadLocal.withInitial(() -> { - try { - Path gradleHome = Files.createTempDirectory("gradle-home"); - ProjectGenerationIntegrationTests.gradleHomes.add(gradleHome); - return gradleHome; - } - catch (IOException ex) { - throw new RuntimeException(ex); - } - }); - private final ProjectGenerationInvoker invoker; private final InitializrMetadata metadata; @@ -109,26 +84,6 @@ class ProjectGenerationIntegrationTests { this.metadata = metadataProvider.get(); } - @AfterAll - static void deleteMavenAndGradleHomes() { - for (Path mavenHome : mavenHomes) { - try { - FileSystemUtils.deleteRecursively(mavenHome); - } - catch (IOException ex) { - // Continue - } - } - for (Path gradleHome : gradleHomes) { - try { - FileSystemUtils.deleteRecursively(gradleHome); - } - catch (IOException ex) { - // Continue - } - } - } - Stream parameters() { List bootVersions = this.metadata.getBootVersions() .getContent() @@ -163,8 +118,8 @@ Stream parameters() { @ParameterizedTest(name = "{0} - {1} - {2} - {3}") @MethodSource("parameters") - void projectBuilds(Version bootVersion, Packaging packaging, Language language, BuildSystem buildSystem, - @TempDir Path directory) throws IOException, InterruptedException { + void projectBuilds(Version bootVersion, Packaging packaging, Language language, BuildSystem buildSystem) + throws IOException, InterruptedException { WebProjectRequest request = new WebProjectRequest(); request.setBootVersion(bootVersion.toString()); request.setLanguage(language.id()); @@ -175,30 +130,46 @@ void projectBuilds(Version bootVersion, Packaging packaging, Language language, request.setApplicationName("DemoApplication"); request.setDependencies(Arrays.asList("devtools", "configuration-processor")); Path project = this.invoker.invokeProjectStructureGeneration(request).getRootDirectory(); - ProcessBuilder processBuilder = createProcessBuilder(buildSystem); - processBuilder.directory(project.toFile()); - Path output = Files.createTempFile(directory, "output-", ".log"); + Path home = getHome(buildSystem); + ProcessBuilder processBuilder = createProcessBuilder(project, buildSystem, home); + Path output = TemporaryFiles.newTemporaryDirectory("ProjectGenerationIntegrationTests-projectBuilds") + .resolve("output.log"); processBuilder.redirectError(output.toFile()); processBuilder.redirectOutput(output.toFile()); assertThat(processBuilder.start().waitFor()).describedAs(String.join("\n", Files.readAllLines(output))) .isEqualTo(0); } - private ProcessBuilder createProcessBuilder(BuildSystem buildSystem) { - if (buildSystem.id().equals(new MavenBuildSystem().id())) { - Path mavenHome = this.mavenHome.get(); - ProcessBuilder processBuilder = new ProcessBuilder("./mvnw", - "-Dmaven.repo.local=" + mavenHome.resolve("repository").toFile(), "package"); - processBuilder.environment().put("MAVEN_USER_HOME", mavenHome.toFile().getAbsolutePath()); + private Path getHome(BuildSystem buildSystem) { + return switch (buildSystem.id()) { + case MavenBuildSystem.ID -> Homes.MAVEN.get(); + case GradleBuildSystem.ID -> Homes.GRADLE.get(); + default -> throw new IllegalStateException("Unknown build system '%s'".formatted(buildSystem.id())); + }; + } + + private ProcessBuilder createProcessBuilder(Path directory, BuildSystem buildSystem, Path home) { + if (buildSystem.id().equals(MavenBuildSystem.ID)) { + String command = (isWindows()) ? "mvnw.cmd" : "mvnw"; + ProcessBuilder processBuilder = new ProcessBuilder(directory.resolve(command).toAbsolutePath().toString(), + "-Dmaven.repo.local=" + home.resolve("repository").toAbsolutePath(), "package"); + processBuilder.environment().put("MAVEN_USER_HOME", home.toAbsolutePath().toString()); + processBuilder.directory(directory.toFile()); return processBuilder; } - if (buildSystem.id().equals(new GradleBuildSystem().id())) { - Path gradleHome = this.gradleHome.get(); - ProcessBuilder processBuilder = new ProcessBuilder("./gradlew", "--no-daemon", "build"); - processBuilder.environment().put("GRADLE_USER_HOME", gradleHome.toFile().getAbsolutePath()); + if (buildSystem.id().equals(GradleBuildSystem.ID)) { + String command = (isWindows()) ? "gradlew.bat" : "gradlew"; + ProcessBuilder processBuilder = new ProcessBuilder(directory.resolve(command).toAbsolutePath().toString(), + "--no-daemon", "build"); + processBuilder.environment().put("GRADLE_USER_HOME", home.toAbsolutePath().toString()); + processBuilder.directory(directory.toFile()); return processBuilder; } - throw new IllegalStateException(); + throw new IllegalStateException("Unknown build system '%s'".formatted(buildSystem.id())); + } + + private boolean isWindows() { + return SystemUtils.IS_OS_WINDOWS; } } diff --git a/start-site/src/test/java/io/spring/start/site/StartApplicationIntegrationTests.java b/start-site/src/test/java/io/spring/start/site/StartApplicationIntegrationTests.java index bccb8dbe5a..25211beebc 100755 --- a/start-site/src/test/java/io/spring/start/site/StartApplicationIntegrationTests.java +++ b/start-site/src/test/java/io/spring/start/site/StartApplicationIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,7 @@ import org.springframework.http.MediaType; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; +import org.springframework.test.context.ActiveProfiles; import static org.assertj.core.api.Assertions.assertThat; @@ -45,6 +46,7 @@ * @author Stephane Nicoll */ @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@ActiveProfiles("test") @AutoConfigureCache class StartApplicationIntegrationTests { diff --git a/start-site/src/test/java/io/spring/start/site/SupportedBootVersion.java b/start-site/src/test/java/io/spring/start/site/SupportedBootVersion.java new file mode 100644 index 0000000000..e94d47aec4 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/SupportedBootVersion.java @@ -0,0 +1,58 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site; + +/** + * Supported Spring Boot versions. + * + * @author Moritz Halbritter + */ +public enum SupportedBootVersion { + + /** + * 3.3.0. + */ + V3_3("3.3.0"), + /** + * 3.4.0. + */ + V3_4("3.4.0"); + + private final String version; + + SupportedBootVersion(String version) { + this.version = version; + } + + public String getVersion() { + return this.version; + } + + @Override + public String toString() { + return getVersion(); + } + + /** + * Returns the latest supported Spring Boot version. + * @return the latest supported Spring Boot version + */ + public static SupportedBootVersion latest() { + return V3_4; + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/container/DockerServiceTests.java b/start-site/src/test/java/io/spring/start/site/container/DockerServiceTests.java new file mode 100644 index 0000000000..1e961819df --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/container/DockerServiceTests.java @@ -0,0 +1,77 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.container; + +import java.util.List; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link DockerService}. + * + * @author Chris Bono + */ +class DockerServiceTests { + + @Test + void builderWithMinimalOptions() { + DockerService service = DockerService.withImageAndTag("acme/toolbox").build(); + assertThat(service.getImage()).isEqualTo("acme/toolbox"); + assertThat(service.getImageTag()).isEqualTo("latest"); + assertThat(service.getWebsite()).isNull(); + assertThat(service.getCommand()).isNull(); + assertThat(service.getPorts()).isEmpty(); + } + + @Test + void builderWithAllOptions() { + DockerService service = DockerService.withImageAndTag("acme/toolbox") + .imageTag("1.0") + .website("acme/toolbox-dot-com") + .command("bin/acme run") + .ports(8007, 8008) + .build(); + assertThat(service.getImage()).isEqualTo("acme/toolbox"); + assertThat(service.getImageTag()).isEqualTo("1.0"); + assertThat(service.getWebsite()).isEqualTo("acme/toolbox-dot-com"); + assertThat(service.getCommand()).isEqualTo("bin/acme run"); + assertThat(service.getPorts()).containsExactly(8007, 8008); + } + + @Test + void builderWithImageAndTagUsesTag() { + DockerService service = DockerService.withImageAndTag("acme/toolbox:1.0").build(); + assertThat(service.getImage()).isEqualTo("acme/toolbox"); + assertThat(service.getImageTag()).isEqualTo("1.0"); + } + + @Test + void builderWithImageAndTagIsOverriddenByImageTag() { + DockerService service = DockerService.withImageAndTag("acme/toolbox:1.0").imageTag("2.0").build(); + assertThat(service.getImage()).isEqualTo("acme/toolbox"); + assertThat(service.getImageTag()).isEqualTo("2.0"); + } + + @Test + void builderWithCollectionOfPorts() { + DockerService service = DockerService.withImageAndTag("acme/toolbox").ports(List.of(8007, 8008)).build(); + assertThat(service.getPorts()).containsExactly(8007, 8008); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java b/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java index 31dc1dc318..4bde99c710 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ import java.util.Arrays; import io.spring.initializr.generator.test.buildsystem.gradle.GroovyDslGradleBuildAssert; +import io.spring.initializr.generator.test.buildsystem.gradle.KotlinDslGradleBuildAssert; import io.spring.initializr.generator.test.buildsystem.maven.MavenBuildAssert; import io.spring.initializr.generator.test.io.TextAssert; import io.spring.initializr.generator.test.project.ProjectStructure; @@ -32,11 +33,13 @@ import io.spring.initializr.web.project.ProjectGenerationResult; import io.spring.initializr.web.project.ProjectRequest; import io.spring.initializr.web.project.WebProjectRequest; +import io.spring.start.site.SupportedBootVersion; import org.assertj.core.api.AssertProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; +import org.springframework.test.context.ActiveProfiles; /** * Base test class for extensions. @@ -44,6 +47,7 @@ * @author Stephane Nicoll */ @SpringBootTest +@ActiveProfiles("test") public abstract class AbstractExtensionTests { @Autowired @@ -87,24 +91,60 @@ protected AssertProvider gradleBuild(ProjectRequest return () -> new GroovyDslGradleBuildAssert(content); } + protected AssertProvider gradleKotlinDslBuild(ProjectRequest request) { + request.setType("gradle-project-kotlin"); + String content = new String(getInvoker().invokeBuildGeneration(request)); + return () -> new KotlinDslGradleBuildAssert(content); + } + protected AssertProvider composeFile(ProjectRequest request) { ProjectStructure project = generateProject(request); return () -> new TextAssert(project.getProjectDirectory().resolve("compose.yaml")); } + protected AssertProvider applicationProperties(ProjectRequest request) { + ProjectStructure project = generateProject(request); + return () -> new TextAssert(project.getProjectDirectory().resolve("src/main/resources/application.properties")); + } + + protected AssertProvider gitIgnore(ProjectRequest request) { + ProjectStructure project = generateProject(request); + return () -> new TextAssert(project.getProjectDirectory().resolve(".gitignore")); + } + + protected AssertProvider helpDocument(ProjectStructure project) { + return () -> new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + } + + protected AssertProvider helpDocument(ProjectRequest request) { + return helpDocument(generateProject(request)); + } + protected ProjectStructure generateProject(ProjectRequest request) { ProjectGenerationResult result = getInvoker().invokeProjectStructureGeneration(request); return new ProjectStructure(result.getRootDirectory()); } /** - * Create a Maven-based {@link ProjectRequest} with the specified dependencies. + * Create a Maven-based {@link ProjectRequest} with the specified dependencies. Uses + * the latest supported Spring Boot version. * @param dependencies the dependency identifiers to add * @return a project request */ protected ProjectRequest createProjectRequest(String... dependencies) { + return createProjectRequest(SupportedBootVersion.latest(), dependencies); + } + + /** + * Create a Maven-based {@link ProjectRequest} with the specified dependencies. + * @param springBootVersion the Spring Boot version to use + * @param dependencies the dependency identifiers to add + * @return a project request + */ + protected ProjectRequest createProjectRequest(SupportedBootVersion springBootVersion, String... dependencies) { WebProjectRequest request = new WebProjectRequest(); request.initialize(this.metadataProvider.get()); + request.setBootVersion(springBootVersion.getVersion()); request.setType("maven-project"); request.getDependencies().addAll(Arrays.asList(dependencies)); return request; diff --git a/start-site/src/test/java/io/spring/start/site/extension/ExtensionIntegrationTests.java b/start-site/src/test/java/io/spring/start/site/extension/ExtensionIntegrationTests.java new file mode 100644 index 0000000000..644aff6f3d --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/ExtensionIntegrationTests.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension; + +import io.spring.initializr.generator.version.Version; +import io.spring.initializr.metadata.Dependency; +import io.spring.initializr.metadata.InitializrMetadata; +import io.spring.initializr.web.project.ProjectRequest; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThatCode; + +/** + * Tests with combined extensions. + * + * @author Stephane Nicoll + */ +public class ExtensionIntegrationTests extends AbstractExtensionTests { + + @ParameterizedTest + @ValueSource(strings = { "maven-project", "gradle-project", "gradle-project-kotlin" }) + void projectWithAllDependenciesCanBeGenerated(String type) { + InitializrMetadata metadata = getMetadata(); + String platformVersion = metadata.getBootVersions().getDefault().getId(); + String[] dependencies = allDependencies(metadata, platformVersion); + ProjectRequest request = createProjectRequest(dependencies); + request.setType(type); + assertThatCode(() -> generateProject(request)).doesNotThrowAnyException(); + } + + private static String[] allDependencies(InitializrMetadata metadata, String platformVersion) { + Version targetVersion = Version.parse(platformVersion); + return metadata.getDependencies() + .getAll() + .stream() + .filter((candidate) -> candidate.match(targetVersion)) + .map(Dependency::getId) + .toArray(String[]::new); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java index 5354983d48..d9e2b3860a 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,44 +16,39 @@ package io.spring.start.site.extension.build.gradle; -import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.assertj.core.api.ListAssert; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + /** * Tests for {@link GradleBuildSystemHelpDocumentCustomizer}. * * @author Jenn Strater * @author Andy Wilkinson + * @author Moritz Halbritter */ class GradleBuildSystemHelpDocumentCustomizerTests extends AbstractExtensionTests { @Test void linksAddedToHelpDocumentForGradleBuild() { - assertHelpDocument("gradle-build", "2.5.0").contains( - "* [Official Gradle documentation](https://docs.gradle.org)", + assertHelpDocument("gradle-build").contains("* [Official Gradle documentation](https://docs.gradle.org)", "* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle)", - "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.5.0/gradle-plugin/reference/html/)", - "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/2.5.0/gradle-plugin/reference/html/#build-image)"); + "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/3.4.0/gradle-plugin)", + "* [Create an OCI image](https://docs.spring.io/spring-boot/3.4.0/gradle-plugin/packaging-oci-image.html)"); } @Test void linksNotAddedToHelpDocumentForMavenBuild() { - assertHelpDocument("maven-build", "2.5.0").doesNotContain( - "* [Official Gradle documentation](https://docs.gradle.org)", - "* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle)", - "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.5.0/gradle-plugin/reference/html/)"); + assertHelpDocument("maven-build").noneMatch((line) -> line.contains("Gradle")); } - private ListAssert assertHelpDocument(String type, String version) { + private ListAssert assertHelpDocument(String type) { ProjectRequest request = createProjectRequest("web"); request.setType(type); - request.setBootVersion(version); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")).lines(); + return assertThat(helpDocument(request)).lines(); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolverTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolverTests.java index 36c5a0578c..3f89013a71 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolverTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolverTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,16 +16,14 @@ package io.spring.start.site.extension.build.gradle; -import java.nio.file.Path; import java.util.function.Function; import io.spring.initializr.generator.project.MutableProjectDescription; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; -import org.junit.jupiter.api.BeforeAll; +import io.spring.initializr.versionresolver.MavenVersionResolver; +import io.spring.start.site.test.TestMavenVersionResolver; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; @@ -40,12 +38,7 @@ */ class ManagedDependenciesDependencyManagementPluginVersionResolverTests { - private static DependencyManagementVersionResolver dependencyManagementVersionResolver; - - @BeforeAll - static void setup(@TempDir Path cacheLocation) { - dependencyManagementVersionResolver = DependencyManagementVersionResolver.withCacheLocation(cacheLocation); - } + private final MavenVersionResolver versionResolver = TestMavenVersionResolver.get(); @Test @SuppressWarnings("unchecked") @@ -53,8 +46,8 @@ void dependencyManagementPluginVersionCanBeResolved() { MutableProjectDescription description = new MutableProjectDescription(); description.setPlatformVersion(Version.parse("2.1.8.RELEASE")); Function fallback = mock(Function.class); - String version = new ManagedDependenciesDependencyManagementPluginVersionResolver( - dependencyManagementVersionResolver, fallback) + String version = new ManagedDependenciesDependencyManagementPluginVersionResolver(this.versionResolver, + fallback) .resolveDependencyManagementPluginVersion(description); assertThat(version).isEqualTo("1.0.8.RELEASE"); verifyNoInteractions(fallback); @@ -67,8 +60,8 @@ void dependencyManagementPluginVersionUsesFallbackIfNecessary() { description.setPlatformVersion(Version.parse("2.1.7.RELEASE")); Function fallback = mock(Function.class); given(fallback.apply(description)).willReturn("1.0.0.RELEASE"); - String version = new ManagedDependenciesDependencyManagementPluginVersionResolver( - dependencyManagementVersionResolver, fallback) + String version = new ManagedDependenciesDependencyManagementPluginVersionResolver(this.versionResolver, + fallback) .resolveDependencyManagementPluginVersion(description); assertThat(version).isEqualTo("1.0.0.RELEASE"); verify(fallback).apply(description); diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/maven/AnnotationProcessorExclusionBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/maven/AnnotationProcessorExclusionBuildCustomizerTests.java index dde690a7c3..dfbbe5484c 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/maven/AnnotationProcessorExclusionBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/maven/AnnotationProcessorExclusionBuildCustomizerTests.java @@ -29,25 +29,9 @@ */ class AnnotationProcessorExclusionBuildCustomizerTests extends AbstractExtensionTests { - @Test - void annotationProcessorsAreExcludedWithoutMetadata() { - ProjectRequest request = createProjectRequest("lombok", "configuration-processor"); - request.setBootVersion("2.3.0.RELEASE"); - assertThat(mavenPom(request)).lines() - .containsSequence(" ", " ", - " org.projectlombok", - " lombok", " ", - " ", - " org.springframework.boot", - " spring-boot-configuration-processor", - " ", " "); - - } - @Test void annotationProcessorsAreExcludedOnlyIfTheyAreNotHandledWithMetadata() { ProjectRequest request = createProjectRequest("lombok", "configuration-processor"); - request.setBootVersion("2.4.0"); assertThat(mavenPom(request)).lines() .containsSequence(" ", " ", " org.projectlombok", @@ -59,7 +43,6 @@ void annotationProcessorsAreExcludedOnlyIfTheyAreNotHandledWithMetadata() { @Test void nonAnnotationProcessorsAreIgnored() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion("2.4.0"); assertThat(mavenPom(request)).lines() .doesNotContainSequence(" ", " org.springframework.boot", diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java index 9d3f69865f..71a2df4b89 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,42 +16,39 @@ package io.spring.start.site.extension.build.maven; -import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.assertj.core.api.ListAssert; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + /** * Tests for {@link MavenBuildSystemHelpDocumentCustomizer}. * * @author Jenn Strater * @author Andy Wilkinson + * @author Moritz Halbritter */ class MavenBuildSystemHelpDocumentCustomizerTests extends AbstractExtensionTests { @Test void linksAddedToHelpDocumentForMavenBuild() { - assertHelpDocument("maven-build", "2.5.0").contains( + assertHelpDocument("maven-build").contains( "* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)", - "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.5.0/maven-plugin/reference/html/)", - "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/2.5.0/maven-plugin/reference/html/#build-image)"); + "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/3.4.0/maven-plugin)", + "* [Create an OCI image](https://docs.spring.io/spring-boot/3.4.0/maven-plugin/build-image.html)"); } @Test void linksNotAddedToHelpDocumentForGradleBuild() { - assertHelpDocument("gradle-build", "2.5.0").doesNotContain( - "* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)", - "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.5.0/maven-plugin/)"); + assertHelpDocument("gradle-build").noneMatch((line) -> line.contains("Maven")); } - private ListAssert assertHelpDocument(String type, String version) { + private ListAssert assertHelpDocument(String type) { ProjectRequest request = createProjectRequest("web"); request.setType(type); - request.setBootVersion(version); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")).lines(); + return assertThat(helpDocument(request)).lines(); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/maven/RegisterAnnotationProcessorsBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/maven/RegisterAnnotationProcessorsBuildCustomizerTests.java new file mode 100644 index 0000000000..61a1b503da --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/build/maven/RegisterAnnotationProcessorsBuildCustomizerTests.java @@ -0,0 +1,106 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.build.maven; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link RegisterAnnotationProcessorsBuildCustomizer}. + * + * @author Moritz Halbritter + */ +class RegisterAnnotationProcessorsBuildCustomizerTests extends AbstractExtensionTests { + + @Test + void shouldNotAddCompilerPluginWhenNoAnnotationProcessorsAreSelected() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotContain("maven-compiler-plugin"); + } + + @Test + void shouldRegisterLombok() { + ProjectRequest request = createProjectRequest("lombok"); + assertThat(mavenPom(request)).containsIgnoringWhitespaces(""" + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + + + + """); + } + + @Test + void shouldRegisterSpringBootConfigurationProcessor() { + ProjectRequest request = createProjectRequest("configuration-processor"); + assertThat(mavenPom(request)).containsIgnoringWhitespaces(""" + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.springframework.boot + spring-boot-configuration-processor + + + + """); + } + + @Test + void shouldRegisterMultiple() { + ProjectRequest request = createProjectRequest("lombok", "configuration-processor"); + assertThat(mavenPom(request)).containsIgnoringWhitespaces(""" + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + + + org.springframework.boot + spring-boot-configuration-processor + + + + """); + } + + @ParameterizedTest + @ValueSource(strings = { "groovy", "kotlin" }) + void shouldDoNothingIfLanguageIsNotJava(String language) { + ProjectRequest request = createProjectRequest("configuration-processor"); + request.setLanguage(language); + assertThat(mavenPom(request)).doesNotContain("maven-compiler-plugin"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java index b4c91c3a30..7e6c2d0381 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java @@ -33,19 +33,16 @@ class KotlinCoroutinesCustomizerTests extends AbstractExtensionTests { @Test void kotlinCoroutinesIsAdded() { ProjectRequest request = createProjectRequest("webflux"); - request.setBootVersion("2.5.0"); request.setLanguage("kotlin"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild().hasDependency("org.jetbrains.kotlinx", "kotlinx-coroutines-reactor"); - assertThat(project).textFile("HELP.md") - .contains( - "* [Coroutines section of the Spring Framework Documentation](https://docs.spring.io/spring/docs/5.3.7/spring-framework-reference/languages.html#coroutines)"); + assertThat(helpDocument(request)).contains( + "* [Coroutines section of the Spring Framework Documentation](https://docs.spring.io/spring-framework/reference/6.2.0/languages/kotlin/coroutines.html)"); } @Test void kotlinCoroutinesIsNotAddedWithNonKotlinApp() { ProjectRequest request = createProjectRequest("webflux"); - request.setBootVersion("2.5.0"); request.setLanguage("java"); assertThat(mavenPom(request)).doesNotHaveDependency("org.jetbrains.kotlinx", "kotlinx-coroutines-reactor"); } @@ -53,7 +50,6 @@ void kotlinCoroutinesIsNotAddedWithNonKotlinApp() { @Test void kotlinCoroutinesIsNotAddedWithoutReactiveFacet() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion("2.5.0"); request.setLanguage("kotlin"); assertThat(mavenPom(request)).doesNotHaveDependency("org.jetbrains.kotlinx", "kotlinx-coroutines-reactor"); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolverTests.java b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolverTests.java index ab9bb964b2..e3ce05d445 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolverTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolverTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,15 +16,14 @@ package io.spring.start.site.extension.code.kotlin; -import java.nio.file.Path; import java.util.function.Function; import io.spring.initializr.generator.project.MutableProjectDescription; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; +import io.spring.start.site.test.TestMavenVersionResolver; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -37,14 +36,15 @@ */ class ManagedDependenciesKotlinVersionResolverTests { + private final MavenVersionResolver mavenVersionResolver = TestMavenVersionResolver.get(); + @Test @SuppressWarnings("unchecked") - void kotlinVersionCanBeResolved(@TempDir Path temp) { + void kotlinVersionCanBeResolved() { MutableProjectDescription description = new MutableProjectDescription(); description.setPlatformVersion(Version.parse("2.5.0")); Function fallback = mock(Function.class); - String version = new ManagedDependenciesKotlinVersionResolver( - DependencyManagementVersionResolver.withCacheLocation(temp), fallback) + String version = new ManagedDependenciesKotlinVersionResolver(this.mavenVersionResolver, fallback) .resolveKotlinVersion(description); assertThat(version).isEqualTo("1.5.0"); verifyNoInteractions(fallback); diff --git a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionTests.java b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionTests.java index 568e32e3b1..7d0fefc372 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,7 +33,6 @@ class ReactorKotlinExtensionTests extends AbstractExtensionTests { @Test void reactorKotlinExtensionsIsAdded() { ProjectRequest request = createProjectRequest("webflux"); - request.setBootVersion("2.5.0"); request.setLanguage("kotlin"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild().hasDependency("io.projectreactor.kotlin", "reactor-kotlin-extensions"); @@ -42,7 +41,6 @@ void reactorKotlinExtensionsIsAdded() { @Test void reactorKotlinExtensionsIsNotAddedWithNonKotlinApp() { ProjectRequest request = createProjectRequest("webflux"); - request.setBootVersion("2.5.0"); request.setLanguage("java"); assertThat(mavenPom(request)).doesNotHaveDependency("io.projectreactor.kotlin", "reactor-kotlin-extensions"); } @@ -50,7 +48,6 @@ void reactorKotlinExtensionsIsNotAddedWithNonKotlinApp() { @Test void reactorKotlinExtensionsIsNotAddedWithoutReactiveFacet() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion("2.5.0"); request.setLanguage("kotlin"); assertThat(mavenPom(request)).doesNotHaveDependency("io.projectreactor.kotlin", "reactor-kotlin-extensions"); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java index b3953916d9..931f06a201 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,52 +16,34 @@ package io.spring.start.site.extension.dependency.activemq; -import io.spring.initializr.generator.test.io.TextAssert; import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; +import org.springframework.core.io.ClassPathResource; + import static org.assertj.core.api.Assertions.assertThat; /** * Tests for {@link ActiveMQProjectGenerationConfiguration}. * * @author Stephane Nicoll + * @author Eddú Meléndez */ class ActiveMQProjectGenerationConfigurationTests extends AbstractExtensionTests { @Test - void activeMQWithSpringBoot30RemovesDependency() { - ProjectRequest request = createProjectRequest("activemq"); - request.setBootVersion("3.0.0"); - assertThat(mavenPom(request)).doesNotHaveDependency("org.springframework.boot", "spring-boot-starter-activemq"); + void dockerComposeWhenDockerComposeIsNotSelectedDoesNotCreateService() { + ProjectRequest request = createProjectRequest("web", "activemq"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); } @Test - void activeMQWithSpringBoot31KeepsDependency() { - ProjectRequest request = createProjectRequest("activemq"); - request.setBootVersion("3.1.0"); - assertThat(mavenPom(request)).hasDependency("org.springframework.boot", "spring-boot-starter-activemq"); - } - - @Test - void activeMQWithSpringBoot30AddsWarning() { - ProjectRequest request = createProjectRequest("activemq"); - request.setBootVersion("3.0.0"); - assertHelpDocument(request).contains("ActiveMQ is not supported with Spring Boot 3.0"); - } - - @Test - void activeMQWithSpringBoot31DoesNotAddWarning() { - ProjectRequest request = createProjectRequest("activemq"); - request.setBootVersion("3.1.0"); - assertHelpDocument(request).doesNotContain("ActiveMQ is not supported with Spring Boot 3.0"); - } - - private TextAssert assertHelpDocument(ProjectRequest request) { - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + void dockerComposeCreatesAppropriateServiceWithVersion() { + ProjectRequest request = createProjectRequest("docker-compose", "activemq"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/activemq.yaml")); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..b8be8e84ea --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfigurationTests.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.activemq; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link ArtemisProjectGenerationConfiguration}. + * + * @author Eddú Meléndez + */ +class ArtemisProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void dockerComposeWhenDockerComposeIsNotSelectedDoesNotCreateService() { + ProjectRequest request = createProjectRequest("web", "artemis"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void dockerComposeCreatesAppropriateService() { + ProjectRequest request = createProjectRequest("docker-compose", "artemis"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/artemis.yaml")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfigurationTests.java index f60b6374c3..88ca962b60 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ * Tests for {@link CassandraProjectGenerationConfiguration}. * * @author Moritz Halbritter + * @author Eddú Meléndez */ class CassandraProjectGenerationConfigurationTests extends AbstractExtensionTests { @@ -51,6 +52,12 @@ void createsCassandraServiceWhenReactive() { assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/cassandra.yaml")); } + @Test + void createsCassandraServiceWhenSpringAiIsSelected() { + ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-cassandra"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/cassandra.yaml")); + } + @Test void doesNotFailWhenBothCassandraAndReactiveCassandraAreSelected() { ProjectRequest request = createProjectRequest("docker-compose", "data-cassandra", "data-cassandra-reactive"); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/derby/DerbyProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/derby/DerbyProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..0ba0b7be07 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/derby/DerbyProjectGenerationConfigurationTests.java @@ -0,0 +1,40 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.derby; + +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link DerbyProjectGenerationConfiguration}. + */ +class DerbyProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void whenDerbyIsSelectedAddsDerbytools() { + assertThat(mavenPom(createProjectRequest("derby"))).hasDependency("org.apache.derby", "derbytools", null, + "runtime"); + } + + @Test + void whenDerbyIsNotSelectedDoesNotAddDerbytools() { + assertThat(mavenPom(createProjectRequest("web"))).doesNotHaveDependency("org.apache.derby", "derbytools"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizerTests.java similarity index 56% rename from start-site/src/test/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaBuildCustomizerTests.java rename to start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizerTests.java index 846e923bcb..ba50f8598c 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,39 +14,37 @@ * limitations under the License. */ -package io.spring.start.site.extension.dependency.springkafka; +package io.spring.start.site.extension.dependency.dgs; import io.spring.initializr.metadata.Dependency; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -/** - * Tests for {@link SpringKafkaBuildCustomizer}. - * - * @author Wonwoo Lee - * @author Stephane Nicoll - */ -class SpringKafkaBuildCustomizerTests extends AbstractExtensionTests { +class DgsBuildCustomizerTests extends AbstractExtensionTests { - @Test - void springKafkaTestIsAdded() { - ProjectRequest request = createProjectRequest("kafka"); - Dependency kafkaTest = Dependency.withId("spring-kafka-test", "org.springframework.kafka", "spring-kafka-test", - null, Dependency.SCOPE_TEST); - assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) - .hasDependency(kafkaTest) - .hasDependenciesSize(4); + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); + + private Dependency dgsTest; + + @BeforeEach + void setup() { + this.dgsTest = Dependency.withId("graphql-dgs-spring-graphql-starter-test", "com.netflix.graphql.dgs", + "graphql-dgs-spring-graphql-starter-test"); + this.dgsTest.setScope(Dependency.SCOPE_TEST); } @Test - void springKafkaTestIsNotAddedWithoutKafka() { - ProjectRequest request = createProjectRequest("web"); + void shouldAddTestingDependency() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "web", "netflix-dgs"); assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("web")) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) - .hasDependenciesSize(2); + .hasDependency(this.dgsTest) + .hasDependenciesSize(4); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenBuildCustomizerTests.java new file mode 100644 index 0000000000..0cf80884d6 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenBuildCustomizerTests.java @@ -0,0 +1,60 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.version.VersionReference; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link DgsCodegenBuildCustomizer}. + * + * @author Brian Clozel + */ +public class DgsCodegenBuildCustomizerTests { + + @Test + void gradleBuildShouldRemoveCodegenDependency() { + DgsCodegenBuildCustomizer customizer = new DgsCodegenBuildCustomizer(); + GradleBuild build = new GradleBuild(); + build.dependencies() + .add("dgs-codegen", + Dependency.withCoordinates("com.example", "dgs-codegen") + .version(VersionReference.ofProperty("dgs-codegen.version")) + .build()); + customizer.customize(build); + assertThat(build.dependencies().has("dgs-codegen")).isFalse(); + } + + @Test + void mavenBuildShouldRemoveCodegenDependency() { + DgsCodegenBuildCustomizer customizer = new DgsCodegenBuildCustomizer(); + MavenBuild build = new MavenBuild(); + build.dependencies() + .add("dgs-codegen", + Dependency.withCoordinates("com.example", "dgs-codegen") + .version(VersionReference.ofProperty("dgs-codegen.version")) + .build()); + customizer.customize(build); + assertThat(build.dependencies().has("dgs-codegen")).isFalse(); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenHelpDocumentCustomizerTests.java new file mode 100644 index 0000000000..9d49a7e493 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenHelpDocumentCustomizerTests.java @@ -0,0 +1,59 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.io.template.MustacheTemplateRenderer; +import io.spring.initializr.generator.test.io.TextAssert; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.beans.factory.annotation.Autowired; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link DgsCodegenHelpDocumentCustomizer}. + * + * @author Brian Clozel + */ +class DgsCodegenHelpDocumentCustomizerTests extends AbstractExtensionTests { + + @Autowired + private MustacheTemplateRenderer templateRenderer; + + @Test + void mavenBuildAddsLinkToMavenCodegenPlugin() { + + assertHelpDocument("maven-project", "dgs-codegen").contains("## GraphQL code generation with DGS") + .contains("[plugin configuration options](https://github.com/deweyjose/graphqlcodegen)"); + } + + @Test + void gradleBuildAddsLinkToGradleCodegenPlugin() { + assertHelpDocument("gradle-project", "dgs-codegen").contains("## GraphQL code generation with DGS") + .contains( + "[plugin configuration options](https://netflix.github.io/dgs/generating-code-from-schema/#configuring-code-generation)"); + } + + private TextAssert assertHelpDocument(String type, String... dependencies) { + ProjectRequest request = createProjectRequest(dependencies); + request.setType(type); + return assertThat(helpDocument(request)); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectContributorTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectContributorTests.java new file mode 100644 index 0000000000..1366d70426 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectContributorTests.java @@ -0,0 +1,47 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link DgsCodegenProjectContributor}. + * + * @author Brian Clozel + */ +class DgsCodegenProjectContributorTests extends AbstractExtensionTests { + + @Test + void graphqlClientResourceDirectoryIsCreatedWithDgsCodegen() { + ProjectRequest request = createProjectRequest("dgs-codegen"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("src/main/resources/graphql-client")).exists().isDirectory(); + } + + @Test + void graphqlClientResourceDirectoryIsNotCreatedIfDgsCodegenIsNotRequested() { + ProjectRequest request = createProjectRequest("web"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("src/main/resources/graphql-client")).doesNotExist(); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..cda1a9a94f --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfigurationTests.java @@ -0,0 +1,140 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link DgsCodegenProjectGenerationConfiguration}. + * + * @author Brian Clozel + */ +class DgsCodegenProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void gradleBuildWithoutDgsCodegenDoesNotConfigureCodegenPlugin() { + ProjectRequest request = createProjectRequest("web"); + assertThat(gradleBuild(request)).doesNotContain("com.netflix.dgs.codegen"); + } + + @Test + void mavenBuildWithoutDgsCodegenDoesNotConfigureCodegenPlugin() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotContain("io.github.deweyjose"); + } + + @Test + void gradleBuildAddsDgsCodegenPlugin() { + ProjectRequest projectRequest = createProjectRequest("dgs-codegen"); + assertThat(gradleBuild(projectRequest)).contains("id 'com.netflix.dgs.codegen' version '"); + } + + @Test + void gradleBuildConfiguresDgsCodegenPlugin() { + ProjectRequest projectRequest = createProjectRequest("dgs-codegen"); + assertThat(gradleBuild(projectRequest)).containsSubsequence( + // @formatter:off + "generateJava {", + " schemaPaths = [\"${projectDir}/src/main/resources/graphql-client\"]", + " packageName = 'com.example.demo.codegen'", + " generateClient = true", + "}" + // @formatter:on + ); + } + + @Test + void gradleKotlinDslBuildAddsDgsCodegenPlugin() { + ProjectRequest projectRequest = createProjectRequest("dgs-codegen"); + assertThat(gradleKotlinDslBuild(projectRequest)).contains("id(\"com.netflix.dgs.codegen\") version "); + } + + @Test + void gradleKotlinDslBuildConfiguresDgsCodegenPlugin() { + ProjectRequest projectRequest = createProjectRequest("dgs-codegen"); + assertThat(gradleKotlinDslBuild(projectRequest)).containsSubsequence( + // @formatter:off + "tasks.generateJava {", + " schemaPaths.add(\"${projectDir}/src/main/resources/graphql-client\")", + " packageName = \"com.example.demo.codegen\"", + " generateClient = true", + "}" + // @formatter:on + ); + } + + @Test + void mavenBuildConfiguresCodegenPlugin() { + ProjectRequest request = createProjectRequest("dgs-codegen"); + assertThat(mavenPom(request)).lines().containsSequence( + // @formatter:off + " ", + " io.github.deweyjose", + " graphqlcodegen-maven-plugin", + " 1.61.5", + " ", + " ", + " dgs-codegen", + " ", + " generate", + " ", + " ", + " ", + " src/main/resources/graphql-client", + " ", + " com.example.demo.codegen", + " true", + " ", + " ", + " ", + " " + ); + // @formatter:on + } + + @Test + void mavenBuildConfiguresMavenHelperPlugin() { + ProjectRequest request = createProjectRequest("dgs-codegen"); + assertThat(mavenPom(request)).lines().containsSequence( + // @formatter:off + " ", + " org.codehaus.mojo", + " build-helper-maven-plugin", + " ", + " ", + " add-dgs-source", + " generate-sources", + " ", + " add-source", + " ", + " ", + " ", + " ${project.build.directory}/generated-sources", + " ", + " ", + " ", + " ", + " " + ); + // @formatter:on + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfigurationTests.java index db81ddf1c6..7bd55b1a60 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ * Tests for {@link ElasticsearchProjectGenerationConfiguration}. * * @author Moritz Halbritter + * @author Eddú Meléndez */ class ElasticsearchProjectGenerationConfigurationTests extends AbstractExtensionTests { @@ -45,4 +46,10 @@ void createsElasticsearchService() { assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/elasticsearch.yaml")); } + @Test + void createsElasticsearchServiceWhenSpringAiModuleIsSelected() { + ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-elasticsearch"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/elasticsearch.yaml")); + } + } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java index 43c6b07619..1bb1c66357 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,77 +26,97 @@ * Tests for {@link FlywayBuildCustomizer}. * * @author Eddú Meléndez + * @author Moritz Halbritter */ class FlywayBuildCustomizerTests extends AbstractExtensionTests { @Test void mariadbOnly() { - ProjectRequest projectRequest = createProject("2.7.0", "mariadb"); + ProjectRequest projectRequest = createProject("mariadb"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mariadb")) .doesNotHaveDependency("org.flywaydb", "flyway-mysql"); } @Test void mysqlOnly() { - ProjectRequest projectRequest = createProject("2.7.0", "mysql"); + ProjectRequest projectRequest = createProject("mysql"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mysql")) .doesNotHaveDependency("org.flywaydb", "flyway-mysql"); } @Test void sqlserverOnly() { - ProjectRequest projectRequest = createProject("2.7.0", "sqlserver"); + ProjectRequest projectRequest = createProject("sqlserver"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("sqlserver")) .doesNotHaveDependency("org.flywaydb", "flyway-sqlserver"); } @Test - void mariadbAndFlywayPreviousTo270() { - ProjectRequest projectRequest = createProject("2.6.0", "mariadb", "flyway"); - assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mariadb")) - .doesNotHaveDependency("org.flywaydb", "flyway-mysql"); - } - - @Test - void mysqlAndFlywayPreviousTo270() { - ProjectRequest projectRequest = createProject("2.6.0", "mysql", "flyway"); - assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mysql")) - .doesNotHaveDependency("org.flywaydb", "flyway-mysql"); - } - - @Test - void sqlserverAndFlywayPreviousTo270() { - ProjectRequest projectRequest = createProject("2.6.0", "sqlserver", "flyway"); - assertThat(mavenPom(projectRequest)).hasDependency(getDependency("sqlserver")) - .doesNotHaveDependency("org.flywaydb", "flyway-sqlserver"); + void oracleOnly() { + ProjectRequest projectRequest = createProject("oracle"); + assertThat(mavenPom(projectRequest)).hasDependency(getDependency("oracle")) + .doesNotHaveDependency("org.flywaydb", "flyway-database-oracle"); } @Test void mariadbAndFlyway() { - ProjectRequest projectRequest = createProject("2.7.0", "mariadb", "flyway"); + ProjectRequest projectRequest = createProject("mariadb", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mariadb")) .hasDependency("org.flywaydb", "flyway-mysql"); } @Test void mysqlAndFlyway() { - ProjectRequest projectRequest = createProject("2.7.0", "mysql", "flyway"); + ProjectRequest projectRequest = createProject("mysql", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mysql")) .hasDependency("org.flywaydb", "flyway-mysql"); } @Test void sqlserverAndFlyway() { - ProjectRequest projectRequest = createProject("2.7.0", "sqlserver", "flyway"); + ProjectRequest projectRequest = createProject("sqlserver", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("sqlserver")) .hasDependency("org.flywaydb", "flyway-sqlserver"); } - private ProjectRequest createProject(String springBootVersion, String... styles) { + @Test + void oracleAndFlyway() { + ProjectRequest projectRequest = createProject("oracle", "flyway"); + assertThat(mavenPom(projectRequest)).hasDependency(getDependency("oracle")) + .hasDependency("org.flywaydb", "flyway-database-oracle"); + } + + @Test + void db2AndFlyway() { + ProjectRequest projectRequest = createProject("db2", "flyway"); + assertThat(mavenPom(projectRequest)).hasDependency(getDependency("db2")) + .hasDependency("org.flywaydb", "flyway-database-db2"); + } + + @Test + void derbyAndFlyway() { + ProjectRequest projectRequest = createProject("derby", "flyway"); + assertThat(mavenPom(projectRequest)).hasDependency(getDependency("derby")) + .hasDependency("org.flywaydb", "flyway-database-derby"); + } + + @Test + void hsqlAndFlyway() { + ProjectRequest projectRequest = createProject("hsql", "flyway"); + assertThat(mavenPom(projectRequest)).hasDependency(getDependency("hsql")) + .hasDependency("org.flywaydb", "flyway-database-hsqldb"); + } + + @Test + void hsqlAndPostgres() { + ProjectRequest projectRequest = createProject("postgresql", "flyway"); + assertThat(mavenPom(projectRequest)).hasDependency(getDependency("postgresql")) + .hasDependency("org.flywaydb", "flyway-database-postgresql"); + } + + private ProjectRequest createProject(String... styles) { ProjectRequest projectRequest = createProjectRequest(styles); projectRequest.setLanguage("java"); - projectRequest.setJavaVersion("11"); - projectRequest.setBootVersion(springBootVersion); return projectRequest; } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizerTests.java index 6794227c5a..c7509f43cd 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizerTests.java @@ -30,13 +30,11 @@ * * @author Stephane Nicoll */ -abstract class GraalVmGradleBuildCustomizerTests { - - protected abstract GraalVmGradleBuildCustomizer createCustomizer(String platformVersion); +class GraalVmGradleBuildCustomizerTests { @Test void gradleBuildConfigureNativeBuildToolsPlugin() { - GraalVmGradleBuildCustomizer customizer = createCustomizer("3.0.0-RC1"); + GraalVmGradleBuildCustomizer customizer = new GraalVmGradleBuildCustomizer("1.0.0"); GradleBuild build = createBuild(); customizer.customize(build); GradlePlugin nbtPlugin = build.plugins() @@ -46,7 +44,7 @@ void gradleBuildConfigureNativeBuildToolsPlugin() { .orElse(null); assertThat(nbtPlugin).isNotNull(); assertThat(nbtPlugin).isInstanceOf(StandardGradlePlugin.class) - .satisfies((plugin) -> assertThat(((StandardGradlePlugin) plugin).getVersion()).isEqualTo("0.9.16")); + .satisfies((plugin) -> assertThat(((StandardGradlePlugin) plugin).getVersion()).isEqualTo("1.0.0")); } protected GradleBuild createBuild() { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java index 39da4d89aa..927c5793f9 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,9 +24,9 @@ import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.generator.version.Version; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -38,6 +38,7 @@ * Tests for {@link GraalVmHelpDocumentCustomizer}. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class GraalVmHelpDocumentCustomizerTests extends AbstractExtensionTests { @@ -47,24 +48,22 @@ class GraalVmHelpDocumentCustomizerTests extends AbstractExtensionTests { @Test void mavenBuildAddLinkToMavenAotPlugin() { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse("3.0.0-RC1")); + description.setPlatformVersion(Version.parse(SupportedBootVersion.latest().getVersion())); HelpDocument document = customize(description, new MavenBuild()); assertThat(document.gettingStarted().additionalLinks().getItems()).singleElement().satisfies((link) -> { assertThat(link.getDescription()).isEqualTo("Configure AOT settings in Build Plugin"); - assertThat(link.getHref()) - .isEqualTo("https://docs.spring.io/spring-boot/docs/3.0.0-RC1/maven-plugin/reference/htmlsingle/#aot"); + assertThat(link.getHref()).isEqualTo("https://docs.spring.io/spring-boot/3.4.0/how-to/aot.html"); }); } @Test void gradleBuildAddLinkToGradleAotPlugin() { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse("3.0.0-RC1")); + description.setPlatformVersion(Version.parse(SupportedBootVersion.latest().getVersion())); HelpDocument document = customize(description, new GradleBuild()); assertThat(document.gettingStarted().additionalLinks().getItems()).singleElement().satisfies((link) -> { assertThat(link.getDescription()).isEqualTo("Configure AOT settings in Build Plugin"); - assertThat(link.getHref()) - .isEqualTo("https://docs.spring.io/spring-boot/docs/3.0.0-RC1/gradle-plugin/reference/htmlsingle/#aot"); + assertThat(link.getHref()).isEqualTo("https://docs.spring.io/spring-boot/3.4.0/how-to/aot.html"); }); } @@ -102,16 +101,24 @@ void nativeSectionWithWebExposesPort() { assertHelpDocument(request).contains("$ docker run --rm -p 8080:8080 another-project:2.0.0-SNAPSHOT"); } - @Override - protected ProjectRequest createProjectRequest(String... styles) { - ProjectRequest request = super.createProjectRequest(styles); - request.setBootVersion("3.0.0-M5"); - return request; + @Test + void shouldDocumentGradleToolchainLimitations() { + ProjectRequest request = createProjectRequest("native"); + request.setType("gradle-project"); + assertHelpDocument(request) + .contains("There are some limitations regarding Native Build Tools and Gradle toolchains."); + } + + @Test + void shouldNotDocumentGradleToolchainLimitationsWhenUsingMaven() { + ProjectRequest request = createProjectRequest("native"); + request.setType("maven-project"); + assertHelpDocument(request) + .doesNotContain("There are some limitations regarding Native Build Tools and Gradle toolchains."); } private TextAssert assertHelpDocument(ProjectRequest request) { - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + return assertThat(helpDocument(request)); } private TextAssert assertHelpDocument(String type, String... dependencies) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java index 399129b4b6..ce879c9198 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,11 +16,16 @@ package io.spring.start.site.extension.dependency.graalvm; +import io.spring.initializr.generator.language.groovy.GroovyLanguage; import io.spring.initializr.generator.version.Version; +import io.spring.initializr.versionresolver.MavenVersionResolver; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + import static org.assertj.core.api.Assertions.assertThat; /** @@ -33,21 +38,18 @@ class GraalVmProjectGenerationConfigurationTests extends AbstractExtensionTests @Test void gradleBuildWithoutNativeDoesNotConfigureNativeBuildTools() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion("3.0.0"); assertThat(gradleBuild(request)).doesNotContain("org.graalvm.buildtools.native"); } @Test void mavenBuildWithoutNativeDoesNotConfigureNativeBuildTools() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion("3.0.0"); assertThat(mavenPom(request)).doesNotContain("native-maven-plugin"); } @Test void mavenBuildConfigureNativeBuildtoolsPlugint() { ProjectRequest request = createNativeProjectRequest(); - request.setBootVersion("3.0.0"); assertThat(mavenPom(request)).lines().containsSequence( // @formatter:off " ", @@ -58,10 +60,10 @@ void mavenBuildConfigureNativeBuildtoolsPlugint() { } @Test - void gradleBuildConfigureNativeBuildToolsPlugin() { - String nbtVersion = NativeBuildtoolsVersionResolver.resolve(Version.parse("3.0.0")); + void gradleBuildConfigureNativeBuildToolsPlugin(@Autowired MavenVersionResolver mavenVersionResolver) { + String nbtVersion = NativeBuildtoolsVersionResolver.resolve(mavenVersionResolver, + Version.parse(SupportedBootVersion.latest().getVersion())); ProjectRequest request = createNativeProjectRequest(); - request.setBootVersion("3.0.0"); assertThat(gradleBuild(request)).hasPlugin("org.graalvm.buildtools.native", nbtVersion); } @@ -71,20 +73,31 @@ void gradleBuildWithoutJpaDoesNotConfigureHibernateEnhancePlugin() { } @Test - void gradleBuildWithJpaConfiguresHibernateEnhancePlugin() { + void gradleBuildAndGroovyDslWithJpaConfiguresHibernateEnhancePlugin() { ProjectRequest request = createNativeProjectRequest("data-jpa"); assertThat(gradleBuild(request)).hasPlugin("org.hibernate.orm").lines().containsSequence( // @formatter:off "hibernate {", " enhancement {", - " lazyInitialization true", - " dirtyTracking true", - " associationManagement true", + " enableAssociationManagement = true", " }", "}"); // @formatter:on } + @Test + void gradleBuildAndKotlinDslWithJpaConfiguresHibernateEnhancePlugin() { + ProjectRequest request = createNativeProjectRequest("data-jpa"); + assertThat(gradleKotlinDslBuild(request)).hasPlugin("org.hibernate.orm").lines().containsSequence( + // @formatter:off + "hibernate {", + " enhancement {", + " enableAssociationManagement = true", + " }", + "}"); + // @formatter:on + } + @Test void mavenBuildWithoutJpaDoesNotConfigureHibernateEnhancePlugin() { assertThat(mavenPom(createNativeProjectRequest())).doesNotContain("hibernate-enhance-maven-plugin"); @@ -115,10 +128,16 @@ void mavenBuildWithJpaConfigureHibernateEnhancePlugin() { // @formatter:on } + @Test + void groovyProjectDoesNotConfigureGraalVm() { + ProjectRequest request = createNativeProjectRequest("data-jpa"); + request.setLanguage(GroovyLanguage.ID); + assertThat(gradleBuild(request)).doesNotContain("graalvm").doesNotContain("org.hibernate.orm"); + } + private ProjectRequest createNativeProjectRequest(String... dependencies) { ProjectRequest projectRequest = createProjectRequest(dependencies); projectRequest.getDependencies().add(0, "native"); - projectRequest.setBootVersion("3.0.0"); return projectRequest; } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGradleBuildCustomizerTests.java similarity index 78% rename from start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizerTests.java rename to start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGradleBuildCustomizerTests.java index d5c7499eb5..431efea445 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGradleBuildCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,22 +19,22 @@ import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.buildsystem.gradle.GradlePlugin; import io.spring.initializr.generator.buildsystem.gradle.StandardGradlePlugin; -import io.spring.initializr.generator.version.VersionReference; +import io.spring.initializr.generator.version.Version; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; /** - * Tests for {@link HibernatePluginGroovyDslGradleBuildCustomizer}. + * Tests for {@link HibernatePluginGradleBuildCustomizer}. * * @author Stephane Nicoll */ -class HibernatePluginGroovyDslGradleBuildCustomizerTests { +class HibernatePluginGradleBuildCustomizerTests { @Test void customizerAppliesHibernateEnhancePlugin() { - HibernatePluginGroovyDslGradleBuildCustomizer customizer = new HibernatePluginGroovyDslGradleBuildCustomizer( - VersionReference.ofValue("6.1.0.Final")); + HibernatePluginGradleBuildCustomizer customizer = new HibernatePluginGradleBuildCustomizer( + Version.parse("6.1.0.Final")); GradleBuild build = new GradleBuild(); customizer.customize(build); GradlePlugin hibernatePlugin = build.plugins() diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolverTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolverTests.java index df6872f4d6..ca4f9ca046 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolverTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolverTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,10 +20,17 @@ import io.spring.initializr.generator.version.Version; import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.metadata.MetadataElement; +import io.spring.initializr.versionresolver.MavenVersionResolver; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.beans.factory.annotation.Autowired; + import static org.assertj.core.api.Assertions.assertThat; /** @@ -31,23 +38,26 @@ * * @author Stephane Nicoll */ -class NativeBuildtoolsVersionResolverTests { +@TestInstance(Lifecycle.PER_CLASS) +class NativeBuildtoolsVersionResolverTests extends AbstractExtensionTests { @ParameterizedTest @MethodSource("platformVersions") - void resolveNativeBuildToolsVersion(Version platformVersion, String expectedBuildToolsVersion) { - assertThat(NativeBuildtoolsVersionResolver.resolve(platformVersion)).isEqualTo(expectedBuildToolsVersion); + void resolveNativeBuildToolsVersion(Version platformVersion, @Autowired MavenVersionResolver versionResolver) { + assertThat(NativeBuildtoolsVersionResolver.resolve(versionResolver, platformVersion)).isNotNull(); } - private static Stream platformVersions() { - return Stream.of(versions("2.7.0", null), versions("3.0.0-M1", "0.9.14"), versions("3.0.0-RC1", "0.9.16"), - versions("3.0.0-RC2", "0.9.17"), versions("3.0.0", "0.9.18"), versions("3.0.1", "0.9.19"), - versions("3.0.3", "0.9.20"), versions("3.0.6", "0.9.21"), versions("3.0.7", "0.9.22"), - versions("3.1.0", "0.9.22"), versions("3.1.1", "0.9.23")); + private Stream platformVersions() { + return getMetadata().getBootVersions() + .getContent() + .stream() + .map(MetadataElement::getId) + .filter((candidate) -> !candidate.startsWith("2.7")) + .map(this::version); } - private static Arguments versions(String platformVersion, String nativeBuildToolsVersion) { - return Arguments.of(VersionParser.DEFAULT.parse(platformVersion), nativeBuildToolsVersion); + private Arguments version(String platformVersion) { + return Arguments.of(VersionParser.DEFAULT.parse(platformVersion)); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizerTests.java index 3703a27db2..5d3bd8828c 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizerTests.java @@ -47,7 +47,6 @@ void setup() { @Test void shouldAddTestingDependencyWhenWebFlux() { ProjectRequest request = createProjectRequest("webflux", "graphql"); - request.setBootVersion("2.7.0-SNAPSHOT"); assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("webflux")) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependency(this.graphQlTest) @@ -58,7 +57,6 @@ void shouldAddTestingDependencyWhenWebFlux() { @Test void shouldAddTestingDependencyAndWebFluxWhenWeb() { ProjectRequest request = createProjectRequest("web", "graphql"); - request.setBootVersion("2.7.0-SNAPSHOT"); assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("web")) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependency(this.graphQlTest) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectContributorTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectContributorTests.java index 631c9935ca..da85c4658d 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectContributorTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectContributorTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.spring.start.site.extension.dependency.graphl; +package io.spring.start.site.extension.dependency.graphql; import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java deleted file mode 100644 index bb52f4cbcd..0000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.hilla; - -import io.spring.initializr.web.project.ProjectRequest; -import io.spring.start.site.extension.AbstractExtensionTests; -import org.junit.jupiter.api.Test; - -import org.springframework.core.io.ClassPathResource; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for {@link HillaProjectGenerationConfiguration}. - * - * @author Stephane Nicoll - */ -class HillaProjectGenerationConfigurationTests extends AbstractExtensionTests { - - @Test - void mavenBuildWithHillaAddProductionProfile() { - ProjectRequest request = createProjectRequest("hilla", "data-jpa"); - request.setBootVersion("3.1.0"); - assertThat(mavenPom(request)).hasProfile("production") - .contains(new ClassPathResource("dependency/hilla/hilla-maven-profile.xml")); - } - - @Test - void mavenBuildWithoutHillaDoesNotAddProductionProfile() { - ProjectRequest request = createProjectRequest("data-jpa"); - request.setBootVersion("3.1.0"); - assertThat(mavenPom(request)).doesNotContain("hilla"); - } - - @Test - void gradleBuildWithHillaConfigurePlugin() { - ProjectRequest request = createProjectRequest("hilla", "data-jpa"); - request.setBootVersion("3.1.0"); - assertThat(gradleBuild(request)).contains("id 'dev.hilla' version '2.1.1'"); - } - - @Test - void gradleBuildWithHillaConfigureTask() { - ProjectRequest request = createProjectRequest("data-jpa"); - request.setBootVersion("3.1.0"); - assertThat(gradleBuild(request)).doesNotContain("hilla"); - } - - @Test - void projectWithHillaCustomizesGitIgnore() { - assertThat(generateProject(createProjectRequest("hilla", "data-jpa"))).textFile(".gitignore") - .contains("node_modules/", "frontend/generated/"); - } - - @Test - void projectWithoutHillaDoesNotCustomizeGitIgnore() { - assertThat(generateProject(createProjectRequest("data-jpa"))).textFile(".gitignore") - .doesNotContain("frontend/generated/"); - } - -} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizerTests.java new file mode 100644 index 0000000000..3bbbe774b1 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizerTests.java @@ -0,0 +1,63 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.htmx; + +import io.spring.initializr.metadata.Dependency; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link HtmxBuildCustomizer}. + * + * @author Moritz Halbritter + */ +class HtmxBuildCustomizerTests extends AbstractExtensionTests { + + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); + + private final Dependency htmx = Dependency.withId("htmx", "io.github.wimdeblauwe", "htmx-spring-boot"); + + private final Dependency htmxThymeleaf = Dependency.withId("htmx", "io.github.wimdeblauwe", + "htmx-spring-boot-thymeleaf"); + + @Test + void shouldUseHtmxThymleafIfThymeleafIsSelected() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "htmx", "thymeleaf"); + assertThat(mavenPom(request)).doesNotHaveDependency(this.htmx.getGroupId(), this.htmx.getArtifactId()) + .hasDependency(this.htmxThymeleaf); + } + + @Test + void shouldUsePlainHtmxIfThymeleafIsNotSelected() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "htmx"); + assertThat(mavenPom(request)) + .doesNotHaveDependency(this.htmxThymeleaf.getGroupId(), this.htmxThymeleaf.getArtifactId()) + .hasDependency(this.htmx); + } + + @Test + void shouldNotAddHtmx() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotHaveDependency(this.htmx.getGroupId(), this.htmx.getArtifactId()) + .doesNotHaveDependency(this.htmxThymeleaf.getGroupId(), this.htmxThymeleaf.getArtifactId()); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/jte/JteProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/jte/JteProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..95cdd4781b --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/jte/JteProjectGenerationConfigurationTests.java @@ -0,0 +1,119 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.jte; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.metadata.Dependency; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link JteProjectGenerationConfiguration}. + * + * @author Moritz Halbritter + */ +class JteProjectGenerationConfigurationTests extends AbstractExtensionTests { + + private final Dependency jte = Dependency.withId("jte", "gg.jte", "jte-spring-boot-starter-3"); + + @Test + void shouldDoNothingIfJteIsNotSelected() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotHaveDependency(this.jte.getGroupId(), this.jte.getArtifactId()); + assertThat(mavenPom(request)).doesNotHaveDependency("gg.jte", "jte"); + ProjectStructure structure = generateProject(request); + assertThat(structure).doesNotContainDirectories("src/main/jte"); + assertThat(applicationProperties(request)).lines().doesNotContain("gg.jte.development-mode=true"); + assertThat(gitIgnore(request)).lines().doesNotContain("/jte-classes/"); + assertThat(helpDocument(request)).lines().doesNotContain("## JTE"); + } + + @Test + void shouldAddJteCore() { + ProjectRequest request = createProjectRequest("jte"); + assertThat(mavenPom(request)).hasDependency("gg.jte", "jte"); + } + + @Test + void shouldCreateTemplateDirectory() { + ProjectRequest request = createProjectRequest("jte"); + ProjectStructure structure = generateProject(request); + assertThat(structure).containsDirectories("src/main/jte"); + } + + @Test + void shouldAddProperties() { + ProjectRequest request = createProjectRequest("jte"); + assertThat(applicationProperties(request)).lines().contains("gg.jte.development-mode=true"); + } + + @Test + void shouldAddGitIgnoreEntries() { + ProjectRequest request = createProjectRequest("jte"); + assertThat(gitIgnore(request)).lines().contains("/jte-classes/"); + } + + @Test + void shouldAddHelpSection() { + ProjectRequest request = createProjectRequest("jte"); + assertThat(helpDocument(request)).lines().contains("## JTE"); + } + + @Test + void shouldAddGradlePluginAndConfigureIt() { + String jteVersion = getDependency("jte").getVersion(); + ProjectRequest request = createProjectRequest("jte"); + assertThat(gradleBuild(request)).hasPlugin("gg.jte.gradle", jteVersion).containsIgnoringWhitespaces(""" + jte { + generate() + binaryStaticContent = true + } + """); + } + + @Test + void shouldAddMavenPluginAndConfigureIt() { + String jteVersion = getDependency("jte").getVersion(); + ProjectRequest request = createProjectRequest("jte"); + assertThat(mavenPom(request)).containsIgnoringWhitespaces(""" + + gg.jte + jte-maven-plugin + %s + + + jte-generate + generate-sources + + generate + + + ${project.basedir}/src/main/jte + Html + true + ${project.build.outputDirectory} + + + + + """.formatted(jteVersion)); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java index 7fc8df11d3..f253ebb021 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.metadata.Dependency; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -30,9 +31,11 @@ */ class MyBatisTestBuildCustomizerTests extends AbstractExtensionTests { + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + @Test void mybatisIsAddedWithSecurity() { - ProjectRequest request = createProjectRequest("mybatis"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "mybatis"); assertThat(mavenPom(request)).hasDependency(mybatis()) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependency(mybatisTest()) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..05ca1a0f03 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.neo4j; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link Neo4jProjectGenerationConfiguration}. + * + * @author Eddú Meléndez + */ +class Neo4jProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest("web", "data-neo4j"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsNeo4jService() { + ProjectRequest request = createProjectRequest("docker-compose", "data-neo4j"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/neo4j.yaml")); + } + + @Test + void createsNeo4jServiceWhenSpringAiModuleIsSelected() { + ProjectRequest request = createProjectRequest(SupportedBootVersion.V3_3, "docker-compose", + "spring-ai-vectordb-neo4j"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/neo4j.yaml")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java index 3b6c1dd6cf..eb8b1bde04 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java @@ -17,7 +17,6 @@ package io.spring.start.site.extension.dependency.observability; import io.spring.initializr.generator.test.project.ProjectStructure; -import io.spring.initializr.metadata.Dependency; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.params.ParameterizedTest; @@ -33,29 +32,14 @@ class ObservabilityActuatorBuildCustomizerTests extends AbstractExtensionTests { @ParameterizedTest - @ValueSource(strings = { "datadog", "dynatrace", "influx", "graphite", "new-relic" }) - void actuatorIsAddedWith2xMicrometerRegistries(String dependency) { - assertThat(generateProject("2.7.5", dependency)).mavenBuild().hasDependency(getDependency("actuator")); - } - - @ParameterizedTest - @ValueSource(strings = { "distributed-tracing", "zipkin", "wavefront" }) - void actuatorIsNotAddedWith2xStarters(String dependency) { - Dependency actuator = getDependency("actuator"); - assertThat(generateProject("2.7.5", dependency)).mavenBuild() - .doesNotHaveDependency(actuator.getGroupId(), actuator.getArtifactId()); - } - - @ParameterizedTest - @ValueSource(strings = { "datadog", "dynatrace", "influx", "graphite", "new-relic", "distributed-tracing", "zipkin", - "wavefront" }) + @ValueSource(strings = { "datadog", "dynatrace", "influx", "graphite", "new-relic", "otlp-metrics", "prometheus", + "distributed-tracing", "zipkin", "wavefront" }) void actuatorIsAddedWithObservabilityEntries(String dependency) { - assertThat(generateProject("3.0.0", dependency)).mavenBuild().hasDependency(getDependency("actuator")); + assertThat(generateProject(dependency)).mavenBuild().hasDependency(getDependency("actuator")); } - private ProjectStructure generateProject(String bootVersion, String... dependencies) { + private ProjectStructure generateProject(String... dependencies) { ProjectRequest request = createProjectRequest(dependencies); - request.setBootVersion(bootVersion); request.setType("maven-build"); return generateProject(request); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizerTests.java new file mode 100644 index 0000000000..b05a038960 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizerTests.java @@ -0,0 +1,51 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.observability; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.assertj.core.api.ListAssert; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link ObservabilityHelpDocumentCustomizer}. + * + * @author Moritz Halbritter + */ +class ObservabilityHelpDocumentCustomizerTests extends AbstractExtensionTests { + + @Test + void linksAddedToHelpDocumentForGradleBuild() { + assertHelpDocument("distributed-tracing").contains( + "* [Distributed Tracing Reference Guide](https://docs.micrometer.io/tracing/reference/index.html)", + "* [Getting Started with Distributed Tracing](https://docs.spring.io/spring-boot/3.4.0/reference/actuator/tracing.html)"); + } + + @Test + void linksNotAddedToHelpDocumentForBuildWithoutTracing() { + assertHelpDocument().noneMatch((line) -> line.contains("Tracing")); + } + + private ListAssert assertHelpDocument(String... dependencies) { + ProjectRequest request = createProjectRequest(dependencies); + request.setType("gradle-build"); + return assertThat(helpDocument(request)).lines(); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfigurationTests.java index c29e83f85a..259b656094 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfigurationTests.java @@ -32,26 +32,25 @@ class ObservabilityProjectGenerationConfigurationTests extends AbstractExtension @Test void zipkinAddsDistributedTracingIfNecessary() { - assertThat(generateProject("3.0.0", "zipkin")).mavenBuild() + assertThat(generateProject("zipkin")).mavenBuild() .hasDependency(getDependency("zipkin")) .hasDependency(getDependency("distributed-tracing")); } @Test void wavefrontDoesNotAddDistributedTracingByDefault() { - assertThat(generateProject("3.0.0", "wavefront")).mavenBuild() + assertThat(generateProject("wavefront")).mavenBuild() .doesNotHaveDependency("io.micrometer", "micrometer-tracing-reporter-wavefront"); } @Test void wavefrontWithDistributedTracingConfigureReport() { - assertThat(generateProject("3.0.0", "wavefront", "distributed-tracing")).mavenBuild() + assertThat(generateProject("wavefront", "distributed-tracing")).mavenBuild() .hasDependency("io.micrometer", "micrometer-tracing-reporter-wavefront", null, "runtime"); } - private ProjectStructure generateProject(String bootVersion, String... dependencies) { + private ProjectStructure generateProject(String... dependencies) { ProjectRequest request = createProjectRequest(dependencies); - request.setBootVersion(bootVersion); request.setType("maven-build"); return generateProject(request); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java deleted file mode 100644 index ad5a9caf67..0000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.observability; - -import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; -import io.spring.initializr.web.project.ProjectRequest; -import io.spring.start.site.extension.AbstractExtensionTests; -import org.assertj.core.api.ListAssert; -import org.junit.jupiter.api.Test; - -/** - * Tests for {@link WavefrontHelpDocumentCustomizer}. - * - * @author Stephane Nicoll - * @author Brian Clozel - */ -class WavefrontHelpDocumentCustomizerTests extends AbstractExtensionTests { - - @Test - void wavefrontAddGeneralSection() { - assertHelpDocument("2.7.5", "wavefront").contains("## Observability with Wavefront", "", - "If you don't have a Wavefront account, the starter will create a freemium account for you.", - "The URL to access the Wavefront Service dashboard is logged on startup."); - } - - @Test - void wavefrontWithoutWebApplicationDoesNotAddActuatorSection() { - assertHelpDocument("2.7.5", "wavefront") - .doesNotContain("You can also access your dashboard using the `/actuator/wavefront` endpoint."); - } - - @Test - void wavefrontWithWebApplicationAddActuatorSection() { - assertHelpDocument("2.7.5", "wavefront", "web") - .contains("You can also access your dashboard using the `/actuator/wavefront` endpoint."); - } - - @Test - void wavefrontWithoutSleuthAddTracingNote() { - assertHelpDocument("2.7.5", "wavefront") - .contains("Finally, you can opt-in for distributed tracing by adding the 'Distributed Tracing' entry."); - } - - @Test - void wavefrontWithSleuthDoesNotAddTracingNote() { - assertHelpDocument("2.7.5", "wavefront", "distributed-tracing").doesNotContain( - "Finally, you can opt-in for distributed tracing by adding the 'Distributed Tracing' entry."); - } - - @Test - void springBoot2xWavefrontReference() { - assertHelpDocument("2.7.5", "wavefront").contains( - "* [Wavefront for Spring Boot documentation](https://docs.wavefront.com/wavefront_springboot.html)"); - } - - @Test - void springBoot3xWavefrontReference() { - assertHelpDocument("3.0.0", "wavefront").contains( - "* [Wavefront for Spring Boot documentation](https://docs.wavefront.com/wavefront_springboot3.html)"); - } - - private ListAssert assertHelpDocument(String version, String... dependencies) { - ProjectRequest request = createProjectRequest(dependencies); - request.setBootVersion(version); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")).lines(); - } - -} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java index eebfd4ad05..5b4c0bd2a0 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,11 +17,13 @@ package io.spring.start.site.extension.dependency.okta; import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + /** * Tests for {@link OktaHelpDocumentCustomizer}. * @@ -29,6 +31,8 @@ */ class OktaHelpDocumentCustomizerTests extends AbstractExtensionTests { + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + @Test void oktaSectionWithOktaDependencyIsPresent() { assertHelpDocument("okta").contains("## OAuth 2.0 and OIDC with Okta"); @@ -40,10 +44,8 @@ void oktaSectionWithoutOktaDependencyIsMissing() { } private TextAssert assertHelpDocument(String... dependencies) { - ProjectRequest request = createProjectRequest(dependencies); - request.setBootVersion("2.4.6"); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + ProjectRequest request = createProjectRequest(BOOT_VERSION, dependencies); + return assertThat(helpDocument(request)); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java index 9eae95a332..c89ad6a9ab 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,20 +29,36 @@ * Tests for {@link OracleProjectGenerationConfiguration}. * * @author Moritz Halbritter + * @author Eddú Meléndez */ class OracleProjectGenerationConfigurationTests extends AbstractExtensionTests { @Test - void doesNothingWithoutDockerCompose() { + void doesNotGenerateComposeYamlWithoutDockerCompose() { ProjectRequest request = createProjectRequest("web", "oracle"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); } @Test - void createsOracleService() { + void createsOracleFreeService() { ProjectRequest request = createProjectRequest("docker-compose", "oracle"); - assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/oracle.yaml")); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/oracle-free.yaml")); + } + + @Test + void createsOracleFreeServiceSpringAi() { + ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-oracle"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/oracle-free.yaml")); + } + + @Test + void declaresOracleFreeContainerBean() { + ProjectRequest request = createProjectRequest("testcontainers", "oracle"); + request.setLanguage("java"); + assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestcontainersConfiguration.java") + .contains("import org.testcontainers.oracle.OracleContainer;") + .contains(" return new OracleContainer(DockerImageName.parse(\"gvenzl/oracle-free:latest\"));"); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/picocli/PicocliCodegenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/picocli/PicocliCodegenBuildCustomizerTests.java deleted file mode 100644 index 0b60f55744..0000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/picocli/PicocliCodegenBuildCustomizerTests.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.picocli; - -import io.spring.initializr.generator.version.Version; -import io.spring.initializr.metadata.Dependency; -import io.spring.initializr.web.project.ProjectRequest; -import io.spring.start.site.extension.AbstractExtensionTests; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for {@link PicocliCodegenBuildCustomizer}. - * - * @author Brian Clozel - */ -class PicocliCodegenBuildCustomizerTests extends AbstractExtensionTests { - - private static final Version SPRING_BOOT_3_VERSION = Version.parse("3.0.0"); - - @Test - void picocliCodegenIsAddedAsMavenOptionalDependency() { - ProjectRequest request = createProjectRequest("picocli", "native"); - request.setBootVersion(SPRING_BOOT_3_VERSION.toString()); - assertThat(mavenPom(request)).hasDependency(getPicocli(SPRING_BOOT_3_VERSION)) - .hasDependency(getPicocliCodegen(SPRING_BOOT_3_VERSION)) - .hasText("/project/dependencies/dependency[2]/optional", "true"); - } - - @Test - void picocliCodegenIsNotAddedAsMavenDependencyIfNativeNotSelected() { - ProjectRequest request = createProjectRequest("picocli"); - request.setBootVersion(SPRING_BOOT_3_VERSION.toString()); - assertThat(mavenPom(request)).hasDependency(getDependency("picocli")) - .doesNotHaveDependency("info.picocli", "picocli-codegen"); - } - - @Test - void picocliCodegenIsAddedAsGradleAnnotationProcessor() { - ProjectRequest request = createProjectRequest("picocli", "native"); - request.setBootVersion(SPRING_BOOT_3_VERSION.toString()); - assertThat(gradleBuild(request)).contains("annotationProcessor 'info.picocli:picocli-codegen:" - + getPicocli(SPRING_BOOT_3_VERSION).getVersion() + "'"); - } - - @Test - void picocliCodegenIsNotAddedAsGradleAnnotationProcessorIfNativeNotSelected() { - ProjectRequest request = createProjectRequest("picocli"); - request.setBootVersion(SPRING_BOOT_3_VERSION.toString()); - assertThat(gradleBuild(request)).doesNotContain("info.picocli:picocli-codegen"); - } - - private Dependency getPicocli(Version springBootVersion) { - return getDependency("picocli").resolve(springBootVersion); - } - - private Dependency getPicocliCodegen(Version springBootVersion) { - return Dependency.create("info.picocli", "picocli-codegen", getPicocli(springBootVersion).getVersion(), - Dependency.SCOPE_COMPILE); - } - -} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..76fc1aacf9 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java @@ -0,0 +1,59 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.postgresql; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link PgVectorProjectGenerationConfiguration}. + * + * @author Eddú Meléndez + * @author Moritz Halbritter + */ +class PgVectorProjectGenerationConfigurationTests extends AbstractExtensionTests { + + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); + + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "web", "spring-ai-vectordb-pgvector"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsPostgresService() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "docker-compose", "spring-ai-vectordb-pgvector"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/pgvector.yaml")); + } + + @Test + void shouldOnlyHavePgVectorIfPostgresAndPgVectorIsSelected() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "docker-compose", "postgresql", + "spring-ai-vectordb-pgvector"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/pgvector.yaml")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/postgresqlProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PostgresqlProjectGenerationConfigurationTests.java similarity index 93% rename from start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/postgresqlProjectGenerationConfigurationTests.java rename to start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PostgresqlProjectGenerationConfigurationTests.java index 7eff334aac..5e4dd3807c 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/postgresqlProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PostgresqlProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,7 +30,7 @@ * * @author Moritz Halbritter */ -class postgresqlProjectGenerationConfigurationTests extends AbstractExtensionTests { +class PostgresqlProjectGenerationConfigurationTests extends AbstractExtensionTests { @Test void doesNothingWithoutDockerCompose() { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizerTests.java index a6669223bb..45ee61b1eb 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizerTests.java @@ -33,7 +33,6 @@ class ReactorTestBuildCustomizerTests extends AbstractExtensionTests { @Test void reactorTestIsAdded() { ProjectRequest request = createProjectRequest("webflux"); - request.setBootVersion("2.5.0"); Dependency reactorTest = Dependency.withId("reactor-test", "io.projectreactor", "reactor-test"); reactorTest.setScope(Dependency.SCOPE_TEST); assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("webflux")) @@ -45,7 +44,6 @@ void reactorTestIsAdded() { @Test void reactorTestIsNotAddedWithoutReactiveFacet() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion("2.5.0"); assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("web")) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependenciesSize(2); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..3e276a6893 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfigurationTests.java @@ -0,0 +1,51 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.redis; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link RedisStackProjectGenerationConfiguration}. + * + * @author Eddú Meléndez + */ +class RedisStackProjectGenerationConfigurationTests extends AbstractExtensionTests { + + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); + + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "spring-ai-vectordb-redis"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsRedisStackService() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "docker-compose", "spring-ai-vectordb-redis"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/redis-stack.yaml")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..89bfe1eb4a --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfigurationTests.java @@ -0,0 +1,70 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.sbom; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SbomProjectGenerationConfiguration}. + * + * @author Moritz Halbritter + */ +class SbomProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void shouldNotAddGradlePluginIfSbomIsNotSelected() { + ProjectRequest request = createProjectRequest("web"); + assertThat(gradleBuild(request)).doesNotContain("org.cyclonedx.bom"); + } + + @Test + void shouldNotAddMavenPluginIfSbomIsNotSelected() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotContain("cyclonedx-maven-plugin"); + } + + @Test + void shouldRemoveArtificalDependency() { + ProjectRequest request = createProjectRequest("sbom-cyclone-dx"); + assertThat(mavenPom(request)).doesNotHaveDependency("org.springframework.boot", "spring-boot"); + assertThat(gradleBuild(request)).doesNotContain("'org.springframework.boot:spring-boot'"); + } + + @Test + void shouldAddMavenPlugin() { + ProjectRequest request = createProjectRequest("sbom-cyclone-dx"); + assertThat(mavenPom(request)).lines().containsSequence( + // @formatter:off + " ", + " org.cyclonedx", + " cyclonedx-maven-plugin", + " " + // @formatter:on + ); + } + + @Test + void shouldAddGradlePlugin() { + ProjectRequest request = createProjectRequest("sbom-cyclone-dx"); + assertThat(gradleBuild(request)).hasPlugin("org.cyclonedx.bom", "1.10.0"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java index 88245d53a5..5502381cc0 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java @@ -19,6 +19,7 @@ import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.metadata.Dependency; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -31,16 +32,18 @@ */ class SolaceBinderBuildCustomizerTests extends AbstractExtensionTests { + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + @Test void binderNotAddedWhenSolaceNotSelected() { - ProjectStructure project = generateProject(createProjectRequest("cloud-stream")); + ProjectRequest request = createProjectRequest("cloud-stream"); + ProjectStructure project = generateProject(request); assertNoBinder(project); } @Test void binderNotAddedWhenCloudStreamNotSelected() { - ProjectRequest request = createProjectRequest("solace"); - request.setBootVersion("3.0.0"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "solace"); ProjectStructure project = generateProject(request); assertNoBinder(project); assertThat(project).mavenBuild().hasDependency(getDependency("solace")); @@ -48,16 +51,14 @@ void binderNotAddedWhenCloudStreamNotSelected() { @Test void binderAddedWhenSolaceAndCloudStreamSelected() { - ProjectRequest request = createProjectRequest("solace", "cloud-stream"); - request.setBootVersion("3.0.0"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "solace", "cloud-stream"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild().hasDependency("com.solace.spring.cloud", "spring-cloud-starter-stream-solace"); } @Test void bomAddedWhenSolaceAndCloudStreamSelected() { - ProjectRequest request = createProjectRequest("solace", "cloud-stream"); - request.setBootVersion("3.0.0"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "solace", "cloud-stream"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild() .hasBom("com.solace.spring.cloud", "solace-spring-cloud-bom", "${solace-spring-cloud.version}"); @@ -65,18 +66,16 @@ void bomAddedWhenSolaceAndCloudStreamSelected() { @Test void bomPropertyAddedWhenSolaceAndCloudStreamSelected() { - String platformVersion = "3.0.0"; - ProjectRequest request = createProjectRequest("solace", "cloud-stream"); - request.setBootVersion(platformVersion); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "solace", "cloud-stream"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild() - .hasProperty("solace-spring-cloud.version", getBom("solace-spring-cloud", platformVersion).getVersion()); + .hasProperty("solace-spring-cloud.version", + getBom("solace-spring-cloud", BOOT_VERSION.getVersion()).getVersion()); } @Test void solaceStarterRemovedWhenSolaceAndCloudStreamSelected() { - ProjectRequest request = createProjectRequest("solace", "cloud-stream"); - request.setBootVersion("3.0.0"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "solace", "cloud-stream"); ProjectStructure project = generateProject(request); Dependency solace = getDependency("solace"); assertThat(project).mavenBuild().doesNotHaveDependency(solace.getGroupId(), solace.getArtifactId()); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/OnRequestedSpringAiDependencyConditionTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/OnRequestedSpringAiDependencyConditionTests.java new file mode 100644 index 0000000000..ff95735d20 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/OnRequestedSpringAiDependencyConditionTests.java @@ -0,0 +1,60 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.project.MutableProjectDescription; +import io.spring.initializr.generator.project.ProjectDescription; +import org.junit.jupiter.api.Test; + +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +/** + * Tests for {@link OnRequestedSpringAiDependencyCondition}. + * + * @author Moritz Halbritter + */ +class OnRequestedSpringAiDependencyConditionTests { + + @Test + void shouldMatchIfSpringAiHasBeenRequested() { + OnRequestedSpringAiDependencyCondition condition = new OnRequestedSpringAiDependencyCondition(); + MutableProjectDescription description = new MutableProjectDescription(); + description.addDependency("spring-ai-azure-openai", + Dependency.withCoordinates("org.springframework.ai", "spring-ai-azure-openai-spring-boot-starter") + .build()); + assertThat(matches(condition, description)).isTrue(); + } + + @Test + void shouldNotMatchIfSpringAiHasNotBeenRequested() { + OnRequestedSpringAiDependencyCondition condition = new OnRequestedSpringAiDependencyCondition(); + MutableProjectDescription description = new MutableProjectDescription(); + description.addDependency("devtools", + Dependency.withCoordinates("org.springframework.boot", "spring-boot-devtools").build()); + assertThat(matches(condition, description)).isFalse(); + } + + private static boolean matches(OnRequestedSpringAiDependencyCondition condition, ProjectDescription description) { + return condition.matches(description, mock(ConditionContext.class), mock(AnnotatedTypeMetadata.class)); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..e72143f9fe --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfigurationTests.java @@ -0,0 +1,51 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAiChromaProjectGenerationConfiguration} + * + * @author Eddú Meléndez + */ +class SpringAiChromaProjectGenerationConfigurationTests extends AbstractExtensionTests { + + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); + + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "web", "spring-ai-vectordb-chroma"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsChromaService() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "docker-compose", "spring-ai-vectordb-chroma"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/chroma.yaml")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..4bd16c2ecc --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java @@ -0,0 +1,66 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import java.util.stream.Stream; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAiDockerComposeProjectGenerationConfiguration}. + * + * @author Eddú Meléndez + * @author Moritz Halbritter + */ +class SpringAiDockerComposeProjectGenerationConfigurationTests extends AbstractExtensionTests { + + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); + + @ParameterizedTest + @MethodSource("supportedDockerComposeSpringAiEntriesBuild") + void springAiTestcontainersDependencyIsAdded(String springAiDependency) { + ProjectRequest projectRequest = createProject("docker-compose", springAiDependency); + assertThat(mavenPom(projectRequest)).hasDependency("org.springframework.ai", + "spring-ai-spring-boot-docker-compose", null, "runtime"); + } + + @Test + void shouldNotAddSpringAiTestcontainersDependencyIfNoSpringAiDependencyIsSelected() { + ProjectRequest projectRequest = createProject("docker-compose", "web"); + assertThat(mavenPom(projectRequest)).doesNotHaveDependency("org.springframework.ai", + "spring-ai-spring-boot-docker-compose"); + } + + private ProjectRequest createProject(String... styles) { + ProjectRequest projectRequest = createProjectRequest(BOOT_VERSION, styles); + projectRequest.setLanguage("java"); + return projectRequest; + } + + static Stream supportedDockerComposeSpringAiEntriesBuild() { + return Stream.of("spring-ai-vectordb-chroma", "spring-ai-vectordb-milvus", "spring-ai-ollama", + "spring-ai-vectordb-qdrant", "spring-ai-vectordb-weaviate"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiMongoDbAtlasProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiMongoDbAtlasProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..76d7589f36 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiMongoDbAtlasProjectGenerationConfigurationTests.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAiMongoDbAtlasProjectGenerationConfiguration} + * + * @author Eddú Meléndez + */ +class SpringAiMongoDbAtlasProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest("web", "spring-ai-vectordb-mongodb-atlas"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsMongoDbAtlasService() { + ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-mongodb-atlas"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/mongodb-atlas.yaml")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..ba08828c41 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfigurationTests.java @@ -0,0 +1,51 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAiOllamaProjectGenerationConfiguration} + * + * @author Eddú Meléndez + */ +class SpringAiOllamaProjectGenerationConfigurationTests extends AbstractExtensionTests { + + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); + + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "web", "spring-ai-ollama"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsOllamaService() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "docker-compose", "spring-ai-ollama"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/ollama.yaml")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..385f61d970 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfigurationTests.java @@ -0,0 +1,51 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAiQdrantProjectGenerationConfiguration} + * + * @author Eddú Meléndez + */ +class SpringAiQdrantProjectGenerationConfigurationTests extends AbstractExtensionTests { + + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); + + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "web", "spring-ai-vectordb-qdrant"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsQdrantService() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "docker-compose", "spring-ai-vectordb-qdrant"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/qdrant.yaml")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..dbaabdb4cc --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java @@ -0,0 +1,66 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import java.util.stream.Stream; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAiTestcontainersProjectGenerationConfiguration}. + * + * @author Eddú Meléndez + * @author Moritz Halbritter + */ +class SpringAiTestcontainersProjectGenerationConfigurationTests extends AbstractExtensionTests { + + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); + + @ParameterizedTest + @MethodSource("supportedTestcontainersSpringAiEntriesBuild") + void springAiTestcontainersDependencyIsAdded(String springAiDependency) { + ProjectRequest projectRequest = createProject("testcontainers", springAiDependency); + assertThat(mavenPom(projectRequest)).hasDependency("org.springframework.ai", + "spring-ai-spring-boot-testcontainers", null, "test"); + } + + @Test + void shouldNotAddSpringAiTestcontainersDependencyIfNoSpringAiDependencyIsSelected() { + ProjectRequest projectRequest = createProject("testcontainers", "web"); + assertThat(mavenPom(projectRequest)).doesNotHaveDependency("org.springframework.ai", + "spring-ai-spring-boot-testcontainers"); + } + + static Stream supportedTestcontainersSpringAiEntriesBuild() { + return Stream.of("spring-ai-vectordb-chroma", "spring-ai-vectordb-milvus", "spring-ai-ollama", + "spring-ai-vectordb-qdrant", "spring-ai-vectordb-weaviate"); + } + + private ProjectRequest createProject(String... styles) { + ProjectRequest projectRequest = createProjectRequest(BOOT_VERSION, styles); + projectRequest.setLanguage("java"); + return projectRequest; + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..d2ffbd2e18 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfigurationTests.java @@ -0,0 +1,51 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAiWeaviateProjectGenerationConfiguration} + * + * @author Eddú Meléndez + */ +class SpringAiWeaviateProjectGenerationConfigurationTests extends AbstractExtensionTests { + + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); + + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "web", "spring-ai-vectordb-qdrant"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsWeaviateService() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "docker-compose", "spring-ai-vectordb-weaviate"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/weaviate.yaml")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..b81e45a30f --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java @@ -0,0 +1,65 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springazure; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAzureDockerComposeProjectGenerationConfiguration}. + * + * @author Eddú Meléndez + */ +class SpringAzureDockerComposeProjectGenerationConfigurationTests extends AbstractExtensionTests { + + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); + + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "web", "azure-storage"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsAzuriteService() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "docker-compose", "azure-storage"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/azurite.yaml")); + } + + @Test + void springAzureDockerComposeDependencyIsAdded() { + ProjectRequest projectRequest = createProjectRequest(BOOT_VERSION, "docker-compose", "azure-storage"); + assertThat(mavenPom(projectRequest)).hasDependency("com.azure.spring", "spring-cloud-azure-docker-compose", + null, "runtime"); + } + + @Test + void shouldNotAddDockerComposeTestcontainersDependencyIfNoSpringAzureDependencyIsSelected() { + ProjectRequest projectRequest = createProjectRequest("docker-compose", "web"); + assertThat(mavenPom(projectRequest)).doesNotHaveDependency("com.azure.spring", + "spring-cloud-azure-docker-compose"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizerTests.java new file mode 100644 index 0000000000..c0740ba3a1 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizerTests.java @@ -0,0 +1,46 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springazure; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAzureMavenBuildCustomizer}. + * + * @author Muyao Feng + * @author Moritz Halbritter + */ +class SpringAzureMavenBuildCustomizerTests extends AbstractExtensionTests { + + @Test + void shouldDoNothingIfAzureSupportIsntSelected() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotContain("azure-container-apps-maven-plugin"); + } + + @Test + void azureContainerAppsMavenPluginAddedWhenAzureSupportPresent() { + ProjectRequest request = createProjectRequest("azure-support"); + assertThat(mavenPom(request)).hasText("/project/build/plugins/plugin[1]/groupId", "com.microsoft.azure") + .hasText("/project/build/plugins/plugin[1]/artifactId", "azure-container-apps-maven-plugin"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java index d1f26adf1e..1d71361684 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import io.spring.initializr.generator.test.io.TextAssert; import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -37,25 +38,12 @@ */ class SpringAzureProjectGenerationConfigurationTests extends AbstractExtensionTests { - @ParameterizedTest - @MethodSource("springBoot2AzureDependencies") - void springBoot2onlyAzureDependency(String dependencyId) { - ProjectStructure project = generateProject("2.7.5", dependencyId); - assertThat(project).mavenBuild() - .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") - .hasDependency(getDependency(dependencyId)) - .doesNotHaveDependency("com.azure.spring", "spring-cloud-azure-starter-actuator") - .doesNotHaveDependency("com.azure.spring", "spring-cloud-azure-trace-sleuth") - .doesNotHaveDependency("com.azure.spring", "spring-cloud-azure-starter-integration-storage-queue"); - assertThatHelpDocumentOf(project).doesNotContain("https://aka.ms/spring/docs/actuator") - .doesNotContain("https://aka.ms/spring/docs/sleuth") - .doesNotContain("https://aka.ms/spring/docs/spring-integration/storage-queue"); - } + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); @ParameterizedTest @MethodSource("azureDependencies") void onlyAzureDependency(String dependencyId) { - ProjectStructure project = generateProject("3.0.0", dependencyId); + ProjectStructure project = generateProject(dependencyId); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency(getDependency(dependencyId)) @@ -65,19 +53,9 @@ void onlyAzureDependency(String dependencyId) { .doesNotContain("https://aka.ms/spring/docs/spring-integration/storage-queue"); } - @Test - void springBoot2onlyActuator() { - ProjectStructure project = generateProject("2.7.5", "actuator"); - assertThat(project).mavenBuild() - .doesNotHaveBom("com.azure.spring", "spring-cloud-azure-dependencies") - .hasDependenciesSize(2) - .hasDependency("org.springframework.boot", "spring-boot-starter-actuator") - .hasDependency("org.springframework.boot", "spring-boot-starter-test", null, "test"); - } - @Test void onlyActuator() { - ProjectStructure project = generateProject("3.0.0", "actuator"); + ProjectStructure project = generateProject("actuator"); assertThat(project).mavenBuild() .doesNotHaveBom("com.azure.spring", "spring-cloud-azure-dependencies") .hasDependenciesSize(2) @@ -85,23 +63,10 @@ void onlyActuator() { .hasDependency("org.springframework.boot", "spring-boot-starter-test", null, "test"); } - @ParameterizedTest - @MethodSource("springBoot2AzureDependencies") - void springBoot2azureDependencyWithActuator(String dependencyId) { - ProjectStructure project = generateProject("2.7.5", dependencyId, "actuator"); - assertThat(project).mavenBuild() - .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") - .hasDependency(getDependency(dependencyId)) - .hasDependency("com.azure.spring", "spring-cloud-azure-starter-actuator"); - assertThatHelpDocumentOf(project).contains("https://aka.ms/spring/docs/actuator") - .doesNotContain("https://aka.ms/spring/docs/sleuth") - .doesNotContain("https://aka.ms/spring/docs/spring-integration/storage-queue"); - } - @ParameterizedTest @MethodSource("azureDependencies") void azureDependencyWithActuator(String dependencyId) { - ProjectStructure project = generateProject("3.0.0", dependencyId, "actuator"); + ProjectStructure project = generateProject(dependencyId, "actuator"); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency(getDependency(dependencyId)) @@ -110,43 +75,9 @@ void azureDependencyWithActuator(String dependencyId) { .doesNotContain("https://aka.ms/spring/docs/spring-integration/storage-queue"); } - @Test - void onlySleuth() { - ProjectStructure project = generateProject("2.7.5", "distributed-tracing"); - assertThat(project).mavenBuild() - .doesNotHaveBom("com.azure.spring", "spring-cloud-azure-dependencies") - .hasDependenciesSize(3) - .hasDependency("org.springframework.cloud", "spring-cloud-starter-sleuth") - .hasDependency("org.springframework.boot", "spring-boot-starter-test", null, "test"); - } - - @ParameterizedTest - @MethodSource("springBoot2AzureDependencies") - void springBoot2AzureDependencyWithSleuth(String dependencyId) { - ProjectStructure project = generateProject("2.7.5", dependencyId, "distributed-tracing"); - assertThat(project).mavenBuild() - .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") - .hasDependency(getDependency(dependencyId)) - .hasDependency("com.azure.spring", "spring-cloud-azure-trace-sleuth"); - assertThatHelpDocumentOf(project).contains("https://aka.ms/spring/docs/sleuth") - .doesNotContain("https://aka.ms/spring/docs/actuator") - .doesNotContain("https://aka.ms/spring/docs/spring-integration/storage-queue"); - } - - @Test - void springBoot2OnlyIntegration() { - ProjectStructure project = generateProject("2.7.5", "integration"); - assertThat(project).mavenBuild() - .doesNotHaveBom("com.azure.spring", "spring-cloud-azure-dependencies") - .hasDependenciesSize(3) - .hasDependency("org.springframework.boot", "spring-boot-starter-integration") - .hasDependency("org.springframework.boot", "spring-boot-starter-test", null, "test") - .hasDependency("org.springframework.integration", "spring-integration-test", null, "test"); - } - @Test void onlyIntegration() { - ProjectStructure project = generateProject("3.0.0", "integration"); + ProjectStructure project = generateProject("integration"); assertThat(project).mavenBuild() .doesNotHaveBom("com.azure.spring", "spring-cloud-azure-dependencies") .hasDependenciesSize(3) @@ -155,22 +86,9 @@ void onlyIntegration() { .hasDependency("org.springframework.integration", "spring-integration-test", null, "test"); } - @Test - void springBoot2AzureStorageWithIntegration() { - ProjectStructure project = generateProject("2.7.5", "azure-storage", "integration"); - assertThat(project).mavenBuild() - .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") - .hasDependency(getDependency("azure-storage")) - .hasDependency(getDependency("integration")) - .hasDependency("com.azure.spring", "spring-cloud-azure-starter-integration-storage-queue"); - assertThatHelpDocumentOf(project).contains("https://aka.ms/spring/docs/spring-integration/storage-queue") - .doesNotContain("https://aka.ms/spring/docs/actuator") - .doesNotContain("https://aka.ms/spring/docs/sleuth"); - } - @Test void azureStorageWithIntegration() { - ProjectStructure project = generateProject("3.0.0", "azure-storage", "integration"); + ProjectStructure project = generateProject("azure-storage", "integration"); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency(getDependency("azure-storage")) @@ -180,19 +98,9 @@ void azureStorageWithIntegration() { .doesNotContain("https://aka.ms/spring/docs/actuator"); } - @Test - void springBoot2AzureJdbcWithMysql() { - ProjectStructure project = generateProject("2.7.5", "mysql", "azure-support"); - assertThat(project).mavenBuild() - .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") - .hasDependency("com.azure.spring", "spring-cloud-azure-starter-jdbc-mysql"); - assertThatHelpDocumentOf(project).contains("https://aka.ms/spring/msdocs/mysql") - .doesNotContain("https://aka.ms/spring/msdocs/postgresql"); - } - @Test void azureJdbcWithMysql() { - ProjectStructure project = generateProject("3.0.0", "mysql", "azure-support"); + ProjectStructure project = generateProject("mysql", "azure-support"); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency("com.azure.spring", "spring-cloud-azure-starter-jdbc-mysql"); @@ -200,19 +108,9 @@ void azureJdbcWithMysql() { .doesNotContain("https://aka.ms/spring/msdocs/postgresql"); } - @Test - void springBoot2AzureJdbcWithPostgresql() { - ProjectStructure project = generateProject("2.7.5", "postgresql", "azure-support"); - assertThat(project).mavenBuild() - .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") - .hasDependency("com.azure.spring", "spring-cloud-azure-starter-jdbc-postgresql"); - assertThatHelpDocumentOf(project).contains("https://aka.ms/spring/msdocs/postgresql") - .doesNotContain("https://aka.ms/spring/msdocs/mysql"); - } - @Test void azureJdbcWithPostgresql() { - ProjectStructure project = generateProject("3.0.0", "postgresql", "azure-support"); + ProjectStructure project = generateProject("postgresql", "azure-support"); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency("com.azure.spring", "spring-cloud-azure-starter-jdbc-postgresql"); @@ -220,9 +118,10 @@ void azureJdbcWithPostgresql() { .doesNotContain("https://aka.ms/spring/msdocs/mysql"); } - private static Stream springBoot2AzureDependencies() { - return Stream.of(Arguments.of("azure-active-directory"), Arguments.of("azure-cosmos-db"), - Arguments.of("azure-keyvault"), Arguments.of("azure-storage"), Arguments.of("azure-support")); + @Test + void DeploytoAzureSectionAddedWhenAzureSupportPresent() { + ProjectStructure project = generateProject("azure-support"); + assertThatHelpDocumentOf(project).contains("### Deploy to Azure"); } private static Stream azureDependencies() { @@ -230,15 +129,14 @@ private static Stream azureDependencies() { Arguments.of("azure-storage"), Arguments.of("azure-support")); } - private ProjectStructure generateProject(String bootVersion, String... dependencies) { - ProjectRequest request = createProjectRequest(dependencies); - request.setBootVersion(bootVersion); + private ProjectStructure generateProject(String... dependencies) { + ProjectRequest request = createProjectRequest(BOOT_VERSION, dependencies); request.setType("maven-build"); return generateProject(request); } private TextAssert assertThatHelpDocumentOf(ProjectStructure project) { - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + return assertThat(helpDocument(project)); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..228040f513 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfigurationTests.java @@ -0,0 +1,49 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springazure; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAzureTestcontainersProjectGenerationConfiguration}. + * + * @author Eddú Meléndez + */ +class SpringAzureTestcontainersProjectGenerationConfigurationTests extends AbstractExtensionTests { + + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); + + @Test + void springAzureTestcontainersDependencyIsAdded() { + ProjectRequest projectRequest = createProjectRequest(BOOT_VERSION, "testcontainers", "azure-storage"); + assertThat(mavenPom(projectRequest)).hasDependency("com.azure.spring", "spring-cloud-azure-testcontainers", + null, "test"); + } + + @Test + void shouldNotAddSpringAzureTestcontainersDependencyIfNoSpringAzureDependencyIsSelected() { + ProjectRequest projectRequest = createProjectRequest(BOOT_VERSION, "testcontainers", "azure-keyvault"); + assertThat(mavenPom(projectRequest)).doesNotHaveDependency("com.azure.spring", + "spring-cloud-azure-testcontainers"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java index 4af4241450..13c3fc0d32 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -30,51 +31,85 @@ */ class SpringBootProjectGenerationConfigurationTests extends AbstractExtensionTests { - @Test - void gradleWithDevtoolsConfigureBuild() { - ProjectRequest request = createProjectRequest("devtools"); - request.setBootVersion("2.4.8"); - assertThat(gradleBuild(request)).lines() - .doesNotContain("configurations {") - .contains("\tdevelopmentOnly 'org.springframework.boot:spring-boot-devtools'"); - } + @Nested + class MavenTests { - @Test - void gradleWithoutDevtoolsDoesNotCreateDevelopmentOnlyConfiguration() { - ProjectRequest request = createProjectRequest("web"); - request.setBootVersion("2.4.8"); - assertThat(gradleBuild(request)).doesNotContain("developmentOnly"); - } + @Test + void devtoolsIsOptional() { + ProjectRequest request = createProjectRequest("devtools"); + assertThat(mavenPom(request)) + .hasText("/project/dependencies/dependency[2]/artifactId", "spring-boot-devtools") + .hasText("/project/dependencies/dependency[2]/optional", "true"); + } - @Test - void mavenWithDevtoolsIsOptional() { - ProjectRequest request = createProjectRequest("devtools"); - assertThat(mavenPom(request)).hasText("/project/dependencies/dependency[2]/artifactId", "spring-boot-devtools") - .hasText("/project/dependencies/dependency[2]/optional", "true"); - } + @Test + void devtoolsAbsentDoesNotChangeOptional() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotContain("optional"); + } - @Test - void mavenWithoutDevtoolsDoesNotChangeOptional() { - ProjectRequest request = createProjectRequest("web"); - assertThat(mavenPom(request)).doesNotContain("optional"); - } + @Test + void dockerComposeSupportHasOptionalScope() { + ProjectRequest request = createProjectRequest("docker-compose"); + assertThat(mavenPom(request)) + .hasText("/project/dependencies/dependency[2]/artifactId", "spring-boot-docker-compose") + .hasText("/project/dependencies/dependency[2]/scope", "runtime") + .hasText("/project/dependencies/dependency[2]/optional", "true"); + } + + @Test + void springBootDoesNotConfigureJammyBaseBuilder() { + ProjectRequest request = createProjectRequest(); + assertThat(mavenPom(request)).doesNotContain(""); + } - @Test - void gradleWithDockerComposeSupportUsesDevelopmentOnly() { - ProjectRequest request = createProjectRequest("docker-compose"); - request.setBootVersion("3.1.0-RC1"); - assertThat(gradleBuild(request)).lines() - .contains("\tdevelopmentOnly 'org.springframework.boot:spring-boot-docker-compose'"); } - @Test - void mavenWithDockerComposeSupportHasOptionalScope() { - ProjectRequest request = createProjectRequest("docker-compose"); - request.setBootVersion("3.1.0-RC1"); - assertThat(mavenPom(request)) - .hasText("/project/dependencies/dependency[2]/artifactId", "spring-boot-docker-compose") - .hasText("/project/dependencies/dependency[2]/scope", "runtime") - .hasText("/project/dependencies/dependency[2]/optional", "true"); + @Nested + class GradleTests { + + @Test + void gradleWithDevtoolsConfigureBuild() { + ProjectRequest request = createProjectRequest("devtools"); + assertThat(gradleBuild(request)).lines() + .doesNotContain("configurations {") + .contains("\tdevelopmentOnly 'org.springframework.boot:spring-boot-devtools'"); + } + + @Test + void gradleWithoutDevtoolsDoesNotCreateDevelopmentOnlyConfiguration() { + ProjectRequest request = createProjectRequest("web"); + assertThat(gradleBuild(request)).doesNotContain("developmentOnly"); + } + + @Test + void gradleWithDockerComposeSupportUsesDevelopmentOnly() { + ProjectRequest request = createProjectRequest("docker-compose"); + assertThat(gradleBuild(request)).lines() + .contains("\tdevelopmentOnly 'org.springframework.boot:spring-boot-docker-compose'"); + } + + @Test + void mavenWithDockerComposeSupportHasOptionalScope() { + ProjectRequest request = createProjectRequest("docker-compose"); + assertThat(mavenPom(request)) + .hasText("/project/dependencies/dependency[2]/artifactId", "spring-boot-docker-compose") + .hasText("/project/dependencies/dependency[2]/scope", "runtime") + .hasText("/project/dependencies/dependency[2]/optional", "true"); + } + + @Test + void springBootWithGroovyDslDoesNotConfigureJammyBaseBuilder() { + ProjectRequest request = createProjectRequest(); + assertThat(gradleBuild(request)).doesNotContain("builder = '"); + } + + @Test + void springBootWithKotlinDslDoesNotConfigureJammyBaseBuilder() { + ProjectRequest request = createProjectRequest(); + assertThat(gradleKotlinDslBuild(request)).doesNotContain("builder.set(\""); + } + } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java index 2c7a164ca4..fd58ffdd91 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java @@ -30,13 +30,12 @@ */ class SpringCloudCircuitBreakerBuildCustomizerTests extends AbstractExtensionTests { - static final Dependency REACTIVE_CLOUD_CIRCUIT_BREAKER = Dependency.withId("cloud-resilience4j-reactive", + private static final Dependency REACTIVE_CLOUD_CIRCUIT_BREAKER = Dependency.withId("cloud-resilience4j-reactive", "org.springframework.cloud", "spring-cloud-starter-circuitbreaker-reactor-resilience4j"); @Test void replacesCircuitBreakerWithReactiveCircuitBreakerWhenReactiveFacetPresent() { ProjectRequest request = createProjectRequest("webflux", "cloud-resilience4j"); - request.setBootVersion("2.5.0"); assertThat(mavenPom(request)).hasDependency(getDependency("webflux")) .hasDependency(REACTIVE_CLOUD_CIRCUIT_BREAKER) .doesNotHaveDependency("org.springframework.cloud", "spring-cloud-starter-circuitbreaker-resilience4j") @@ -47,7 +46,6 @@ void replacesCircuitBreakerWithReactiveCircuitBreakerWhenReactiveFacetPresent() @Test void doesNotReplaceCircuitBreakerWithReactiveCircuitBreakerWhenReactiveFacetNotPresent() { ProjectRequest request = createProjectRequest("cloud-resilience4j"); - request.setBootVersion("2.5.0"); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-resilience4j")) .doesNotHaveDependency("org.springframework.cloud", "spring-cloud-starter-circuitbreaker-reactor-resilience4j") diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java index 0fc6f2d3d6..590b711ee7 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,43 +33,40 @@ class SpringCloudContractGradleBuildCustomizerTests extends AbstractExtensionTes @Test void springCloudContractVerifierPluginAddedWhenSCCDependencyPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier"); - assertThat(gradleBuild(projectRequest)).contains("id 'org.springframework.cloud.contract' version '"); + ProjectRequest request = createProjectRequest("cloud-contract-verifier"); + assertThat(gradleBuild(request)).contains("id 'org.springframework.cloud.contract' version '"); } @Test void springCloudContractVerifierPluginNotAddedWhenSCCDependencyAbsent() { - ProjectRequest projectRequest = createProjectRequest(); - assertThat(gradleBuild(projectRequest)).doesNotContain("org.springframework.cloud.contract"); + ProjectRequest request = createProjectRequest(); + assertThat(gradleBuild(request)).doesNotContain("org.springframework.cloud.contract"); } @Test - void springCloudContractVerifierPlugin30ContractTestWithJUnit5ByDefault() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier"); - projectRequest.setBootVersion("2.7.5"); - assertThat(gradleBuild(projectRequest)).containsSubsequence("tasks.named('contractTest') {", - "useJUnitPlatform()"); + void springCloudContractVerifierPluginContractTestWithJUnit5ByDefault() { + ProjectRequest request = createProjectRequest("cloud-contract-verifier"); + assertThat(gradleBuild(request)).containsSubsequence("tasks.named('contractTest') {", "useJUnitPlatform()"); } @Test void springCloudContractVerifierPluginWithGroovyDslAndWithTestModeSetWhenWebFluxIsPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier", "webflux"); - assertThat(gradleBuild(projectRequest)).containsSubsequence("contracts {", "testMode = 'WebTestClient'"); + ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); + assertThat(gradleBuild(request)).containsSubsequence("contracts {", "testMode = 'WebTestClient'"); } @Test void springCloudContractVerifierPluginWithKotlinDslAndTestModeSetWhenWebFluxIsPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier", "webflux"); - projectRequest.setType("gradle-project-kotlin"); - assertThat(generateProject(projectRequest)).textFile("build.gradle.kts") + ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); + assertThat(gradleKotlinDslBuild(request)) .contains("import org.springframework.cloud.contract.verifier.config.TestMode") - .containsSubsequence("contracts {", "testMode.set(TestMode.WEBTESTCLIENT)"); + .containsSubsequence("contracts {", "testMode = TestMode.WEBTESTCLIENT"); } @Test void springWebTestClientDependencyAddedWhenWebFluxIsPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier", "webflux"); - assertThat(gradleBuild(projectRequest)).contains("testImplementation 'io.rest-assured:spring-web-test-client'"); + ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); + assertThat(gradleBuild(request)).contains("testImplementation 'io.rest-assured:spring-web-test-client'"); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java index 89565790a2..f213d9a1c8 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java @@ -34,8 +34,8 @@ class SpringCloudContractMavenBuildCustomizerTests extends AbstractExtensionTest @Test void springCloudContractVerifierPluginAddedWhenSCCDependencyPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier"); - assertThat(mavenPom(projectRequest)).hasDependency(getDependency("cloud-contract-verifier")) + ProjectRequest request = createProjectRequest("cloud-contract-verifier"); + assertThat(mavenPom(request)).hasDependency(getDependency("cloud-contract-verifier")) .hasText("/project/build/plugins/plugin[1]/groupId", "org.springframework.cloud") .hasText("/project/build/plugins/plugin[1]/artifactId", "spring-cloud-contract-maven-plugin") .hasText("/project/build/plugins/plugin[1]/extensions", Boolean.toString(true)); @@ -49,28 +49,27 @@ void springCloudContractVerifierPluginNotAddedWhenSCCDependencyAbsent() { @Test void springCloudContractVerifierPluginForSpringBootWithJUnit5ByDefault() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier"); - projectRequest.setBootVersion("2.4.0"); - assertThat(mavenPom(projectRequest)) + ProjectRequest request = createProjectRequest("cloud-contract-verifier"); + assertThat(mavenPom(request)) .hasText("/project/build/plugins/plugin[1]/artifactId", "spring-cloud-contract-maven-plugin") .hasText("/project/build/plugins/plugin[1]/configuration/testFramework", "JUNIT5"); } @Test void springCloudContractVerifierPluginWithTestModeSetWhenWebFluxIsPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier", "webflux"); - assertThat(mavenPom(projectRequest)) + ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); + assertThat(mavenPom(request)) .hasText("/project/build/plugins/plugin[1]/artifactId", "spring-cloud-contract-maven-plugin") .hasText("/project/build/plugins/plugin[1]/configuration/testMode", "WEBTESTCLIENT"); } @Test void springWebTestClientDependencyAddedWhenWebFluxIsPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier", "webflux"); + ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); Dependency springWebTestClientDep = Dependency.withId("rest-assured-spring-web-test-client", "io.rest-assured", "spring-web-test-client"); springWebTestClientDep.setScope(Dependency.SCOPE_TEST); - assertThat(mavenPom(projectRequest)).hasDependency(springWebTestClientDep); + assertThat(mavenPom(request)).hasDependency(springWebTestClientDep); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java index 092423dee8..dc6fba6029 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ import java.util.Arrays; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -31,30 +32,30 @@ */ class SpringCloudFunctionHelpDocumentCustomizerTests extends AbstractExtensionTests { + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); + private static final String AZURE_SECTION_TITLE = "## Running Spring Cloud Function applications on Microsoft Azure"; @Test void functionBuildSetupInfoSectionAddedForMaven() { - ProjectRequest request = createProjectRequest(); - request.setBootVersion("2.5.0"); + ProjectRequest request = createProjectRequest(BOOT_VERSION); request.setType("maven-build"); request.setDependencies(Arrays.asList("cloud-function", "azure-support")); - assertThat(generateProject(request)).textFile("HELP.md").contains(AZURE_SECTION_TITLE); + assertThat(helpDocument(request)).contains(AZURE_SECTION_TITLE); } @Test void functionBuildSetupInfoSectionAddedForGradle() { - ProjectRequest request = createProjectRequest(); - request.setBootVersion("2.5.0"); + ProjectRequest request = createProjectRequest(BOOT_VERSION); request.setType("gradle-build"); request.setDependencies(Arrays.asList("cloud-function", "azure-support")); - assertThat(generateProject(request)).textFile("HELP.md").contains(AZURE_SECTION_TITLE); + assertThat(helpDocument(request)).contains(AZURE_SECTION_TITLE); } @Test void functionBuildSetupInfoSectionNotAddedWhenFunctionAndCloudDependenciesAbsent() { ProjectRequest request = createProjectRequest(); - assertThat(generateProject(request)).textFile("HELP.md").doesNotContain(AZURE_SECTION_TITLE); + assertThat(helpDocument(request)).doesNotContain(AZURE_SECTION_TITLE); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudGatewayHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudGatewayHelpDocumentCustomizerTests.java deleted file mode 100644 index 84dcd2fbc6..0000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudGatewayHelpDocumentCustomizerTests.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2012-2021 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.springcloud; - -import io.spring.initializr.generator.buildsystem.Dependency; -import io.spring.initializr.generator.io.template.MustacheTemplateRenderer; -import io.spring.initializr.generator.project.MutableProjectDescription; -import io.spring.initializr.generator.project.ProjectDescriptionDiff; -import io.spring.initializr.generator.spring.documentation.HelpDocument; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; - -/** - * Tests for {@link SpringCloudGatewayHelpDocumentCustomizer}. - * - * @author Stephane Nicoll - */ -class SpringCloudGatewayHelpDocumentCustomizerTests { - - @Test - void originalWithSpringCloudGatewayAndSpringWebAddsWarning() { - HelpDocument document = customizeEmptyDocument(createDiff("web", "cloud-gateway")); - assertThat(document.getWarnings().getItems()).hasSize(1); - assertThat(document.getWarnings().getItems().get(0)).isEqualTo( - "Spring Cloud Gateway requires Spring WebFlux, your choice of Spring Web has been replaced accordingly."); - } - - @Test - void originalWithSpringCloudGatewayDoesNotAddWarning() { - HelpDocument document = customizeEmptyDocument(createDiff("cloud-gateway")); - assertThat(document.getWarnings().getItems()).isEmpty(); - } - - @Test - void originalWithSpringWebOnlyDoesNotAddWarning() { - HelpDocument document = customizeEmptyDocument(createDiff("web")); - assertThat(document.getWarnings().getItems()).isEmpty(); - } - - private HelpDocument customizeEmptyDocument(ProjectDescriptionDiff diff) { - HelpDocument document = new HelpDocument(mock(MustacheTemplateRenderer.class)); - new SpringCloudGatewayHelpDocumentCustomizer(diff).customize(document); - return document; - } - - private ProjectDescriptionDiff createDiff(String... dependencies) { - MutableProjectDescription description = new MutableProjectDescription(); - for (String dependency : dependencies) { - description.addDependency(dependency, mock(Dependency.class)); - } - return new ProjectDescriptionDiff(description); - } - -} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfigurationTests.java index 112f8379a3..477535adb9 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,6 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; +import org.springframework.test.context.ActiveProfiles; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -40,6 +41,7 @@ * @author Stephane Nicoll */ @SpringBootTest +@ActiveProfiles("test") class SpringCloudProjectGenerationConfigurationTests { @Autowired diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectVersionResolverTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectVersionResolverTests.java index 012d0df61f..59ae742e97 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectVersionResolverTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectVersionResolverTests.java @@ -22,7 +22,7 @@ import io.spring.initializr.generator.version.VersionParser; import io.spring.initializr.metadata.BillOfMaterials; import io.spring.initializr.metadata.InitializrMetadata; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -36,7 +36,7 @@ */ class SpringCloudProjectVersionResolverTests { - private final DependencyManagementVersionResolver versionResolver = mock(DependencyManagementVersionResolver.class); + private final MavenVersionResolver versionResolver = mock(MavenVersionResolver.class); @Test void resolveWithNoSpringCloudBom() { @@ -51,7 +51,8 @@ void resolveWithNoSpringCloudBom() { void resolveWithUnknownArtifactId() { BillOfMaterials bom = BillOfMaterials.create("org.springframework.cloud", "spring-cloud-dependencies", "1.0.0"); InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults().addBom("spring-cloud", bom).build(); - given(this.versionResolver.resolve("org.springframework.cloud", "spring-cloud-dependencies", "1.0.0")) + given(this.versionResolver.resolveDependencies("org.springframework.cloud", "spring-cloud-dependencies", + "1.0.0")) .willReturn(Collections.singletonMap("org.springframework.cloud:spring-cloud", "1.1.0")); String version = new SpringCloudProjectVersionResolver(metadata, this.versionResolver) .resolveVersion(VersionParser.DEFAULT.parse("2.1.0.RELEASE"), "org.springframework.cloud:test"); @@ -62,7 +63,8 @@ void resolveWithUnknownArtifactId() { void resolveManagedArtifact() { BillOfMaterials bom = BillOfMaterials.create("org.springframework.cloud", "spring-cloud-dependencies", "1.0.0"); InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults().addBom("spring-cloud", bom).build(); - given(this.versionResolver.resolve("org.springframework.cloud", "spring-cloud-dependencies", "1.0.0")) + given(this.versionResolver.resolveDependencies("org.springframework.cloud", "spring-cloud-dependencies", + "1.0.0")) .willReturn(Collections.singletonMap("org.springframework.cloud:spring-cloud", "1.1.0")); String version = new SpringCloudProjectVersionResolver(metadata, this.versionResolver) .resolveVersion(VersionParser.DEFAULT.parse("2.1.0.RELEASE"), "org.springframework.cloud:spring-cloud"); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java index ad9bced503..0d5b7ba54c 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java @@ -16,16 +16,10 @@ package io.spring.start.site.extension.dependency.springcloud; -import java.util.stream.Stream; - -import io.spring.initializr.generator.version.Version; import io.spring.initializr.metadata.Dependency; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; import static org.assertj.core.api.Assertions.assertThat; @@ -34,6 +28,7 @@ * * @author Stephane Nicoll * @author Brian Clozel + * @author Chris Bono */ class SpringCloudStreamBuildCustomizerTests extends AbstractExtensionTests { @@ -43,53 +38,60 @@ class SpringCloudStreamBuildCustomizerTests extends AbstractExtensionTests { private static final Dependency KAFKA_STREAMS_BINDER = Dependency.withId("cloud-stream-binder-kafka-streams", "org.springframework.cloud", "spring-cloud-stream-binder-kafka-streams"); + private static final Dependency PULSAR_BINDER = Dependency.withId("cloud-stream-binder-pulsar", + "org.springframework.cloud", "spring-cloud-stream-binder-pulsar"); + private static final Dependency RABBIT_BINDER = Dependency.withId("cloud-stream-binder-rabbit", "org.springframework.cloud", "spring-cloud-stream-binder-rabbit"); - @ParameterizedTest - @MethodSource("springCloudStreamArguments") - void springCloudStreamWithRabbit(Version springBootVersion, Dependency testDependency) { + private static final Dependency TEST_BINDER = Dependency.withId("cloud-stream-test", "org.springframework.cloud", + "spring-cloud-stream-test-binder", null, Dependency.SCOPE_TEST); + + @Test + void springCloudStreamWithRabbit() { ProjectRequest request = createProjectRequest("cloud-stream", "amqp"); - request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("amqp")) .hasDependency(RABBIT_BINDER) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) - .hasDependency(testDependency) + .hasDependency(TEST_BINDER) .hasDependenciesSize(6); } - @ParameterizedTest - @MethodSource("springCloudStreamArguments") - void springCloudStreamWithKafka(Version springBootVersion, Dependency testDependency) { + @Test + void springCloudStreamWithKafka() { ProjectRequest request = createProjectRequest("cloud-stream", "kafka"); - request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("kafka")) .hasDependency(KAFKA_BINDER) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) - .hasDependency(testDependency) + .hasDependency(TEST_BINDER) .hasDependenciesSize(6); } - @ParameterizedTest - @MethodSource("springCloudStreamArguments") - void springCloudStreamWithKafkaStreams(Version springBootVersion, Dependency testDependency) { + @Test + void springCloudStreamWithKafkaStreams() { ProjectRequest request = createProjectRequest("cloud-stream", "kafka-streams"); - request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("kafka-streams")) .hasDependency(KAFKA_STREAMS_BINDER) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) - .hasDependency(testDependency) + .hasDependency(TEST_BINDER) .hasDependenciesSize(5); } - @ParameterizedTest - @MethodSource("springCloudStreamArguments") - void springCloudStreamWithAllBinders(Version springBootVersion, Dependency testDependency) { + @Test + void springCloudStreamWithPulsar() { + ProjectRequest request = createProjectRequest("cloud-stream", "pulsar"); + assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) + .hasDependency(getDependency("pulsar")) + .hasDependency(PULSAR_BINDER) + .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)); + } + + @Test + void springCloudStreamWithAllBinders() { ProjectRequest request = createProjectRequest("cloud-stream", "amqp", "kafka", "kafka-streams"); - request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("amqp")) .hasDependency(getDependency("kafka")) @@ -98,15 +100,13 @@ void springCloudStreamWithAllBinders(Version springBootVersion, Dependency testD .hasDependency(KAFKA_BINDER) .hasDependency(KAFKA_STREAMS_BINDER) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) - .hasDependency(testDependency) + .hasDependency(TEST_BINDER) .hasDependenciesSize(11); } - @ParameterizedTest - @MethodSource("springCloudStreamArguments") - void springCloudBusWithRabbit(Version springBootVersion, Dependency testDependency) { + @Test + void springCloudBusWithRabbit() { ProjectRequest request = createProjectRequest("cloud-bus", "amqp"); - request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(RABBIT_BINDER) @@ -114,11 +114,9 @@ void springCloudBusWithRabbit(Version springBootVersion, Dependency testDependen .hasDependenciesSize(5); } - @ParameterizedTest - @MethodSource("springCloudStreamArguments") - void springCloudBusWithKafka(Version springBootVersion, Dependency testDependency) { + @Test + void springCloudBusWithKafka() { ProjectRequest request = createProjectRequest("cloud-bus", "amqp"); - request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(RABBIT_BINDER) @@ -126,11 +124,9 @@ void springCloudBusWithKafka(Version springBootVersion, Dependency testDependenc .hasDependenciesSize(5); } - @ParameterizedTest - @MethodSource("springCloudStreamArguments") - void springCloudBusWithAllBinders(Version springBootVersion, Dependency testDependency) { + @Test + void springCloudBusWithAllBinders() { ProjectRequest request = createProjectRequest("cloud-bus", "amqp", "kafka", "kafka-streams"); - request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(getDependency("kafka")) @@ -141,22 +137,4 @@ void springCloudBusWithAllBinders(Version springBootVersion, Dependency testDepe .hasDependenciesSize(9); } - @Test - void springCloudStreamWithGradleBuildDoesNotAddTestDependency() { - ProjectRequest request = createProjectRequest("cloud-stream", "amqp"); - request.setBootVersion("2.7.0"); - assertThat(gradleBuild(request)).doesNotContain("test-binder"); - } - - private static Stream springCloudStreamArguments() { - Dependency scsTest = Dependency.withId("cloud-stream-test", "org.springframework.cloud", "spring-cloud-stream", - null, Dependency.SCOPE_TEST); - scsTest.setClassifier("test-binder"); - scsTest.setType("test-jar"); - Dependency testBinder = Dependency.withId("cloud-stream-test", "org.springframework.cloud", - "spring-cloud-stream-test-binder", null, Dependency.SCOPE_TEST); - return Stream.of(Arguments.of(Version.parse("2.7.0"), scsTest), - Arguments.of(Version.parse("3.0.0"), testBinder)); - } - } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizerTests.java index 40479d9c22..abb43ae8e0 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizerTests.java @@ -33,6 +33,7 @@ * Tests for {@link R2dbcBuildCustomizer}. * * @author Stephane Nicoll + * @author Eddú Meléndez */ class R2dbcBuildCustomizerTests extends AbstractExtensionTests { @@ -46,17 +47,7 @@ void r2dbcWithH2() { } @Test - void r2dbcWithMariadbAndBorca() { - Build build = createBuild(); - build.dependencies().add("data-r2dbc"); - build.dependencies().add("mariadb"); - customize(build, Version.parse("2.7.6")); - assertThat(build.dependencies().ids()).containsOnly("data-r2dbc", "mariadb", "r2dbc-mariadb"); - assertThat(build.dependencies().get("r2dbc-mariadb").getVersion()).isNull(); - } - - @Test - void r2dbcWithMariadbAfterBorca() { + void r2dbcWithMariadb() { Build build = createBuild(); build.dependencies().add("data-r2dbc"); build.dependencies().add("mariadb"); @@ -70,17 +61,9 @@ void r2dbcWithMysql() { Build build = createBuild(); build.dependencies().add("data-r2dbc"); build.dependencies().add("mysql"); - customize(build, Version.parse("2.6.8")); + customize(build); assertThat(build.dependencies().ids()).containsOnly("data-r2dbc", "mysql", "r2dbc-mysql"); - } - - @Test - void r2dbcWithMysqlAndBorca() { - Build build = createBuild(); - build.dependencies().add("data-r2dbc"); - build.dependencies().add("mysql"); - customize(build, Version.parse("2.7.0")); - assertThat(build.dependencies().ids()).containsOnly("data-r2dbc", "mysql"); + assertThat(build.dependencies().get("r2dbc-mysql").getGroupId()).isEqualTo("io.asyncer"); } @Test @@ -88,33 +71,13 @@ void r2dbcWithPostgresql() { Build build = createBuild(); build.dependencies().add("data-r2dbc"); build.dependencies().add("postgresql"); - customize(build, Version.parse("2.6.8")); - assertThat(build.dependencies().ids()).containsOnly("data-r2dbc", "postgresql", "r2dbc-postgresql"); - assertThat(build.dependencies().get("r2dbc-postgresql").getGroupId()).isEqualTo("io.r2dbc"); - } - - @Test - void r2dbcWithPostgresqlAndBorca() { - Build build = createBuild(); - build.dependencies().add("data-r2dbc"); - build.dependencies().add("postgresql"); - customize(build, Version.parse("3.0.0-M2")); + customize(build); assertThat(build.dependencies().ids()).containsOnly("data-r2dbc", "postgresql", "r2dbc-postgresql"); assertThat(build.dependencies().get("r2dbc-postgresql").getGroupId()).isEqualTo("org.postgresql"); } @Test void r2dbcWithSqlserver() { - Build build = createBuild(); - build.dependencies().add("data-r2dbc"); - build.dependencies().add("sqlserver"); - customize(build, Version.parse("2.7.6")); - assertThat(build.dependencies().ids()).containsOnly("data-r2dbc", "sqlserver", "r2dbc-mssql"); - assertThat(build.dependencies().get("r2dbc-mssql").getVersion()).isNull(); - } - - @Test - void r2dbcWithSqlserverAfterBorca() { Build build = createBuild(); build.dependencies().add("data-r2dbc"); build.dependencies().add("sqlserver"); @@ -125,7 +88,7 @@ void r2dbcWithSqlserverAfterBorca() { } @Test - void r2dbcWithOracleAfterBorca() { + void r2dbcWithOracle() { Build build = createBuild(); build.dependencies().add("data-r2dbc"); build.dependencies().add("oracle"); @@ -179,11 +142,7 @@ private Build createBuild() { } private void customize(Build build) { - customize(build, getDefaultPlatformVersion(getMetadata())); - } - - private void customize(Build build, Version platformVersion) { - new R2dbcBuildCustomizer(platformVersion).customize(build); + new R2dbcBuildCustomizer().customize(build); } private Version getDefaultPlatformVersion(InitializrMetadata metadata) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizerTests.java index 486c7808ee..9ab9dec385 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizerTests.java @@ -69,6 +69,12 @@ void r2dbcWithOracle() { assertThat(helpDocument.getSections()).isEmpty(); } + @Test + void r2dbcWithMysql() { + HelpDocument helpDocument = createHelpDocument("mysql"); + assertThat(helpDocument.getSections()).isEmpty(); + } + @Test void r2dbcWithSeveralDrivers() { HelpDocument helpDocument = createHelpDocument("mysql", "h2"); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..a4224130d2 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java @@ -0,0 +1,177 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springgrpc; + +import io.spring.initializr.metadata.Dependency; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringGrpcProjectGenerationConfiguration}. + * + * @author Moritz Halbritter + */ +class SpringGrpcProjectGenerationConfigurationTests extends AbstractExtensionTests { + + private static final String SPRING_GRPC = "spring-grpc"; + + @Test + void shouldDoNothingIfSpringGrpcIsntSelected() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotHaveDependency("io.grpc", "grpc-services") + .doesNotHaveDependency("org.springframework.grpc", "spring-grpc-test") + .doesNotContain("os-maven-plugin") + .doesNotContain("protobuf-maven-plugin") + .doesNotHaveProperty("grpc.version") + .doesNotHaveProperty("protobuf-java.version"); + assertThat(generateProject(request)).doesNotContainDirectories("src/main/proto"); + } + + @Test + void shouldAddAdditionalDependenciesForMaven() { + ProjectRequest request = createProjectRequest(SPRING_GRPC); + assertThat(mavenPom(request)).hasDependency("io.grpc", "grpc-services", null, Dependency.SCOPE_COMPILE) + .hasDependency("org.springframework.grpc", "spring-grpc-test", null, Dependency.SCOPE_TEST); + } + + @Test + void shouldAddAdditionalDependenciesForGradle() { + ProjectRequest request = createProjectRequest(SPRING_GRPC); + request.setType("gradle-project"); + assertThat(gradleBuild(request)).contains("implementation 'io.grpc:grpc-services'") + .contains("testImplementation 'org.springframework.grpc:spring-grpc-test'"); + } + + @Test + void shouldAddGrpcPluginAndConfigurationForGradleGroovy() { + ProjectRequest request = createProjectRequest(SPRING_GRPC); + request.setType("gradle-project"); + assertThat(gradleBuild(request)).hasPlugin("com.google.protobuf", "0.9.4").containsIgnoringWhitespaces(""" + protobuf { + protoc { + artifact = 'com.google.protobuf:protoc' + } + plugins { + grpc { + artifact = 'io.grpc:protoc-gen-grpc-java' + } + } + generateProtoTasks { + all()*.plugins { + grpc { + option 'jakarta_omit' + option '@generated=omit' + } + } + } + } + """); + } + + @Test + void shouldAddGrpcPluginAndConfigurationForGradleKotlin() { + ProjectRequest request = createProjectRequest(SPRING_GRPC); + request.setType("gradle-project-kotlin"); + assertThat(gradleKotlinDslBuild(request)).hasPlugin("com.google.protobuf", "0.9.4") + .contains("import com.google.protobuf.gradle.id") + .containsIgnoringWhitespaces(""" + protobuf { + protoc { + artifact = "com.google.protobuf:protoc" + } + plugins { + id("grpc") { + artifact = "io.grpc:protoc-gen-grpc-java" + } + } + generateProtoTasks { + all().forEach { + it.plugins { + id("grpc") { + option("jakarta_omit") + option("@generated=omit") + } + } + } + } + } + """); + } + + @Test + void shouldAddOsPluginForMaven() { + ProjectRequest request = createProjectRequest(SPRING_GRPC); + assertThat(mavenPom(request)).containsIgnoringWhitespaces(""" + + kr.motd.maven + os-maven-plugin + 1.7.1 + + + initialize + initialize + + detect + + + + + """); + } + + @Test + void shouldAddProtobufPluginForMaven() { + ProjectRequest request = createProjectRequest(SPRING_GRPC); + assertThat(mavenPom(request)).hasProperty("grpc.version", "1.69.0") + .hasProperty("protobuf-java.version", "3.25.5") + .containsIgnoringWhitespaces( + """ + + org.xolstice.maven.plugins + protobuf-maven-plugin + 0.6.1 + + com.google.protobuf:protoc:${protobuf-java.version}:exe:${os.detected.classifier} + grpc-java + io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier} + + + + compile + + compile + compile-custom + + + jakarta_omit,@generated=omit + + + + + """); + } + + @Test + void shouldCreateSrcMainProtoDirectory() { + ProjectRequest request = createProjectRequest(SPRING_GRPC); + assertThat(generateProject(request)).containsDirectories("src/main/proto"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java index ea2193d2e7..932dfa6d1b 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,7 @@ * @author Stephane Nicoll * @author Artem Bilan * @author Brian Clozel + * @author Moritz Halbritter */ class SpringIntegrationProjectGenerationConfigurationTests extends AbstractExtensionTests { @@ -60,13 +61,13 @@ void buildWithSupportedEntries(String springBootDependencyId, String integration static Stream supportedEntries() { return Stream.of(Arguments.arguments("artemis", "jms"), Arguments.arguments("amqp", "amqp"), - Arguments.arguments("data-jdbc", "jdbc"), Arguments.arguments("jdbc", "jdbc"), - Arguments.arguments("data-jpa", "jpa"), Arguments.arguments("data-mongodb", "mongodb"), - Arguments.arguments("data-mongodb-reactive", "mongodb"), Arguments.arguments("data-r2dbc", "r2dbc"), - Arguments.arguments("data-redis", "redis"), Arguments.arguments("data-redis-reactive", "redis"), - Arguments.arguments("kafka", "kafka"), Arguments.arguments("kafka-streams", "kafka"), - Arguments.arguments("mail", "mail"), Arguments.arguments("rsocket", "rsocket"), - Arguments.arguments("security", "security"), Arguments.arguments("web", "http"), + Arguments.arguments("amqp-streams", "amqp"), Arguments.arguments("data-jdbc", "jdbc"), + Arguments.arguments("jdbc", "jdbc"), Arguments.arguments("data-jpa", "jpa"), + Arguments.arguments("data-mongodb", "mongodb"), Arguments.arguments("data-mongodb-reactive", "mongodb"), + Arguments.arguments("data-r2dbc", "r2dbc"), Arguments.arguments("data-redis", "redis"), + Arguments.arguments("data-redis-reactive", "redis"), Arguments.arguments("kafka", "kafka"), + Arguments.arguments("kafka-streams", "kafka"), Arguments.arguments("mail", "mail"), + Arguments.arguments("rsocket", "rsocket"), Arguments.arguments("web", "http"), Arguments.arguments("webflux", "webflux"), Arguments.arguments("websocket", "websocket"), Arguments.arguments("websocket", "stomp"), Arguments.arguments("web-services", "ws")); } @@ -75,33 +76,42 @@ static Stream supportedEntries() { @MethodSource("referenceLinks") void linkToSupportedEntriesWhenSpringIntegrationIsPresentIsAdded(String dependencyId, String pageName) { assertHelpDocument("integration", dependencyId) - .contains("https://docs.spring.io/spring-integration/reference/html/" + pageName + ".html"); + .contains("https://docs.spring.io/spring-integration/reference/%s.html".formatted(pageName)); } @ParameterizedTest @MethodSource("referenceLinks") void linkToSupportedEntriesWhenSpringIntegrationIsNotPresentIsNotAdded(String dependencyId, String pageName) { assertHelpDocument(dependencyId) - .doesNotContain("https://docs.spring.io/spring-integration/reference/html/" + pageName + ".html"); + .doesNotContain("https://docs.spring.io/spring-integration/reference/%s.html".formatted(pageName)); } static Stream referenceLinks() { return Stream.of(Arguments.arguments("artemis", "jms"), Arguments.arguments("amqp", "amqp"), - Arguments.arguments("data-jdbc", "jdbc"), Arguments.arguments("jdbc", "jdbc"), - Arguments.arguments("data-jpa", "jpa"), Arguments.arguments("data-mongodb", "mongodb"), - Arguments.arguments("data-mongodb-reactive", "mongodb"), Arguments.arguments("data-r2dbc", "r2dbc"), - Arguments.arguments("data-redis", "redis"), Arguments.arguments("data-redis-reactive", "redis"), - Arguments.arguments("kafka", "kafka"), Arguments.arguments("kafka-streams", "kafka"), - Arguments.arguments("mail", "mail"), Arguments.arguments("rsocket", "rsocket"), - Arguments.arguments("security", "security"), Arguments.arguments("web", "http"), - Arguments.arguments("webflux", "webflux"), Arguments.arguments("websocket", "web-sockets"), - Arguments.arguments("websocket", "stomp"), Arguments.arguments("web-services", "ws")); + Arguments.arguments("amqp-streams", "amqp"), Arguments.arguments("data-jdbc", "jdbc"), + Arguments.arguments("jdbc", "jdbc"), Arguments.arguments("data-jpa", "jpa"), + Arguments.arguments("data-mongodb", "mongodb"), Arguments.arguments("data-mongodb-reactive", "mongodb"), + Arguments.arguments("data-r2dbc", "r2dbc"), Arguments.arguments("data-redis", "redis"), + Arguments.arguments("data-redis-reactive", "redis"), Arguments.arguments("kafka", "kafka"), + Arguments.arguments("kafka-streams", "kafka"), Arguments.arguments("mail", "mail"), + Arguments.arguments("rsocket", "rsocket"), Arguments.arguments("security", "security"), + Arguments.arguments("web", "http"), Arguments.arguments("webflux", "webflux"), + Arguments.arguments("websocket", "web-sockets"), Arguments.arguments("websocket", "stomp"), + Arguments.arguments("web-services", "ws")); } @Test void linkToSupportedEntriesWhenTwoMatchesArePresentOnlyAddLinkOnce() { assertHelpDocument("testcontainers", "data-mongodb", "data-mongodb-reactive") - .containsOnlyOnce("https://www.testcontainers.org/modules/databases/mongodb/"); + .containsOnlyOnce("https://java.testcontainers.org/modules/databases/mongodb/"); + } + + @Test + void securityAddsSpringSecurityMessaging() { + assertThat(generateProject("integration", "security")).mavenBuild() + .hasDependency("org.springframework.security", "spring-security-messaging") + .doesNotHaveDependency("org.springframework.integration", "spring-integration-security"); + } private static Dependency integrationDependency(String id) { @@ -118,8 +128,7 @@ private ProjectStructure generateProject(String... dependencies) { private TextAssert assertHelpDocument(String... dependencyIds) { ProjectRequest request = createProjectRequest(dependencyIds); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + return assertThat(helpDocument(request)); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..8642bda14e --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfigurationTests.java @@ -0,0 +1,89 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springkafka; + +import io.spring.initializr.metadata.Dependency; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringKafkaProjectGenerationConfiguration}. + * + * @author Wonwoo Lee + * @author Stephane Nicoll + * @author Moritz Halbritter + */ +class SpringKafkaProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void springKafkaTestIsAdded() { + ProjectRequest request = createProjectRequest("kafka"); + Dependency kafkaTest = Dependency.withId("spring-kafka-test", "org.springframework.kafka", "spring-kafka-test", + null, Dependency.SCOPE_TEST); + assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) + .hasDependency(kafkaTest) + .hasDependenciesSize(4); + } + + @Test + void springKafkaTestIsNotAddedWithoutKafka() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("web")) + .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) + .hasDependenciesSize(2); + } + + @Test + void customizesBuildpacksBuilderWhenUsingMavenAndKafkaStreams() { + ProjectRequest request = createProjectRequest("kafka-streams"); + assertThat(mavenPom(request)).containsIgnoringWhitespaces(""" + + org.springframework.boot + spring-boot-maven-plugin + + + paketobuildpacks/builder-jammy-base:latest + + + + """); + } + + @Test + void customizesBuildpacksBuilderWhenUsingGradleGroovyAndKafkaStreams() { + ProjectRequest request = createProjectRequest("kafka-streams"); + assertThat(gradleBuild(request)).containsIgnoringWhitespaces(""" + tasks.named('bootBuildImage') { + builder = 'paketobuildpacks/builder-jammy-base:latest' + } + """); + } + + @Test + void customizesBuildpacksBuilderWhenUsingGradleKotlinAndKafkaStreams() { + ProjectRequest request = createProjectRequest("kafka-streams"); + assertThat(gradleKotlinDslBuild(request)).containsIgnoringWhitespaces(""" + tasks.bootBuildImage { + builder = "paketobuildpacks/builder-jammy-base:latest" + } + """); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java new file mode 100644 index 0000000000..86ce6f09e4 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java @@ -0,0 +1,106 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springmodulith; + +import java.util.Arrays; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.version.Version; +import io.spring.initializr.metadata.InitializrMetadata; +import io.spring.initializr.metadata.support.MetadataBuildItemResolver; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringModulithBuildCustomizer}. + * + * @author Oliver Drotbohm + */ +class SpringModulithBuildCustomizerTests extends AbstractExtensionTests { + + private final SpringModulithBuildCustomizer customizer = new SpringModulithBuildCustomizer(); + + @Test + void registersTestAndCoreStarterWhenModulithIsSelected() { + Build build = createBuild("modulith"); + this.customizer.customize(build); + assertThat(build.dependencies().ids()).contains("modulith"); + assertThat(build.dependencies().ids()).contains("modulith-starter-test"); + } + + @Test + void registersActuatorStarterIfActuatorsIsPresent() { + Build build = createBuild("modulith", "actuator"); + this.customizer.customize(build); + assertThat(build.dependencies().ids()).contains("modulith-actuator"); + } + + @ParameterizedTest + @ValueSource(strings = { "actuator", "datadog", "graphite", "influx", "new-relic", "otlp-metrics", "prometheus", + "wavefront", "zipkin" }) + void registersObservabilityStarterIfObservabilityDependencyIsPresent(String dependency) { + Build build = createBuild("modulith"); + build.dependencies().add(dependency); + this.customizer.customize(build); + assertThat(build.dependencies().ids()).contains("modulith-observability"); + } + + @ParameterizedTest + @ValueSource(strings = { "jdbc", "jpa", "mongodb" }) + void presenceOfSpringDataModuleAddsModuleEventStarter(String store) { + Build build = createBuild("modulith"); + build.dependencies().add("data-" + store); + this.customizer.customize(build); + assertThat(build.dependencies().ids()).contains("modulith-starter-" + store); + assertThat(build.dependencies().ids()).doesNotContain("modulith-starter-core"); + } + + @ParameterizedTest + @ValueSource(strings = { "amqp", "kafka" }) + void addsExternalizationDependency(String broker) { + Build build = createBuild("modulith", broker); + this.customizer.customize(build); + assertThat(build.dependencies().ids()).contains("modulith-events-" + broker); + assertThat(build.dependencies().ids()).contains("modulith-events-api"); + } + + @ParameterizedTest + @ValueSource(strings = { "activemq", "artemis" }) + void addsJmsExternalizationDependency(String broker) { + Build build = createBuild("modulith", broker); + this.customizer.customize(build); + assertThat(build.dependencies().ids()).contains("modulith-events-jms"); + assertThat(build.dependencies().ids()).contains("modulith-events-api"); + } + + private Build createBuild(String... dependencies) { + InitializrMetadata metadata = getMetadata(); + MavenBuild build = new MavenBuild(new MetadataBuildItemResolver(metadata, getDefaultPlatformVersion(metadata))); + Arrays.stream(dependencies).forEach(build.dependencies()::add); + return build; + } + + private Version getDefaultPlatformVersion(InitializrMetadata metadata) { + return Version.parse(metadata.getBootVersions().getDefault().getId()); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarBinderBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarBinderBuildCustomizerTests.java deleted file mode 100644 index 62c7b2ac40..0000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarBinderBuildCustomizerTests.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.springpulsar; - -import io.spring.initializr.generator.test.project.ProjectStructure; -import io.spring.initializr.web.project.ProjectRequest; -import io.spring.start.site.extension.AbstractExtensionTests; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for {@link SpringPulsarBinderBuildCustomizer}. - * - * @author Chris Bono - */ -class SpringPulsarBinderBuildCustomizerTests extends AbstractExtensionTests { - - @Test - void binderNotAddedWhenPulsarNotSelected() { - ProjectStructure project = generateProject(createProjectRequest("cloud-stream")); - assertNoBinder(project); - } - - @Test - void binderNotAddedWhenCloudStreamNotSelected() { - ProjectRequest request = createProjectRequest("pulsar"); - request.setBootVersion("3.0.4"); - ProjectStructure project = generateProject(request); - assertNoBinder(project); - assertThat(project).mavenBuild().hasDependency(getDependency("pulsar")); - } - - @Test - void binderAddedWhenPulsarAndCloudStreamSelected() { - ProjectRequest request = createProjectRequest("pulsar", "cloud-stream"); - request.setBootVersion("3.0.4"); - ProjectStructure project = generateProject(request); - assertThat(project).mavenBuild() - .hasDependency("org.springframework.pulsar", "spring-pulsar-spring-cloud-stream-binder", "0.2.0"); - } - - private void assertNoBinder(ProjectStructure project) { - assertThat(project).mavenBuild() - .doesNotHaveDependency("org.springframework.pulsar", "spring-pulsar-spring-cloud-stream-binder"); - } - -} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..6695d762a6 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java @@ -0,0 +1,147 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springpulsar; + +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.project.MutableProjectDescription; +import io.spring.initializr.generator.test.project.ProjectAssetTester; +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.generator.version.Version; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections; +import io.spring.start.site.container.ServiceConnectionsCustomizer; +import io.spring.start.site.container.SimpleDockerServiceResolver; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +/** + * Tests for {@link SpringPulsarProjectGenerationConfiguration}. + * + * @author Chris Bono + */ +class SpringPulsarProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Nested + class PulsarDependencyConfigurationTests { + + @Test + void pulsarBootStarterUsed() { + ProjectRequest request = createProjectRequest("pulsar"); + ProjectStructure project = generateProject(request); + assertThat(project).mavenBuild().hasDependency("org.springframework.boot", "spring-boot-starter-pulsar"); + } + + @Test + void pulsarReactiveBootStarterUsed() { + ProjectRequest request = createProjectRequest("pulsar-reactive"); + ProjectStructure project = generateProject(request); + assertThat(project).mavenBuild() + .hasDependency("org.springframework.boot", "spring-boot-starter-pulsar-reactive"); + } + + } + + @Nested + class DockerComposeConfigurationTests { + + @Test + void serviceNotCreatedWhenDockerComposeNotSelected() { + ProjectRequest request = createProjectRequest("pulsar"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @ParameterizedTest + @ValueSource(strings = { "pulsar", "pulsar-reactive" }) + void serviceCreatedWhenDockerComposeSelectedWithCompatibleBootVersion(String pulsarDependencyId) { + ProjectRequest request = createProjectRequest("docker-compose", pulsarDependencyId); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/pulsar.yaml")); + } + + } + + @Nested + class ServiceConnectionConfigurationTests { + + private final ProjectAssetTester projectTester = new ProjectAssetTester() + .withConfiguration(SpringPulsarProjectGenerationConfiguration.class) + .withBean(DockerServiceResolver.class, SimpleDockerServiceResolver::new); + + @Test + void connectionNotAddedWhenTestcontainersNotSelected() { + MutableProjectDescription description = new MutableProjectDescription(); + description.setPlatformVersion(Version.parse(SupportedBootVersion.latest().getVersion())); + description.addDependency("pulsar", mock(Dependency.class)); + this.projectTester.configure(description, + (context) -> assertThat(context).doesNotHaveBean("pulsarServiceConnectionsCustomizer")); + } + + @Test + void connectionNotAddedWhenPulsarNotSelected() { + MutableProjectDescription description = new MutableProjectDescription(); + description.setPlatformVersion(Version.parse(SupportedBootVersion.latest().getVersion())); + description.addDependency("testcontainers", mock(Dependency.class)); + this.projectTester.configure(description, + (context) -> assertThat(context).doesNotHaveBean("pulsarServiceConnectionsCustomizer")); + } + + @ParameterizedTest + @ValueSource(strings = { "pulsar", "pulsar-reactive" }) + void connectionAddedWhenTestcontainersAndPulsarSelectedWithCompatibleBootVersion(String pulsarDependencyId) { + MutableProjectDescription description = new MutableProjectDescription(); + description.setPlatformVersion(Version.parse(SupportedBootVersion.latest().getVersion())); + description.addDependency("testcontainers", mock(Dependency.class)); + description.addDependency(pulsarDependencyId, mock(Dependency.class)); + this.projectTester.configure(description, + (context) -> assertThat(context) + .getBean("pulsarServiceConnectionsCustomizer", ServiceConnectionsCustomizer.class) + .satisfies((customizer) -> { + ServiceConnections connections = new ServiceConnections(); + customizer.customize(connections); + assertPulsarServiceConnectionAdded(connections); + })); + } + + private void assertPulsarServiceConnectionAdded(ServiceConnections connections) { + assertThat(connections.values()).first().satisfies((connection) -> { + assertThat(connection.id()).isEqualTo("pulsar"); + assertThat(connection.containerClassName()).isEqualTo("org.testcontainers.containers.PulsarContainer"); + assertThat(connection.isGenericContainer()).isFalse(); + assertThat(connection.containerClassNameGeneric()).isFalse(); + assertThat(connection.dockerService()).satisfies((dockerService) -> { + assertThat(dockerService.getImage()).isEqualTo("apachepulsar/pulsar"); + assertThat(dockerService.getImageTag()).isEqualTo("latest"); + assertThat(dockerService.getWebsite()).isEqualTo("https://hub.docker.com/r/apachepulsar/pulsar"); + assertThat(dockerService.getCommand()).isEqualTo("bin/pulsar standalone"); + assertThat(dockerService.getPorts()).containsExactlyInAnyOrder(8080, 6650); + }); + }); + } + + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizerTests.java similarity index 88% rename from start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleBuildCustomizerTests.java rename to start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizerTests.java index 725daf3cf2..a0fbf82ced 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,15 +26,16 @@ import static org.assertj.core.api.Assertions.entry; /** - * Tests for {@link SpringRestDocsGradleBuildCustomizer}. + * Tests for {@link SpringRestDocsGradleGroovyBuildCustomizer}. * * @author Andy Wilkinson */ -class SpringRestDocsGradleBuildCustomizerTests { +class SpringRestDocsGradleGroovyBuildCustomizerTests { - private final SpringRestDocsGradleBuildCustomizer customizer = new SpringRestDocsGradleBuildCustomizer(); + private final SpringRestDocsGradleGroovyBuildCustomizer customizer = new SpringRestDocsGradleGroovyBuildCustomizer(); @Test + @SuppressWarnings("removal") void customizesGradleBuild() { GradleBuild build = new GradleBuild(); this.customizer.customize(build); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizerTests.java new file mode 100644 index 0000000000..42a7917e63 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizerTests.java @@ -0,0 +1,64 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springrestdocs; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.buildsystem.gradle.GradleTask; +import io.spring.initializr.generator.buildsystem.gradle.GradleTask.Invocation; +import io.spring.initializr.generator.buildsystem.gradle.StandardGradlePlugin; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.entry; + +/** + * Tests for {@link SpringRestDocsGradleKotlinBuildCustomizer}. + * + * @author Moritz Halbritter + */ +@SuppressWarnings("removal") +class SpringRestDocsGradleKotlinBuildCustomizerTests { + + private final SpringRestDocsGradleKotlinBuildCustomizer customizer = new SpringRestDocsGradleKotlinBuildCustomizer(); + + @Test + void customizesGradleBuild() { + GradleBuild build = new GradleBuild(); + this.customizer.customize(build); + assertThat(build.plugins().values()).singleElement().satisfies((plugin) -> { + assertThat(plugin.getId()).isEqualTo("org.asciidoctor.jvm.convert"); + assertThat(((StandardGradlePlugin) plugin).getVersion()).isEqualTo("3.3.2"); + }); + assertThat(build.properties().values()).contains(entry("snippetsDir", "file(\"build/generated-snippets\")")); + GradleTask testTask = build.tasks().get("test"); + assertThat(testTask).isNotNull(); + assertThat(testTask.getInvocations()).hasSize(1); + Invocation invocation = testTask.getInvocations().get(0); + assertThat(invocation.getTarget()).isEqualTo("outputs.dir"); + assertThat(invocation.getArguments()).containsExactly("project.extra[\"snippetsDir\"]!!"); + GradleTask asciidoctorTask = build.tasks().get("asciidoctor"); + assertThat(asciidoctorTask).isNotNull(); + assertThat(asciidoctorTask.getInvocations()).hasSize(2); + Invocation inputsDir = asciidoctorTask.getInvocations().get(0); + assertThat(inputsDir.getTarget()).isEqualTo("inputs.dir"); + assertThat(inputsDir.getArguments()).containsExactly("project.extra[\"snippetsDir\"]!!"); + Invocation dependsOn = asciidoctorTask.getInvocations().get(1); + assertThat(dependsOn.getTarget()).isEqualTo("dependsOn"); + assertThat(dependsOn.getArguments()).containsExactly("tasks.test"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsProjectGenerationConfigurationTests.java index c74518a515..c7fd51bd19 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,7 @@ * Tests for {@link SpringRestDocsProjectGenerationConfiguration}. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class SpringRestDocsProjectGenerationConfigurationTests { @@ -49,13 +50,26 @@ void springRestDocsCustomizerMaven() { } @Test - void springRestDocsCustomizerGradle() { + void springRestDocsCustomizerGradleGroovy() { MutableProjectDescription description = new MutableProjectDescription(); - description.setBuildSystem(new GradleBuildSystem()); + description.setBuildSystem(new GradleBuildSystem(GradleBuildSystem.DIALECT_GROOVY)); + description.addDependency("restdocs", mock(Dependency.class)); + this.projectTester.configure(description, + (context) -> assertThat(context).getBeans(BuildCustomizer.class) + .containsKeys("restDocsGradleGroovyBuildCustomizer") + .doesNotContainKeys("restDocsGradleKotlinBuildCustomizer") + .doesNotContainKeys("restDocsMavenBuildCustomizer")); + } + + @Test + void springRestDocsCustomizerGradleKotlin() { + MutableProjectDescription description = new MutableProjectDescription(); + description.setBuildSystem(new GradleBuildSystem(GradleBuildSystem.DIALECT_KOTLIN)); description.addDependency("restdocs", mock(Dependency.class)); this.projectTester.configure(description, (context) -> assertThat(context).getBeans(BuildCustomizer.class) - .containsKeys("restDocsGradleBuildCustomizer") + .containsKeys("restDocsGradleKotlinBuildCustomizer") + .doesNotContainKeys("restDocsGradleGroovyBuildCustomizer") .doesNotContainKeys("restDocsMavenBuildCustomizer")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springsecurity/SpringSecurityTestBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springsecurity/SpringSecurityTestBuildCustomizerTests.java index 4f70572652..1f9f392ff1 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springsecurity/SpringSecurityTestBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springsecurity/SpringSecurityTestBuildCustomizerTests.java @@ -27,6 +27,7 @@ * Tests for {@link SpringSecurityTestBuildCustomizer}. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class SpringSecurityTestBuildCustomizerTests extends AbstractExtensionTests { @@ -39,6 +40,15 @@ void securityTestIsAddedWithSecurity() { .hasDependenciesSize(3); } + @Test + void securityTestIsAddedWithOAuth2Client() { + ProjectRequest request = createProjectRequest("oauth2-client"); + assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("oauth2-client")) + .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) + .hasDependency(springSecurityTest()) + .hasDependenciesSize(3); + } + @Test void securityTestIsNotAddedWithoutSpringSecurity() { ProjectRequest request = createProjectRequest("web"); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizerTests.java new file mode 100644 index 0000000000..085df995c1 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizerTests.java @@ -0,0 +1,65 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springshell; + +import io.spring.initializr.metadata.BillOfMaterials; +import io.spring.initializr.metadata.Dependency; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringShellTestBuildCustomizer}. + * + * @author DaShaun Carter + */ +class SpringShellTestBuildCustomizerTests extends AbstractExtensionTests { + + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); + + @Test + void shellTestIsAddedWithSpringShell() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "spring-shell"); + BillOfMaterials bom = getBom("spring-shell", request.getBootVersion()); + assertThat(mavenPom(request)).hasDependency(getDependency("spring-shell")) + .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) + .hasDependency(springShellStarterTest()) + .hasDependenciesSize(3) + .hasBom("org.springframework.shell", "spring-shell-dependencies", "${spring-shell.version}") + .hasBomsSize(1) + .hasProperty("spring-shell.version", bom.getVersion()); + } + + @Test + void shellTestIsNotAddedWithoutSpringShell() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("web")) + .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) + .hasDependenciesSize(2); + } + + private static Dependency springShellStarterTest() { + Dependency dependency = Dependency.withId("spring-shell-starter-test", "org.springframework.shell", + "spring-shell-starter-test"); + dependency.setScope(Dependency.SCOPE_TEST); + return dependency; + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index 3288cc20a1..9521353576 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,9 +20,10 @@ import io.spring.initializr.generator.test.io.TextAssert; import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.generator.version.Version; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -37,136 +38,142 @@ * @author Stephane Nicoll * @author Eddú Meléndez * @author Chris Bono + * @author Moritz Halbritter + * @author Ngoc Nhan */ class TestcontainersProjectGenerationConfigurationTests extends AbstractExtensionTests { @Test void buildWithOnlyTestContainers() { - assertThat(generateProject("3.0.0", "testcontainers")).mavenBuild() - .hasBom("org.testcontainers", "testcontainers-bom", "${testcontainers.version}") + assertThat(generateProject("testcontainers")).mavenBuild().hasDependency(getDependency("testcontainers")); + } + + @ParameterizedTest + @MethodSource("supportedTestcontainersActiveMQEntriesBuild") + void buildWithSpringBootAndTestcontainersActiveMQModule(String springBootDependencyId, + String testcontainersArtifactId) { + assertThat(generateProject("testcontainers", springBootDependencyId)).mavenBuild() + .doesNotHaveBom("org.testcontainers", "testcontainers-bom") + .hasDependency(getDependency(springBootDependencyId) + .resolve(Version.parse(SupportedBootVersion.latest().getVersion()))) + .hasDependency("org.testcontainers", testcontainersArtifactId, null, "test") .hasDependency(getDependency("testcontainers")); } @ParameterizedTest - @MethodSource("supportedEntriesBuild") - void buildWithSupportedEntries(String springBootDependencyId, String testcontainersArtifactId) { - assertThat(generateProject("3.0.0", "testcontainers", springBootDependencyId)).mavenBuild() - .hasBom("org.testcontainers", "testcontainers-bom", "${testcontainers.version}") - .hasDependency(getDependency(springBootDependencyId)) + @MethodSource("supportedTestcontainersSpringAiEntriesBuild") + void buildWithSpringBootAndTestcontainersSpringAiModule(String springBootDependencyId, + String testcontainersArtifactId) { + assertThat(generateProject("testcontainers", springBootDependencyId)).mavenBuild() + .doesNotHaveBom("org.testcontainers", "testcontainers-bom") + .hasDependency(getDependency(springBootDependencyId) + .resolve(Version.parse(SupportedBootVersion.latest().getVersion()))) .hasDependency("org.testcontainers", testcontainersArtifactId, null, "test") .hasDependency(getDependency("testcontainers")); } - static Stream supportedEntriesBuild() { - return Stream.of(Arguments.arguments("amqp", "rabbitmq"), Arguments.arguments("data-cassandra", "cassandra"), - Arguments.arguments("data-cassandra-reactive", "cassandra"), - Arguments.arguments("data-couchbase", "couchbase"), - Arguments.arguments("data-couchbase-reactive", "couchbase"), - Arguments.arguments("data-elasticsearch", "elasticsearch"), - Arguments.arguments("data-mongodb", "mongodb"), Arguments.arguments("data-mongodb-reactive", "mongodb"), - Arguments.arguments("data-neo4j", "neo4j"), Arguments.arguments("data-r2dbc", "r2dbc"), - Arguments.arguments("db2", "db2"), Arguments.arguments("kafka", "kafka"), - Arguments.arguments("kafka-streams", "kafka"), Arguments.arguments("mariadb", "mariadb"), - Arguments.arguments("mysql", "mysql"), Arguments.arguments("postgresql", "postgresql"), - Arguments.arguments("oracle", "oracle-xe"), Arguments.arguments("pulsar", "pulsar"), - Arguments.arguments("pulsar-reactive", "pulsar"), Arguments.arguments("sqlserver", "mssqlserver")); + static Stream supportedTestcontainersActiveMQEntriesBuild() { + return Stream.of(Arguments.arguments("activemq", "activemq"), Arguments.arguments("artemis", "activemq")); + } + + static Stream supportedTestcontainersSpringAiEntriesBuild() { + return Stream.of(Arguments.arguments("spring-ai-vectordb-chroma", "chromadb"), + Arguments.arguments("spring-ai-vectordb-milvus", "milvus"), + Arguments.arguments("spring-ai-vectordb-mongodb-atlas", "mongodb"), + Arguments.arguments("spring-ai-vectordb-qdrant", "qdrant"), + Arguments.arguments("spring-ai-vectordb-weaviate", "weaviate")); } @ParameterizedTest @MethodSource("supportedEntriesHelpDocument") void linkToSupportedEntriesWhenTestContainerIsPresentIsAdded(String dependencyId, String docHref) { - assertHelpDocument("3.0.0", "testcontainers", dependencyId) - .contains("https://www.testcontainers.org/modules/" + docHref); + assertHelpDocument("testcontainers", dependencyId).contains(docHref); } @ParameterizedTest @MethodSource("supportedEntriesHelpDocument") void linkToSupportedEntriesWhenTestContainerIsNotPresentIsNotAdded(String dependencyId, String docHref) { - assertHelpDocument("3.0.0", dependencyId).doesNotContain("https://www.testcontainers.org/modules/" + docHref); + assertHelpDocument(dependencyId).doesNotContain(docHref); } static Stream supportedEntriesHelpDocument() { - return Stream.of(Arguments.arguments("amqp", "rabbitmq/"), - Arguments.arguments("cloud-starter-consul-config", "consul/"), - Arguments.arguments("cloud-starter-vault-config", "vault/"), - Arguments.arguments("data-cassandra", "databases/cassandra/"), - Arguments.arguments("data-cassandra-reactive", "databases/cassandra/"), - Arguments.arguments("data-couchbase", "databases/couchbase/"), - Arguments.arguments("data-couchbase-reactive", "databases/couchbase/"), - Arguments.arguments("data-elasticsearch", "elasticsearch/"), - Arguments.arguments("data-mongodb", "databases/mongodb/"), - Arguments.arguments("data-mongodb-reactive", "databases/mongodb/"), - Arguments.arguments("data-neo4j", "databases/neo4j/"), - Arguments.arguments("data-r2dbc", "databases/r2dbc/"), Arguments.arguments("db2", "databases/db2"), - Arguments.arguments("kafka", "kafka/"), Arguments.arguments("kafka-streams", "kafka/"), - Arguments.arguments("mariadb", "databases/mariadb/"), Arguments.arguments("mysql", "databases/mysql/"), - Arguments.arguments("oracle", "databases/oraclexe/"), - Arguments.arguments("postgresql", "databases/postgres/"), Arguments.arguments("pulsar", "pulsar/"), - Arguments.arguments("pulsar-reactive", "pulsar/"), - Arguments.arguments("sqlserver", "databases/mssqlserver/")); + return Stream.of(Arguments.arguments("amqp", "https://java.testcontainers.org/modules/rabbitmq/"), + Arguments.arguments("amqp-streams", "https://java.testcontainers.org/modules/rabbitmq/"), + Arguments.arguments("cloud-gcp", "https://java.testcontainers.org/modules/gcloud/"), + Arguments.arguments("cloud-gcp-pubsub", "https://java.testcontainers.org/modules/gcloud/"), + Arguments.arguments("cloud-starter-consul-config", "https://java.testcontainers.org/modules/consul/"), + Arguments.arguments("cloud-starter-vault-config", "https://java.testcontainers.org/modules/vault/"), + Arguments.arguments("data-cassandra", "https://java.testcontainers.org/modules/databases/cassandra/"), + Arguments.arguments("data-cassandra-reactive", + "https://java.testcontainers.org/modules/databases/cassandra/"), + Arguments.arguments("data-couchbase", "https://java.testcontainers.org/modules/databases/couchbase/"), + Arguments.arguments("data-couchbase-reactive", + "https://java.testcontainers.org/modules/databases/couchbase/"), + Arguments.arguments("data-elasticsearch", "https://java.testcontainers.org/modules/elasticsearch/"), + Arguments.arguments("data-mongodb", "https://java.testcontainers.org/modules/databases/mongodb/"), + Arguments.arguments("data-mongodb-reactive", + "https://java.testcontainers.org/modules/databases/mongodb/"), + Arguments.arguments("data-neo4j", "https://java.testcontainers.org/modules/databases/neo4j/"), + Arguments.arguments("data-r2dbc", "https://java.testcontainers.org/modules/databases/r2dbc/"), + Arguments.arguments("db2", "https://java.testcontainers.org/modules/databases/db2"), + Arguments.arguments("kafka", "https://java.testcontainers.org/modules/kafka/"), + Arguments.arguments("kafka-streams", "https://java.testcontainers.org/modules/kafka/"), + Arguments.arguments("mariadb", "https://java.testcontainers.org/modules/databases/mariadb/"), + Arguments.arguments("mysql", "https://java.testcontainers.org/modules/databases/mysql/"), + Arguments.arguments("oracle", "https://hub.docker.com/r/gvenzl/oracle-free"), + Arguments.arguments("postgresql", "https://java.testcontainers.org/modules/databases/postgres/"), + Arguments.arguments("pulsar", "https://java.testcontainers.org/modules/pulsar/"), + Arguments.arguments("pulsar-reactive", "https://java.testcontainers.org/modules/pulsar/"), + Arguments.arguments("solace", "https://java.testcontainers.org/modules/solace/"), + Arguments.arguments("sqlserver", "https://java.testcontainers.org/modules/databases/mssqlserver/")); } @Test void linkToSupportedEntriesWhenTwoMatchesArePresentOnlyAddLinkOnce() { - assertHelpDocument("3.0.0", "testcontainers", "data-mongodb", "data-mongodb-reactive") - .containsOnlyOnce("https://www.testcontainers.org/modules/databases/mongodb/"); + assertHelpDocument("testcontainers", "data-mongodb", "data-mongodb-reactive") + .containsOnlyOnce("https://java.testcontainers.org/modules/databases/mongodb/"); } @Test void buildWithSpringBoot31DoesNotIncludeBom() { - assertThat(generateProject("3.1.0-RC1", "testcontainers")).mavenBuild() + assertThat(generateProject("testcontainers")).mavenBuild() .doesNotHaveBom("org.testcontainers", "testcontainers-bom") .hasDependency(getDependency("testcontainers")); } - @Test - void buildWithSpringBoot30DoesNotIncludeSpringBootTestcontainers() { - assertThat(generateProject("3.0.0", "testcontainers")).mavenBuild() - .doesNotHaveDependency("org.springframework.boot", "spring-boot-testcontainers"); - } - @Test void buildWithSpringBoot31IncludeSpringBootTestcontainers() { - assertThat(generateProject("3.1.0-RC1", "testcontainers")).mavenBuild() + assertThat(generateProject("testcontainers")).mavenBuild() .hasDependency("org.springframework.boot", "spring-boot-testcontainers", null, "test"); } - @Test - void buildWithSpringBoot30DoesNotIncludeTestcontainersSection() { - assertHelpDocument("3.0.0", "testcontainers").doesNotContain("Spring Boot Testcontainers support"); - } - @Test void buildWithSpringBoot31IncludeTestcontainersSection() { - assertHelpDocument("3.1.0-RC1", "testcontainers").contains("Spring Boot Testcontainers support"); + assertHelpDocument("testcontainers").contains("Spring Boot Testcontainers support"); } @Test void testApplicationWithGroovyAndGenericContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-redis"); - request.setBootVersion("3.1.0-RC2"); request.setLanguage("groovy"); - assertThat(generateProject(request)).textFile("src/test/groovy/com/example/demo/TestDemoApplication.groovy") - .isEqualTo(""" + assertThat(generateProject(request)) + .textFile("src/test/groovy/com/example/demo/TestcontainersConfiguration.groovy") + .isEqualToNormalizingNewlines(""" package com.example.demo - import org.springframework.boot.SpringApplication import org.springframework.boot.test.context.TestConfiguration import org.springframework.boot.testcontainers.service.connection.ServiceConnection import org.springframework.context.annotation.Bean import org.testcontainers.containers.GenericContainer + import org.testcontainers.utility.DockerImageName @TestConfiguration(proxyBeanMethods = false) - class TestDemoApplication { + class TestcontainersConfiguration { @Bean @ServiceConnection(name = "redis") GenericContainer redisContainer() { - new GenericContainer<>("redis:latest").withExposedPorts(6379) - } - - static void main(String[] args) { - SpringApplication.from(DemoApplication::main).with(TestDemoApplication).run(args) + new GenericContainer<>(DockerImageName.parse("redis:latest")).withExposedPorts(6379) } } @@ -176,29 +183,24 @@ static void main(String[] args) { @Test void testApplicationWithJavaAndGenericContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-redis"); - request.setBootVersion("3.1.0-RC2"); request.setLanguage("java"); - assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestDemoApplication.java") - .isEqualTo(""" + assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestcontainersConfiguration.java") + .isEqualToNormalizingNewlines(""" package com.example.demo; - import org.springframework.boot.SpringApplication; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; import org.testcontainers.containers.GenericContainer; + import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) - public class TestDemoApplication { + class TestcontainersConfiguration { @Bean @ServiceConnection(name = "redis") GenericContainer redisContainer() { - return new GenericContainer<>("redis:latest").withExposedPorts(6379); - } - - public static void main(String[] args) { - SpringApplication.from(DemoApplication::main).with(TestDemoApplication.class).run(args); + return new GenericContainer<>(DockerImageName.parse("redis:latest")).withExposedPorts(6379); } } @@ -206,65 +208,86 @@ public static void main(String[] args) { } @Test - @Disabled void testApplicationWithKotlinAndGenericContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-redis"); - request.setBootVersion("3.1.1"); request.setLanguage("kotlin"); - assertThat(generateProject(request)).textFile("src/test/kotlin/com/example/demo/TestDemoApplication.kt") - .isEqualTo(""" + assertThat(generateProject(request)).textFile("src/test/kotlin/com/example/demo/TestcontainersConfiguration.kt") + .isEqualToNormalizingNewlines(""" package com.example.demo - import org.springframework.boot.fromApplication import org.springframework.boot.test.context.TestConfiguration import org.springframework.boot.testcontainers.service.connection.ServiceConnection - import org.springframework.boot.with import org.springframework.context.annotation.Bean import org.testcontainers.containers.GenericContainer + import org.testcontainers.utility.DockerImageName @TestConfiguration(proxyBeanMethods = false) - public class TestDemoApplication { + class TestcontainersConfiguration { @Bean @ServiceConnection(name = "redis") fun redisContainer(): GenericContainer<*> { - return GenericContainer("redis:latest").withExposedPorts(6379) + return GenericContainer(DockerImageName.parse("redis:latest")).withExposedPorts(6379) } } - - fun main(args: Array) { - fromApplication().with(TestDemoApplication::class).run(*args) - } """); } @Test void testApplicationWithGroovyAndSpecificContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-cassandra"); - request.setBootVersion("3.1.0-RC2"); request.setLanguage("groovy"); - assertThat(generateProject(request)).textFile("src/test/groovy/com/example/demo/TestDemoApplication.groovy") - .isEqualTo(""" + ProjectStructure projectStructure = generateProject(request); + assertThat(projectStructure).textFile("src/test/groovy/com/example/demo/TestDemoApplication.groovy") + .isEqualToNormalizingNewlines(""" package com.example.demo import org.springframework.boot.SpringApplication + + class TestDemoApplication { + + static void main(String[] args) { + SpringApplication.from(DemoApplication::main).with(TestcontainersConfiguration).run(args) + } + + } + """); + assertThat(projectStructure).textFile("src/test/groovy/com/example/demo/TestcontainersConfiguration.groovy") + .isEqualToNormalizingNewlines(""" + package com.example.demo + import org.springframework.boot.test.context.TestConfiguration import org.springframework.boot.testcontainers.service.connection.ServiceConnection import org.springframework.context.annotation.Bean import org.testcontainers.containers.CassandraContainer + import org.testcontainers.utility.DockerImageName @TestConfiguration(proxyBeanMethods = false) - class TestDemoApplication { + class TestcontainersConfiguration { @Bean @ServiceConnection CassandraContainer cassandraContainer() { - new CassandraContainer<>("cassandra:latest") + new CassandraContainer<>(DockerImageName.parse("cassandra:latest")) } - static void main(String[] args) { - SpringApplication.from(DemoApplication::main).with(TestDemoApplication).run(args) + } + """); + assertThat(projectStructure).textFile("src/test/groovy/com/example/demo/DemoApplicationTests.groovy") + .isEqualToNormalizingNewlines(""" + package com.example.demo + + import org.junit.jupiter.api.Test + import org.springframework.boot.test.context.SpringBootTest + import org.springframework.context.annotation.Import + + @Import(TestcontainersConfiguration) + @SpringBootTest + class DemoApplicationTests { + + @Test + void contextLoads() { } } @@ -274,29 +297,58 @@ static void main(String[] args) { @Test void testApplicationWithJavaAndSpecificContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-cassandra"); - request.setBootVersion("3.1.0-RC2"); request.setLanguage("java"); - assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestDemoApplication.java") - .isEqualTo(""" + ProjectStructure projectStructure = generateProject(request); + assertThat(projectStructure).textFile("src/test/java/com/example/demo/TestDemoApplication.java") + .isEqualToNormalizingNewlines( + """ + package com.example.demo; + + import org.springframework.boot.SpringApplication; + + public class TestDemoApplication { + + public static void main(String[] args) { + SpringApplication.from(DemoApplication::main).with(TestcontainersConfiguration.class).run(args); + } + + } + """); + assertThat(projectStructure).textFile("src/test/java/com/example/demo/TestcontainersConfiguration.java") + .isEqualToNormalizingNewlines(""" package com.example.demo; - import org.springframework.boot.SpringApplication; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; import org.testcontainers.containers.CassandraContainer; + import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) - public class TestDemoApplication { + class TestcontainersConfiguration { @Bean @ServiceConnection CassandraContainer cassandraContainer() { - return new CassandraContainer<>("cassandra:latest"); + return new CassandraContainer<>(DockerImageName.parse("cassandra:latest")); } - public static void main(String[] args) { - SpringApplication.from(DemoApplication::main).with(TestDemoApplication.class).run(args); + } + """); + assertThat(projectStructure).textFile("src/test/java/com/example/demo/DemoApplicationTests.java") + .isEqualToNormalizingNewlines(""" + package com.example.demo; + + import org.junit.jupiter.api.Test; + import org.springframework.boot.test.context.SpringBootTest; + import org.springframework.context.annotation.Import; + + @Import(TestcontainersConfiguration.class) + @SpringBootTest + class DemoApplicationTests { + + @Test + void contextLoads() { } } @@ -304,51 +356,82 @@ public static void main(String[] args) { } @Test - @Disabled void testApplicationWithKotlinAndSpecificContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-cassandra"); - request.setBootVersion("3.1.1"); request.setLanguage("kotlin"); - assertThat(generateProject(request)).textFile("src/test/kotlin/com/example/demo/TestDemoApplication.kt") - .isEqualTo(""" + ProjectStructure projectStructure = generateProject(request); + assertThat(projectStructure).textFile("src/test/kotlin/com/example/demo/TestDemoApplication.kt") + .isEqualToNormalizingNewlines(""" package com.example.demo import org.springframework.boot.fromApplication + import org.springframework.boot.with + + + fun main(args: Array) { + fromApplication().with(TestcontainersConfiguration::class).run(*args) + } + """); + assertThat(projectStructure).textFile("src/test/kotlin/com/example/demo/TestcontainersConfiguration.kt") + .isEqualToNormalizingNewlines(""" + package com.example.demo + import org.springframework.boot.test.context.TestConfiguration import org.springframework.boot.testcontainers.service.connection.ServiceConnection - import org.springframework.boot.with import org.springframework.context.annotation.Bean import org.testcontainers.containers.CassandraContainer + import org.testcontainers.utility.DockerImageName @TestConfiguration(proxyBeanMethods = false) - public class TestDemoApplication { + class TestcontainersConfiguration { @Bean @ServiceConnection fun cassandraContainer(): CassandraContainer<*> { - return CassandraContainer("cassandra:latest") + return CassandraContainer(DockerImageName.parse("cassandra:latest")) } } + """); + assertThat(projectStructure).textFile("src/test/kotlin/com/example/demo/DemoApplicationTests.kt") + .isEqualToNormalizingNewlines(""" + package com.example.demo + + import org.junit.jupiter.api.Test + import org.springframework.boot.test.context.SpringBootTest + import org.springframework.context.annotation.Import + + @Import(TestcontainersConfiguration::class) + @SpringBootTest + class DemoApplicationTests { + + @Test + fun contextLoads() { + } - fun main(args: Array) { - fromApplication().with(TestDemoApplication::class).run(*args) } """); } - private ProjectStructure generateProject(String platformVersion, String... dependencies) { - ProjectRequest request = createProjectRequest(dependencies); - request.setBootVersion(platformVersion); + @Test + void shouldAddHelpSection() { + assertHelpDocument("testcontainers", "data-mongodb", "postgresql").contains( + "https://docs.spring.io/spring-boot/3.3.0/reference/testing/testcontainers.html#testing.testcontainers") + .contains( + "https://docs.spring.io/spring-boot/3.3.0/reference/features/dev-services.html#features.dev-services.testcontainers") + .contains("mongo:latest") + .contains("postgres:latest"); + } + + private ProjectStructure generateProject(String... dependencies) { + ProjectRequest request = createProjectRequest(SupportedBootVersion.V3_3, dependencies); request.setType("maven-build"); return generateProject(request); } - private TextAssert assertHelpDocument(String platformVersion, String... dependencyIds) { - ProjectRequest request = createProjectRequest(dependencyIds); - request.setBootVersion(platformVersion); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + private TextAssert assertHelpDocument(String... dependencyIds) { + ProjectRequest request = createProjectRequest(SupportedBootVersion.V3_3, dependencyIds); + return assertThat(helpDocument(request)); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizerTests.java index 8226484dc2..9a4eda8b6c 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizerTests.java @@ -27,25 +27,24 @@ * Tests for {@link ThymeleafBuildCustomizer}. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class ThymeleafBuildCustomizerTests extends AbstractExtensionTests { @Test - void thymeleafWithSpringSecurityAndSpringBoot2AddsExtrasDependency() { + void thymeleafWithSpringSecurityAndSpringBootAddsExtrasDependency() { ProjectRequest projectRequest = createProjectRequest("thymeleaf", "security"); - projectRequest.setBootVersion("2.7.1"); assertThat(mavenPom(projectRequest)).hasDependency(Dependency.createSpringBootStarter("thymeleaf")) .hasDependency(Dependency.createSpringBootStarter("security")) .hasDependency(Dependency.withId("thymeleaf-extras-spring-security", "org.thymeleaf.extras", - "thymeleaf-extras-springsecurity5")); + "thymeleaf-extras-springsecurity6")); } @Test - void thymeleafWithSpringSecurityAndSpringBoot3AddsExtrasDependency() { - ProjectRequest projectRequest = createProjectRequest("thymeleaf", "security"); - projectRequest.setBootVersion("3.0.0-M1"); + void thymeleafWithOAuth2ClientAndSpringBootAddsExtrasDependency() { + ProjectRequest projectRequest = createProjectRequest("thymeleaf", "oauth2-client"); assertThat(mavenPom(projectRequest)).hasDependency(Dependency.createSpringBootStarter("thymeleaf")) - .hasDependency(Dependency.createSpringBootStarter("security")) + .hasDependency(Dependency.createSpringBootStarter("oauth2-client")) .hasDependency(Dependency.withId("thymeleaf-extras-spring-security", "org.thymeleaf.extras", "thymeleaf-extras-springsecurity6")); } @@ -54,7 +53,7 @@ void thymeleafWithSpringSecurityAndSpringBoot3AddsExtrasDependency() { void thymeleafWithoutSpringSecurityDoesNotAddExtrasDependency() { assertThat(mavenPom(createProjectRequest("thymeleaf", "web"))) .hasDependency(Dependency.createSpringBootStarter("thymeleaf")) - .doesNotHaveDependency("org.thymeleaf.extras", "thymeleaf-extras-springsecurity5"); + .doesNotHaveDependency("org.thymeleaf.extras", "thymeleaf-extras-springsecurity6"); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizerTests.java new file mode 100644 index 0000000000..48db9ddf45 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizerTests.java @@ -0,0 +1,77 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.vaadin; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link VaadinMavenBuildCustomizer}. + * + * @author Moritz Halbritter + */ +class VaadinMavenBuildCustomizerTests extends AbstractExtensionTests { + + @Test + void shouldAddProductionProfile() { + ProjectRequest projectRequest = createProjectRequest(SupportedBootVersion.V3_3, "vaadin", "web"); + assertThat(mavenPom(projectRequest)).hasProfile("production").lines().containsSequence( + // @formatter:off + " ", + " production", + " ", + " ", + " com.vaadin", + " vaadin-core", + " ", + " ", + " com.vaadin", + " vaadin-dev", + " ", + " ", + " ", + "", + " ", + " ", + " ", + " ", + " com.vaadin", + " vaadin-maven-plugin", + " ${vaadin.version}", + " ", + " ", + " frontend", + " compile", + " ", + " prepare-frontend", + " build-frontend", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ); + // @formatter:on + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java index 0f590a2f6b..89de609587 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.generator.version.Version; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -27,51 +28,53 @@ * Tests for {@link VaadinProjectGenerationConfiguration}. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class VaadinProjectGenerationConfigurationTests extends AbstractExtensionTests { - @Test - void mavenBuildWithVaadin23AddProductionProfileWithProductionModeFlag() { - ProjectRequest request = createProjectRequest("vaadin", "data-jpa"); - request.setBootVersion("2.7.10"); - assertThat(mavenPom(request)).hasProfile("production") - .lines() - .containsSequence(" ", " production", " ", - " ", " ", - " com.vaadin", - " vaadin-maven-plugin", - " ${vaadin.version}", - " ", " ", - " frontend", - " compile", " ", - " prepare-frontend", - " build-frontend", - " ", " ", - " true", - " ", " ", - " ", " ", " ", - " ", " "); - } + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; @Test - void mavenBuildWithVaadin24AddProductionProfileWithoutProductionModeFlag() { - ProjectRequest request = createProjectRequest("vaadin", "data-jpa"); - request.setBootVersion("3.0.0"); - assertThat(mavenPom(request)).hasProfile("production") - .lines() - .containsSequence(" ", " production", " ", - " ", " ", - " com.vaadin", - " vaadin-maven-plugin", - " ${vaadin.version}", - " ", " ", - " frontend", - " compile", " ", - " prepare-frontend", - " build-frontend", - " ", " ", - " ", " ", " ", - " ", " "); + void mavenBuildWithVaadinAddProductionProfileWithoutProductionModeFlag() { + ProjectRequest request = createProjectRequest(BOOT_VERSION, "vaadin", "data-jpa"); + assertThat(mavenPom(request)).hasProfile("production").lines().containsSequence( + // @formatter:off + " ", + " production", + " ", + " ", + " com.vaadin", + " vaadin-core", + " ", + " ", + " com.vaadin", + " vaadin-dev", + " ", + " ", + " ", + "", + " ", + " ", + " ", + " ", + " com.vaadin", + " vaadin-maven-plugin", + " ${vaadin.version}", + " ", + " ", + " frontend", + " compile", + " ", + " prepare-frontend", + " build-frontend", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ); } @Test @@ -81,7 +84,7 @@ void mavenBuildWithoutVaadinDoesNotAddProductionProfile() { @Test void gradleBuildWithVaadinAddPlugin() { - ProjectRequest request = createProjectRequest("vaadin", "data-jpa"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "vaadin", "data-jpa"); String vaadinVersion = getMetadata().getConfiguration() .getEnv() .getBoms() @@ -98,7 +101,7 @@ void gradleBuildWithoutVaadinDoesNotAddPlugin() { @Test void gitIgnoreWithVaadinIgnoreNodeModules() { - assertThat(generateProject(createProjectRequest("vaadin", "data-jpa"))).textFile(".gitignore") + assertThat(generateProject(createProjectRequest(BOOT_VERSION, "vaadin", "data-jpa"))).textFile(".gitignore") .contains("node_modules"); } @@ -108,11 +111,14 @@ void gitIgnoreWithoutVaadinDoesNotIgnoreNodeModules() { .doesNotContain("node_modules"); } - @Override - protected ProjectRequest createProjectRequest(String... dependencies) { - ProjectRequest request = super.createProjectRequest(dependencies); - request.setBootVersion("2.4.6"); - return request; + @Test + void shouldAddLaunchBrowserProperty() { + assertThat(applicationProperties(createProjectRequest(BOOT_VERSION, "vaadin"))).lines().contains("vaadin.launch-browser=true"); + } + + @Test + void shouldNotAddLaunchBrowserPropertyIfVaadinIsNotSelected() { + assertThat(applicationProperties(createProjectRequest("data-jpa"))).lines().doesNotContain("vaadin.launch-browser=true"); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java index 20a3635850..b28c7a1295 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java @@ -16,12 +16,14 @@ package io.spring.start.site.extension.description; +import io.spring.initializr.generator.language.kotlin.KotlinLanguage; import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + /** * Tests for {@link InvalidJvmVersionHelpDocumentCustomizer}. * @@ -31,23 +33,35 @@ class InvalidJvmVersionHelpDocumentCustomizerTests extends AbstractExtensionTest @Test void warningAddedWithUnsupportedCombination() { - assertHelpDocument("2.4.0", "16").lines() + assertHelpDocument("11").lines() + .containsSubsequence("# Read Me First", + "* The JVM level was changed from '11' to '17', review the [JDK Version Range](https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions#jdk-version-range) on the wiki for more details."); + } + + @Test + void warningAddedWithUnsupportedKotlinVersion() { + ProjectRequest request = createProjectRequest("web"); + request.setJavaVersion("22"); + request.setLanguage(KotlinLanguage.ID); + assertHelpDocument(request).lines() .containsSubsequence("# Read Me First", - "* The JVM level was changed from '16' to '11', review the [JDK Version Range](https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions#jdk-version-range) on the wiki for more details."); + "* The JVM level was changed from '22' to '21' as the Kotlin version does not support Java 22 yet."); } @Test void warningNotAddedWithCompatibleVersion() { - assertHelpDocument("2.4.8", "11").doesNotContain("# Read Me First"); + assertHelpDocument("17").doesNotContain("# Read Me First"); + } + + private TextAssert assertHelpDocument(ProjectRequest request) { + return assertThat(helpDocument(request)); } - private TextAssert assertHelpDocument(String platformVersion, String jvmVersion) { + private TextAssert assertHelpDocument(String jvmVersion) { ProjectRequest request = createProjectRequest("web"); request.setType("gradle-project"); - request.setBootVersion(platformVersion); request.setJavaVersion(jvmVersion); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + return assertHelpDocument(request); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidPackageNameHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidPackageNameHelpDocumentCustomizerTests.java index b81679ec08..f31bed08a1 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidPackageNameHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidPackageNameHelpDocumentCustomizerTests.java @@ -17,11 +17,12 @@ package io.spring.start.site.extension.description; import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + /** * Tests for {@link InvalidPackageNameHelpDocumentCustomizer}. * @@ -33,7 +34,7 @@ class InvalidPackageNameHelpDocumentCustomizerTests extends AbstractExtensionTes void warningAddedWithInvalidPackageName() { assertHelpDocument("com.my-invalid-package").lines() .containsSubsequence("# Read Me First", - "* The original package name 'com.my-invalid-package' is invalid and this project uses 'com.myinvalidpackage' instead."); + "* The original package name 'com.my-invalid-package' is invalid and this project uses 'com.my_invalid_package' instead."); } @Test @@ -44,8 +45,7 @@ void warningNotAddedWithValidPackageName() { private TextAssert assertHelpDocument(String packageName) { ProjectRequest request = createProjectRequest("web"); request.setPackageName(packageName); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + return assertThat(helpDocument(request)); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizerTests.java new file mode 100644 index 0000000000..26b19792f6 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizerTests.java @@ -0,0 +1,40 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.properties; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link DefaultApplicationPropertiesCustomizer}. + * + * @author Moritz Halbritter + */ +class DefaultApplicationPropertiesCustomizerTests extends AbstractExtensionTests { + + @Test + void shouldAddSpringApplicationName() { + ProjectRequest request = createProjectRequest("web"); + request.setJavaVersion("21"); + request.setName("test"); + assertThat(applicationProperties(request)).lines().contains("spring.application.name=test"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java index 16fb1062a8..90901b044e 100755 --- a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ import java.util.stream.Stream; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -31,40 +32,20 @@ * Tests for {@link JavaVersionProjectDescriptionCustomizer}. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class JavaVersionProjectDescriptionCustomizerTests extends AbstractExtensionTests { - @Test - void java8IsMandatoryMaven() { - assertThat(mavenPom(javaProject("1.7", "2.3.0.RELEASE"))).hasProperty("java.version", "1.8"); - } - - @Test - void java8IsMandatoryGradle() { - assertThat(gradleBuild(javaProject("1.7", "2.3.0.RELEASE"))).hasSourceCompatibility("1.8"); - } - @Test void javaUnknownVersionIsLeftAsIs() { - assertThat(mavenPom(javaProject("9999999", "2.3.0.RELEASE"))).hasProperty("java.version", "9999999"); + assertThat(mavenPom(javaProject("9999999", SupportedBootVersion.latest().getVersion()))) + .hasProperty("java.version", "9999999"); } @Test void javaInvalidVersionIsLeftAsIs() { - assertThat(mavenPom(javaProject("${another.version}", "2.3.0.RELEASE"))).hasProperty("java.version", - "${another.version}"); - } - - @Test - void java8IsNotCompatibleWithSpringBoot3() { - ProjectRequest request = javaProject("1.8", "3.0.0-M1"); - assertThat(mavenPom(request)).hasProperty("java.version", "17"); - } - - @Test - void java11IsNotCompatibleWithSpringBoot3() { - ProjectRequest request = javaProject("11", "3.0.0-M1"); - assertThat(mavenPom(request)).hasProperty("java.version", "17"); + assertThat(mavenPom(javaProject("${another.version}", SupportedBootVersion.latest().getVersion()))) + .hasProperty("java.version", "${another.version}"); } @ParameterizedTest(name = "{0} - Java {1} - Spring Boot {2}") @@ -79,7 +60,19 @@ void mavenBuildWithSupportedOptionsDoesNotDowngradeJavaVersion(String language, @MethodSource("supportedGradleGroovyParameters") void gradleGroovyBuildWithSupportedOptionsDoesNotDowngradeJavaVersion(String language, String javaVersion, String springBootVersion) { - assertThat(gradleBuild(project(language, javaVersion, springBootVersion))).hasSourceCompatibility(javaVersion); + assertThat(gradleBuild(project(language, javaVersion, springBootVersion))).hasToolchainForJava(javaVersion); + } + + @Test + void java22IsNotSupportedWithKotlin() { + assertThat(mavenPom(kotlinProject("22", SupportedBootVersion.latest().getVersion()))) + .hasProperty("java.version", "21"); + } + + @Test + void java23IsNotSupportedWithKotlin() { + assertThat(mavenPom(kotlinProject("23", SupportedBootVersion.latest().getVersion()))) + .hasProperty("java.version", "21"); } static Stream supportedMavenParameters() { @@ -92,59 +85,18 @@ static Stream supportedGradleGroovyParameters() { } private static Stream supportedJavaParameters() { - return Stream.of(java("9", "2.3.0.RELEASE"), java("10", "2.3.0.RELEASE"), java("11", "2.3.0.RELEASE"), - java("12", "2.3.0.RELEASE"), java("13", "2.3.0.RELEASE"), java("14", "2.3.0.RELEASE"), - java("15", "2.3.4.RELEASE"), java("16", "2.5.0-RC1"), java("17", "2.5.5"), java("18", "2.5.11"), - java("19", "2.6.12"), java("20", "2.7.10")); + return Stream.of(java("17", SupportedBootVersion.latest().getVersion()), + java("21", SupportedBootVersion.latest().getVersion()), + java("23", SupportedBootVersion.latest().getVersion())); } private static Stream supportedKotlinParameters() { - return Stream.of(kotlin("9", "2.3.0.RELEASE"), kotlin("10", "2.3.0.RELEASE"), kotlin("11", "2.3.0.RELEASE"), - kotlin("12", "2.3.0.RELEASE"), kotlin("13", "2.3.0.RELEASE"), kotlin("14", "2.3.0.RELEASE"), - kotlin("15", "2.3.4.RELEASE"), kotlin("16", "2.5.0-RC1"), kotlin("17", "2.6.0")); + return Stream.of(kotlin("21", SupportedBootVersion.latest().getVersion())); } private static Stream supportedGroovyParameters() { - return Stream.of(groovy("9", "2.3.0.RELEASE"), groovy("10", "2.3.0.RELEASE"), groovy("11", "2.3.0.RELEASE"), - groovy("12", "2.3.0.RELEASE"), groovy("13", "2.3.0.RELEASE"), groovy("14", "2.3.0.RELEASE"), - groovy("15", "2.3.4.RELEASE"), groovy("16", "2.5.0-RC1"), groovy("17", "2.5.5"), groovy("18", "2.5.11"), - groovy("19", "2.6.12"), groovy("20", "2.7.10")); - } - - @ParameterizedTest(name = "{0} - Java {1} - Spring Boot {2}") - @MethodSource("unsupportedMavenParameters") - void mavenBuildWithUnsupportedOptionsDowngradesToLts(String language, String javaVersion, - String springBootVersion) { - assertThat(mavenPom(project(language, javaVersion, springBootVersion))).hasProperty("java.version", "11"); - } - - @ParameterizedTest(name = "{0} - Java {1} - Spring Boot {2}") - @MethodSource("unsupportedGradleGroovyParameters") - void gradleGroovyBuildWithUnsupportedOptionsDowngradesToLts(String language, String javaVersion, - String springBootVersion) { - assertThat(gradleBuild(project(language, javaVersion, springBootVersion))).hasSourceCompatibility("11"); - } - - static Stream unsupportedMavenParameters() { - return Stream.concat(unsupportedJavaParameters(), - Stream.concat(unsupportedKotlinParameters(), unsupportedGroovyParameters())); - } - - static Stream unsupportedGradleGroovyParameters() { - return Stream.concat(unsupportedJavaParameters(), unsupportedGroovyParameters()); - } - - private static Stream unsupportedJavaParameters() { - return Stream.of(java("16", "2.4.3"), java("17", "2.5.4")); - } - - private static Stream unsupportedKotlinParameters() { - return Stream.of(kotlin("16", "2.4.3"), kotlin("17", "2.5.5"), kotlin("18", "2.5.11"), kotlin("19", "2.5.11"), - kotlin("20", "2.5.11")); - } - - private static Stream unsupportedGroovyParameters() { - return Stream.of(groovy("16", "2.4.3"), groovy("17", "2.5.4")); + return Stream.of(groovy("21", SupportedBootVersion.latest().getVersion()), + groovy("23", SupportedBootVersion.latest().getVersion())); } private static Arguments java(String javaVersion, String springBootVersion) { @@ -171,4 +123,8 @@ private ProjectRequest javaProject(String javaVersion, String springBootVersion) return project("java", javaVersion, springBootVersion); } + private ProjectRequest kotlinProject(String javaVersion, String springBootVersion) { + return project("kotlin", javaVersion, springBootVersion); + } + } diff --git a/start-site/src/test/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizerTests.java deleted file mode 100644 index 4d6c5a5b66..0000000000 --- a/start-site/src/test/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizerTests.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.project.dependency.springcloud; - -import java.util.Collections; - -import io.spring.initializr.generator.buildsystem.Dependency; -import io.spring.initializr.generator.project.MutableProjectDescription; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; - -/** - * Tests for {@link SpringCloudGatewayProjectDescriptionCustomizer}. - * - * @author Stephane Nicoll - */ -class SpringCloudGatewayProjectDescriptionCustomizerTests { - - @Test - void customizeWithSpringCloudGatewayAndSpringMvcMigratesToSpringWebFlux() { - MutableProjectDescription description = new MutableProjectDescription(); - description.addDependency("cloud-gateway", mock(Dependency.class)); - description.addDependency("web", mock(Dependency.class)); - new SpringCloudGatewayProjectDescriptionCustomizer().customize(description); - assertThat(description.getRequestedDependencies()).containsOnlyKeys("cloud-gateway", "webflux"); - Dependency webflux = description.getRequestedDependencies().get("webflux"); - assertThat(webflux.getGroupId()).isEqualTo("org.springframework.boot"); - assertThat(webflux.getArtifactId()).isEqualTo("spring-boot-starter-webflux"); - } - - @Test - void customizeWithSpringCloudGatewayDoesNotAddSpringWebFlux() { - MutableProjectDescription description = mock(MutableProjectDescription.class); - given(description.getRequestedDependencies()) - .willReturn(Collections.singletonMap("cloud-gateway", mock(Dependency.class))); - new SpringCloudGatewayProjectDescriptionCustomizer().customize(description); - verify(description).getRequestedDependencies(); - verifyNoMoreInteractions(description); - } - - @Test - void customizeWithoutSpringCloudGatewayDoesNotRemoveSpringMvc() { - MutableProjectDescription description = mock(MutableProjectDescription.class); - given(description.getRequestedDependencies()) - .willReturn(Collections.singletonMap("web", mock(Dependency.class))); - new SpringCloudGatewayProjectDescriptionCustomizer().customize(description); - verify(description).getRequestedDependencies(); - verifyNoMoreInteractions(description); - } - -} diff --git a/start-site/src/test/java/io/spring/start/site/project/dependency/springcloud/SpringCloudResilience4JProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/dependency/springcloud/SpringCloudResilience4JProjectDescriptionCustomizerTests.java new file mode 100644 index 0000000000..4a5980142a --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/project/dependency/springcloud/SpringCloudResilience4JProjectDescriptionCustomizerTests.java @@ -0,0 +1,58 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.project.dependency.springcloud; + +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.project.MutableProjectDescription; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +/** + * Tests for {@link SpringCloudResilience4JProjectDescriptionCustomizer}. + * + * @author Stephane Nicoll + */ +class SpringCloudResilience4JProjectDescriptionCustomizerTests { + + @Test + void customizeWithSpringCloudResilience4jAndSpringMvcUsesMvcStarter() { + MutableProjectDescription description = new MutableProjectDescription(); + description.addDependency("cloud-resilience4j", Dependency.withCoordinates("org.springframework.cloud", + "spring-cloud-starter-circuitbreaker-resilience4j")); + description.addDependency("web", mock(Dependency.class)); + new SpringCloudResilience4JProjectDescriptionCustomizer().customize(description); + assertThat(description.getRequestedDependencies()).containsOnlyKeys("cloud-resilience4j", "web"); + Dependency cloudResilience4j = description.getRequestedDependencies().get("cloud-resilience4j"); + assertThat(cloudResilience4j.getArtifactId()).isEqualTo("spring-cloud-starter-circuitbreaker-resilience4j"); + } + + @Test + void customizeWithSpringCloudResilience4jAndSpringWebfluxUsesReactiveStarter() { + MutableProjectDescription description = new MutableProjectDescription(); + description.addDependency("cloud-resilience4j", Dependency.withCoordinates("org.springframework.cloud", + "spring-cloud-starter-circuitbreaker-resilience4j")); + description.addDependency("webflux", mock(Dependency.class)); + new SpringCloudResilience4JProjectDescriptionCustomizer().customize(description); + assertThat(description.getRequestedDependencies()).containsOnlyKeys("cloud-resilience4j", "webflux"); + Dependency cloudResilience4j = description.getRequestedDependencies().get("cloud-resilience4j"); + assertThat(cloudResilience4j.getArtifactId()) + .isEqualTo("spring-cloud-starter-circuitbreaker-reactor-resilience4j"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java b/start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java new file mode 100644 index 0000000000..3512b98853 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java @@ -0,0 +1,86 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.support; + +import java.util.Map; + +import io.spring.initializr.versionresolver.MavenVersionResolver; +import io.spring.start.site.SupportedBootVersion; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.cache.CacheType; +import org.springframework.boot.test.autoconfigure.core.AutoConfigureCache; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cache.Cache; +import org.springframework.cache.Cache.ValueWrapper; +import org.springframework.cache.CacheManager; +import org.springframework.test.context.ActiveProfiles; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link CacheableMavenVersionResolver}. + * + * @author Stephane Nicoll + */ +@SpringBootTest +@ActiveProfiles("test") +@AutoConfigureCache(cacheProvider = CacheType.SIMPLE) +class CacheableMavenVersionResolverTests { + + private final MavenVersionResolver versionResolver; + + private final Cache cache; + + CacheableMavenVersionResolverTests(@Autowired MavenVersionResolver versionResolver, + @Autowired CacheManager cacheManager) { + this.versionResolver = versionResolver; + this.cache = cacheManager.getCache("initializr.metadata"); + } + + @BeforeEach + @AfterEach + void clearCache() { + this.cache.clear(); + } + + @Test + void managedDependenciesAreCached() { + Map dependencies = this.versionResolver.resolveDependencies("org.springframework.boot", + "spring-boot-dependencies", SupportedBootVersion.latest().getVersion()); + assertThat(dependencies).isNotNull(); + ValueWrapper valueWrapper = this.cache.get("dependencies-org.springframework.boot:spring-boot-dependencies:%s" + .formatted(SupportedBootVersion.latest().getVersion())); + assertThat(valueWrapper).isNotNull(); + assertThat(valueWrapper.get()).isInstanceOf(Map.class); + } + + @Test + void managedPluginsAreCached() { + Map plugins = this.versionResolver.resolvePlugins("org.springframework.boot", + "spring-boot-dependencies", SupportedBootVersion.latest().getVersion()); + assertThat(plugins).isNotNull(); + ValueWrapper valueWrapper = this.cache.get("plugins-org.springframework.boot:spring-boot-dependencies:%s" + .formatted(SupportedBootVersion.latest().getVersion())); + assertThat(valueWrapper).isNotNull(); + assertThat(valueWrapper.get()).isInstanceOf(Map.class); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java b/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java index 5ca991566d..6b9f052bcf 100644 --- a/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java +++ b/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java @@ -71,10 +71,10 @@ void eolVersionsAreRemoved() { assertThat(updatedMetadata.getBootVersions()).isNotNull(); List updatedBootVersions = updatedMetadata.getBootVersions().getContent(); assertThat(updatedBootVersions).hasSize(4); - assertBootVersion(updatedBootVersions.get(0), "3.0.2 (SNAPSHOT)", false); - assertBootVersion(updatedBootVersions.get(1), "3.0.1", true); - assertBootVersion(updatedBootVersions.get(2), "2.7.8 (SNAPSHOT)", false); - assertBootVersion(updatedBootVersions.get(3), "2.7.7", false); + assertBootVersion(updatedBootVersions.get(0), "3.4.1 (SNAPSHOT)", false); + assertBootVersion(updatedBootVersions.get(1), "3.4.0", true); + assertBootVersion(updatedBootVersions.get(2), "3.3.7 (SNAPSHOT)", false); + assertBootVersion(updatedBootVersions.get(3), "3.3.6", false); } @Test diff --git a/start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java b/start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java new file mode 100644 index 0000000000..49cac91169 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java @@ -0,0 +1,50 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.test; + +import java.util.Map; + +import io.spring.initializr.versionresolver.MavenVersionResolver; +import io.spring.start.testsupport.TemporaryFiles; + +/** + * A {@link MavenVersionResolver} for tests, which uses a fixed directory for the cache. + * + * @author Moritz Halbritter + */ +public class TestMavenVersionResolver implements MavenVersionResolver { + + private static final TestMavenVersionResolver INSTANCE = new TestMavenVersionResolver(); + + private final MavenVersionResolver delegate = MavenVersionResolver + .withCacheLocation(TemporaryFiles.getTempDir().resolve("maven-version-resolver-cache")); + + @Override + public Map resolveDependencies(String groupId, String artifactId, String version) { + return this.delegate.resolveDependencies(groupId, artifactId, version); + } + + @Override + public Map resolvePlugins(String groupId, String artifactId, String version) { + return this.delegate.resolvePlugins(groupId, artifactId, version); + } + + public static TestMavenVersionResolver get() { + return INSTANCE; + } + +} diff --git a/start-site/src/test/resources/application-test.yml b/start-site/src/test/resources/application-test.yml new file mode 100644 index 0000000000..604ee888f6 --- /dev/null +++ b/start-site/src/test/resources/application-test.yml @@ -0,0 +1,3 @@ +application: + maven-version-resolver: + cache-directory: "${START_SPRING_IO_TMPDIR:${java.io.tmpdir}}/maven-version-resolver-cache" diff --git a/start-site/src/test/resources/compose/activemq.yaml b/start-site/src/test/resources/compose/activemq.yaml new file mode 100644 index 0000000000..269d4e2a2c --- /dev/null +++ b/start-site/src/test/resources/compose/activemq.yaml @@ -0,0 +1,5 @@ +services: + activemq: + image: 'apache/activemq-classic:latest' + ports: + - '61616' diff --git a/start-site/src/test/resources/compose/artemis.yaml b/start-site/src/test/resources/compose/artemis.yaml new file mode 100644 index 0000000000..1aa745eb00 --- /dev/null +++ b/start-site/src/test/resources/compose/artemis.yaml @@ -0,0 +1,5 @@ +services: + artemis: + image: 'apache/activemq-artemis:latest' + ports: + - '61616' diff --git a/start-site/src/test/resources/compose/azurite.yaml b/start-site/src/test/resources/compose/azurite.yaml new file mode 100644 index 0000000000..ba2b9ad710 --- /dev/null +++ b/start-site/src/test/resources/compose/azurite.yaml @@ -0,0 +1,7 @@ +services: + azurite: + image: 'mcr.microsoft.com/azure-storage/azurite:latest' + ports: + - '10000' + - '10001' + - '10002' diff --git a/start-site/src/test/resources/compose/chroma.yaml b/start-site/src/test/resources/compose/chroma.yaml new file mode 100644 index 0000000000..9f00255351 --- /dev/null +++ b/start-site/src/test/resources/compose/chroma.yaml @@ -0,0 +1,5 @@ +services: + chroma: + image: 'chromadb/chroma:latest' + ports: + - '8000' diff --git a/start-site/src/test/resources/compose/mongodb-atlas.yaml b/start-site/src/test/resources/compose/mongodb-atlas.yaml new file mode 100644 index 0000000000..e50a9727fa --- /dev/null +++ b/start-site/src/test/resources/compose/mongodb-atlas.yaml @@ -0,0 +1,5 @@ +services: + mongodbatlas: + image: 'mongodb/mongodb-atlas-local:latest' + ports: + - '27017' diff --git a/start-site/src/test/resources/compose/neo4j.yaml b/start-site/src/test/resources/compose/neo4j.yaml new file mode 100644 index 0000000000..f295c847bf --- /dev/null +++ b/start-site/src/test/resources/compose/neo4j.yaml @@ -0,0 +1,7 @@ +services: + neo4j: + image: 'neo4j:latest' + environment: + - 'NEO4J_AUTH=neo4j/notverysecret' + ports: + - '7687' diff --git a/start-site/src/test/resources/compose/ollama.yaml b/start-site/src/test/resources/compose/ollama.yaml new file mode 100644 index 0000000000..60ccf775b2 --- /dev/null +++ b/start-site/src/test/resources/compose/ollama.yaml @@ -0,0 +1,5 @@ +services: + ollama: + image: 'ollama/ollama:latest' + ports: + - '11434' diff --git a/start-site/src/test/resources/compose/oracle.yaml b/start-site/src/test/resources/compose/oracle-free.yaml similarity index 71% rename from start-site/src/test/resources/compose/oracle.yaml rename to start-site/src/test/resources/compose/oracle-free.yaml index 6fbff0e486..7703a71861 100644 --- a/start-site/src/test/resources/compose/oracle.yaml +++ b/start-site/src/test/resources/compose/oracle-free.yaml @@ -1,6 +1,6 @@ services: oracle: - image: 'gvenzl/oracle-xe:latest' + image: 'gvenzl/oracle-free:latest' environment: - 'ORACLE_PASSWORD=secret' ports: diff --git a/start-site/src/test/resources/compose/pgvector.yaml b/start-site/src/test/resources/compose/pgvector.yaml new file mode 100644 index 0000000000..36565c03d6 --- /dev/null +++ b/start-site/src/test/resources/compose/pgvector.yaml @@ -0,0 +1,11 @@ +services: + pgvector: + image: 'pgvector/pgvector:pg16' + environment: + - 'POSTGRES_DB=mydatabase' + - 'POSTGRES_PASSWORD=secret' + - 'POSTGRES_USER=myuser' + labels: + - "org.springframework.boot.service-connection=postgres" + ports: + - '5432' diff --git a/start-site/src/test/resources/compose/pulsar.yaml b/start-site/src/test/resources/compose/pulsar.yaml new file mode 100644 index 0000000000..cbd95ab404 --- /dev/null +++ b/start-site/src/test/resources/compose/pulsar.yaml @@ -0,0 +1,7 @@ +services: + pulsar: + image: 'apachepulsar/pulsar:latest' + ports: + - '6650' + - '8080' + command: 'bin/pulsar standalone' diff --git a/start-site/src/test/resources/compose/qdrant.yaml b/start-site/src/test/resources/compose/qdrant.yaml new file mode 100644 index 0000000000..01613ae2fd --- /dev/null +++ b/start-site/src/test/resources/compose/qdrant.yaml @@ -0,0 +1,5 @@ +services: + qdrant: + image: 'qdrant/qdrant:latest' + ports: + - '6334' diff --git a/start-site/src/test/resources/compose/redis-stack.yaml b/start-site/src/test/resources/compose/redis-stack.yaml new file mode 100644 index 0000000000..2b23270487 --- /dev/null +++ b/start-site/src/test/resources/compose/redis-stack.yaml @@ -0,0 +1,7 @@ +services: + redis: + image: 'redis/redis-stack:latest' + labels: + - "org.springframework.boot.service-connection=redis" + ports: + - '6379' diff --git a/start-site/src/test/resources/compose/weaviate.yaml b/start-site/src/test/resources/compose/weaviate.yaml new file mode 100644 index 0000000000..4dac3a88bb --- /dev/null +++ b/start-site/src/test/resources/compose/weaviate.yaml @@ -0,0 +1,5 @@ +services: + weaviate: + image: 'semitechnologies/weaviate:latest' + ports: + - '8080' diff --git a/start-site/src/test/resources/dependency/hilla/hilla-maven-profile.xml b/start-site/src/test/resources/dependency/hilla/hilla-maven-profile.xml deleted file mode 100644 index 6cc09429e4..0000000000 --- a/start-site/src/test/resources/dependency/hilla/hilla-maven-profile.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - production - - - - dev.hilla - hilla-maven-plugin - ${hilla.version} - - - frontend - compile - - build-frontend - - - true - - - - - - - - \ No newline at end of file diff --git a/start-site/src/test/resources/junit-platform.properties b/start-site/src/test/resources/junit-platform.properties index 1d27b78fbb..5c068dfbba 100644 --- a/start-site/src/test/resources/junit-platform.properties +++ b/start-site/src/test/resources/junit-platform.properties @@ -1 +1,19 @@ +# +# Copyright 2012-2024 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + junit.jupiter.execution.parallel.enabled=true +junit.jupiter.execution.parallel.config.strategy=custom +junit.jupiter.execution.parallel.config.custom.class=io.spring.start.testsupport.JunitMaxParallelismStrategy diff --git a/start-site/src/test/resources/metadata/springio/spring-boot.json b/start-site/src/test/resources/metadata/springio/spring-boot.json index 20aa37932a..1d73a7b21a 100644 --- a/start-site/src/test/resources/metadata/springio/spring-boot.json +++ b/start-site/src/test/resources/metadata/springio/spring-boot.json @@ -2,88 +2,133 @@ "_embedded": { "releases": [ { - "version": "3.0.2-SNAPSHOT", - "status": "SNAPSHOT", + "version": "3.1.12", + "apiDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/api/", + "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/reference/html/", + "status": "GENERAL_AVAILABILITY", "current": false, - "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/3.0.2-SNAPSHOT/reference/html/", - "apiDocUrl": "https://docs.spring.io/spring-boot/docs/3.0.2-SNAPSHOT/api/", "_links": { - "self": { - "href": "https://spring.io/api/projects/spring-boot/releases/3.0.2-SNAPSHOT" - }, "repository": { - "href": "https://spring.io/api/repositories/spring-snapshots" + "href": "https://api.spring.io/repositories/spring-releases" + }, + "self": { + "href": "https://api.spring.io/projects/spring-boot/releases/3.1.12" } } }, { - "version": "3.0.1", + "version": "3.0.13", + "apiDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/api/", + "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/reference/html/", "status": "GENERAL_AVAILABILITY", - "current": true, - "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/current/reference/html/", - "apiDocUrl": "https://docs.spring.io/spring-boot/docs/current/api/", + "current": false, "_links": { - "self": { - "href": "https://spring.io/api/projects/spring-boot/releases/3.0.1" + "repository": { + "href": "https://api.spring.io/repositories/spring-releases" }, + "self": { + "href": "https://api.spring.io/projects/spring-boot/releases/3.0.13" + } + } + }, + { + "version": "2.7.18", + "apiDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/api/", + "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/reference/html/", + "status": "GENERAL_AVAILABILITY", + "current": false, + "_links": { "repository": { - "href": "https://spring.io/api/repositories/spring-releases" + "href": "https://api.spring.io/repositories/spring-releases" + }, + "self": { + "href": "https://api.spring.io/projects/spring-boot/releases/2.7.18" } } }, { - "version": "2.7.8-SNAPSHOT", + "version": "3.3.7-SNAPSHOT", + "apiDocUrl": "https://docs.spring.io/spring-boot/{version}/api/java/index.html", + "referenceDocUrl": "https://docs.spring.io/spring-boot/{version}/index.html", "status": "SNAPSHOT", "current": false, - "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/2.7.8-SNAPSHOT/reference/html/", - "apiDocUrl": "https://docs.spring.io/spring-boot/docs/2.7.8-SNAPSHOT/api/", "_links": { - "self": { - "href": "https://spring.io/api/projects/spring-boot/releases/2.7.8-SNAPSHOT" - }, "repository": { - "href": "https://spring.io/api/repositories/spring-snapshots" + "href": "https://api.spring.io/repositories/spring-snapshots" + }, + "self": { + "href": "https://api.spring.io/projects/spring-boot/releases/3.3.7-SNAPSHOT" } } }, { - "version": "2.7.7", + "version": "3.3.6", + "apiDocUrl": "https://docs.spring.io/spring-boot/{version}/api/java/index.html", + "referenceDocUrl": "https://docs.spring.io/spring-boot/{version}/index.html", "status": "GENERAL_AVAILABILITY", "current": false, - "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/2.7.7/reference/html/", - "apiDocUrl": "https://docs.spring.io/spring-boot/docs/2.7.7/api/", "_links": { - "self": { - "href": "https://spring.io/api/projects/spring-boot/releases/2.7.7" - }, "repository": { - "href": "https://spring.io/api/repositories/spring-releases" + "href": "https://api.spring.io/repositories/spring-releases" + }, + "self": { + "href": "https://api.spring.io/projects/spring-boot/releases/3.3.6" } } }, { - "version": "2.6.14", + "version": "3.2.12", + "apiDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/api/", + "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/reference/html/", "status": "GENERAL_AVAILABILITY", "current": false, - "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/2.6.14/reference/html/", - "apiDocUrl": "https://docs.spring.io/spring-boot/docs/2.6.14/api/", "_links": { + "repository": { + "href": "https://api.spring.io/repositories/spring-releases" + }, "self": { - "href": "https://spring.io/api/projects/spring-boot/releases/2.6.14" + "href": "https://api.spring.io/projects/spring-boot/releases/3.2.12" + } + } + }, + { + "version": "3.4.0", + "apiDocUrl": "https://docs.spring.io/spring-boot/{version}/api/java/index.html", + "referenceDocUrl": "https://docs.spring.io/spring-boot/{version}/index.html", + "status": "GENERAL_AVAILABILITY", + "current": true, + "_links": { + "repository": { + "href": "https://api.spring.io/repositories/spring-releases" }, + "self": { + "href": "https://api.spring.io/projects/spring-boot/releases/3.4.0" + } + } + }, + { + "version": "3.4.1-SNAPSHOT", + "apiDocUrl": "https://docs.spring.io/spring-boot/{version}/api/java/index.html", + "referenceDocUrl": "https://docs.spring.io/spring-boot/{version}/index.html", + "status": "SNAPSHOT", + "current": false, + "_links": { "repository": { - "href": "https://spring.io/api/repositories/spring-releases" + "href": "https://api.spring.io/repositories/spring-snapshots" + }, + "self": { + "href": "https://api.spring.io/projects/spring-boot/releases/3.4.1-SNAPSHOT" } } } ] }, "_links": { - "current": { - "href": "https://spring.io/api/projects/spring-boot/releases/current" - }, "project": { - "href": "https://spring.io/api/projects/spring-boot" + "href": "https://api.spring.io/projects/spring-boot" + }, + "current": { + "href": "https://api.spring.io/projects/spring-boot/releases/current" } } } diff --git a/test-support/pom.xml b/test-support/pom.xml new file mode 100644 index 0000000000..29137b934e --- /dev/null +++ b/test-support/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + io.spring.start + start-parent + ${revision} + + test-support + Support utilities for tests + + + + org.springframework + spring-core + + + org.junit.jupiter + junit-jupiter-engine + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + io.spring.javaformat + spring-javaformat-maven-plugin + + + org.apache.maven.plugins + maven-checkstyle-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + false + + + + + + diff --git a/test-support/src/main/java/io/spring/start/testsupport/Homes.java b/test-support/src/main/java/io/spring/start/testsupport/Homes.java new file mode 100644 index 0000000000..fec5435da4 --- /dev/null +++ b/test-support/src/main/java/io/spring/start/testsupport/Homes.java @@ -0,0 +1,69 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.testsupport; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Files; +import java.nio.file.Path; + +/** + * Manages Maven and Gradle home directories. + *

    + * The directories are reused, if possible. If no home is available for reuse, a new one + * will be created. + * + * @author Moritz Halbritter + */ +public class Homes { + + /** + * Maven homes. + */ + public static final Homes MAVEN = new Homes("maven-home"); + + /** + * Gradle homes. + */ + public static final Homes GRADLE = new Homes("gradle-home"); + + private final Path path; + + Homes(String name) { + this.path = createTempDirectory(name); + } + + /** + * Returns the path to the home. + * @return the path to the home + */ + public Path get() { + return this.path; + } + + private static Path createTempDirectory(String name) { + try { + Path path = TemporaryFiles.getTempDir().resolve("homes").resolve(name); + Files.createDirectories(path); + return path; + } + catch (IOException ex) { + throw new UncheckedIOException("Failed to create temp directory", ex); + } + } + +} diff --git a/test-support/src/main/java/io/spring/start/testsupport/JunitMaxParallelismStrategy.java b/test-support/src/main/java/io/spring/start/testsupport/JunitMaxParallelismStrategy.java new file mode 100644 index 0000000000..171fb0527f --- /dev/null +++ b/test-support/src/main/java/io/spring/start/testsupport/JunitMaxParallelismStrategy.java @@ -0,0 +1,96 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.testsupport; + +import java.util.concurrent.ForkJoinPool; +import java.util.function.Predicate; + +import org.junit.platform.engine.ConfigurationParameters; +import org.junit.platform.engine.support.hierarchical.ParallelExecutionConfiguration; +import org.junit.platform.engine.support.hierarchical.ParallelExecutionConfigurationStrategy; + +import org.springframework.util.StringUtils; + +/** + * A parallel execution strategy for JUnit, which limits the maximum number of + * parallelism. + * + * @author Moritz Halbritter + */ +public class JunitMaxParallelismStrategy implements ParallelExecutionConfigurationStrategy { + + private static final int DEFAULT_MAX_PARALLELISM = Integer.MAX_VALUE; + + @Override + public ParallelExecutionConfiguration createConfiguration(ConfigurationParameters configurationParameters) { + int maxParallelism = getMaxParallelism(); + int parallelism = Runtime.getRuntime().availableProcessors(); + if (parallelism > maxParallelism) { + parallelism = maxParallelism; + } + return new FixedParallelExecutionConfiguration(parallelism); + } + + private int getMaxParallelism() { + String maxParallelism = System.getenv("JUNIT_MAX_PARALLELISM"); + if (StringUtils.hasText(maxParallelism)) { + return Integer.parseInt(maxParallelism); + } + return DEFAULT_MAX_PARALLELISM; + } + + private static final class FixedParallelExecutionConfiguration implements ParallelExecutionConfiguration { + + private final int processors; + + FixedParallelExecutionConfiguration(int processors) { + this.processors = processors; + } + + @Override + public int getParallelism() { + return this.processors; + } + + @Override + public int getMinimumRunnable() { + return getParallelism(); + } + + @Override + public int getMaxPoolSize() { + return getParallelism(); + } + + @Override + public int getCorePoolSize() { + return getParallelism(); + } + + @Override + public int getKeepAliveSeconds() { + return 30; + } + + @Override + public Predicate getSaturatePredicate() { + return (ignore) -> true; + } + + } + +} diff --git a/test-support/src/main/java/io/spring/start/testsupport/TemporaryFiles.java b/test-support/src/main/java/io/spring/start/testsupport/TemporaryFiles.java new file mode 100644 index 0000000000..92fab023fe --- /dev/null +++ b/test-support/src/main/java/io/spring/start/testsupport/TemporaryFiles.java @@ -0,0 +1,79 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.testsupport; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.springframework.util.FileSystemUtils; + +/** + * Utility to work with temporary files. + * + * @author Moritz Halbritter + */ +public final class TemporaryFiles { + + private static final AtomicBoolean CLEANUP_REGISTERED = new AtomicBoolean(); + + private static final Set CLEANUP_PATHS = ConcurrentHashMap.newKeySet(); + + private TemporaryFiles() { + } + + public static Path newTemporaryDirectory(String prefix) throws IOException { + String name = prefix + System.nanoTime(); + Path path = getTempDir().resolve(name); + Files.createDirectories(path); + registerCleanup(); + CLEANUP_PATHS.add(path); + return path; + } + + private static void registerCleanup() { + if (CLEANUP_REGISTERED.compareAndSet(false, true)) { + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + for (Path cleanupPath : CLEANUP_PATHS) { + try { + FileSystemUtils.deleteRecursively(cleanupPath); + } + catch (IOException ex) { + // Ignore + } + } + })); + } + } + + public static Path getTempDir() { + String property = System.getenv("START_SPRING_IO_TMPDIR"); + if (property != null) { + return Path.of(property); + } + property = System.getProperty("java.io.tmpdir"); + if (property != null) { + return Path.of(property); + } + throw new IllegalStateException( + "Unable to find temporary directory. Please set either the env variable START_SPRING_IO_TMPDIR, or the system property java.io.tmpdir"); + } + +} diff --git a/test-support/src/main/java/io/spring/start/testsupport/package-info.java b/test-support/src/main/java/io/spring/start/testsupport/package-info.java new file mode 100644 index 0000000000..1399b403a4 --- /dev/null +++ b/test-support/src/main/java/io/spring/start/testsupport/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Test support classes. + */ +package io.spring.start.testsupport; diff --git a/test-support/src/test/java/io/spring/start/testsupport/HomesTests.java b/test-support/src/test/java/io/spring/start/testsupport/HomesTests.java new file mode 100644 index 0000000000..6a52f48ab5 --- /dev/null +++ b/test-support/src/test/java/io/spring/start/testsupport/HomesTests.java @@ -0,0 +1,41 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.testsupport; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link Homes}. + * + * @author Moritz Halbritter + */ +class HomesTests { + + @Test + void shouldGetNewHome() { + Homes test1 = new Homes("test1"); + Homes test1Again = new Homes("test1"); + Homes test2 = new Homes("test2"); + assertThat(test1.get()).isEmptyDirectory(); + assertThat(test1.get()).isEqualTo(test1.get()); + assertThat(test1.get()).isEqualTo(test1Again.get()); + assertThat(test1.get()).isNotEqualTo(test2.get()); + } + +} diff --git a/using-web-ui.png b/using-web-ui.png index 97878c3e7b..6bae0391c8 100644 Binary files a/using-web-ui.png and b/using-web-ui.png differ