From 44a2d8547a0a2449e41c01451ee31082b424987a Mon Sep 17 00:00:00 2001 From: ahjephson <16685186+ahjephson@users.noreply.github.com> Date: Fri, 13 Mar 2026 12:16:06 +0000 Subject: [PATCH 1/5] Reduce dependency versions --- src/Blazor.HashRouting/Blazor.HashRouting.csproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Blazor.HashRouting/Blazor.HashRouting.csproj b/src/Blazor.HashRouting/Blazor.HashRouting.csproj index 510ea78..150076a 100644 --- a/src/Blazor.HashRouting/Blazor.HashRouting.csproj +++ b/src/Blazor.HashRouting/Blazor.HashRouting.csproj @@ -25,13 +25,13 @@ - - + + - - + + From bece4e0ba14003c1f0cee95f51ba1c58ce106962 Mon Sep 17 00:00:00 2001 From: ahjephson <16685186+ahjephson@users.noreply.github.com> Date: Fri, 13 Mar 2026 13:01:20 +0000 Subject: [PATCH 2/5] Update pipelines to include tags --- .github/workflows/ci.yml | 1 + .github/workflows/release.yml | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 609d7ac..4557f2d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + fetch-tags: true - name: Setup .NET uses: actions/setup-dotnet@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cba6641..26ea3fd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,6 +17,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + fetch-tags: true - name: Setup .NET uses: actions/setup-dotnet@v4 @@ -145,15 +146,26 @@ jobs: - name: Push package to NuGet if: steps.release_channel.outputs.channel != 'none' + id: push_package shell: bash run: | + set -o pipefail + + push_output_file="$(mktemp)" + dotnet nuget push "/tmp/artifacts/blazor-hashrouting/package/release/Blazor.HashRouting.${VERSION}.nupkg" \ --api-key "${{ secrets.NUGET_API_KEY }}" \ --source "https://api.nuget.org/v3/index.json" \ - --skip-duplicate + --skip-duplicate 2>&1 | tee "${push_output_file}" + + if grep -qi "already exists" "${push_output_file}"; then + echo "pushed=false" >> $GITHUB_OUTPUT + else + echo "pushed=true" >> $GITHUB_OUTPUT + fi - name: Push symbols to NuGet - if: steps.release_channel.outputs.channel != 'none' + if: steps.release_channel.outputs.channel != 'none' && steps.push_package.outputs.pushed == 'true' shell: bash run: | dotnet nuget push "/tmp/artifacts/blazor-hashrouting/package/release/Blazor.HashRouting.${VERSION}.snupkg" \ From 7b27c75c93ab9fc6e12c407915392a85330aecc7 Mon Sep 17 00:00:00 2001 From: ahjephson <16685186+ahjephson@users.noreply.github.com> Date: Fri, 13 Mar 2026 13:26:56 +0000 Subject: [PATCH 3/5] Add repo driven release notes --- .github/workflows/release.yml | 47 ++++++++++++++++++++++++++++++ CHANGELOG.md | 8 +++++ release-notes/1.0.0-rc.md | 55 +++++++++++++++++++++++++++++++++++ release-notes/1.0.0.md | 55 +++++++++++++++++++++++++++++++++++ release-notes/alpha.md | 17 +++++++++++ release-notes/beta.md | 17 +++++++++++ 6 files changed, 199 insertions(+) create mode 100644 release-notes/1.0.0-rc.md create mode 100644 release-notes/1.0.0.md create mode 100644 release-notes/alpha.md create mode 100644 release-notes/beta.md diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 26ea3fd..d32ab93 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -33,8 +33,12 @@ jobs: id: gitversion shell: bash run: | + MAJOR_MINOR_PATCH=$(dotnet gitversion /output json /showvariable MajorMinorPatch) + PRE_RELEASE_LABEL=$(dotnet gitversion /output json /showvariable PreReleaseLabel) VERSION=$(dotnet gitversion /output json /showvariable SemVer) SAFE_VERSION=$(echo "$VERSION" | sed -E 's/[^A-Za-z0-9._+-]+/-/g') + echo "MAJOR_MINOR_PATCH=$MAJOR_MINOR_PATCH" >> $GITHUB_ENV + echo "PRE_RELEASE_LABEL=$PRE_RELEASE_LABEL" >> $GITHUB_ENV echo "VERSION=$VERSION" >> $GITHUB_ENV echo "VERSION_SAFE=$SAFE_VERSION" >> $GITHUB_ENV @@ -114,6 +118,45 @@ jobs: echo "::error::Expected an existing git tag '${VERSION}' (or 'v${VERSION}') before creating a stable release." exit 1 + - name: Resolve Release Notes File + if: steps.release_channel.outputs.channel != 'none' + id: release_notes + shell: bash + run: | + if [ "${{ steps.release_channel.outputs.channel }}" = "stable" ]; then + notes_file="release-notes/${MAJOR_MINOR_PATCH}.md" + else + notes_file="release-notes/${MAJOR_MINOR_PATCH}-${{ steps.release_channel.outputs.channel }}.md" + fi + + if [ ! -f "${notes_file}" ]; then + fallback_notes_file="release-notes/${{ steps.release_channel.outputs.channel }}.md" + + if [ -f "${fallback_notes_file}" ]; then + notes_file="${fallback_notes_file}" + else + echo "::error::Expected release notes file '${notes_file}' was not found and fallback '${fallback_notes_file}' was not available." + exit 1 + fi + fi + + echo "file=${notes_file}" >> $GITHUB_OUTPUT + + - name: Render Release Notes + if: steps.release_channel.outputs.channel != 'none' + id: render_release_notes + shell: bash + run: | + rendered_notes_file="$(mktemp)" + + sed \ + -e "s/{{VERSION}}/${VERSION}/g" \ + -e "s/{{NUGET_VERSION}}/${VERSION}/g" \ + -e "s/{{MAJOR_MINOR_PATCH}}/${MAJOR_MINOR_PATCH}/g" \ + "${{ steps.release_notes.outputs.file }}" > "${rendered_notes_file}" + + echo "file=${rendered_notes_file}" >> $GITHUB_OUTPUT + - name: Create GitHub release if: steps.release_channel.outputs.channel != 'none' env: @@ -131,6 +174,9 @@ jobs: fi if gh release view "${{ steps.resolve_tag.outputs.tag }}" >/dev/null 2>&1; then + gh release edit "${{ steps.resolve_tag.outputs.tag }}" \ + --notes-file "${{ steps.render_release_notes.outputs.file }}" + gh release upload "${{ steps.resolve_tag.outputs.tag }}" \ /tmp/artifacts/blazor-hashrouting/package/release/Blazor.HashRouting.${VERSION}.nupkg \ /tmp/artifacts/blazor-hashrouting/package/release/Blazor.HashRouting.${VERSION}.snupkg \ @@ -141,6 +187,7 @@ jobs: /tmp/artifacts/blazor-hashrouting/package/release/Blazor.HashRouting.${VERSION}.snupkg \ --title "${{ steps.release_channel.outputs.label }} ${{ steps.resolve_tag.outputs.tag }}" \ --target "${GITHUB_SHA}" \ + --notes-file "${{ steps.render_release_notes.outputs.file }}" \ "${release_args[@]}" fi diff --git a/CHANGELOG.md b/CHANGELOG.md index 4898b08..9388a38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,3 +4,11 @@ - Initial standalone release preparation. - Prepared the package for independent build, test, and NuGet packaging. + +## 1.0.0-rc.1 + +- First release candidate of `Blazor.HashRouting`. +- Added reusable hash-fragment routing for browser-hosted Blazor WebAssembly applications. +- Added canonical `/#/...` routing, internal link interception, back/forward handling, and navigation lock integration. +- Added standalone NuGet packaging, static web assets, and independent CI/release automation. +- Multi-targeted the package for `net9.0` and `net10.0`. diff --git a/release-notes/1.0.0-rc.md b/release-notes/1.0.0-rc.md new file mode 100644 index 0000000..8dda941 --- /dev/null +++ b/release-notes/1.0.0-rc.md @@ -0,0 +1,55 @@ +# Blazor.HashRouting {{VERSION}} + +## Summary + +Release candidate build for the `{{MAJOR_MINOR_PATCH}}` line of `Blazor.HashRouting`, a reusable hash-fragment routing engine for browser-hosted Blazor WebAssembly applications. + +This package is intended for environments where the host can serve the application root document and static assets, but cannot reliably serve deep-linked route paths on refresh. + +## Highlights + +- Hash-fragment routing built on top of Blazor's navigation model +- Canonical `/#/...` URL handling +- Internal link interception for same-origin navigation +- Browser back/forward and hash change support +- Navigation lock integration +- Standalone NuGet-ready packaging with static web assets +- Multi-targeted for `net9.0` and `net10.0` + +## Installation + +```bash +dotnet add package Blazor.HashRouting --version {{NUGET_VERSION}} +``` + +## Basic usage + +```csharp +using Blazor.HashRouting; + +var builder = WebAssemblyHostBuilder.CreateDefault(args); + +builder.Services.AddHashRouting(); + +await builder.Build().RunAsync(); +``` + +## URL examples + +- Root route: `/#/` +- Nested route: `/#/settings` +- Base-path route: `/proxy/app/#/settings` + +## Supported environments + +- Blazor WebAssembly running in a browser + +## Not supported + +- Blazor Server +- Blazor Hybrid + +## Notes + +- This file is shared by all `{{MAJOR_MINOR_PATCH}}-rc.*` GitHub draft releases. +- The exact package version is provided by the release tag and package artifact, not hard-coded in this document. diff --git a/release-notes/1.0.0.md b/release-notes/1.0.0.md new file mode 100644 index 0000000..3b7e524 --- /dev/null +++ b/release-notes/1.0.0.md @@ -0,0 +1,55 @@ +# Blazor.HashRouting {{VERSION}} + +## Summary + +Stable release for the `{{MAJOR_MINOR_PATCH}}` line of `Blazor.HashRouting`, a reusable hash-fragment routing engine for browser-hosted Blazor WebAssembly applications. + +This package is intended for environments where the host can serve the application root document and static assets, but cannot reliably serve deep-linked route paths on refresh. + +## Highlights + +- Hash-fragment routing built on top of Blazor's navigation model +- Canonical `/#/...` URL handling +- Internal link interception for same-origin navigation +- Browser back/forward and hash change support +- Navigation lock integration +- Standalone NuGet-ready packaging with static web assets +- Multi-targeted for `net9.0` and `net10.0` + +## Installation + +```bash +dotnet add package Blazor.HashRouting --version {{NUGET_VERSION}} +``` + +## Basic usage + +```csharp +using Blazor.HashRouting; + +var builder = WebAssemblyHostBuilder.CreateDefault(args); + +builder.Services.AddHashRouting(); + +await builder.Build().RunAsync(); +``` + +## URL examples + +- Root route: `/#/` +- Nested route: `/#/settings` +- Base-path route: `/proxy/app/#/settings` + +## Supported environments + +- Blazor WebAssembly running in a browser + +## Not supported + +- Blazor Server +- Blazor Hybrid + +## Notes + +- This file is used for the `{{MAJOR_MINOR_PATCH}}` stable release tag. +- Subsequent stable version lines should use their own file, for example `1.1.0.md`. diff --git a/release-notes/alpha.md b/release-notes/alpha.md new file mode 100644 index 0000000..ec1e215 --- /dev/null +++ b/release-notes/alpha.md @@ -0,0 +1,17 @@ +# Blazor.HashRouting {{VERSION}} + +## Summary + +Alpha build of `Blazor.HashRouting`. + +This prerelease is intended for early validation of hash-fragment routing in browser-hosted Blazor WebAssembly applications. + +## Installation + +```bash +dotnet add package Blazor.HashRouting --version {{NUGET_VERSION}} +``` + +## Notes + +- This file is used as a fallback for alpha builds when no version-line-specific alpha notes file exists. diff --git a/release-notes/beta.md b/release-notes/beta.md new file mode 100644 index 0000000..96646b3 --- /dev/null +++ b/release-notes/beta.md @@ -0,0 +1,17 @@ +# Blazor.HashRouting {{VERSION}} + +## Summary + +Beta build of `Blazor.HashRouting`. + +This prerelease is intended for broader validation of hash-fragment routing in browser-hosted Blazor WebAssembly applications. + +## Installation + +```bash +dotnet add package Blazor.HashRouting --version {{NUGET_VERSION}} +``` + +## Notes + +- This file is used as a fallback for beta builds when no version-line-specific beta notes file exists. From f4a2a735035247469180fdf412f5701aee457d2b Mon Sep 17 00:00:00 2001 From: ahjephson <16685186+ahjephson@users.noreply.github.com> Date: Fri, 13 Mar 2026 13:30:52 +0000 Subject: [PATCH 4/5] Remove notes section from release notes --- release-notes/1.0.0-rc.md | 5 ----- release-notes/1.0.0.md | 5 ----- release-notes/alpha.md | 6 +----- release-notes/beta.md | 6 +----- 4 files changed, 2 insertions(+), 20 deletions(-) diff --git a/release-notes/1.0.0-rc.md b/release-notes/1.0.0-rc.md index 8dda941..aad34a6 100644 --- a/release-notes/1.0.0-rc.md +++ b/release-notes/1.0.0-rc.md @@ -48,8 +48,3 @@ await builder.Build().RunAsync(); - Blazor Server - Blazor Hybrid - -## Notes - -- This file is shared by all `{{MAJOR_MINOR_PATCH}}-rc.*` GitHub draft releases. -- The exact package version is provided by the release tag and package artifact, not hard-coded in this document. diff --git a/release-notes/1.0.0.md b/release-notes/1.0.0.md index 3b7e524..8c640cc 100644 --- a/release-notes/1.0.0.md +++ b/release-notes/1.0.0.md @@ -48,8 +48,3 @@ await builder.Build().RunAsync(); - Blazor Server - Blazor Hybrid - -## Notes - -- This file is used for the `{{MAJOR_MINOR_PATCH}}` stable release tag. -- Subsequent stable version lines should use their own file, for example `1.1.0.md`. diff --git a/release-notes/alpha.md b/release-notes/alpha.md index ec1e215..3828893 100644 --- a/release-notes/alpha.md +++ b/release-notes/alpha.md @@ -10,8 +10,4 @@ This prerelease is intended for early validation of hash-fragment routing in bro ```bash dotnet add package Blazor.HashRouting --version {{NUGET_VERSION}} -``` - -## Notes - -- This file is used as a fallback for alpha builds when no version-line-specific alpha notes file exists. +``` \ No newline at end of file diff --git a/release-notes/beta.md b/release-notes/beta.md index 96646b3..e4b1961 100644 --- a/release-notes/beta.md +++ b/release-notes/beta.md @@ -10,8 +10,4 @@ This prerelease is intended for broader validation of hash-fragment routing in b ```bash dotnet add package Blazor.HashRouting --version {{NUGET_VERSION}} -``` - -## Notes - -- This file is used as a fallback for beta builds when no version-line-specific beta notes file exists. +``` \ No newline at end of file From 9404cc691ac0d1bf71d108795885429c934feaf5 Mon Sep 17 00:00:00 2001 From: ahjephson <16685186+ahjephson@users.noreply.github.com> Date: Fri, 13 Mar 2026 13:56:13 +0000 Subject: [PATCH 5/5] Review feedback --- .github/workflows/release.yml | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d32ab93..b0795bc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -193,26 +193,15 @@ jobs: - name: Push package to NuGet if: steps.release_channel.outputs.channel != 'none' - id: push_package shell: bash run: | - set -o pipefail - - push_output_file="$(mktemp)" - dotnet nuget push "/tmp/artifacts/blazor-hashrouting/package/release/Blazor.HashRouting.${VERSION}.nupkg" \ --api-key "${{ secrets.NUGET_API_KEY }}" \ --source "https://api.nuget.org/v3/index.json" \ - --skip-duplicate 2>&1 | tee "${push_output_file}" - - if grep -qi "already exists" "${push_output_file}"; then - echo "pushed=false" >> $GITHUB_OUTPUT - else - echo "pushed=true" >> $GITHUB_OUTPUT - fi + --skip-duplicate - name: Push symbols to NuGet - if: steps.release_channel.outputs.channel != 'none' && steps.push_package.outputs.pushed == 'true' + if: steps.release_channel.outputs.channel != 'none' shell: bash run: | dotnet nuget push "/tmp/artifacts/blazor-hashrouting/package/release/Blazor.HashRouting.${VERSION}.snupkg" \