diff --git a/.config/pmd/ruleset.xml b/.config/pmd/ruleset.xml
new file mode 100644
index 00000000..5f881567
--- /dev/null
+++ b/.config/pmd/ruleset.xml
@@ -0,0 +1,152 @@
+
+
+
+
+ This ruleset checks the code for discouraged programming constructs.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 00000000..9bd656c3
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,2 @@
+github: Leaflet
+open_collective: leafletjs
diff --git a/.github/workflows/checkBuild.yml b/.github/workflows/check-build.yml
similarity index 70%
rename from .github/workflows/checkBuild.yml
rename to .github/workflows/check-build.yml
index 3534d501..93378be5 100644
--- a/.github/workflows/checkBuild.yml
+++ b/.github/workflows/check-build.yml
@@ -70,7 +70,7 @@ jobs:
path: ${{ env.DEMO_MAVEN_MODULE }}/target/${{ env.DEMO_MAVEN_MODULE }}.jar
if-no-files-found: error
- code-style:
+ checkstyle:
runs-on: ubuntu-latest
if: ${{ github.event_name != 'pull_request' || !startsWith(github.head_ref, 'renovate/') }}
@@ -91,3 +91,40 @@ jobs:
- name: Run Checkstyle
run: ./mvnw -B checkstyle:check -P checkstyle -T2C
+
+ pmd:
+ runs-on: ubuntu-latest
+ if: ${{ github.event_name != 'pull_request' || !startsWith(github.head_ref, 'renovate/') }}
+
+ strategy:
+ matrix:
+ java: [17]
+ distribution: [temurin]
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up JDK
+ uses: actions/setup-java@v4
+ with:
+ distribution: ${{ matrix.distribution }}
+ java-version: ${{ matrix.java }}
+ cache: 'maven'
+
+ - name: Run PMD
+ run: ./mvnw -B test pmd:aggregate-pmd-no-fork pmd:check -P pmd -DskipTests -T2C
+
+ - name: Run CPD (Copy Paste Detector)
+ run: ./mvnw -B pmd:aggregate-cpd pmd:cpd-check -P pmd -DskipTests -T2C
+
+ - name: Upload report
+ if: always()
+ uses: actions/upload-artifact@v4
+ with:
+ name: pmd-report
+ if-no-files-found: ignore
+ path: |
+ target/site/*.html
+ target/site/css/**
+ target/site/images/logos/maven-feather.png
+ target/site/images/external.png
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 7936acb2..17140f36 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -12,7 +12,7 @@ permissions:
pull-requests: write
jobs:
- check_code: # Validates the code
+ check-code:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
@@ -45,9 +45,9 @@ jobs:
exit 1
fi
- prepare_release:
+ prepare-release:
runs-on: ubuntu-latest
- needs: [check_code]
+ needs: [check-code]
outputs:
upload_url: ${{ steps.create_release.outputs.upload_url }}
steps:
@@ -93,8 +93,8 @@ jobs:
release_name: v${{ steps.version.outputs.release }}
commitish: master
body: |
- ## [Changelog](https://github.com/xdev-software/${{ env.PRIMARY_MAVEN_MODULE }}/blob/develop/CHANGELOG.md#${{ steps.version.outputs.releasenumber }})
- See [Changelog#v${{ steps.version.outputs.release }}](https://github.com/xdev-software/${{ env.PRIMARY_MAVEN_MODULE }}/blob/develop/CHANGELOG.md#${{ steps.version.outputs.releasenumber }}) for more information.
+ ## [Changelog](https://github.com/${{ github.repository }}/blob/develop/CHANGELOG.md#${{ steps.version.outputs.releasenumber }})
+ See [Changelog#v${{ steps.version.outputs.release }}](https://github.com/${{ github.repository }}/blob/develop/CHANGELOG.md#${{ steps.version.outputs.releasenumber }}) for more information.
## Installation
Add the following lines to your pom:
@@ -109,9 +109,9 @@ jobs:
### Additional notes
* [Spring-Boot] You may have to include ``software/xdev`` inside [``vaadin.allowed-packages``](https://vaadin.com/docs/latest/integrations/spring/configuration#configure-the-scanning-of-packages)
- publish_central: # Publish the code to central
+ publish-maven:
runs-on: ubuntu-latest
- needs: [prepare_release]
+ needs: [prepare-release]
steps:
- uses: actions/checkout@v4
@@ -133,7 +133,7 @@ jobs:
gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }}
- name: Publish to Apache Maven Central
- run: ../mvnw -B deploy -Possrh
+ run: ../mvnw -B deploy -Possrh -DskipTests
env:
MAVEN_CENTRAL_USERNAME: ${{ secrets.S01_OSS_SONATYPE_MAVEN_USERNAME }}
MAVEN_CENTRAL_TOKEN: ${{ secrets.S01_OSS_SONATYPE_MAVEN_TOKEN }}
@@ -142,7 +142,7 @@ jobs:
publish-pages:
runs-on: ubuntu-latest
- needs: [prepare_release]
+ needs: [prepare-release]
steps:
- uses: actions/checkout@v4
@@ -160,7 +160,7 @@ jobs:
cache: 'maven'
- name: Build site
- run: ../mvnw -B site
+ run: ../mvnw -B site -DskipTests
working-directory: ${{ env.PRIMARY_MAVEN_MODULE }}
- name: Deploy to Github pages
@@ -169,9 +169,9 @@ jobs:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./${{ env.PRIMARY_MAVEN_MODULE }}/target/site
- after_release:
+ after-release:
runs-on: ubuntu-latest
- needs: [publish_central]
+ needs: [publish-maven]
steps:
- uses: actions/checkout@v4
@@ -189,7 +189,7 @@ jobs:
for i in "${modules[@]}"
do
echo "Processing $i/pom.xml"
- (cd "$i" && $mvnwPath -B build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} -DgenerateBackupPoms=false -DnextSnapshot=true)
+ (cd "$i" && $mvnwPath -B build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} -DgenerateBackupPoms=false -DnextSnapshot=true -DupdateMatchingVersions=false)
done
- name: Git Commit and Push
diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml
index 1c9b0f8d..7824917b 100644
--- a/.github/workflows/sonar.yml
+++ b/.github/workflows/sonar.yml
@@ -24,10 +24,22 @@ env:
SONARCLOUD_HOST: https://sonarcloud.io
jobs:
- sonar:
- name: SonarCloud Scan
+ token-check:
runs-on: ubuntu-latest
- if: ${{ github.event_name != 'pull_request' || !startsWith(github.head_ref, 'renovate/') }}
+ if: ${{ !(github.event_name == 'pull_request' && startsWith(github.head_ref, 'renovate/')) }}
+ outputs:
+ hasToken: ${{ steps.check-token.outputs.has }}
+ steps:
+ - id: check-token
+ run: |
+ [ -z $SONAR_TOKEN ] && echo "has=false" || echo "has=true" >> "$GITHUB_OUTPUT"
+ env:
+ SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
+
+ sonar-scan:
+ runs-on: ubuntu-latest
+ needs: token-check
+ if: ${{ needs.token-check.outputs.hasToken }}
steps:
- uses: actions/checkout@v4
with:
diff --git a/.github/workflows/test-deploy.yml b/.github/workflows/test-deploy.yml
index cdd96cc1..9c07de25 100644
--- a/.github/workflows/test-deploy.yml
+++ b/.github/workflows/test-deploy.yml
@@ -7,7 +7,7 @@ env:
PRIMARY_MAVEN_MODULE: ${{ github.event.repository.name }}
jobs:
- publish_central: # Publish the code to central
+ publish-maven:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
diff --git a/.github/workflows/update-from-template.yml b/.github/workflows/update-from-template.yml
index 2bd1095a..36d059ae 100644
--- a/.github/workflows/update-from-template.yml
+++ b/.github/workflows/update-from-template.yml
@@ -1,9 +1,10 @@
name: Update from Template
# This workflow keeps the repo up to date with changes from the template repo (REMOTE_URL)
-# It duplicates the REMOTE_BRANCH (into UPDATE_BRANCH) and tries to merge it into the
+# It duplicates the REMOTE_BRANCH (into UPDATE_BRANCH) and tries to merge it into
# this repos default branch (which is checked out here)
# Note that this requires a PAT (Personal Access Token) - at best from a servicing account
+# PAT permissions: read:discussion, read:org, repo, workflow
# Also note that you should have at least once merged the template repo into the current repo manually
# otherwise a "refusing to merge unrelated histories" error might occur.
@@ -11,9 +12,15 @@ on:
schedule:
- cron: '55 2 * * 1'
workflow_dispatch:
+ inputs:
+ no_automatic_merge:
+ type: boolean
+ description: 'No automatic merge'
+ default: false
env:
UPDATE_BRANCH: update-from-template
+ UPDATE_BRANCH_MERGED: update-from-template-merged
REMOTE_URL: https://github.com/xdev-software/vaadin-addon-template.git
REMOTE_BRANCH: master
@@ -24,7 +31,9 @@ permissions:
jobs:
update:
runs-on: ubuntu-latest
-
+ outputs:
+ update_branch_merged_commit: ${{ steps.manage-branches.outputs.update_branch_merged_commit }}
+ create_update_branch_merged_pr: ${{ steps.manage-branches.outputs.create_update_branch_merged_pr }}
steps:
- uses: actions/checkout@v4
with:
@@ -36,11 +45,11 @@ jobs:
- name: Init Git
run: |
- git config --global user.email "actions@github.com"
- git config --global user.name "GitHub Actions"
+ git config --global user.email "111048771+xdev-gh-bot@users.noreply.github.com"
+ git config --global user.name "XDEV Bot"
- - name: Main workflow
- id: main
+ - name: Manage branches
+ id: manage-branches
run: |
echo "Adding remote template-repo"
git remote add template ${{ env.REMOTE_URL }}
@@ -48,8 +57,9 @@ jobs:
echo "Fetching remote template repo"
git fetch template
- echo "Deleting local branch that will contain the updates - if present"
+ echo "Deleting local branches that will contain the updates - if present"
git branch -D ${{ env.UPDATE_BRANCH }} || true
+ git branch -D ${{ env.UPDATE_BRANCH_MERGED }} || true
echo "Checking if the remote template repo has new commits"
git rev-list ..template/${{ env.REMOTE_BRANCH }}
@@ -57,10 +67,12 @@ jobs:
if [ $(git rev-list --count ..template/${{ env.REMOTE_BRANCH }}) -eq 0 ]; then
echo "There are no commits new commits on the template repo"
- echo "Deleting origin branch that contains the updates - if present"
+ echo "Deleting origin branch(es) that contain the updates - if present"
git push -f origin --delete ${{ env.UPDATE_BRANCH }} || true
+ git push -f origin --delete ${{ env.UPDATE_BRANCH_MERGED }} || true
- echo "abort=1" >> $GITHUB_OUTPUT
+ echo "create_update_branch_pr=0" >> $GITHUB_OUTPUT
+ echo "create_update_branch_merged_pr=0" >> $GITHUB_OUTPUT
exit 0
fi
@@ -73,21 +85,234 @@ jobs:
echo "Pushing update branch"
git push -f -u origin ${{ env.UPDATE_BRANCH }}
- echo "Getting current branch"
- current_branch=$(git branch --show-current)
- echo "Current branch is $current_branch"
- echo "current_branch=$current_branch" >> $GITHUB_OUTPUT
+ echo "Getting base branch"
+ base_branch=$(git branch --show-current)
+ echo "Base branch is $base_branch"
+ echo "base_branch=$base_branch" >> $GITHUB_OUTPUT
- echo "abort=0" >> $GITHUB_OUTPUT
+ echo "Trying to create auto-merged branch ${{ env.UPDATE_BRANCH_MERGED }}"
+ git branch ${{ env.UPDATE_BRANCH_MERGED }} ${{ env.UPDATE_BRANCH }}
+ git checkout ${{ env.UPDATE_BRANCH_MERGED }}
- - name: pull-request
- if: steps.main.outputs.abort == 0
+ echo "Merging branch $base_branch into ${{ env.UPDATE_BRANCH_MERGED }}"
+ git merge $base_branch && merge_exit_code=$? || merge_exit_code=$?
+ if [ $merge_exit_code -ne 0 ]; then
+ echo "Auto merge failed! Manual merge required"
+ echo "::notice ::Auto merge failed - Manual merge required"
+
+ echo "Cleaning up failed merge"
+ git merge --abort
+ git checkout $base_branch
+ git branch -D ${{ env.UPDATE_BRANCH_MERGED }} || true
+
+ echo "Deleting auto-merge branch - if present"
+ git push -f origin --delete ${{ env.UPDATE_BRANCH_MERGED }} || true
+
+ echo "create_update_branch_pr=1" >> $GITHUB_OUTPUT
+ echo "create_update_branch_merged_pr=0" >> $GITHUB_OUTPUT
+ exit 0
+ fi
+
+ echo "Post processing: Trying to automatically fill in template variables"
+ find . -type f \
+ -not -path "./.git/**" \
+ -not -path "./.github/workflows/update-from-template.yml" -print0 \
+ | xargs -0 sed -i "s/template-placeholder/${GITHUB_REPOSITORY#*/}/g"
+
+ git status
+ git add --all
+
+ if [[ "$(git status --porcelain)" != "" ]]; then
+ echo "Filled in template; Committing"
+
+ git commit -m "Fill in template"
+ fi
+
+ echo "Pushing auto-merged branch"
+ git push -f -u origin ${{ env.UPDATE_BRANCH_MERGED }}
+
+ echo "update_branch_merged_commit=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
+
+ echo "Restoring base branch $base_branch"
+ git checkout $base_branch
+
+ echo "create_update_branch_pr=0" >> $GITHUB_OUTPUT
+ echo "create_update_branch_merged_pr=1" >> $GITHUB_OUTPUT
+ echo "try_close_update_branch_pr=1" >> $GITHUB_OUTPUT
+
+ - name: Create/Update PR update_branch
+ if: steps.manage-branches.outputs.create_update_branch_pr == 1
env:
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ GH_TOKEN: ${{ secrets.UPDATE_FROM_TEMPLATE_PAT }}
run: |
gh_pr_up() {
gh pr create -H "${{ env.UPDATE_BRANCH }}" "$@" || (git checkout "${{ env.UPDATE_BRANCH }}" && gh pr edit "$@")
}
- gh_pr_up -B "${{ steps.main.outputs.current_branch }}" \
+ gh_pr_up -B "${{ steps.manage-branches.outputs.base_branch }}" \
--title "Update from template" \
--body "An automated PR to sync changes from the template into this repo"
+
+ # Ensure that only a single PR is open (otherwise confusion and spam)
+ - name: Close PR update_branch
+ if: steps.manage-branches.outputs.try_close_update_branch_pr == 1
+ env:
+ GH_TOKEN: ${{ secrets.UPDATE_FROM_TEMPLATE_PAT }}
+ run: |
+ gh pr close "${{ env.UPDATE_BRANCH }}" || true
+
+ - name: Create/Update PR update_branch_merged
+ if: steps.manage-branches.outputs.create_update_branch_merged_pr == 1
+ env:
+ GH_TOKEN: ${{ secrets.UPDATE_FROM_TEMPLATE_PAT }}
+ run: |
+ gh_pr_up() {
+ gh pr create -H "${{ env.UPDATE_BRANCH_MERGED }}" "$@" || (git checkout "${{ env.UPDATE_BRANCH_MERGED }}" && gh pr edit "$@")
+ }
+ gh_pr_up -B "${{ steps.manage-branches.outputs.base_branch }}" \
+ --title "Update from template (auto-merged)" \
+ --body "An automated PR to sync changes from the template into this repo"
+
+ # Wait a moment so that checks of PR have higher prio than following job
+ sleep 3
+
+ # Split into two jobs to help with executor starvation
+ auto-merge:
+ needs: [update]
+ if: needs.update.outputs.create_update_branch_merged_pr == 1
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ # Required because otherwise there are always changes detected when executing diff/rev-list
+ fetch-depth: 0
+ # If no PAT is used the following error occurs on a push:
+ # refusing to allow a GitHub App to create or update workflow `.github/workflows/xxx.yml` without `workflows` permission
+ token: ${{ secrets.UPDATE_FROM_TEMPLATE_PAT }}
+
+ - name: Init Git
+ run: |
+ git config --global user.email "111048771+xdev-gh-bot@users.noreply.github.com"
+ git config --global user.name "XDEV Bot"
+
+ - name: Checking if auto-merge for PR update_branch_merged can be done
+ id: auto-merge-check
+ env:
+ GH_TOKEN: ${{ secrets.UPDATE_FROM_TEMPLATE_PAT }}
+ run: |
+ not_failed_conclusion="skipped|neutral|success"
+ not_relevant_app_slug="dependabot|github-pages|sonarcloud"
+
+ echo "Waiting for checks to start..."
+ sleep 40s
+
+ for i in {1..20}; do
+ echo "Checking if PR can be auto-merged. Try: $i"
+
+ echo "Checking if update-branch-merged exists"
+ git fetch
+ if [[ $(git rev-parse origin/${{ env.UPDATE_BRANCH_MERGED }}) ]]; then
+ echo "Branch still exists; Continuing..."
+ else
+ echo "Branch origin/${{ env.UPDATE_BRANCH_MERGED }} is missing"
+ exit 0
+ fi
+
+ echo "Fetching checks"
+ cs_response=$(curl -sL \
+ --fail-with-body \
+ --connect-timeout 60 \
+ --max-time 120 \
+ -H "Accept: application/vnd.github+json" \
+ -H "Authorization: Bearer $GH_TOKEN" \
+ -H "X-GitHub-Api-Version: 2022-11-28" \
+ https://api.github.com/repos/${{ github.repository }}/commits/${{ needs.update.outputs.update_branch_merged_commit }}/check-suites)
+
+ cs_data=$(echo $cs_response | jq '.check_suites[] | { conclusion: .conclusion, slug: .app.slug, check_runs_url: .check_runs_url }')
+ echo $cs_data
+
+ if [[ -z "$cs_data" ]]; then
+ echo "No check suite data - Assuming that there are no checks to run"
+
+ echo "perform=1" >> $GITHUB_OUTPUT
+ exit 0
+ fi
+
+ cs_failed=$(echo $cs_data | jq --arg x "$not_failed_conclusion" 'select ((.conclusion == null or (.conclusion | test($x))) | not)')
+ if [[ -z "$cs_failed" ]]; then
+ echo "No check failed so far; Checking if relevant checks are still running"
+
+ cs_relevant_still_running=$(echo $cs_data | jq --arg x "$not_relevant_app_slug" 'select (.conclusion == null and (.slug | test($x) | not))')
+ if [[ -z $cs_relevant_still_running ]]; then
+ echo "All relevant checks finished - PR can be merged"
+
+ echo "perform=1" >> $GITHUB_OUTPUT
+ exit 0
+ else
+ echo "Relevant checks are still running"
+ echo $cs_relevant_still_running
+ fi
+ else
+ echo "Detected failed check"
+ echo $cs_failed
+
+ echo "perform=0" >> $GITHUB_OUTPUT
+ exit 0
+ fi
+
+ echo "Waiting before next run..."
+ sleep 30s
+ done
+
+ echo "Timed out - Assuming executor starvation - Forcing merge"
+ echo "perform=1" >> $GITHUB_OUTPUT
+
+ - name: Auto-merge update_branch_merged
+ if: steps.auto-merge-check.outputs.perform == 1
+ run: |
+ echo "Getting base branch"
+ base_branch=$(git branch --show-current)
+ echo "Base branch is $base_branch"
+
+ echo "Fetching..."
+ git fetch
+ if [[ $(git rev-parse origin/${{ env.UPDATE_BRANCH_MERGED }}) ]]; then
+ echo "Branch still exists; Continuing..."
+ else
+ echo "Branch origin/${{ env.UPDATE_BRANCH_MERGED }} is missing"
+ exit 0
+ fi
+
+ expected_commit="${{ needs.update.outputs.update_branch_merged_commit }}"
+ actual_commit=$(git rev-parse origin/${{ env.UPDATE_BRANCH_MERGED }})
+ if [[ "$expected_commit" != "$actual_commit" ]]; then
+ echo "Branch ${{ env.UPDATE_BRANCH_MERGED }} contains unexpected commit $actual_commit"
+ echo "Expected: $expected_commit"
+
+ exit 0
+ fi
+
+ echo "Ensuring that current branch $base_branch is up-to-date"
+ git pull
+
+ echo "Merging origin/${{ env.UPDATE_BRANCH_MERGED }} into $base_branch"
+ git merge origin/${{ env.UPDATE_BRANCH_MERGED }} && merge_exit_code=$? || merge_exit_code=$?
+ if [ $merge_exit_code -ne 0 ]; then
+ echo "Unexpected merge failure $merge_exit_code - Requires manual resolution"
+
+ exit 0
+ fi
+
+ if [[ "${{ inputs.no_automatic_merge }}" == "true" ]]; then
+ echo "Exiting due no_automatic_merge"
+
+ exit 0
+ fi
+
+ echo "Pushing"
+ git push
+
+ echo "Cleaning up"
+ git branch -D ${{ env.UPDATE_BRANCH }} || true
+ git branch -D ${{ env.UPDATE_BRANCH_MERGED }} || true
+ git push -f origin --delete ${{ env.UPDATE_BRANCH }} || true
+ git push -f origin --delete ${{ env.UPDATE_BRANCH_MERGED }} || true
diff --git a/.gitignore b/.gitignore
index 8c3a5297..41570f9a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,11 +39,6 @@ buildNumber.properties
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
-
-# bin / compiled stuff
-target/
-
-
# JRebel
**/resources/rebel.xml
**/resources/rebel-remote.xml
@@ -79,8 +74,8 @@ tsconfig.json
types.d.ts
vite.config.ts
vite.generated.ts
-/*/frontend/generated/
-/*/frontend/index.html
+/*/src/main/frontend/generated/
+/*/src/main/frontend/index.html
/*/src/main/dev-bundle/
/*/src/main/bundles/
*.lock
diff --git a/.idea/saveactions_settings.xml b/.idea/saveactions_settings.xml
index 71a42c42..506f17eb 100644
--- a/.idea/saveactions_settings.xml
+++ b/.idea/saveactions_settings.xml
@@ -4,6 +4,7 @@