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" \