From bfa4afcdd359b62dfc9c721114e814dde11a2f82 Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Tue, 31 Mar 2026 09:10:00 +0200 Subject: [PATCH 01/12] fix: fix local build issues with Flow frontend build Force production frontend build in wtr.js and build.sh verify step to prevent flow:build-frontend from skipping npm install when it detects an existing bundle. Add pre-compile step after mergeITs to avoid incremental compilation wiping flow-build-info.json during the verify lifecycle. Clean stale Flow-generated files in mergeITs.js and create an empty package.json so that build-frontend preserves generated config files. --- scripts/build.sh | 6 +++++- scripts/mergeITs.js | 14 ++++++++++++++ scripts/wtr.js | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/scripts/build.sh b/scripts/build.sh index 5a364ea8983..f5a7a5b2b9e 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -157,6 +157,10 @@ cmd="node scripts/mergeITs.js "`echo $elements` tcLog "Merge IT modules - $cmd" $cmd || tcStatus 1 "Merging ITs failed" +## Pre-compile merged ITs to avoid incremental compilation issues +tcLog "Pre-compiling merged ITs" +(cd integration-tests && mvn compile test-compile $args -DskipUnitTests) || tcStatus 1 "Merged ITs compilation failed" + ## Compute variable to run tests [ -n "$TBLICENSE" ] && args="$args -Dvaadin.testbench.developer.license=$TBLICENSE" [ -n "$TBHUB" ] && args="$args -Dtest.use.hub=true -Dcom.vaadin.testbench.Parameters.hubHostname=$TBHUB" @@ -197,7 +201,7 @@ then else mode="-Dfailsafe.forkCount=$FORK_COUNT -Dcom.vaadin.testbench.Parameters.testsInParallel=$TESTS_IN_PARALLEL" ### Run IT's in merged module - cmd="mvn $verify -Drun-it -Drelease -Dvaadin.productionMode -Dfailsafe.rerunFailingTestsCount=2 $mode $args -pl integration-tests -DskipUnitTests" + cmd="mvn $verify -Drun-it -Drelease -Dvaadin.productionMode -Dvaadin.force.production.build=true -Dfailsafe.rerunFailingTestsCount=2 $mode $args -pl integration-tests -DskipUnitTests" tcLog "Running merged ITs - mvn $verify -B -Drun-it -Drelease -pl integration-tests ..." echo $cmd $cmd diff --git a/scripts/mergeITs.js b/scripts/mergeITs.js index c641a8077e1..f2f70fa626d 100755 --- a/scripts/mergeITs.js +++ b/scripts/mergeITs.js @@ -252,6 +252,20 @@ async function copySources() { } }); + // clean stale Flow-generated files from previous runs + ['package.json', 'package-lock.json', 'pnpm-lock.yaml', 'tsconfig.json', 'types.d.ts', 'vite.generated.ts', '.npmrc', '.pnpmfile.cjs'] + .forEach(f => { + const file = `${itFolder}/${f}`; + if (fs.existsSync(file)) { + console.log(`removing ${file}`); + fs.rmSync(file); + } + }); + + // Create empty package.json so that build-frontend does not + // perform aggressive cleanup that deletes flow-build-info.json + fs.writeFileSync(`${itFolder}/package.json`, '{}'); + modules.forEach(parent => { const id = parent.replace('-parent', ''); console.log(`Copying ${parent}/${id}-integration-tests`); diff --git a/scripts/wtr.js b/scripts/wtr.js index 122558cbb55..20e894d1f07 100755 --- a/scripts/wtr.js +++ b/scripts/wtr.js @@ -47,7 +47,7 @@ function runTests() { } // Install the IT module dependencies - execSync(`mvn -DskipTests flow:prepare-frontend flow:build-frontend`, { + execSync(`mvn -DskipTests -Dvaadin.force.production.build=true flow:prepare-frontend flow:build-frontend`, { cwd: itFolder, stdio: 'inherit' }); From b121a1b1527c860d969fd211bf7c74460fc78a45 Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Wed, 1 Apr 2026 08:28:43 +0200 Subject: [PATCH 02/12] chore: add -B -ntp to the run.js script --- scripts/run.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/run.js b/scripts/run.js index c3a427d1c34..534595dda68 100755 --- a/scripts/run.js +++ b/scripts/run.js @@ -98,9 +98,9 @@ function generateHistoryItems() { // === Maven Execution === function runMvn(module, modeKey, args, message, onOutput) { - const command = `mvn ${args.join(' ')}`; + const command = `mvn -B -ntp ${args.join(' ')}`; args = [...args, '-Dstyle.color=always']; - console.log(`\n${message}\n`); + console.log(`\n${message}\n${command}\n`); const mvn = spawn('mvn', args, { stdio: ['inherit', 'pipe', 'pipe'] }); From d0d087a71a6636dbf2d28cc6e44ea2f449bb49ed Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Wed, 1 Apr 2026 08:36:13 +0200 Subject: [PATCH 03/12] feat: add GitHub Actions validation workflow Replicate the TeamCity validation build as a GH Actions workflow. Single job runs: compile, unit tests, skip-ci check, mergeITs, pre-compile, WTR tests, Selenium setup, and integration tests. --- .github/workflows/validation.yml | 181 +++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 .github/workflows/validation.yml diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml new file mode 100644 index 00000000000..2e97ce2cb51 --- /dev/null +++ b/.github/workflows/validation.yml @@ -0,0 +1,181 @@ +name: Validation + +on: + pull_request: + branches: ['main', '25.*'] + workflow_dispatch: + inputs: + components: + description: 'Space-separated component names (e.g. "grid combo-box"), empty for all' + required: false + default: '' + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +env: + MAVEN_ARGS: -ntp -B + FORK_COUNT: 5 + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + +jobs: + validation: + name: Build and Test + runs-on: ubuntu-latest + timeout-minutes: 120 + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha || github.sha }} + + - name: Setup JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + cache: 'maven' + + - name: Setup Node 20 + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install TestBench license + if: env.TB_LICENSE != '' + env: + TB_LICENSE: ${{ secrets.TB_LICENSE }} + run: | + mkdir -p ~/.vaadin + user="${TB_LICENSE%%/*}" + key="${TB_LICENSE#*/}" + echo "{\"username\":\"${user}\",\"proKey\":\"${key}\"}" > ~/.vaadin/proKey + + - name: Show environment info + run: | + java -version + mvn -version + node --version + npm --version + + - name: Compile all sources + run: mvn clean test-compile -DskipFrontend $MAVEN_ARGS + + - name: Unit tests and install + run: | + mvn install -Drelease -T $FORK_COUNT $MAVEN_ARGS || { + echo "::warning::First attempt failed (Maven multi-thread race). Retrying..." + sleep 15 + mvn install -Drelease -T $FORK_COUNT $MAVEN_ARGS + } + + - name: Check for skip-ci + id: skip-ci + if: github.event_name == 'pull_request' + env: + GH_TOKEN: ${{ github.token }} + PR_TITLE: ${{ github.event.pull_request.title }} + run: | + if echo "$PR_TITLE" | grep -q '\[skip ci\]'; then + echo "skip=true" >> "$GITHUB_OUTPUT" + exit 0 + fi + pr_number="${{ github.event.pull_request.number }}" + commits=$(gh api "repos/${{ github.repository }}/pulls/$pr_number/commits" --jq '.[].commit.message') + if echo "$commits" | grep -q '\[skip ci\]'; then + echo "skip=true" >> "$GITHUB_OUTPUT" + exit 0 + fi + echo "skip=false" >> "$GITHUB_OUTPUT" + + - name: Detect modified components + id: components + if: steps.skip-ci.outputs.skip != 'true' + env: + GH_TOKEN: ${{ github.token }} + run: | + elements="${{ github.event.inputs.components || '' }}" + if [ -z "$elements" ] && [ "${{ github.event_name }}" = "pull_request" ]; then + pr_number="${{ github.event.pull_request.number }}" + modified=$(gh api "repos/${{ github.repository }}/pulls/$pr_number/files" --jq '.[].filename' \ + | grep 'vaadin.*flow-parent' \ + | sed 's,^vaadin-\(.*\)-flow-parent.*,\1,' \ + | sort -u) + nmods=$(echo "$modified" | wc -w | tr -d ' ') + all_files=$(gh api "repos/${{ github.repository }}/pulls/$pr_number/files" --jq '.[].filename' | sort -u | tr -d '[:space:]') + component_files=$(gh api "repos/${{ github.repository }}/pulls/$pr_number/files" --jq '.[].filename' | grep 'vaadin.*flow-parent' | sort -u | tr -d '[:space:]') + if [ "$nmods" -lt 5 ] && [ ${#all_files} -eq ${#component_files} ]; then + elements=$(echo $modified | tr '\n' ' ') + echo "Running partial build for: $elements" + fi + fi + echo "elements=$elements" >> "$GITHUB_OUTPUT" + + - name: npm install + if: steps.skip-ci.outputs.skip != 'true' + run: npm install --silent --quiet --no-progress + + - name: Merge ITs + if: steps.skip-ci.outputs.skip != 'true' + run: node scripts/mergeITs.js ${{ steps.components.outputs.elements }} + + - name: Pre-compile merged ITs + if: steps.skip-ci.outputs.skip != 'true' + run: cd integration-tests && mvn compile test-compile $MAVEN_ARGS -DskipUnitTests + + - name: WTR tests + if: steps.skip-ci.outputs.skip != 'true' + run: node scripts/wtr.js ${{ steps.components.outputs.elements }} + + - name: Start Selenium + if: steps.skip-ci.outputs.skip != 'true' + run: | + docker pull selenium/standalone-chrome:latest + docker run --name selenium --net=host --rm -d -v /dev/shm:/dev/shm selenium/standalone-chrome:latest + sleep 5 + + - name: Run integration tests + if: steps.skip-ci.outputs.skip != 'true' + env: + TBLICENSE: ${{ secrets.TB_LICENSE }} + run: | + args="$MAVEN_ARGS" + [ -n "$TBLICENSE" ] && args="$args -Dvaadin.testbench.developer.license=$TBLICENSE" + args="$args -Dtest.use.hub=true -Dcom.vaadin.testbench.Parameters.hubHostname=localhost" + args="$args -Dfailsafe.rerunFailingTestsCount=2 -Dmaven.test.redirectTestOutputToFile=true" + mode="-Dfailsafe.forkCount=$FORK_COUNT -Dcom.vaadin.testbench.Parameters.testsInParallel=1" + + mvn verify -Dvaadin.pnpm.enable -Drun-it -Drelease -Dvaadin.productionMode \ + -Dvaadin.force.production.build=true \ + $mode $args -pl integration-tests -DskipUnitTests + + - name: Stop Selenium + if: always() + run: docker stop selenium 2>/dev/null || true + + - name: Upload surefire reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: surefire-reports + path: '**/target/surefire-reports/' + retention-days: 5 + + - name: Upload failsafe reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: failsafe-reports + path: 'integration-tests/target/failsafe-reports/' + retention-days: 5 + + - name: Upload error screenshots + if: failure() + uses: actions/upload-artifact@v4 + with: + name: error-screenshots + path: 'integration-tests/error-screenshots/' + retention-days: 5 From 46c6d9596a706b44b7099d5aa77c5ff54f41c3ec Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Wed, 1 Apr 2026 11:32:52 +0200 Subject: [PATCH 04/12] chore: update GH Actions to Node 24 compatible versions checkout@v6, setup-java@v5, setup-node@v6, upload-artifact@v5 --- .github/workflows/validation.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 2e97ce2cb51..2ac57ecdc0c 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -20,7 +20,6 @@ concurrency: env: MAVEN_ARGS: -ntp -B FORK_COUNT: 5 - FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true jobs: validation: @@ -28,19 +27,19 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 120 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.head.sha || github.sha }} - name: Setup JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: java-version: '21' distribution: 'temurin' cache: 'maven' - name: Setup Node 20 - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '20' @@ -158,7 +157,7 @@ jobs: - name: Upload surefire reports if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: surefire-reports path: '**/target/surefire-reports/' @@ -166,7 +165,7 @@ jobs: - name: Upload failsafe reports if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: failsafe-reports path: 'integration-tests/target/failsafe-reports/' @@ -174,7 +173,7 @@ jobs: - name: Upload error screenshots if: failure() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: error-screenshots path: 'integration-tests/error-screenshots/' From ca8f0a94e91bf6104023e61d9a524b229a1d173e Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Wed, 1 Apr 2026 11:34:38 +0200 Subject: [PATCH 05/12] chore: enable Maven quiet mode by default in validation workflow Use -q flag unless the workflow is re-run with debug enabled. --- .github/workflows/validation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 2ac57ecdc0c..81746a1574f 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -18,7 +18,7 @@ concurrency: cancel-in-progress: true env: - MAVEN_ARGS: -ntp -B + MAVEN_ARGS: -ntp -B ${{ !runner.debug && '-q' || '' }} FORK_COUNT: 5 jobs: From dfe8499dfedf82a533ce0034dc0096a523101a6b Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Wed, 1 Apr 2026 11:36:16 +0200 Subject: [PATCH 06/12] feat: publish test results to PR via check runs Use dorny/test-reporter to parse surefire and failsafe XML reports and create check runs with test summaries visible in the PR. --- .github/workflows/validation.yml | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 81746a1574f..2dff3feb8ef 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -12,6 +12,7 @@ on: permissions: contents: read + checks: write concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -155,21 +156,21 @@ jobs: if: always() run: docker stop selenium 2>/dev/null || true - - name: Upload surefire reports + - name: Publish unit test results if: always() - uses: actions/upload-artifact@v5 + uses: dorny/test-reporter@v1 with: - name: surefire-reports - path: '**/target/surefire-reports/' - retention-days: 5 + name: Unit Tests + path: '**/target/surefire-reports/TEST-*.xml' + reporter: java-junit - - name: Upload failsafe reports + - name: Publish integration test results if: always() - uses: actions/upload-artifact@v5 + uses: dorny/test-reporter@v1 with: - name: failsafe-reports - path: 'integration-tests/target/failsafe-reports/' - retention-days: 5 + name: Integration Tests + path: 'integration-tests/target/failsafe-reports/TEST-*.xml' + reporter: java-junit - name: Upload error screenshots if: failure() From 912012750added642a8a84d147fdb94d3c14cbe3 Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Wed, 1 Apr 2026 11:45:00 +0200 Subject: [PATCH 07/12] fix: move MAVEN_ARGS to job-level env where runner context is available --- .github/workflows/validation.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 2dff3feb8ef..283117e66f8 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -19,7 +19,6 @@ concurrency: cancel-in-progress: true env: - MAVEN_ARGS: -ntp -B ${{ !runner.debug && '-q' || '' }} FORK_COUNT: 5 jobs: @@ -28,6 +27,12 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 120 steps: + - name: Set Maven args + run: | + args="-ntp -B" + [ "${{ runner.debug }}" != "1" ] && args="$args -q" + echo "MAVEN_ARGS=$args" >> "$GITHUB_ENV" + - uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.head.sha || github.sha }} From cc20ebc81df7a80f300b1fa831ea4e683faedfcc Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Wed, 1 Apr 2026 14:23:11 +0200 Subject: [PATCH 08/12] feat: add merge queue support to validation workflow Support merge_group events so the workflow runs when PRs enter the merge queue. Component detection uses git diff for merge queue events since there is no PR number available for the GitHub API. --- .github/workflows/validation.yml | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 283117e66f8..41a3543e1f3 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -3,6 +3,7 @@ name: Validation on: pull_request: branches: ['main', '25.*'] + merge_group: workflow_dispatch: inputs: components: @@ -15,7 +16,7 @@ permissions: checks: write concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.event.merge_group.head_ref || github.ref }} cancel-in-progress: true env: @@ -35,7 +36,8 @@ jobs: - uses: actions/checkout@v6 with: - ref: ${{ github.event.pull_request.head.sha || github.sha }} + ref: ${{ github.event.pull_request.head.sha || github.event.merge_group.head_sha || github.sha }} + fetch-depth: ${{ github.event_name == 'merge_group' && 50 || 1 }} - name: Setup JDK 21 uses: actions/setup-java@v5 @@ -79,11 +81,15 @@ jobs: - name: Check for skip-ci id: skip-ci - if: github.event_name == 'pull_request' + if: github.event_name == 'pull_request' || github.event_name == 'merge_group' env: GH_TOKEN: ${{ github.token }} PR_TITLE: ${{ github.event.pull_request.title }} run: | + if [ "${{ github.event_name }}" = "merge_group" ]; then + echo "skip=false" >> "$GITHUB_OUTPUT" + exit 0 + fi if echo "$PR_TITLE" | grep -q '\[skip ci\]'; then echo "skip=true" >> "$GITHUB_OUTPUT" exit 0 @@ -103,15 +109,21 @@ jobs: GH_TOKEN: ${{ github.token }} run: | elements="${{ github.event.inputs.components || '' }}" + changed_files="" if [ -z "$elements" ] && [ "${{ github.event_name }}" = "pull_request" ]; then pr_number="${{ github.event.pull_request.number }}" - modified=$(gh api "repos/${{ github.repository }}/pulls/$pr_number/files" --jq '.[].filename' \ + changed_files=$(gh api "repos/${{ github.repository }}/pulls/$pr_number/files" --jq '.[].filename') + elif [ -z "$elements" ] && [ "${{ github.event_name }}" = "merge_group" ]; then + changed_files=$(git diff --name-only "${{ github.event.merge_group.base_sha }}" "${{ github.event.merge_group.head_sha }}") + fi + if [ -n "$changed_files" ]; then + modified=$(echo "$changed_files" \ | grep 'vaadin.*flow-parent' \ | sed 's,^vaadin-\(.*\)-flow-parent.*,\1,' \ | sort -u) nmods=$(echo "$modified" | wc -w | tr -d ' ') - all_files=$(gh api "repos/${{ github.repository }}/pulls/$pr_number/files" --jq '.[].filename' | sort -u | tr -d '[:space:]') - component_files=$(gh api "repos/${{ github.repository }}/pulls/$pr_number/files" --jq '.[].filename' | grep 'vaadin.*flow-parent' | sort -u | tr -d '[:space:]') + all_files=$(echo "$changed_files" | sort -u | tr -d '[:space:]') + component_files=$(echo "$changed_files" | grep 'vaadin.*flow-parent' | sort -u | tr -d '[:space:]') if [ "$nmods" -lt 5 ] && [ ${#all_files} -eq ${#component_files} ]; then elements=$(echo $modified | tr '\n' ' ') echo "Running partial build for: $elements" From 4463d5662bea2df3df0c2b6bf5966ac4bfb1603c Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Thu, 2 Apr 2026 09:20:35 +0200 Subject: [PATCH 09/12] chore: remove sonar errors --- .github/workflows/validation.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 41a3543e1f3..2a4abb59f49 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -133,7 +133,7 @@ jobs: - name: npm install if: steps.skip-ci.outputs.skip != 'true' - run: npm install --silent --quiet --no-progress + run: npm install --ignore-scripts --silent --quiet --no-progress - name: Merge ITs if: steps.skip-ci.outputs.skip != 'true' @@ -175,7 +175,8 @@ jobs: - name: Publish unit test results if: always() - uses: dorny/test-reporter@v1 + ## Make sonar happy for external actions + uses: dorny/test-reporter@a43b3a5f7366b97d083190328d2c652e1a8b6aa2 with: name: Unit Tests path: '**/target/surefire-reports/TEST-*.xml' @@ -183,7 +184,7 @@ jobs: - name: Publish integration test results if: always() - uses: dorny/test-reporter@v1 + uses: dorny/test-reporter@a43b3a5f7366b97d083190328d2c652e1a8b6aa2 with: name: Integration Tests path: 'integration-tests/target/failsafe-reports/TEST-*.xml' From 1a799874c93c00c1b6a7f6ff1407a744ce6d1579 Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Wed, 1 Apr 2026 11:42:12 +0200 Subject: [PATCH 10/12] refactor: use GH Actions service container for Selenium Replace manual docker pull/run/stop with a service container that starts automatically and maps port 4444. --- .github/workflows/validation.yml | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 2a4abb59f49..226080f2f01 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -27,6 +27,12 @@ jobs: name: Build and Test runs-on: ubuntu-latest timeout-minutes: 120 + services: + selenium: + image: selenium/standalone-chrome:latest + options: --shm-size=2g + ports: + - 4444:4444 steps: - name: Set Maven args run: | @@ -147,13 +153,6 @@ jobs: if: steps.skip-ci.outputs.skip != 'true' run: node scripts/wtr.js ${{ steps.components.outputs.elements }} - - name: Start Selenium - if: steps.skip-ci.outputs.skip != 'true' - run: | - docker pull selenium/standalone-chrome:latest - docker run --name selenium --net=host --rm -d -v /dev/shm:/dev/shm selenium/standalone-chrome:latest - sleep 5 - - name: Run integration tests if: steps.skip-ci.outputs.skip != 'true' env: @@ -161,7 +160,7 @@ jobs: run: | args="$MAVEN_ARGS" [ -n "$TBLICENSE" ] && args="$args -Dvaadin.testbench.developer.license=$TBLICENSE" - args="$args -Dtest.use.hub=true -Dcom.vaadin.testbench.Parameters.hubHostname=localhost" + args="$args -Dtest.use.hub=true -Dcom.vaadin.testbench.Parameters.hubHostname=localhost -Dcom.vaadin.testbench.Parameters.hubPort=4444" args="$args -Dfailsafe.rerunFailingTestsCount=2 -Dmaven.test.redirectTestOutputToFile=true" mode="-Dfailsafe.forkCount=$FORK_COUNT -Dcom.vaadin.testbench.Parameters.testsInParallel=1" @@ -169,10 +168,6 @@ jobs: -Dvaadin.force.production.build=true \ $mode $args -pl integration-tests -DskipUnitTests - - name: Stop Selenium - if: always() - run: docker stop selenium 2>/dev/null || true - - name: Publish unit test results if: always() ## Make sonar happy for external actions From 2a3d3ca1c903c34a7037368c905d181d88f93495 Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Wed, 20 May 2026 22:05:31 +0200 Subject: [PATCH 11/12] ci: use npm ci instead of npm install --- .github/workflows/validation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 226080f2f01..a0884befaea 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -139,7 +139,7 @@ jobs: - name: npm install if: steps.skip-ci.outputs.skip != 'true' - run: npm install --ignore-scripts --silent --quiet --no-progress + run: npm ci --ignore-scripts - name: Merge ITs if: steps.skip-ci.outputs.skip != 'true' From e9851b85e5145d474383457a2c8e613acfe74862 Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Wed, 20 May 2026 23:09:10 +0200 Subject: [PATCH 12/12] chore: track package-lock.json and fix gitignore pattern --- .gitignore | 4 +- package-lock.json | 521 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 524 insertions(+), 1 deletion(-) create mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index 518cf97b21d..994c46bcbbb 100644 --- a/.gitignore +++ b/.gitignore @@ -25,7 +25,9 @@ vite.generated.ts /vite.config.ts node_modules .driver -package*json +**/package*json +!/package.json +!/package-lock.json pnpm* .npmrc .pnpmfile.cjs diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000000..393817c1431 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,521 @@ +{ + "name": "vaadin-flow-components", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vaadin-flow-components", + "version": "1.0.0", + "license": "APACHE", + "devDependencies": { + "replace-in-file": "6.1.0", + "xml2js": "^0.4.23" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/replace-in-file": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-6.1.0.tgz", + "integrity": "sha512-URzjyF3nucvejuY13HFd7O+Q6tFJRLKGHLYVvSh+LiZj3gFXzSYGnIkQflnJJulCAI2/RTZaZkpOtdVdW0EhQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "glob": "^7.1.6", + "yargs": "^15.3.1" + }, + "bin": { + "replace-in-file": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "license": "ISC" + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + } + } +}