From 4bff9a2663d5b85adeab7392df586f0e9a10aae9 Mon Sep 17 00:00:00 2001
From: Kieron Lanning
Date: Fri, 18 Sep 2026 17:58:50 +0100
Subject: [PATCH 1/3] docs: added value objects project
---
src/src/data/projects.yml | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/src/src/data/projects.yml b/src/src/data/projects.yml
index d690390..28cecd7 100644
--- a/src/src/data/projects.yml
+++ b/src/src/data/projects.yml
@@ -76,6 +76,7 @@ projects:
description: Purview.ZodSharp adapter for aggregate save-time validation.
related:
- zodsharp
+ - value-objects
discussions: false
- id: zodsharp
@@ -111,6 +112,39 @@ projects:
description: Newtonsoft.Json integration and JSON Schema import.
- id: Purview.ZodSharp.AspNetCore
description: ASP.NET Core ProblemDetails integration.
+ related:
+ - value-objects
+
+ - id: value-objects
+ name: Value Objects
+ shortDescription: Source-generated scalar and complex value objects for .NET.
+ description: >-
+ F#-style single-case types for C#. Mark a partial struct or class with
+ [Scalar] or [ValueObject] and an incremental source generator produces
+ Create/Hydrate factories with normalization and validation, equality,
+ comparison, implicit conversions, JSON converters, and contextual
+ creation. Value objects serialize as their underlying value, map cleanly
+ onto Entity Framework JSON columns, and can be validated with
+ Purview.ZodSharp schemas.
+ repository: purview-dev/value-objects
+ category: source-generation
+ status: preview
+ featured: true
+ order: 35
+ docs:
+ source: github-path
+ path: docs
+ targetFrameworks:
+ - net8.0
+ - net9.0
+ - net10.0
+ packages:
+ - id: Purview.ValueObjects
+ description: Runtime contracts, source generator, and analyzer for scalar and complex value objects.
+ primary: true
+ related:
+ - zodsharp
+ - event-sourcing
- id: sourcegenerator-framework
name: SourceGenerator Framework
From c5a7b6872434e22c53a40d327f25b11157a603ed Mon Sep 17 00:00:00 2001
From: Kieron Lanning
Date: Fri, 18 Sep 2026 18:27:50 +0100
Subject: [PATCH 2/3] feat: added value objects project
---
.../github/releases/aspire-resourcekit.json | 86 ++++
src/fixtures/github/releases/aspirec4.json | 43 ++
src/fixtures/github/releases/build-sdk.json | 43 ++
src/fixtures/github/releases/build.json | 464 ++++++++++++++++++
.../github/releases/event-sourcing.json | 86 ++++
.../releases/sourcegenerator-framework.json | 86 ++++
.../releases/telemetry-sourcegenerator.json | 86 ++++
.../github/releases/value-objects.json | 44 ++
src/fixtures/github/releases/zodsharp.json | 86 ++++
.../github/repos/aspire-resourcekit.json | 6 +-
src/fixtures/github/repos/aspirec4.json | 6 +-
src/fixtures/github/repos/build-sdk.json | 12 +-
src/fixtures/github/repos/build.json | 6 +-
src/fixtures/github/repos/event-sourcing.json | 6 +-
.../repos/sourcegenerator-framework.json | 6 +-
.../repos/telemetry-sourcegenerator.json | 8 +-
src/fixtures/github/repos/value-objects.json | 197 ++++++++
src/fixtures/github/repos/zodsharp.json | 8 +-
src/fixtures/nuget/aspirec4.hosting.json | 3 +-
.../nuget/purview.aspire.resourcekit.json | 4 +-
src/fixtures/nuget/purview.build.json | 6 +-
src/fixtures/nuget/purview.buildsdk.json | 3 +-
.../purview.eventsourcing.azurestorage.json | 4 +-
.../nuget/purview.eventsourcing.cosmosdb.json | 4 +-
.../nuget/purview.eventsourcing.inmemory.json | 4 +-
src/fixtures/nuget/purview.eventsourcing.json | 4 +-
.../nuget/purview.eventsourcing.mongodb.json | 4 +-
.../nuget/purview.eventsourcing.postgres.json | 4 +-
.../purview.eventsourcing.sqlserver.json | 4 +-
...tsourcing.validation.fluentvalidation.json | 4 +-
...iew.eventsourcing.validation.zodsharp.json | 4 +-
.../purview.sourcegeneratorframework.json | 4 +-
...view.sourcegeneratorframework.testing.json | 4 +-
...ourcegeneratorframework.testing.tunit.json | 4 +-
.../purview.telemetry.sourcegenerator.json | 4 +-
src/fixtures/nuget/purview.valueobjects.json | 5 +
.../nuget/purview.zodsharp.aspnetcore.json | 4 +-
src/fixtures/nuget/purview.zodsharp.json | 4 +-
.../purview.zodsharp.newtonsoftjson.json | 4 +-
.../purview.zodsharp.systemtextjson.json | 4 +-
.../nuget/search/AspireC4.Hosting.json | 20 +-
src/fixtures/nuget/search/Purview.Build.json | 32 +-
.../Purview.Telemetry.SourceGenerator.json | 6 +-
.../nuget/search/Purview.ValueObjects.json | 8 +
src/fixtures/releases/index.json | 308 ++++++++++--
src/src/components/ProjectCard.astro | 53 +-
src/src/components/SiteFooter.astro | 10 +-
src/src/data/projects.yml | 1 +
src/src/lib/docs/aggregate.ts | 207 ++++++--
src/src/lib/docs/links.ts | 13 +-
src/src/lib/manifest/schema.ts | 2 +
src/src/pages/index.astro | 57 ++-
src/src/pages/releases/index.astro | 48 +-
src/tests/unit/docs.test.ts | 54 ++
54 files changed, 2000 insertions(+), 187 deletions(-)
create mode 100644 src/fixtures/github/releases/value-objects.json
create mode 100644 src/fixtures/github/repos/value-objects.json
create mode 100644 src/fixtures/nuget/purview.valueobjects.json
create mode 100644 src/fixtures/nuget/search/Purview.ValueObjects.json
diff --git a/src/fixtures/github/releases/aspire-resourcekit.json b/src/fixtures/github/releases/aspire-resourcekit.json
index f1de5cc..749b17a 100644
--- a/src/fixtures/github/releases/aspire-resourcekit.json
+++ b/src/fixtures/github/releases/aspire-resourcekit.json
@@ -1,4 +1,90 @@
[
+ {
+ "url": "https://api.github.com/repos/purview-dev/aspire-resourcekit/releases/391313725",
+ "assets_url": "https://api.github.com/repos/purview-dev/aspire-resourcekit/releases/391313725/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/aspire-resourcekit/releases/391313725/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/aspire-resourcekit/releases/tag/v1.0.0-prerelease.30",
+ "id": 391313725,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOTZLmtM4XUvk9",
+ "tag_name": "v1.0.0-prerelease.30",
+ "target_commitish": "main",
+ "name": "v1.0.0-prerelease.30",
+ "draft": false,
+ "immutable": false,
+ "prerelease": false,
+ "created_at": "2026-09-18T08:16:48Z",
+ "updated_at": "2026-09-18T08:19:04Z",
+ "published_at": "2026-09-18T08:19:04Z",
+ "assets": [],
+ "tarball_url": "https://api.github.com/repos/purview-dev/aspire-resourcekit/tarball/v1.0.0-prerelease.30",
+ "zipball_url": "https://api.github.com/repos/purview-dev/aspire-resourcekit/zipball/v1.0.0-prerelease.30",
+ "body": "## What's Changed\n* chore: update branding assets, bump version, and use human-readable name by @kieronlanning in https://github.com/purview-dev/aspire-resourcekit/pull/33\n\n\n**Full Changelog**: https://github.com/purview-dev/aspire-resourcekit/compare/v1.0.0-prerelease.29...v1.0.0-prerelease.30",
+ "mentions_count": 1
+ },
+ {
+ "url": "https://api.github.com/repos/purview-dev/aspire-resourcekit/releases/390932692",
+ "assets_url": "https://api.github.com/repos/purview-dev/aspire-resourcekit/releases/390932692/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/aspire-resourcekit/releases/390932692/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/aspire-resourcekit/releases/tag/v1.0.0-prerelease.29",
+ "id": 390932692,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOTZLmtM4XTSjU",
+ "tag_name": "v1.0.0-prerelease.29",
+ "target_commitish": "main",
+ "name": "v1.0.0-prerelease.29",
+ "draft": false,
+ "immutable": false,
+ "prerelease": false,
+ "created_at": "2026-09-17T17:47:11Z",
+ "updated_at": "2026-09-17T17:49:21Z",
+ "published_at": "2026-09-17T17:49:21Z",
+ "assets": [],
+ "tarball_url": "https://api.github.com/repos/purview-dev/aspire-resourcekit/tarball/v1.0.0-prerelease.29",
+ "zipball_url": "https://api.github.com/repos/purview-dev/aspire-resourcekit/zipball/v1.0.0-prerelease.29",
+ "body": "## What's Changed\n* docs: updated urls in documentation by @kieronlanning in https://github.com/purview-dev/aspire-resourcekit/pull/31\n* chore: update to Purview.BuildSdk and bump to 1.0.0-prerelease.29 by @kieronlanning in https://github.com/purview-dev/aspire-resourcekit/pull/32\n\n\n**Full Changelog**: https://github.com/purview-dev/aspire-resourcekit/compare/v1.0.0-prerelease.28...v1.0.0-prerelease.29",
+ "mentions_count": 1
+ },
{
"url": "https://api.github.com/repos/purview-dev/aspire-resourcekit/releases/389553004",
"assets_url": "https://api.github.com/repos/purview-dev/aspire-resourcekit/releases/389553004/assets",
diff --git a/src/fixtures/github/releases/aspirec4.json b/src/fixtures/github/releases/aspirec4.json
index 40db013..5fa4c04 100644
--- a/src/fixtures/github/releases/aspirec4.json
+++ b/src/fixtures/github/releases/aspirec4.json
@@ -1,4 +1,47 @@
[
+ {
+ "url": "https://api.github.com/repos/purview-dev/aspirec4/releases/390932294",
+ "assets_url": "https://api.github.com/repos/purview-dev/aspirec4/releases/390932294/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/aspirec4/releases/390932294/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/aspirec4/releases/tag/v13.5.3.2",
+ "id": 390932294,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOSXT2Zs4XTSdG",
+ "tag_name": "v13.5.3.2",
+ "target_commitish": "main",
+ "name": "v13.5.3.2",
+ "draft": false,
+ "immutable": true,
+ "prerelease": false,
+ "created_at": "2026-09-17T17:47:19Z",
+ "updated_at": "2026-09-17T17:48:44Z",
+ "published_at": "2026-09-17T17:48:44Z",
+ "assets": [],
+ "tarball_url": "https://api.github.com/repos/purview-dev/aspirec4/tarball/v13.5.3.2",
+ "zipball_url": "https://api.github.com/repos/purview-dev/aspirec4/zipball/v13.5.3.2",
+ "body": "## What's Changed\n* docs: updated urls in documentation by @kieronlanning in https://github.com/purview-dev/aspirec4/pull/38\n* chore: update to Purview.BuildSdk and bump to 13.5.3.2 by @kieronlanning in https://github.com/purview-dev/aspirec4/pull/39\n\n\n**Full Changelog**: https://github.com/purview-dev/aspirec4/compare/v13.5.3.1...v13.5.3.2",
+ "mentions_count": 1
+ },
{
"url": "https://api.github.com/repos/purview-dev/aspirec4/releases/388431840",
"assets_url": "https://api.github.com/repos/purview-dev/aspirec4/releases/388431840/assets",
diff --git a/src/fixtures/github/releases/build-sdk.json b/src/fixtures/github/releases/build-sdk.json
index 8973c6f..30f163d 100644
--- a/src/fixtures/github/releases/build-sdk.json
+++ b/src/fixtures/github/releases/build-sdk.json
@@ -1,4 +1,47 @@
[
+ {
+ "url": "https://api.github.com/repos/purview-dev/build-sdk/releases/391312438",
+ "assets_url": "https://api.github.com/repos/purview-dev/build-sdk/releases/391312438/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/build-sdk/releases/391312438/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/build-sdk/releases/tag/v1.0.0-prerelease.57",
+ "id": 391312438,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOSmgZrc4XUvQ2",
+ "tag_name": "v1.0.0-prerelease.57",
+ "target_commitish": "main",
+ "name": "v1.0.0-prerelease.57",
+ "draft": false,
+ "immutable": false,
+ "prerelease": false,
+ "created_at": "2026-09-18T08:15:37Z",
+ "updated_at": "2026-09-18T08:16:44Z",
+ "published_at": "2026-09-18T08:16:44Z",
+ "assets": [],
+ "tarball_url": "https://api.github.com/repos/purview-dev/build-sdk/tarball/v1.0.0-prerelease.57",
+ "zipball_url": "https://api.github.com/repos/purview-dev/build-sdk/zipball/v1.0.0-prerelease.57",
+ "body": "## What's Changed\n* chore: update branding assets, bump version, and use human-readable name by @kieronlanning in https://github.com/purview-dev/build-sdk/pull/20\n\n\n**Full Changelog**: https://github.com/purview-dev/build-sdk/compare/v1.0.0-prerelease.56...v1.0.0-prerelease.57",
+ "mentions_count": 1
+ },
{
"url": "https://api.github.com/repos/purview-dev/build-sdk/releases/390914381",
"assets_url": "https://api.github.com/repos/purview-dev/build-sdk/releases/390914381/assets",
diff --git a/src/fixtures/github/releases/build.json b/src/fixtures/github/releases/build.json
index 7dfc6e4..cc0766c 100644
--- a/src/fixtures/github/releases/build.json
+++ b/src/fixtures/github/releases/build.json
@@ -1,4 +1,468 @@
[
+ {
+ "url": "https://api.github.com/repos/purview-dev/build/releases/391426620",
+ "assets_url": "https://api.github.com/repos/purview-dev/build/releases/391426620/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/build/releases/391426620/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/build/releases/tag/v0.3.2",
+ "id": 391426620,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOULKrys4XVLI8",
+ "tag_name": "v0.3.2",
+ "target_commitish": "main",
+ "name": "v0.3.2",
+ "draft": false,
+ "immutable": false,
+ "prerelease": false,
+ "created_at": "2026-09-18T11:35:35Z",
+ "updated_at": "2026-09-18T11:36:19Z",
+ "published_at": "2026-09-18T11:36:17Z",
+ "assets": [
+ {
+ "url": "https://api.github.com/repos/purview-dev/build/releases/assets/572500080",
+ "id": 572500080,
+ "node_id": "RA_kwDOULKrys4iH6hw",
+ "name": "Purview.Build.0.3.2.nupkg",
+ "label": "",
+ "uploader": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "content_type": "application/octet-stream",
+ "state": "uploaded",
+ "size": 11437402,
+ "digest": "sha256:cb758836781b69ba04866f9ef5967c406697dd6bdd039fa0a96053eee8479886",
+ "download_count": 0,
+ "created_at": "2026-09-18T11:36:19Z",
+ "updated_at": "2026-09-18T11:36:19Z",
+ "browser_download_url": "https://github.com/purview-dev/build/releases/download/v0.3.2/Purview.Build.0.3.2.nupkg"
+ },
+ {
+ "url": "https://api.github.com/repos/purview-dev/build/releases/assets/572500059",
+ "id": 572500059,
+ "node_id": "RA_kwDOULKrys4iH6hb",
+ "name": "Purview.Build.0.3.2.snupkg",
+ "label": "",
+ "uploader": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "content_type": "application/octet-stream",
+ "state": "uploaded",
+ "size": 47387,
+ "digest": "sha256:99d98c0a8413b1b7d0da5bf0bed7951bd81bb27643e3a9522a680e3af88331e8",
+ "download_count": 0,
+ "created_at": "2026-09-18T11:36:18Z",
+ "updated_at": "2026-09-18T11:36:18Z",
+ "browser_download_url": "https://github.com/purview-dev/build/releases/download/v0.3.2/Purview.Build.0.3.2.snupkg"
+ }
+ ],
+ "tarball_url": "https://api.github.com/repos/purview-dev/build/tarball/v0.3.2",
+ "zipball_url": "https://api.github.com/repos/purview-dev/build/zipball/v0.3.2",
+ "body": "## What's Changed\n* fix(build): new release build by @kieronlanning in https://github.com/purview-dev/build/pull/16\n\n\n**Full Changelog**: https://github.com/purview-dev/build/compare/v0.3.1...v0.3.2",
+ "mentions_count": 1
+ },
+ {
+ "url": "https://api.github.com/repos/purview-dev/build/releases/391395505",
+ "assets_url": "https://api.github.com/repos/purview-dev/build/releases/391395505/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/build/releases/391395505/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/build/releases/tag/v0.3.1",
+ "id": 391395505,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOULKrys4XVDix",
+ "tag_name": "v0.3.1",
+ "target_commitish": "main",
+ "name": "v0.3.1",
+ "draft": false,
+ "immutable": false,
+ "prerelease": false,
+ "created_at": "2026-09-18T10:41:03Z",
+ "updated_at": "2026-09-18T10:42:03Z",
+ "published_at": "2026-09-18T10:42:00Z",
+ "assets": [
+ {
+ "url": "https://api.github.com/repos/purview-dev/build/releases/assets/572411726",
+ "id": 572411726,
+ "node_id": "RA_kwDOULKrys4iHk9O",
+ "name": "Purview.Build.0.3.1.nupkg",
+ "label": "",
+ "uploader": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "content_type": "application/octet-stream",
+ "state": "uploaded",
+ "size": 11437406,
+ "digest": "sha256:25cfbfaca62ad49e4ddcd3e236afc278d2296191d8c01d95a07199bcc5f1e663",
+ "download_count": 0,
+ "created_at": "2026-09-18T10:42:01Z",
+ "updated_at": "2026-09-18T10:42:02Z",
+ "browser_download_url": "https://github.com/purview-dev/build/releases/download/v0.3.1/Purview.Build.0.3.1.nupkg"
+ },
+ {
+ "url": "https://api.github.com/repos/purview-dev/build/releases/assets/572411759",
+ "id": 572411759,
+ "node_id": "RA_kwDOULKrys4iHk9v",
+ "name": "Purview.Build.0.3.1.snupkg",
+ "label": "",
+ "uploader": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "content_type": "application/octet-stream",
+ "state": "uploaded",
+ "size": 47387,
+ "digest": "sha256:552fd64795afb1dfd94dbecab7325e664f164330f5cdb93e17a5d16d63f44626",
+ "download_count": 0,
+ "created_at": "2026-09-18T10:42:03Z",
+ "updated_at": "2026-09-18T10:42:03Z",
+ "browser_download_url": "https://github.com/purview-dev/build/releases/download/v0.3.1/Purview.Build.0.3.1.snupkg"
+ }
+ ],
+ "tarball_url": "https://api.github.com/repos/purview-dev/build/tarball/v0.3.1",
+ "zipball_url": "https://api.github.com/repos/purview-dev/build/zipball/v0.3.1",
+ "body": "## What's Changed\n* fix: web-based linted was run before the restore by @kieronlanning in https://github.com/purview-dev/build/pull/15\n\n\n**Full Changelog**: https://github.com/purview-dev/build/compare/v0.3.0...v0.3.1",
+ "mentions_count": 1
+ },
+ {
+ "url": "https://api.github.com/repos/purview-dev/build/releases/391343181",
+ "assets_url": "https://api.github.com/repos/purview-dev/build/releases/391343181/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/build/releases/391343181/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/build/releases/tag/v0.3.0",
+ "id": 391343181,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOULKrys4XU2xN",
+ "tag_name": "v0.3.0",
+ "target_commitish": "main",
+ "name": "v0.3.0",
+ "draft": false,
+ "immutable": false,
+ "prerelease": false,
+ "created_at": "2026-09-18T09:10:17Z",
+ "updated_at": "2026-09-18T09:11:11Z",
+ "published_at": "2026-09-18T09:11:09Z",
+ "assets": [
+ {
+ "url": "https://api.github.com/repos/purview-dev/build/releases/assets/572254665",
+ "id": 572254665,
+ "node_id": "RA_kwDOULKrys4iG-nJ",
+ "name": "Purview.Build.0.3.0.nupkg",
+ "label": "",
+ "uploader": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "content_type": "application/octet-stream",
+ "state": "uploaded",
+ "size": 11437380,
+ "digest": "sha256:324156c56caa4960cac3861155debc57fc69f06b69f5a567a1afdc2be07c802f",
+ "download_count": 0,
+ "created_at": "2026-09-18T09:11:10Z",
+ "updated_at": "2026-09-18T09:11:11Z",
+ "browser_download_url": "https://github.com/purview-dev/build/releases/download/v0.3.0/Purview.Build.0.3.0.nupkg"
+ },
+ {
+ "url": "https://api.github.com/repos/purview-dev/build/releases/assets/572254709",
+ "id": 572254709,
+ "node_id": "RA_kwDOULKrys4iG-n1",
+ "name": "Purview.Build.0.3.0.snupkg",
+ "label": "",
+ "uploader": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "content_type": "application/octet-stream",
+ "state": "uploaded",
+ "size": 47367,
+ "digest": "sha256:593aa7d2ce80cad80b62d40caba393f76d0fcfbde803a9a1fc1eea4c3d85c4eb",
+ "download_count": 0,
+ "created_at": "2026-09-18T09:11:11Z",
+ "updated_at": "2026-09-18T09:11:11Z",
+ "browser_download_url": "https://github.com/purview-dev/build/releases/download/v0.3.0/Purview.Build.0.3.0.snupkg"
+ }
+ ],
+ "tarball_url": "https://api.github.com/repos/purview-dev/build/tarball/v0.3.0",
+ "zipball_url": "https://api.github.com/repos/purview-dev/build/zipball/v0.3.0",
+ "body": "## What's Changed\n* feat: supported web-script build/ deployments by @kieronlanning in https://github.com/purview-dev/build/pull/14\n\n\n**Full Changelog**: https://github.com/purview-dev/build/compare/v0.2.6...v0.3.0",
+ "mentions_count": 1
+ },
+ {
+ "url": "https://api.github.com/repos/purview-dev/build/releases/391312231",
+ "assets_url": "https://api.github.com/repos/purview-dev/build/releases/391312231/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/build/releases/391312231/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/build/releases/tag/v0.2.6",
+ "id": 391312231,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOULKrys4XUvNn",
+ "tag_name": "v0.2.6",
+ "target_commitish": "main",
+ "name": "v0.2.6",
+ "draft": false,
+ "immutable": false,
+ "prerelease": false,
+ "created_at": "2026-09-18T08:15:32Z",
+ "updated_at": "2026-09-18T08:16:25Z",
+ "published_at": "2026-09-18T08:16:23Z",
+ "assets": [
+ {
+ "url": "https://api.github.com/repos/purview-dev/build/releases/assets/572159432",
+ "id": 572159432,
+ "node_id": "RA_kwDOULKrys4iGnXI",
+ "name": "Purview.Build.0.2.6.nupkg",
+ "label": "",
+ "uploader": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "content_type": "application/octet-stream",
+ "state": "uploaded",
+ "size": 11433366,
+ "digest": "sha256:cc407254025b595d929c8263104f0ae99f0f61d2e3f80c24f17f8d0000efd84a",
+ "download_count": 0,
+ "created_at": "2026-09-18T08:16:24Z",
+ "updated_at": "2026-09-18T08:16:25Z",
+ "browser_download_url": "https://github.com/purview-dev/build/releases/download/v0.2.6/Purview.Build.0.2.6.nupkg"
+ },
+ {
+ "url": "https://api.github.com/repos/purview-dev/build/releases/assets/572159418",
+ "id": 572159418,
+ "node_id": "RA_kwDOULKrys4iGnW6",
+ "name": "Purview.Build.0.2.6.snupkg",
+ "label": "",
+ "uploader": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "content_type": "application/octet-stream",
+ "state": "uploaded",
+ "size": 43204,
+ "digest": "sha256:83dccb983f33a8bd3cb4a05463a8b48170cd4a9b0f2a4106fea7e1e5f73b7793",
+ "download_count": 0,
+ "created_at": "2026-09-18T08:16:24Z",
+ "updated_at": "2026-09-18T08:16:24Z",
+ "browser_download_url": "https://github.com/purview-dev/build/releases/download/v0.2.6/Purview.Build.0.2.6.snupkg"
+ }
+ ],
+ "tarball_url": "https://api.github.com/repos/purview-dev/build/tarball/v0.2.6",
+ "zipball_url": "https://api.github.com/repos/purview-dev/build/zipball/v0.2.6",
+ "body": "## What's Changed\n* docs: updated urls in documentation by @kieronlanning in https://github.com/purview-dev/build/pull/10\n* docs: use a generic local feed path example by @kieronlanning in https://github.com/purview-dev/build/pull/11\n* chore: update to Purview.BuildSdk and bump to 0.2.5 by @kieronlanning in https://github.com/purview-dev/build/pull/12\n* chore: update branding assets, bump version, and use human-readable name by @kieronlanning in https://github.com/purview-dev/build/pull/13\n\n\n**Full Changelog**: https://github.com/purview-dev/build/compare/v0.2.4...v0.2.6",
+ "mentions_count": 1
+ },
{
"url": "https://api.github.com/repos/purview-dev/build/releases/388378517",
"assets_url": "https://api.github.com/repos/purview-dev/build/releases/388378517/assets",
diff --git a/src/fixtures/github/releases/event-sourcing.json b/src/fixtures/github/releases/event-sourcing.json
index 91b971c..28b7fb7 100644
--- a/src/fixtures/github/releases/event-sourcing.json
+++ b/src/fixtures/github/releases/event-sourcing.json
@@ -1,4 +1,90 @@
[
+ {
+ "url": "https://api.github.com/repos/purview-dev/event-sourcing/releases/391316541",
+ "assets_url": "https://api.github.com/repos/purview-dev/event-sourcing/releases/391316541/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/event-sourcing/releases/391316541/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/event-sourcing/releases/tag/v2.0.0-prerelease.34",
+ "id": 391316541,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOL0aKDs4XUwQ9",
+ "tag_name": "v2.0.0-prerelease.34",
+ "target_commitish": "main",
+ "name": "v2.0.0-prerelease.34",
+ "draft": false,
+ "immutable": false,
+ "prerelease": false,
+ "created_at": "2026-09-18T08:19:22Z",
+ "updated_at": "2026-09-18T08:24:00Z",
+ "published_at": "2026-09-18T08:24:00Z",
+ "assets": [],
+ "tarball_url": "https://api.github.com/repos/purview-dev/event-sourcing/tarball/v2.0.0-prerelease.34",
+ "zipball_url": "https://api.github.com/repos/purview-dev/event-sourcing/zipball/v2.0.0-prerelease.34",
+ "body": "## What's Changed\n* docs: reference framework as Purview.ZodSharp and fix stale package IDs by @kieronlanning in https://github.com/purview-dev/event-sourcing/pull/53\n* chore: update branding assets, bump version, and use human-readable name by @kieronlanning in https://github.com/purview-dev/event-sourcing/pull/54\n\n\n**Full Changelog**: https://github.com/purview-dev/event-sourcing/compare/v2.0.0-prerelease.33...v2.0.0-prerelease.34",
+ "mentions_count": 1
+ },
+ {
+ "url": "https://api.github.com/repos/purview-dev/event-sourcing/releases/390936317",
+ "assets_url": "https://api.github.com/repos/purview-dev/event-sourcing/releases/390936317/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/event-sourcing/releases/390936317/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/event-sourcing/releases/tag/v2.0.0-prerelease.33",
+ "id": 390936317,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOL0aKDs4XTTb9",
+ "tag_name": "v2.0.0-prerelease.33",
+ "target_commitish": "main",
+ "name": "v2.0.0-prerelease.33",
+ "draft": false,
+ "immutable": false,
+ "prerelease": false,
+ "created_at": "2026-09-17T17:52:03Z",
+ "updated_at": "2026-09-17T17:54:44Z",
+ "published_at": "2026-09-17T17:54:44Z",
+ "assets": [],
+ "tarball_url": "https://api.github.com/repos/purview-dev/event-sourcing/tarball/v2.0.0-prerelease.33",
+ "zipball_url": "https://api.github.com/repos/purview-dev/event-sourcing/zipball/v2.0.0-prerelease.33",
+ "body": "## What's Changed\n* chore: bumped sdk - no core version bump by @kieronlanning in https://github.com/purview-dev/event-sourcing/pull/50\n* Docs update by @kieronlanning in https://github.com/purview-dev/event-sourcing/pull/51\n* chore: rename to event-sourcing and bump to 2.0.0-prerelease.33 by @kieronlanning in https://github.com/purview-dev/event-sourcing/pull/52\n\n\n**Full Changelog**: https://github.com/purview-dev/event-sourcing/compare/v2.0.0-prerelease.32...v2.0.0-prerelease.33",
+ "mentions_count": 1
+ },
{
"url": "https://api.github.com/repos/purview-dev/event-sourcing/releases/388969020",
"assets_url": "https://api.github.com/repos/purview-dev/event-sourcing/releases/388969020/assets",
diff --git a/src/fixtures/github/releases/sourcegenerator-framework.json b/src/fixtures/github/releases/sourcegenerator-framework.json
index 3b1a09a..527becc 100644
--- a/src/fixtures/github/releases/sourcegenerator-framework.json
+++ b/src/fixtures/github/releases/sourcegenerator-framework.json
@@ -1,4 +1,90 @@
[
+ {
+ "url": "https://api.github.com/repos/purview-dev/sourcegenerator-framework/releases/391316152",
+ "assets_url": "https://api.github.com/repos/purview-dev/sourcegenerator-framework/releases/391316152/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/sourcegenerator-framework/releases/391316152/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/sourcegenerator-framework/releases/tag/v1.0.0-prerelease.44",
+ "id": 391316152,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOTv0SC84XUwK4",
+ "tag_name": "v1.0.0-prerelease.44",
+ "target_commitish": "main",
+ "name": "v1.0.0-prerelease.44",
+ "draft": false,
+ "immutable": false,
+ "prerelease": false,
+ "created_at": "2026-09-18T08:18:52Z",
+ "updated_at": "2026-09-18T08:23:20Z",
+ "published_at": "2026-09-18T08:23:20Z",
+ "assets": [],
+ "tarball_url": "https://api.github.com/repos/purview-dev/sourcegenerator-framework/tarball/v1.0.0-prerelease.44",
+ "zipball_url": "https://api.github.com/repos/purview-dev/sourcegenerator-framework/zipball/v1.0.0-prerelease.44",
+ "body": "## What's Changed\n* chore: update branding assets, bump version, and use human-readable name by @kieronlanning in https://github.com/purview-dev/sourcegenerator-framework/pull/27\n\n\n**Full Changelog**: https://github.com/purview-dev/sourcegenerator-framework/compare/v1.0.0-prerelease.43...v1.0.0-prerelease.44",
+ "mentions_count": 1
+ },
+ {
+ "url": "https://api.github.com/repos/purview-dev/sourcegenerator-framework/releases/390933649",
+ "assets_url": "https://api.github.com/repos/purview-dev/sourcegenerator-framework/releases/390933649/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/sourcegenerator-framework/releases/390933649/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/sourcegenerator-framework/releases/tag/v1.0.0-prerelease.43",
+ "id": 390933649,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOTv0SC84XTSyR",
+ "tag_name": "v1.0.0-prerelease.43",
+ "target_commitish": "main",
+ "name": "v1.0.0-prerelease.43",
+ "draft": false,
+ "immutable": false,
+ "prerelease": false,
+ "created_at": "2026-09-17T17:47:40Z",
+ "updated_at": "2026-09-17T17:50:45Z",
+ "published_at": "2026-09-17T17:50:45Z",
+ "assets": [],
+ "tarball_url": "https://api.github.com/repos/purview-dev/sourcegenerator-framework/tarball/v1.0.0-prerelease.43",
+ "zipball_url": "https://api.github.com/repos/purview-dev/sourcegenerator-framework/zipball/v1.0.0-prerelease.43",
+ "body": "## What's Changed\n* docs: updated urls in documentation by @kieronlanning in https://github.com/purview-dev/sourcegenerator-framework/pull/25\n* chore: rename to sourcegenerator-framework and bump to 1.0.0-prerelease.43 by @kieronlanning in https://github.com/purview-dev/sourcegenerator-framework/pull/26\n\n\n**Full Changelog**: https://github.com/purview-dev/sourcegenerator-framework/compare/v1.0.0-prerelease.42...v1.0.0-prerelease.43",
+ "mentions_count": 1
+ },
{
"url": "https://api.github.com/repos/purview-dev/sourcegenerator-framework/releases/388395082",
"assets_url": "https://api.github.com/repos/purview-dev/sourcegenerator-framework/releases/388395082/assets",
diff --git a/src/fixtures/github/releases/telemetry-sourcegenerator.json b/src/fixtures/github/releases/telemetry-sourcegenerator.json
index 675e01f..17dae40 100644
--- a/src/fixtures/github/releases/telemetry-sourcegenerator.json
+++ b/src/fixtures/github/releases/telemetry-sourcegenerator.json
@@ -1,4 +1,90 @@
[
+ {
+ "url": "https://api.github.com/repos/purview-dev/telemetry-sourcegenerator/releases/391315862",
+ "assets_url": "https://api.github.com/repos/purview-dev/telemetry-sourcegenerator/releases/391315862/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/telemetry-sourcegenerator/releases/391315862/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/telemetry-sourcegenerator/releases/tag/v5.0.0-prerelease.11",
+ "id": 391315862,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOLblSmc4XUwGW",
+ "tag_name": "v5.0.0-prerelease.11",
+ "target_commitish": "main",
+ "name": "v5.0.0-prerelease.11",
+ "draft": false,
+ "immutable": false,
+ "prerelease": false,
+ "created_at": "2026-09-18T08:19:10Z",
+ "updated_at": "2026-09-18T08:22:49Z",
+ "published_at": "2026-09-18T08:22:49Z",
+ "assets": [],
+ "tarball_url": "https://api.github.com/repos/purview-dev/telemetry-sourcegenerator/tarball/v5.0.0-prerelease.11",
+ "zipball_url": "https://api.github.com/repos/purview-dev/telemetry-sourcegenerator/zipball/v5.0.0-prerelease.11",
+ "body": "## What's Changed\n* chore: update branding assets, bump version, and use human-readable name by @kieronlanning in https://github.com/purview-dev/telemetry-sourcegenerator/pull/131\n\n\n**Full Changelog**: https://github.com/purview-dev/telemetry-sourcegenerator/compare/v5.0.0-prerelease.10...v5.0.0-prerelease.11",
+ "mentions_count": 1
+ },
+ {
+ "url": "https://api.github.com/repos/purview-dev/telemetry-sourcegenerator/releases/390934829",
+ "assets_url": "https://api.github.com/repos/purview-dev/telemetry-sourcegenerator/releases/390934829/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/telemetry-sourcegenerator/releases/390934829/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/telemetry-sourcegenerator/releases/tag/v5.0.0-prerelease.10",
+ "id": 390934829,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOLblSmc4XTTEt",
+ "tag_name": "v5.0.0-prerelease.10",
+ "target_commitish": "main",
+ "name": "v5.0.0-prerelease.10",
+ "draft": false,
+ "immutable": false,
+ "prerelease": false,
+ "created_at": "2026-09-17T17:47:01Z",
+ "updated_at": "2026-09-17T17:52:12Z",
+ "published_at": "2026-09-17T17:52:12Z",
+ "assets": [],
+ "tarball_url": "https://api.github.com/repos/purview-dev/telemetry-sourcegenerator/tarball/v5.0.0-prerelease.10",
+ "zipball_url": "https://api.github.com/repos/purview-dev/telemetry-sourcegenerator/zipball/v5.0.0-prerelease.10",
+ "body": "## What's Changed\n* chore: update to Purview.BuildSdk and bump to 5.0.0-prerelease.10 by @kieronlanning in https://github.com/purview-dev/telemetry-sourcegenerator/pull/130\n\n\n**Full Changelog**: https://github.com/purview-dev/telemetry-sourcegenerator/compare/v5.0.0-prerelease.9...v5.0.0-prerelease.10",
+ "mentions_count": 1
+ },
{
"url": "https://api.github.com/repos/purview-dev/telemetry-sourcegenerator/releases/390304693",
"assets_url": "https://api.github.com/repos/purview-dev/telemetry-sourcegenerator/releases/390304693/assets",
diff --git a/src/fixtures/github/releases/value-objects.json b/src/fixtures/github/releases/value-objects.json
new file mode 100644
index 0000000..6533aa3
--- /dev/null
+++ b/src/fixtures/github/releases/value-objects.json
@@ -0,0 +1,44 @@
+[
+ {
+ "url": "https://api.github.com/repos/purview-dev/value-objects/releases/391640207",
+ "assets_url": "https://api.github.com/repos/purview-dev/value-objects/releases/391640207/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/value-objects/releases/391640207/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/value-objects/releases/tag/v1.0.0-prerelease.1",
+ "id": 391640207,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOUgS3hM4XV_SP",
+ "tag_name": "v1.0.0-prerelease.1",
+ "target_commitish": "main",
+ "name": "v1.0.0-prerelease.1",
+ "draft": false,
+ "immutable": false,
+ "prerelease": false,
+ "created_at": "2026-09-18T16:53:49Z",
+ "updated_at": "2026-09-18T16:58:43Z",
+ "published_at": "2026-09-18T16:58:43Z",
+ "assets": [],
+ "tarball_url": "https://api.github.com/repos/purview-dev/value-objects/tarball/v1.0.0-prerelease.1",
+ "zipball_url": "https://api.github.com/repos/purview-dev/value-objects/zipball/v1.0.0-prerelease.1",
+ "body": "**Full Changelog**: https://github.com/purview-dev/value-objects/commits/v1.0.0-prerelease.1"
+ }
+]
diff --git a/src/fixtures/github/releases/zodsharp.json b/src/fixtures/github/releases/zodsharp.json
index a259846..acbc343 100644
--- a/src/fixtures/github/releases/zodsharp.json
+++ b/src/fixtures/github/releases/zodsharp.json
@@ -1,4 +1,90 @@
[
+ {
+ "url": "https://api.github.com/repos/purview-dev/zodsharp/releases/391314962",
+ "assets_url": "https://api.github.com/repos/purview-dev/zodsharp/releases/391314962/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/zodsharp/releases/391314962/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/zodsharp/releases/tag/v2.0.0-prerelease.9",
+ "id": 391314962,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOTNzbhc4XUv4S",
+ "tag_name": "v2.0.0-prerelease.9",
+ "target_commitish": "main",
+ "name": "v2.0.0-prerelease.9",
+ "draft": false,
+ "immutable": false,
+ "prerelease": false,
+ "created_at": "2026-09-18T08:18:37Z",
+ "updated_at": "2026-09-18T08:21:13Z",
+ "published_at": "2026-09-18T08:21:13Z",
+ "assets": [],
+ "tarball_url": "https://api.github.com/repos/purview-dev/zodsharp/tarball/v2.0.0-prerelease.9",
+ "zipball_url": "https://api.github.com/repos/purview-dev/zodsharp/zipball/v2.0.0-prerelease.9",
+ "body": "## What's Changed\n* docs: reference framework as Purview.ZodSharp by @kieronlanning in https://github.com/purview-dev/zodsharp/pull/24\n* chore: update branding assets, bump version, and use human-readable name by @kieronlanning in https://github.com/purview-dev/zodsharp/pull/25\n\n\n**Full Changelog**: https://github.com/purview-dev/zodsharp/compare/v2.0.0-prerelease.8...v2.0.0-prerelease.9",
+ "mentions_count": 1
+ },
+ {
+ "url": "https://api.github.com/repos/purview-dev/zodsharp/releases/390933423",
+ "assets_url": "https://api.github.com/repos/purview-dev/zodsharp/releases/390933423/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/zodsharp/releases/390933423/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/zodsharp/releases/tag/v2.0.0-prerelease.8",
+ "id": 390933423,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOTNzbhc4XTSuv",
+ "tag_name": "v2.0.0-prerelease.8",
+ "target_commitish": "main",
+ "name": "v2.0.0-prerelease.8",
+ "draft": false,
+ "immutable": false,
+ "prerelease": false,
+ "created_at": "2026-09-17T17:47:28Z",
+ "updated_at": "2026-09-17T17:50:27Z",
+ "published_at": "2026-09-17T17:50:27Z",
+ "assets": [],
+ "tarball_url": "https://api.github.com/repos/purview-dev/zodsharp/tarball/v2.0.0-prerelease.8",
+ "zipball_url": "https://api.github.com/repos/purview-dev/zodsharp/zipball/v2.0.0-prerelease.8",
+ "body": "## What's Changed\n* chore: update to Purview.BuildSdk and bump to 2.0.0-prerelease.8 by @kieronlanning in https://github.com/purview-dev/zodsharp/pull/23\n\n\n**Full Changelog**: https://github.com/purview-dev/zodsharp/compare/v2.0.0-prerelease.7...v2.0.0-prerelease.8",
+ "mentions_count": 1
+ },
{
"url": "https://api.github.com/repos/purview-dev/zodsharp/releases/390532987",
"assets_url": "https://api.github.com/repos/purview-dev/zodsharp/releases/390532987/assets",
diff --git a/src/fixtures/github/repos/aspire-resourcekit.json b/src/fixtures/github/repos/aspire-resourcekit.json
index c00a12b..38fb887 100644
--- a/src/fixtures/github/repos/aspire-resourcekit.json
+++ b/src/fixtures/github/repos/aspire-resourcekit.json
@@ -66,14 +66,14 @@
"releases_url": "https://api.github.com/repos/purview-dev/aspire-resourcekit/releases{/id}",
"deployments_url": "https://api.github.com/repos/purview-dev/aspire-resourcekit/deployments",
"created_at": "2026-07-15T10:09:08Z",
- "updated_at": "2026-09-16T16:02:30Z",
- "pushed_at": "2026-09-16T16:00:59Z",
+ "updated_at": "2026-09-18T08:16:53Z",
+ "pushed_at": "2026-09-18T08:19:04Z",
"git_url": "git://github.com/purview-dev/aspire-resourcekit.git",
"ssh_url": "git@github.com:purview-dev/aspire-resourcekit.git",
"clone_url": "https://github.com/purview-dev/aspire-resourcekit.git",
"svn_url": "https://github.com/purview-dev/aspire-resourcekit",
"homepage": "https://purview.dev/projects/aspire-resourcekit/",
- "size": 4151,
+ "size": 4275,
"stargazers_count": 2,
"watchers_count": 2,
"language": "C#",
diff --git a/src/fixtures/github/repos/aspirec4.json b/src/fixtures/github/repos/aspirec4.json
index bc1dbfc..3c3118e 100644
--- a/src/fixtures/github/repos/aspirec4.json
+++ b/src/fixtures/github/repos/aspirec4.json
@@ -66,14 +66,14 @@
"releases_url": "https://api.github.com/repos/purview-dev/aspirec4/releases{/id}",
"deployments_url": "https://api.github.com/repos/purview-dev/aspirec4/deployments",
"created_at": "2026-05-07T22:35:03Z",
- "updated_at": "2026-09-16T16:08:46Z",
- "pushed_at": "2026-09-16T16:08:42Z",
+ "updated_at": "2026-09-17T17:47:24Z",
+ "pushed_at": "2026-09-17T17:48:43Z",
"git_url": "git://github.com/purview-dev/aspirec4.git",
"ssh_url": "git@github.com:purview-dev/aspirec4.git",
"clone_url": "https://github.com/purview-dev/aspirec4.git",
"svn_url": "https://github.com/purview-dev/aspirec4",
"homepage": "https://purview.dev/projects/aspirec4/",
- "size": 10817,
+ "size": 10825,
"stargazers_count": 9,
"watchers_count": 9,
"language": "C#",
diff --git a/src/fixtures/github/repos/build-sdk.json b/src/fixtures/github/repos/build-sdk.json
index 9a9aabc..f60eaf7 100644
--- a/src/fixtures/github/repos/build-sdk.json
+++ b/src/fixtures/github/repos/build-sdk.json
@@ -66,16 +66,16 @@
"releases_url": "https://api.github.com/repos/purview-dev/build-sdk/releases{/id}",
"deployments_url": "https://api.github.com/repos/purview-dev/build-sdk/deployments",
"created_at": "2026-05-24T14:07:44Z",
- "updated_at": "2026-09-17T17:18:03Z",
- "pushed_at": "2026-09-17T17:19:07Z",
+ "updated_at": "2026-09-18T08:15:42Z",
+ "pushed_at": "2026-09-18T08:16:43Z",
"git_url": "git://github.com/purview-dev/build-sdk.git",
"ssh_url": "git@github.com:purview-dev/build-sdk.git",
"clone_url": "https://github.com/purview-dev/build-sdk.git",
"svn_url": "https://github.com/purview-dev/build-sdk",
"homepage": "https://purview.dev/projects/build-sdk/",
- "size": 1401,
- "stargazers_count": 0,
- "watchers_count": 0,
+ "size": 1538,
+ "stargazers_count": 1,
+ "watchers_count": 1,
"language": "C#",
"has_issues": true,
"has_projects": false,
@@ -121,7 +121,7 @@
"visibility": "public",
"forks": 0,
"open_issues": 0,
- "watchers": 0,
+ "watchers": 1,
"default_branch": "main",
"permissions": {
"admin": true,
diff --git a/src/fixtures/github/repos/build.json b/src/fixtures/github/repos/build.json
index 70875a1..c59b2ec 100644
--- a/src/fixtures/github/repos/build.json
+++ b/src/fixtures/github/repos/build.json
@@ -66,14 +66,14 @@
"releases_url": "https://api.github.com/repos/purview-dev/build/releases{/id}",
"deployments_url": "https://api.github.com/repos/purview-dev/build/deployments",
"created_at": "2026-09-01T18:12:54Z",
- "updated_at": "2026-09-16T21:00:15Z",
- "pushed_at": "2026-09-16T21:00:13Z",
+ "updated_at": "2026-09-18T11:35:40Z",
+ "pushed_at": "2026-09-18T11:36:17Z",
"git_url": "git://github.com/purview-dev/build.git",
"ssh_url": "git@github.com:purview-dev/build.git",
"clone_url": "https://github.com/purview-dev/build.git",
"svn_url": "https://github.com/purview-dev/build",
"homepage": "https://purview.dev/projects/build/",
- "size": 209,
+ "size": 304,
"stargazers_count": 0,
"watchers_count": 0,
"language": "C#",
diff --git a/src/fixtures/github/repos/event-sourcing.json b/src/fixtures/github/repos/event-sourcing.json
index 8a71b08..6cce45c 100644
--- a/src/fixtures/github/repos/event-sourcing.json
+++ b/src/fixtures/github/repos/event-sourcing.json
@@ -66,14 +66,14 @@
"releases_url": "https://api.github.com/repos/purview-dev/event-sourcing/releases{/id}",
"deployments_url": "https://api.github.com/repos/purview-dev/event-sourcing/deployments",
"created_at": "2024-04-28T15:19:40Z",
- "updated_at": "2026-09-17T16:26:52Z",
- "pushed_at": "2026-09-16T15:11:45Z",
+ "updated_at": "2026-09-18T08:19:28Z",
+ "pushed_at": "2026-09-18T16:46:22Z",
"git_url": "git://github.com/purview-dev/event-sourcing.git",
"ssh_url": "git@github.com:purview-dev/event-sourcing.git",
"clone_url": "https://github.com/purview-dev/event-sourcing.git",
"svn_url": "https://github.com/purview-dev/event-sourcing",
"homepage": "https://purview.dev/event-sourcing/",
- "size": 11528,
+ "size": 11387,
"stargazers_count": 4,
"watchers_count": 4,
"language": "C#",
diff --git a/src/fixtures/github/repos/sourcegenerator-framework.json b/src/fixtures/github/repos/sourcegenerator-framework.json
index 13d5507..a2d629f 100644
--- a/src/fixtures/github/repos/sourcegenerator-framework.json
+++ b/src/fixtures/github/repos/sourcegenerator-framework.json
@@ -66,14 +66,14 @@
"releases_url": "https://api.github.com/repos/purview-dev/sourcegenerator-framework/releases{/id}",
"deployments_url": "https://api.github.com/repos/purview-dev/sourcegenerator-framework/deployments",
"created_at": "2026-08-06T12:26:03Z",
- "updated_at": "2026-09-17T16:26:28Z",
- "pushed_at": "2026-09-16T16:20:56Z",
+ "updated_at": "2026-09-18T08:18:57Z",
+ "pushed_at": "2026-09-18T08:23:19Z",
"git_url": "git://github.com/purview-dev/sourcegenerator-framework.git",
"ssh_url": "git@github.com:purview-dev/sourcegenerator-framework.git",
"clone_url": "https://github.com/purview-dev/sourcegenerator-framework.git",
"svn_url": "https://github.com/purview-dev/sourcegenerator-framework",
"homepage": "https://purview.dev/projects/sourcegenerator-framework/",
- "size": 8061,
+ "size": 8204,
"stargazers_count": 2,
"watchers_count": 2,
"language": "C#",
diff --git a/src/fixtures/github/repos/telemetry-sourcegenerator.json b/src/fixtures/github/repos/telemetry-sourcegenerator.json
index 40fd5bb..ebecf3c 100644
--- a/src/fixtures/github/repos/telemetry-sourcegenerator.json
+++ b/src/fixtures/github/repos/telemetry-sourcegenerator.json
@@ -66,14 +66,14 @@
"releases_url": "https://api.github.com/repos/purview-dev/telemetry-sourcegenerator/releases{/id}",
"deployments_url": "https://api.github.com/repos/purview-dev/telemetry-sourcegenerator/deployments",
"created_at": "2024-03-04T18:31:56Z",
- "updated_at": "2026-09-16T22:01:36Z",
- "pushed_at": "2026-09-16T22:05:51Z",
+ "updated_at": "2026-09-18T08:19:16Z",
+ "pushed_at": "2026-09-18T08:22:49Z",
"git_url": "git://github.com/purview-dev/telemetry-sourcegenerator.git",
"ssh_url": "git@github.com:purview-dev/telemetry-sourcegenerator.git",
"clone_url": "https://github.com/purview-dev/telemetry-sourcegenerator.git",
"svn_url": "https://github.com/purview-dev/telemetry-sourcegenerator",
"homepage": "https://purview.dev/projects/telemetry-sourcegenerator/",
- "size": 7448,
+ "size": 7560,
"stargazers_count": 35,
"watchers_count": 35,
"language": "C#",
@@ -195,5 +195,5 @@
}
},
"network_count": 2,
- "subscribers_count": 1
+ "subscribers_count": 0
}
diff --git a/src/fixtures/github/repos/value-objects.json b/src/fixtures/github/repos/value-objects.json
new file mode 100644
index 0000000..69a4d18
--- /dev/null
+++ b/src/fixtures/github/repos/value-objects.json
@@ -0,0 +1,197 @@
+{
+ "id": 1376040836,
+ "node_id": "R_kgDOUgS3hA",
+ "name": "value-objects",
+ "full_name": "purview-dev/value-objects",
+ "private": false,
+ "owner": {
+ "login": "purview-dev",
+ "id": 96894084,
+ "node_id": "O_kgDOBcZ8hA",
+ "avatar_url": "https://avatars.githubusercontent.com/u/96894084?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/purview-dev",
+ "html_url": "https://github.com/purview-dev",
+ "followers_url": "https://api.github.com/users/purview-dev/followers",
+ "following_url": "https://api.github.com/users/purview-dev/following{/other_user}",
+ "gists_url": "https://api.github.com/users/purview-dev/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/purview-dev/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/purview-dev/subscriptions",
+ "organizations_url": "https://api.github.com/users/purview-dev/orgs",
+ "repos_url": "https://api.github.com/users/purview-dev/repos",
+ "events_url": "https://api.github.com/users/purview-dev/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/purview-dev/received_events",
+ "type": "Organization",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "html_url": "https://github.com/purview-dev/value-objects",
+ "description": "Source-generated scalar and complex value objects for .NET - F#-style single-case types with Create/Hydrate factories, normalization, validation, equality, JSON serialization, Entity Framework integration, and ZodSharp validation.",
+ "fork": false,
+ "url": "https://api.github.com/repos/purview-dev/value-objects",
+ "forks_url": "https://api.github.com/repos/purview-dev/value-objects/forks",
+ "keys_url": "https://api.github.com/repos/purview-dev/value-objects/keys{/key_id}",
+ "collaborators_url": "https://api.github.com/repos/purview-dev/value-objects/collaborators{/collaborator}",
+ "teams_url": "https://api.github.com/repos/purview-dev/value-objects/teams",
+ "hooks_url": "https://api.github.com/repos/purview-dev/value-objects/hooks",
+ "issue_events_url": "https://api.github.com/repos/purview-dev/value-objects/issues/events{/number}",
+ "events_url": "https://api.github.com/repos/purview-dev/value-objects/events",
+ "assignees_url": "https://api.github.com/repos/purview-dev/value-objects/assignees{/user}",
+ "branches_url": "https://api.github.com/repos/purview-dev/value-objects/branches{/branch}",
+ "tags_url": "https://api.github.com/repos/purview-dev/value-objects/tags",
+ "blobs_url": "https://api.github.com/repos/purview-dev/value-objects/git/blobs{/sha}",
+ "git_tags_url": "https://api.github.com/repos/purview-dev/value-objects/git/tags{/sha}",
+ "git_refs_url": "https://api.github.com/repos/purview-dev/value-objects/git/refs{/sha}",
+ "trees_url": "https://api.github.com/repos/purview-dev/value-objects/git/trees{/sha}",
+ "statuses_url": "https://api.github.com/repos/purview-dev/value-objects/statuses/{sha}",
+ "languages_url": "https://api.github.com/repos/purview-dev/value-objects/languages",
+ "stargazers_url": "https://api.github.com/repos/purview-dev/value-objects/stargazers",
+ "contributors_url": "https://api.github.com/repos/purview-dev/value-objects/contributors",
+ "subscribers_url": "https://api.github.com/repos/purview-dev/value-objects/subscribers",
+ "subscription_url": "https://api.github.com/repos/purview-dev/value-objects/subscription",
+ "commits_url": "https://api.github.com/repos/purview-dev/value-objects/commits{/sha}",
+ "git_commits_url": "https://api.github.com/repos/purview-dev/value-objects/git/commits{/sha}",
+ "comments_url": "https://api.github.com/repos/purview-dev/value-objects/comments{/number}",
+ "issue_comment_url": "https://api.github.com/repos/purview-dev/value-objects/issues/comments{/number}",
+ "contents_url": "https://api.github.com/repos/purview-dev/value-objects/contents/{+path}",
+ "compare_url": "https://api.github.com/repos/purview-dev/value-objects/compare/{base}...{head}",
+ "merges_url": "https://api.github.com/repos/purview-dev/value-objects/merges",
+ "archive_url": "https://api.github.com/repos/purview-dev/value-objects/{archive_format}{/ref}",
+ "downloads_url": "https://api.github.com/repos/purview-dev/value-objects/downloads",
+ "issues_url": "https://api.github.com/repos/purview-dev/value-objects/issues{/number}",
+ "pulls_url": "https://api.github.com/repos/purview-dev/value-objects/pulls{/number}",
+ "milestones_url": "https://api.github.com/repos/purview-dev/value-objects/milestones{/number}",
+ "notifications_url": "https://api.github.com/repos/purview-dev/value-objects/notifications{?since,all,participating}",
+ "labels_url": "https://api.github.com/repos/purview-dev/value-objects/labels{/name}",
+ "releases_url": "https://api.github.com/repos/purview-dev/value-objects/releases{/id}",
+ "deployments_url": "https://api.github.com/repos/purview-dev/value-objects/deployments",
+ "created_at": "2026-09-18T15:09:15Z",
+ "updated_at": "2026-09-18T17:05:08Z",
+ "pushed_at": "2026-09-18T17:04:28Z",
+ "git_url": "git://github.com/purview-dev/value-objects.git",
+ "ssh_url": "git@github.com:purview-dev/value-objects.git",
+ "clone_url": "https://github.com/purview-dev/value-objects.git",
+ "svn_url": "https://github.com/purview-dev/value-objects",
+ "homepage": "https://purview.dev/projects/value-objects/",
+ "size": 109,
+ "stargazers_count": 1,
+ "watchers_count": 1,
+ "language": "C#",
+ "has_issues": true,
+ "has_projects": false,
+ "has_downloads": false,
+ "has_wiki": false,
+ "has_pages": false,
+ "has_discussions": false,
+ "forks_count": 0,
+ "mirror_url": null,
+ "archived": false,
+ "disabled": false,
+ "open_issues_count": 0,
+ "license": {
+ "key": "mit",
+ "name": "MIT License",
+ "spdx_id": "MIT",
+ "url": "https://api.github.com/licenses/mit",
+ "node_id": "MDc6TGljZW5zZTEz"
+ },
+ "allow_forking": true,
+ "is_template": false,
+ "web_commit_signoff_required": false,
+ "has_pull_requests": true,
+ "pull_request_creation_policy": "all",
+ "topics": [
+ "c-sharp",
+ "csharp",
+ "ddd",
+ "domain-driven-design",
+ "dotnet",
+ "dto",
+ "entity-framework",
+ "immutable",
+ "json",
+ "roslyn",
+ "scalar",
+ "serialization",
+ "single-case-union",
+ "source-generator",
+ "validation",
+ "value-object",
+ "value-objects",
+ "zodsharp"
+ ],
+ "visibility": "public",
+ "forks": 0,
+ "open_issues": 0,
+ "watchers": 1,
+ "default_branch": "main",
+ "permissions": {
+ "admin": true,
+ "maintain": true,
+ "push": true,
+ "triage": true,
+ "pull": true
+ },
+ "temp_clone_token": "",
+ "allow_squash_merge": true,
+ "allow_merge_commit": true,
+ "allow_rebase_merge": true,
+ "allow_auto_merge": true,
+ "delete_branch_on_merge": true,
+ "allow_update_branch": true,
+ "use_squash_pr_title_as_default": false,
+ "squash_merge_commit_message": "COMMIT_MESSAGES",
+ "squash_merge_commit_title": "COMMIT_OR_PR_TITLE",
+ "merge_commit_message": "PR_TITLE",
+ "merge_commit_title": "MERGE_MESSAGE",
+ "custom_properties": {},
+ "organization": {
+ "login": "purview-dev",
+ "id": 96894084,
+ "node_id": "O_kgDOBcZ8hA",
+ "avatar_url": "https://avatars.githubusercontent.com/u/96894084?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/purview-dev",
+ "html_url": "https://github.com/purview-dev",
+ "followers_url": "https://api.github.com/users/purview-dev/followers",
+ "following_url": "https://api.github.com/users/purview-dev/following{/other_user}",
+ "gists_url": "https://api.github.com/users/purview-dev/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/purview-dev/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/purview-dev/subscriptions",
+ "organizations_url": "https://api.github.com/users/purview-dev/orgs",
+ "repos_url": "https://api.github.com/users/purview-dev/repos",
+ "events_url": "https://api.github.com/users/purview-dev/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/purview-dev/received_events",
+ "type": "Organization",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "security_and_analysis": {
+ "secret_scanning": {
+ "status": "enabled"
+ },
+ "secret_scanning_push_protection": {
+ "status": "enabled"
+ },
+ "dependabot_security_updates": {
+ "status": "disabled"
+ },
+ "secret_scanning_non_provider_patterns": {
+ "status": "disabled"
+ },
+ "secret_scanning_ai_detection": {
+ "status": "disabled"
+ },
+ "secret_scanning_validity_checks": {
+ "status": "disabled"
+ },
+ "secret_scanning_delegated_alert_dismissal": {
+ "status": "disabled"
+ },
+ "secret_scanning_delegated_bypass": {
+ "status": "disabled"
+ }
+ },
+ "network_count": 0,
+ "subscribers_count": 0
+}
diff --git a/src/fixtures/github/repos/zodsharp.json b/src/fixtures/github/repos/zodsharp.json
index 40e67a4..394643d 100644
--- a/src/fixtures/github/repos/zodsharp.json
+++ b/src/fixtures/github/repos/zodsharp.json
@@ -66,19 +66,19 @@
"releases_url": "https://api.github.com/repos/purview-dev/zodsharp/releases{/id}",
"deployments_url": "https://api.github.com/repos/purview-dev/zodsharp/deployments",
"created_at": "2026-07-04T22:19:44Z",
- "updated_at": "2026-09-17T08:08:07Z",
- "pushed_at": "2026-09-17T08:10:23Z",
+ "updated_at": "2026-09-18T08:18:43Z",
+ "pushed_at": "2026-09-18T08:21:12Z",
"git_url": "git://github.com/purview-dev/zodsharp.git",
"ssh_url": "git@github.com:purview-dev/zodsharp.git",
"clone_url": "https://github.com/purview-dev/zodsharp.git",
"svn_url": "https://github.com/purview-dev/zodsharp",
"homepage": "https://purview.dev/projects/zodsharp/",
- "size": 1034,
+ "size": 1103,
"stargazers_count": 1,
"watchers_count": 1,
"language": "C#",
"has_issues": true,
- "has_projects": true,
+ "has_projects": false,
"has_downloads": false,
"has_wiki": false,
"has_pages": false,
diff --git a/src/fixtures/nuget/aspirec4.hosting.json b/src/fixtures/nuget/aspirec4.hosting.json
index e332536..3d2d00a 100644
--- a/src/fixtures/nuget/aspirec4.hosting.json
+++ b/src/fixtures/nuget/aspirec4.hosting.json
@@ -13,6 +13,7 @@
"13.3.3",
"13.3.5",
"13.5.3",
- "13.5.3.1"
+ "13.5.3.1",
+ "13.5.3.2"
]
}
diff --git a/src/fixtures/nuget/purview.aspire.resourcekit.json b/src/fixtures/nuget/purview.aspire.resourcekit.json
index a2e32f0..b29a7ba 100644
--- a/src/fixtures/nuget/purview.aspire.resourcekit.json
+++ b/src/fixtures/nuget/purview.aspire.resourcekit.json
@@ -27,6 +27,8 @@
"1.0.0-prerelease.25",
"1.0.0-prerelease.26",
"1.0.0-prerelease.27",
- "1.0.0-prerelease.28"
+ "1.0.0-prerelease.28",
+ "1.0.0-prerelease.29",
+ "1.0.0-prerelease.30"
]
}
diff --git a/src/fixtures/nuget/purview.build.json b/src/fixtures/nuget/purview.build.json
index 06fe8d8..eef7fd4 100644
--- a/src/fixtures/nuget/purview.build.json
+++ b/src/fixtures/nuget/purview.build.json
@@ -3,6 +3,10 @@
"0.2.1",
"0.2.2",
"0.2.3",
- "0.2.4"
+ "0.2.4",
+ "0.2.6",
+ "0.3.0",
+ "0.3.1",
+ "0.3.2"
]
}
diff --git a/src/fixtures/nuget/purview.buildsdk.json b/src/fixtures/nuget/purview.buildsdk.json
index ec3d05e..c34430a 100644
--- a/src/fixtures/nuget/purview.buildsdk.json
+++ b/src/fixtures/nuget/purview.buildsdk.json
@@ -1,5 +1,6 @@
{
"versions": [
- "1.0.0-prerelease.56"
+ "1.0.0-prerelease.56",
+ "1.0.0-prerelease.57"
]
}
diff --git a/src/fixtures/nuget/purview.eventsourcing.azurestorage.json b/src/fixtures/nuget/purview.eventsourcing.azurestorage.json
index 3267701..48a9a98 100644
--- a/src/fixtures/nuget/purview.eventsourcing.azurestorage.json
+++ b/src/fixtures/nuget/purview.eventsourcing.azurestorage.json
@@ -21,6 +21,8 @@
"2.0.0-prerelease.29",
"2.0.0-prerelease.30",
"2.0.0-prerelease.31",
- "2.0.0-prerelease.32"
+ "2.0.0-prerelease.32",
+ "2.0.0-prerelease.33",
+ "2.0.0-prerelease.34"
]
}
diff --git a/src/fixtures/nuget/purview.eventsourcing.cosmosdb.json b/src/fixtures/nuget/purview.eventsourcing.cosmosdb.json
index 3267701..48a9a98 100644
--- a/src/fixtures/nuget/purview.eventsourcing.cosmosdb.json
+++ b/src/fixtures/nuget/purview.eventsourcing.cosmosdb.json
@@ -21,6 +21,8 @@
"2.0.0-prerelease.29",
"2.0.0-prerelease.30",
"2.0.0-prerelease.31",
- "2.0.0-prerelease.32"
+ "2.0.0-prerelease.32",
+ "2.0.0-prerelease.33",
+ "2.0.0-prerelease.34"
]
}
diff --git a/src/fixtures/nuget/purview.eventsourcing.inmemory.json b/src/fixtures/nuget/purview.eventsourcing.inmemory.json
index a2e9149..7c8ed16 100644
--- a/src/fixtures/nuget/purview.eventsourcing.inmemory.json
+++ b/src/fixtures/nuget/purview.eventsourcing.inmemory.json
@@ -13,6 +13,8 @@
"2.0.0-prerelease.29",
"2.0.0-prerelease.30",
"2.0.0-prerelease.31",
- "2.0.0-prerelease.32"
+ "2.0.0-prerelease.32",
+ "2.0.0-prerelease.33",
+ "2.0.0-prerelease.34"
]
}
diff --git a/src/fixtures/nuget/purview.eventsourcing.json b/src/fixtures/nuget/purview.eventsourcing.json
index 3267701..48a9a98 100644
--- a/src/fixtures/nuget/purview.eventsourcing.json
+++ b/src/fixtures/nuget/purview.eventsourcing.json
@@ -21,6 +21,8 @@
"2.0.0-prerelease.29",
"2.0.0-prerelease.30",
"2.0.0-prerelease.31",
- "2.0.0-prerelease.32"
+ "2.0.0-prerelease.32",
+ "2.0.0-prerelease.33",
+ "2.0.0-prerelease.34"
]
}
diff --git a/src/fixtures/nuget/purview.eventsourcing.mongodb.json b/src/fixtures/nuget/purview.eventsourcing.mongodb.json
index 3267701..48a9a98 100644
--- a/src/fixtures/nuget/purview.eventsourcing.mongodb.json
+++ b/src/fixtures/nuget/purview.eventsourcing.mongodb.json
@@ -21,6 +21,8 @@
"2.0.0-prerelease.29",
"2.0.0-prerelease.30",
"2.0.0-prerelease.31",
- "2.0.0-prerelease.32"
+ "2.0.0-prerelease.32",
+ "2.0.0-prerelease.33",
+ "2.0.0-prerelease.34"
]
}
diff --git a/src/fixtures/nuget/purview.eventsourcing.postgres.json b/src/fixtures/nuget/purview.eventsourcing.postgres.json
index 9e3c569..a750574 100644
--- a/src/fixtures/nuget/purview.eventsourcing.postgres.json
+++ b/src/fixtures/nuget/purview.eventsourcing.postgres.json
@@ -3,6 +3,8 @@
"2.0.0-prerelease.29",
"2.0.0-prerelease.30",
"2.0.0-prerelease.31",
- "2.0.0-prerelease.32"
+ "2.0.0-prerelease.32",
+ "2.0.0-prerelease.33",
+ "2.0.0-prerelease.34"
]
}
diff --git a/src/fixtures/nuget/purview.eventsourcing.sqlserver.json b/src/fixtures/nuget/purview.eventsourcing.sqlserver.json
index 3267701..48a9a98 100644
--- a/src/fixtures/nuget/purview.eventsourcing.sqlserver.json
+++ b/src/fixtures/nuget/purview.eventsourcing.sqlserver.json
@@ -21,6 +21,8 @@
"2.0.0-prerelease.29",
"2.0.0-prerelease.30",
"2.0.0-prerelease.31",
- "2.0.0-prerelease.32"
+ "2.0.0-prerelease.32",
+ "2.0.0-prerelease.33",
+ "2.0.0-prerelease.34"
]
}
diff --git a/src/fixtures/nuget/purview.eventsourcing.validation.fluentvalidation.json b/src/fixtures/nuget/purview.eventsourcing.validation.fluentvalidation.json
index f8b52af..50bf5c7 100644
--- a/src/fixtures/nuget/purview.eventsourcing.validation.fluentvalidation.json
+++ b/src/fixtures/nuget/purview.eventsourcing.validation.fluentvalidation.json
@@ -2,6 +2,8 @@
"versions": [
"2.0.0-prerelease.30",
"2.0.0-prerelease.31",
- "2.0.0-prerelease.32"
+ "2.0.0-prerelease.32",
+ "2.0.0-prerelease.33",
+ "2.0.0-prerelease.34"
]
}
diff --git a/src/fixtures/nuget/purview.eventsourcing.validation.zodsharp.json b/src/fixtures/nuget/purview.eventsourcing.validation.zodsharp.json
index f8b52af..50bf5c7 100644
--- a/src/fixtures/nuget/purview.eventsourcing.validation.zodsharp.json
+++ b/src/fixtures/nuget/purview.eventsourcing.validation.zodsharp.json
@@ -2,6 +2,8 @@
"versions": [
"2.0.0-prerelease.30",
"2.0.0-prerelease.31",
- "2.0.0-prerelease.32"
+ "2.0.0-prerelease.32",
+ "2.0.0-prerelease.33",
+ "2.0.0-prerelease.34"
]
}
diff --git a/src/fixtures/nuget/purview.sourcegeneratorframework.json b/src/fixtures/nuget/purview.sourcegeneratorframework.json
index c3fb3f3..be7a068 100644
--- a/src/fixtures/nuget/purview.sourcegeneratorframework.json
+++ b/src/fixtures/nuget/purview.sourcegeneratorframework.json
@@ -40,6 +40,8 @@
"1.0.0-prerelease.39",
"1.0.0-prerelease.40",
"1.0.0-prerelease.41",
- "1.0.0-prerelease.42"
+ "1.0.0-prerelease.42",
+ "1.0.0-prerelease.43",
+ "1.0.0-prerelease.44"
]
}
diff --git a/src/fixtures/nuget/purview.sourcegeneratorframework.testing.json b/src/fixtures/nuget/purview.sourcegeneratorframework.testing.json
index c3fb3f3..be7a068 100644
--- a/src/fixtures/nuget/purview.sourcegeneratorframework.testing.json
+++ b/src/fixtures/nuget/purview.sourcegeneratorframework.testing.json
@@ -40,6 +40,8 @@
"1.0.0-prerelease.39",
"1.0.0-prerelease.40",
"1.0.0-prerelease.41",
- "1.0.0-prerelease.42"
+ "1.0.0-prerelease.42",
+ "1.0.0-prerelease.43",
+ "1.0.0-prerelease.44"
]
}
diff --git a/src/fixtures/nuget/purview.sourcegeneratorframework.testing.tunit.json b/src/fixtures/nuget/purview.sourcegeneratorframework.testing.tunit.json
index c3fb3f3..be7a068 100644
--- a/src/fixtures/nuget/purview.sourcegeneratorframework.testing.tunit.json
+++ b/src/fixtures/nuget/purview.sourcegeneratorframework.testing.tunit.json
@@ -40,6 +40,8 @@
"1.0.0-prerelease.39",
"1.0.0-prerelease.40",
"1.0.0-prerelease.41",
- "1.0.0-prerelease.42"
+ "1.0.0-prerelease.42",
+ "1.0.0-prerelease.43",
+ "1.0.0-prerelease.44"
]
}
diff --git a/src/fixtures/nuget/purview.telemetry.sourcegenerator.json b/src/fixtures/nuget/purview.telemetry.sourcegenerator.json
index 0c5e9ec..ff834c0 100644
--- a/src/fixtures/nuget/purview.telemetry.sourcegenerator.json
+++ b/src/fixtures/nuget/purview.telemetry.sourcegenerator.json
@@ -55,6 +55,8 @@
"5.0.0-prerelease.6",
"5.0.0-prerelease.7",
"5.0.0-prerelease.8",
- "5.0.0-prerelease.9"
+ "5.0.0-prerelease.9",
+ "5.0.0-prerelease.10",
+ "5.0.0-prerelease.11"
]
}
diff --git a/src/fixtures/nuget/purview.valueobjects.json b/src/fixtures/nuget/purview.valueobjects.json
new file mode 100644
index 0000000..bb59240
--- /dev/null
+++ b/src/fixtures/nuget/purview.valueobjects.json
@@ -0,0 +1,5 @@
+{
+ "versions": [
+ "1.0.0-prerelease.1"
+ ]
+}
diff --git a/src/fixtures/nuget/purview.zodsharp.aspnetcore.json b/src/fixtures/nuget/purview.zodsharp.aspnetcore.json
index c270eb3..da78068 100644
--- a/src/fixtures/nuget/purview.zodsharp.aspnetcore.json
+++ b/src/fixtures/nuget/purview.zodsharp.aspnetcore.json
@@ -6,6 +6,8 @@
"2.0.0-prerelease.4",
"2.0.0-prerelease.5",
"2.0.0-prerelease.6",
- "2.0.0-prerelease.7"
+ "2.0.0-prerelease.7",
+ "2.0.0-prerelease.8",
+ "2.0.0-prerelease.9"
]
}
diff --git a/src/fixtures/nuget/purview.zodsharp.json b/src/fixtures/nuget/purview.zodsharp.json
index c270eb3..da78068 100644
--- a/src/fixtures/nuget/purview.zodsharp.json
+++ b/src/fixtures/nuget/purview.zodsharp.json
@@ -6,6 +6,8 @@
"2.0.0-prerelease.4",
"2.0.0-prerelease.5",
"2.0.0-prerelease.6",
- "2.0.0-prerelease.7"
+ "2.0.0-prerelease.7",
+ "2.0.0-prerelease.8",
+ "2.0.0-prerelease.9"
]
}
diff --git a/src/fixtures/nuget/purview.zodsharp.newtonsoftjson.json b/src/fixtures/nuget/purview.zodsharp.newtonsoftjson.json
index c270eb3..da78068 100644
--- a/src/fixtures/nuget/purview.zodsharp.newtonsoftjson.json
+++ b/src/fixtures/nuget/purview.zodsharp.newtonsoftjson.json
@@ -6,6 +6,8 @@
"2.0.0-prerelease.4",
"2.0.0-prerelease.5",
"2.0.0-prerelease.6",
- "2.0.0-prerelease.7"
+ "2.0.0-prerelease.7",
+ "2.0.0-prerelease.8",
+ "2.0.0-prerelease.9"
]
}
diff --git a/src/fixtures/nuget/purview.zodsharp.systemtextjson.json b/src/fixtures/nuget/purview.zodsharp.systemtextjson.json
index c270eb3..da78068 100644
--- a/src/fixtures/nuget/purview.zodsharp.systemtextjson.json
+++ b/src/fixtures/nuget/purview.zodsharp.systemtextjson.json
@@ -6,6 +6,8 @@
"2.0.0-prerelease.4",
"2.0.0-prerelease.5",
"2.0.0-prerelease.6",
- "2.0.0-prerelease.7"
+ "2.0.0-prerelease.7",
+ "2.0.0-prerelease.8",
+ "2.0.0-prerelease.9"
]
}
diff --git a/src/fixtures/nuget/search/AspireC4.Hosting.json b/src/fixtures/nuget/search/AspireC4.Hosting.json
index 42a8372..fc43a3d 100644
--- a/src/fixtures/nuget/search/AspireC4.Hosting.json
+++ b/src/fixtures/nuget/search/AspireC4.Hosting.json
@@ -10,12 +10,13 @@
"@type": "Package",
"registration": "https://api.nuget.org/v3/registration5-semver1/aspirec4.hosting/index.json",
"id": "AspireC4.Hosting",
- "version": "13.5.3.1",
+ "version": "13.5.3.2",
"description": "Aspire hosting extension for the AspireC4 plugin, generating a dynamic LikeC4 architecture diagram for your Aspire application.",
"summary": "",
"title": "AspireC4.Hosting - Aspire LikeC4 Visualisation",
- "iconUrl": "https://api.nuget.org/v3-flatcontainer/aspirec4.hosting/13.5.3.1/icon",
- "licenseUrl": "https://www.nuget.org/packages/AspireC4.Hosting/13.5.3.1/license",
+ "iconUrl": "https://api.nuget.org/v3-flatcontainer/aspirec4.hosting/13.5.3.2/icon",
+ "licenseUrl": "https://www.nuget.org/packages/AspireC4.Hosting/13.5.3.2/license",
+ "projectUrl": "https://purview.dev/projects/aspirec4/",
"tags": [
"aspire",
"dotnet",
@@ -35,7 +36,7 @@
"kieronlanning",
"KJL.dev"
],
- "totalDownloads": 1404,
+ "totalDownloads": 1435,
"verified": false,
"packageTypes": [
{
@@ -60,18 +61,23 @@
},
{
"version": "13.3.5",
- "downloads": 123,
+ "downloads": 124,
"@id": "https://api.nuget.org/v3/registration5-semver1/aspirec4.hosting/13.3.5.json"
},
{
"version": "13.5.3",
- "downloads": 78,
+ "downloads": 82,
"@id": "https://api.nuget.org/v3/registration5-semver1/aspirec4.hosting/13.5.3.json"
},
{
"version": "13.5.3.1",
- "downloads": 79,
+ "downloads": 81,
"@id": "https://api.nuget.org/v3/registration5-semver1/aspirec4.hosting/13.5.3.1.json"
+ },
+ {
+ "version": "13.5.3.2",
+ "downloads": 24,
+ "@id": "https://api.nuget.org/v3/registration5-semver1/aspirec4.hosting/13.5.3.2.json"
}
],
"vulnerabilities": []
diff --git a/src/fixtures/nuget/search/Purview.Build.json b/src/fixtures/nuget/search/Purview.Build.json
index 8ae5913..8ffd950 100644
--- a/src/fixtures/nuget/search/Purview.Build.json
+++ b/src/fixtures/nuget/search/Purview.Build.json
@@ -10,13 +10,13 @@
"@type": "Package",
"registration": "https://api.nuget.org/v3/registration5-semver1/purview.build/index.json",
"id": "Purview.Build",
- "version": "0.2.4",
+ "version": "0.3.2",
"description": "Shared build/test/release pipeline for purview-dev. A Modular Pipelines based .NET tool (Purview.Build) with a GitHub composite action and reusable workflows; consumers configure, the pipeline runs.",
"summary": "",
"title": "Purview.Build",
- "iconUrl": "https://api.nuget.org/v3-flatcontainer/purview.build/0.2.4/icon",
- "licenseUrl": "https://www.nuget.org/packages/Purview.Build/0.2.4/license",
- "projectUrl": "https://github.com/purview-dev/build",
+ "iconUrl": "https://api.nuget.org/v3-flatcontainer/purview.build/0.3.2/icon",
+ "licenseUrl": "https://www.nuget.org/packages/Purview.Build/0.3.2/license",
+ "projectUrl": "https://purview.dev/projects/build/",
"tags": [],
"authors": [
"Purview Contributors"
@@ -24,7 +24,7 @@
"owners": [
"kieronlanning"
],
- "totalDownloads": 571,
+ "totalDownloads": 595,
"verified": false,
"packageTypes": [
{
@@ -49,8 +49,28 @@
},
{
"version": "0.2.4",
- "downloads": 124,
+ "downloads": 148,
"@id": "https://api.nuget.org/v3/registration5-semver1/purview.build/0.2.4.json"
+ },
+ {
+ "version": "0.2.6",
+ "downloads": 0,
+ "@id": "https://api.nuget.org/v3/registration5-semver1/purview.build/0.2.6.json"
+ },
+ {
+ "version": "0.3.0",
+ "downloads": 0,
+ "@id": "https://api.nuget.org/v3/registration5-semver1/purview.build/0.3.0.json"
+ },
+ {
+ "version": "0.3.1",
+ "downloads": 0,
+ "@id": "https://api.nuget.org/v3/registration5-semver1/purview.build/0.3.1.json"
+ },
+ {
+ "version": "0.3.2",
+ "downloads": 0,
+ "@id": "https://api.nuget.org/v3/registration5-semver1/purview.build/0.3.2.json"
}
],
"vulnerabilities": []
diff --git a/src/fixtures/nuget/search/Purview.Telemetry.SourceGenerator.json b/src/fixtures/nuget/search/Purview.Telemetry.SourceGenerator.json
index 435ff50..716046e 100644
--- a/src/fixtures/nuget/search/Purview.Telemetry.SourceGenerator.json
+++ b/src/fixtures/nuget/search/Purview.Telemetry.SourceGenerator.json
@@ -48,7 +48,7 @@
"kieronlanning",
"KJL.dev"
],
- "totalDownloads": 16339,
+ "totalDownloads": 16495,
"verified": false,
"packageTypes": [
{
@@ -158,7 +158,7 @@
},
{
"version": "3.2.4",
- "downloads": 4445,
+ "downloads": 4497,
"@id": "https://api.nuget.org/v3/registration5-semver1/purview.telemetry.sourcegenerator/3.2.4.json"
},
{
@@ -178,7 +178,7 @@
},
{
"version": "4.4.0",
- "downloads": 596,
+ "downloads": 621,
"@id": "https://api.nuget.org/v3/registration5-semver1/purview.telemetry.sourcegenerator/4.4.0.json"
}
],
diff --git a/src/fixtures/nuget/search/Purview.ValueObjects.json b/src/fixtures/nuget/search/Purview.ValueObjects.json
new file mode 100644
index 0000000..b6b988b
--- /dev/null
+++ b/src/fixtures/nuget/search/Purview.ValueObjects.json
@@ -0,0 +1,8 @@
+{
+ "@context": {
+ "@vocab": "http://schema.nuget.org/schema#",
+ "@base": "https://api.nuget.org/v3/registration5-semver1/"
+ },
+ "totalHits": 0,
+ "data": []
+}
diff --git a/src/fixtures/releases/index.json b/src/fixtures/releases/index.json
index ae6ec5c..8d96f70 100644
--- a/src/fixtures/releases/index.json
+++ b/src/fixtures/releases/index.json
@@ -1,6 +1,6 @@
{
"schema": 1,
- "retrievedAt": "2026-09-17T17:27:57.521Z",
+ "retrievedAt": "2026-09-18T17:05:30.958Z",
"repos": {
"purview-dev/telemetry-sourcegenerator": {
"name": "telemetry-sourcegenerator",
@@ -33,7 +33,7 @@
"stargazersCount": 35,
"openIssuesCount": 0,
"defaultBranch": "main",
- "updatedAt": "2026-09-16T22:01:36Z",
+ "updatedAt": "2026-09-18T08:19:16Z",
"hasDiscussions": false
},
"purview-dev/event-sourcing": {
@@ -64,7 +64,7 @@
"stargazersCount": 4,
"openIssuesCount": 0,
"defaultBranch": "main",
- "updatedAt": "2026-09-17T16:26:52Z",
+ "updatedAt": "2026-09-18T08:19:28Z",
"hasDiscussions": false
},
"purview-dev/zodsharp": {
@@ -90,7 +90,39 @@
"stargazersCount": 1,
"openIssuesCount": 0,
"defaultBranch": "main",
- "updatedAt": "2026-09-17T08:08:07Z",
+ "updatedAt": "2026-09-18T08:18:43Z",
+ "hasDiscussions": false
+ },
+ "purview-dev/value-objects": {
+ "name": "value-objects",
+ "fullName": "purview-dev/value-objects",
+ "description": "Source-generated scalar and complex value objects for .NET - F#-style single-case types with Create/Hydrate factories, normalization, validation, equality, JSON serialization, Entity Framework integration, and ZodSharp validation.",
+ "archived": false,
+ "homepage": "https://purview.dev/projects/value-objects/",
+ "topics": [
+ "c-sharp",
+ "csharp",
+ "ddd",
+ "domain-driven-design",
+ "dotnet",
+ "dto",
+ "entity-framework",
+ "immutable",
+ "json",
+ "roslyn",
+ "scalar",
+ "serialization",
+ "single-case-union",
+ "source-generator",
+ "validation",
+ "value-object",
+ "value-objects",
+ "zodsharp"
+ ],
+ "stargazersCount": 1,
+ "openIssuesCount": 0,
+ "defaultBranch": "main",
+ "updatedAt": "2026-09-18T17:05:08Z",
"hasDiscussions": false
},
"purview-dev/sourcegenerator-framework": {
@@ -120,7 +152,7 @@
"stargazersCount": 2,
"openIssuesCount": 0,
"defaultBranch": "main",
- "updatedAt": "2026-09-17T16:26:28Z",
+ "updatedAt": "2026-09-18T08:18:57Z",
"hasDiscussions": false
},
"purview-dev/aspire-resourcekit": {
@@ -148,7 +180,7 @@
"stargazersCount": 2,
"openIssuesCount": 0,
"defaultBranch": "main",
- "updatedAt": "2026-09-16T16:02:30Z",
+ "updatedAt": "2026-09-18T08:16:53Z",
"hasDiscussions": false
},
"purview-dev/aspirec4": {
@@ -181,7 +213,7 @@
"stargazersCount": 9,
"openIssuesCount": 1,
"defaultBranch": "main",
- "updatedAt": "2026-09-16T16:08:46Z",
+ "updatedAt": "2026-09-17T17:47:24Z",
"hasDiscussions": false
},
"purview-dev/build": {
@@ -207,7 +239,7 @@
"stargazersCount": 0,
"openIssuesCount": 1,
"defaultBranch": "main",
- "updatedAt": "2026-09-16T21:00:15Z",
+ "updatedAt": "2026-09-18T11:35:40Z",
"hasDiscussions": false
},
"purview-dev/build-sdk": {
@@ -234,10 +266,10 @@
"tunit",
"xunit"
],
- "stargazersCount": 0,
+ "stargazersCount": 1,
"openIssuesCount": 0,
"defaultBranch": "main",
- "updatedAt": "2026-09-17T17:18:03Z",
+ "updatedAt": "2026-09-18T08:15:42Z",
"hasDiscussions": false
},
"purview-dev/dotnet-logging-source-generators": {
@@ -256,6 +288,24 @@
},
"releases": {
"purview-dev/telemetry-sourcegenerator": [
+ {
+ "tagName": "v5.0.0-prerelease.11",
+ "name": "v5.0.0-prerelease.11",
+ "body": "## What's Changed\n* chore: update branding assets, bump version, and use human-readable name by @kieronlanning in https://github.com/purview-dev/telemetry-sourcegenerator/pull/131\n\n\n**Full Changelog**: https://github.com/purview-dev/telemetry-sourcegenerator/compare/v5.0.0-prerelease.10...v5.0.0-prerelease.11",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-18T08:22:49Z",
+ "htmlUrl": "https://github.com/purview-dev/telemetry-sourcegenerator/releases/tag/v5.0.0-prerelease.11"
+ },
+ {
+ "tagName": "v5.0.0-prerelease.10",
+ "name": "v5.0.0-prerelease.10",
+ "body": "## What's Changed\n* chore: update to Purview.BuildSdk and bump to 5.0.0-prerelease.10 by @kieronlanning in https://github.com/purview-dev/telemetry-sourcegenerator/pull/130\n\n\n**Full Changelog**: https://github.com/purview-dev/telemetry-sourcegenerator/compare/v5.0.0-prerelease.9...v5.0.0-prerelease.10",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-17T17:52:12Z",
+ "htmlUrl": "https://github.com/purview-dev/telemetry-sourcegenerator/releases/tag/v5.0.0-prerelease.10"
+ },
{
"tagName": "v5.0.0-prerelease.9",
"name": "v5.0.0-prerelease.9",
@@ -537,6 +587,24 @@
}
],
"purview-dev/event-sourcing": [
+ {
+ "tagName": "v2.0.0-prerelease.34",
+ "name": "v2.0.0-prerelease.34",
+ "body": "## What's Changed\n* docs: reference framework as Purview.ZodSharp and fix stale package IDs by @kieronlanning in https://github.com/purview-dev/event-sourcing/pull/53\n* chore: update branding assets, bump version, and use human-readable name by @kieronlanning in https://github.com/purview-dev/event-sourcing/pull/54\n\n\n**Full Changelog**: https://github.com/purview-dev/event-sourcing/compare/v2.0.0-prerelease.33...v2.0.0-prerelease.34",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-18T08:24:00Z",
+ "htmlUrl": "https://github.com/purview-dev/event-sourcing/releases/tag/v2.0.0-prerelease.34"
+ },
+ {
+ "tagName": "v2.0.0-prerelease.33",
+ "name": "v2.0.0-prerelease.33",
+ "body": "## What's Changed\n* chore: bumped sdk - no core version bump by @kieronlanning in https://github.com/purview-dev/event-sourcing/pull/50\n* Docs update by @kieronlanning in https://github.com/purview-dev/event-sourcing/pull/51\n* chore: rename to event-sourcing and bump to 2.0.0-prerelease.33 by @kieronlanning in https://github.com/purview-dev/event-sourcing/pull/52\n\n\n**Full Changelog**: https://github.com/purview-dev/event-sourcing/compare/v2.0.0-prerelease.32...v2.0.0-prerelease.33",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-17T17:54:44Z",
+ "htmlUrl": "https://github.com/purview-dev/event-sourcing/releases/tag/v2.0.0-prerelease.33"
+ },
{
"tagName": "v2.0.0-prerelease.32",
"name": "v2.0.0-prerelease.32",
@@ -611,6 +679,24 @@
}
],
"purview-dev/zodsharp": [
+ {
+ "tagName": "v2.0.0-prerelease.9",
+ "name": "v2.0.0-prerelease.9",
+ "body": "## What's Changed\n* docs: reference framework as Purview.ZodSharp by @kieronlanning in https://github.com/purview-dev/zodsharp/pull/24\n* chore: update branding assets, bump version, and use human-readable name by @kieronlanning in https://github.com/purview-dev/zodsharp/pull/25\n\n\n**Full Changelog**: https://github.com/purview-dev/zodsharp/compare/v2.0.0-prerelease.8...v2.0.0-prerelease.9",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-18T08:21:13Z",
+ "htmlUrl": "https://github.com/purview-dev/zodsharp/releases/tag/v2.0.0-prerelease.9"
+ },
+ {
+ "tagName": "v2.0.0-prerelease.8",
+ "name": "v2.0.0-prerelease.8",
+ "body": "## What's Changed\n* chore: update to Purview.BuildSdk and bump to 2.0.0-prerelease.8 by @kieronlanning in https://github.com/purview-dev/zodsharp/pull/23\n\n\n**Full Changelog**: https://github.com/purview-dev/zodsharp/compare/v2.0.0-prerelease.7...v2.0.0-prerelease.8",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-17T17:50:27Z",
+ "htmlUrl": "https://github.com/purview-dev/zodsharp/releases/tag/v2.0.0-prerelease.8"
+ },
{
"tagName": "v2.0.0-prerelease.7",
"name": "v2.0.0-prerelease.7",
@@ -675,7 +761,36 @@
"htmlUrl": "https://github.com/purview-dev/zodsharp/releases/tag/v2.0.0-prerelease.1"
}
],
+ "purview-dev/value-objects": [
+ {
+ "tagName": "v1.0.0-prerelease.1",
+ "name": "v1.0.0-prerelease.1",
+ "body": "**Full Changelog**: https://github.com/purview-dev/value-objects/commits/v1.0.0-prerelease.1",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-18T16:58:43Z",
+ "htmlUrl": "https://github.com/purview-dev/value-objects/releases/tag/v1.0.0-prerelease.1"
+ }
+ ],
"purview-dev/sourcegenerator-framework": [
+ {
+ "tagName": "v1.0.0-prerelease.44",
+ "name": "v1.0.0-prerelease.44",
+ "body": "## What's Changed\n* chore: update branding assets, bump version, and use human-readable name by @kieronlanning in https://github.com/purview-dev/sourcegenerator-framework/pull/27\n\n\n**Full Changelog**: https://github.com/purview-dev/sourcegenerator-framework/compare/v1.0.0-prerelease.43...v1.0.0-prerelease.44",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-18T08:23:20Z",
+ "htmlUrl": "https://github.com/purview-dev/sourcegenerator-framework/releases/tag/v1.0.0-prerelease.44"
+ },
+ {
+ "tagName": "v1.0.0-prerelease.43",
+ "name": "v1.0.0-prerelease.43",
+ "body": "## What's Changed\n* docs: updated urls in documentation by @kieronlanning in https://github.com/purview-dev/sourcegenerator-framework/pull/25\n* chore: rename to sourcegenerator-framework and bump to 1.0.0-prerelease.43 by @kieronlanning in https://github.com/purview-dev/sourcegenerator-framework/pull/26\n\n\n**Full Changelog**: https://github.com/purview-dev/sourcegenerator-framework/compare/v1.0.0-prerelease.42...v1.0.0-prerelease.43",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-17T17:50:45Z",
+ "htmlUrl": "https://github.com/purview-dev/sourcegenerator-framework/releases/tag/v1.0.0-prerelease.43"
+ },
{
"tagName": "v1.0.0-prerelease.42",
"name": "v1.0.0-prerelease.42",
@@ -822,6 +937,24 @@
}
],
"purview-dev/aspire-resourcekit": [
+ {
+ "tagName": "v1.0.0-prerelease.30",
+ "name": "v1.0.0-prerelease.30",
+ "body": "## What's Changed\n* chore: update branding assets, bump version, and use human-readable name by @kieronlanning in https://github.com/purview-dev/aspire-resourcekit/pull/33\n\n\n**Full Changelog**: https://github.com/purview-dev/aspire-resourcekit/compare/v1.0.0-prerelease.29...v1.0.0-prerelease.30",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-18T08:19:04Z",
+ "htmlUrl": "https://github.com/purview-dev/aspire-resourcekit/releases/tag/v1.0.0-prerelease.30"
+ },
+ {
+ "tagName": "v1.0.0-prerelease.29",
+ "name": "v1.0.0-prerelease.29",
+ "body": "## What's Changed\n* docs: updated urls in documentation by @kieronlanning in https://github.com/purview-dev/aspire-resourcekit/pull/31\n* chore: update to Purview.BuildSdk and bump to 1.0.0-prerelease.29 by @kieronlanning in https://github.com/purview-dev/aspire-resourcekit/pull/32\n\n\n**Full Changelog**: https://github.com/purview-dev/aspire-resourcekit/compare/v1.0.0-prerelease.28...v1.0.0-prerelease.29",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-17T17:49:21Z",
+ "htmlUrl": "https://github.com/purview-dev/aspire-resourcekit/releases/tag/v1.0.0-prerelease.29"
+ },
{
"tagName": "v1.0.0-prerelease.28",
"name": "v1.0.0-prerelease.28",
@@ -896,6 +1029,15 @@
}
],
"purview-dev/aspirec4": [
+ {
+ "tagName": "v13.5.3.2",
+ "name": "v13.5.3.2",
+ "body": "## What's Changed\n* docs: updated urls in documentation by @kieronlanning in https://github.com/purview-dev/aspirec4/pull/38\n* chore: update to Purview.BuildSdk and bump to 13.5.3.2 by @kieronlanning in https://github.com/purview-dev/aspirec4/pull/39\n\n\n**Full Changelog**: https://github.com/purview-dev/aspirec4/compare/v13.5.3.1...v13.5.3.2",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-17T17:48:44Z",
+ "htmlUrl": "https://github.com/purview-dev/aspirec4/releases/tag/v13.5.3.2"
+ },
{
"tagName": "v13.5.3.1",
"name": "v13.5.3.1",
@@ -1006,6 +1148,42 @@
}
],
"purview-dev/build": [
+ {
+ "tagName": "v0.3.2",
+ "name": "v0.3.2",
+ "body": "## What's Changed\n* fix(build): new release build by @kieronlanning in https://github.com/purview-dev/build/pull/16\n\n\n**Full Changelog**: https://github.com/purview-dev/build/compare/v0.3.1...v0.3.2",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-18T11:36:17Z",
+ "htmlUrl": "https://github.com/purview-dev/build/releases/tag/v0.3.2"
+ },
+ {
+ "tagName": "v0.3.1",
+ "name": "v0.3.1",
+ "body": "## What's Changed\n* fix: web-based linted was run before the restore by @kieronlanning in https://github.com/purview-dev/build/pull/15\n\n\n**Full Changelog**: https://github.com/purview-dev/build/compare/v0.3.0...v0.3.1",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-18T10:42:00Z",
+ "htmlUrl": "https://github.com/purview-dev/build/releases/tag/v0.3.1"
+ },
+ {
+ "tagName": "v0.3.0",
+ "name": "v0.3.0",
+ "body": "## What's Changed\n* feat: supported web-script build/ deployments by @kieronlanning in https://github.com/purview-dev/build/pull/14\n\n\n**Full Changelog**: https://github.com/purview-dev/build/compare/v0.2.6...v0.3.0",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-18T09:11:09Z",
+ "htmlUrl": "https://github.com/purview-dev/build/releases/tag/v0.3.0"
+ },
+ {
+ "tagName": "v0.2.6",
+ "name": "v0.2.6",
+ "body": "## What's Changed\n* docs: updated urls in documentation by @kieronlanning in https://github.com/purview-dev/build/pull/10\n* docs: use a generic local feed path example by @kieronlanning in https://github.com/purview-dev/build/pull/11\n* chore: update to Purview.BuildSdk and bump to 0.2.5 by @kieronlanning in https://github.com/purview-dev/build/pull/12\n* chore: update branding assets, bump version, and use human-readable name by @kieronlanning in https://github.com/purview-dev/build/pull/13\n\n\n**Full Changelog**: https://github.com/purview-dev/build/compare/v0.2.4...v0.2.6",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-18T08:16:23Z",
+ "htmlUrl": "https://github.com/purview-dev/build/releases/tag/v0.2.6"
+ },
{
"tagName": "v0.2.4",
"name": "v0.2.4",
@@ -1062,6 +1240,15 @@
}
],
"purview-dev/build-sdk": [
+ {
+ "tagName": "v1.0.0-prerelease.57",
+ "name": "v1.0.0-prerelease.57",
+ "body": "## What's Changed\n* chore: update branding assets, bump version, and use human-readable name by @kieronlanning in https://github.com/purview-dev/build-sdk/pull/20\n\n\n**Full Changelog**: https://github.com/purview-dev/build-sdk/compare/v1.0.0-prerelease.56...v1.0.0-prerelease.57",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-18T08:16:44Z",
+ "htmlUrl": "https://github.com/purview-dev/build-sdk/releases/tag/v1.0.0-prerelease.57"
+ },
{
"tagName": "v1.0.0-prerelease.56",
"name": "v1.0.0-prerelease.56",
@@ -1250,7 +1437,9 @@
"5.0.0-prerelease.6",
"5.0.0-prerelease.7",
"5.0.0-prerelease.8",
- "5.0.0-prerelease.9"
+ "5.0.0-prerelease.9",
+ "5.0.0-prerelease.10",
+ "5.0.0-prerelease.11"
]
},
"Purview.EventSourcing": {
@@ -1277,7 +1466,9 @@
"2.0.0-prerelease.29",
"2.0.0-prerelease.30",
"2.0.0-prerelease.31",
- "2.0.0-prerelease.32"
+ "2.0.0-prerelease.32",
+ "2.0.0-prerelease.33",
+ "2.0.0-prerelease.34"
]
},
"Purview.EventSourcing.SqlServer": {
@@ -1304,7 +1495,9 @@
"2.0.0-prerelease.29",
"2.0.0-prerelease.30",
"2.0.0-prerelease.31",
- "2.0.0-prerelease.32"
+ "2.0.0-prerelease.32",
+ "2.0.0-prerelease.33",
+ "2.0.0-prerelease.34"
]
},
"Purview.EventSourcing.Postgres": {
@@ -1313,7 +1506,9 @@
"2.0.0-prerelease.29",
"2.0.0-prerelease.30",
"2.0.0-prerelease.31",
- "2.0.0-prerelease.32"
+ "2.0.0-prerelease.32",
+ "2.0.0-prerelease.33",
+ "2.0.0-prerelease.34"
]
},
"Purview.EventSourcing.AzureStorage": {
@@ -1340,7 +1535,9 @@
"2.0.0-prerelease.29",
"2.0.0-prerelease.30",
"2.0.0-prerelease.31",
- "2.0.0-prerelease.32"
+ "2.0.0-prerelease.32",
+ "2.0.0-prerelease.33",
+ "2.0.0-prerelease.34"
]
},
"Purview.EventSourcing.MongoDB": {
@@ -1367,7 +1564,9 @@
"2.0.0-prerelease.29",
"2.0.0-prerelease.30",
"2.0.0-prerelease.31",
- "2.0.0-prerelease.32"
+ "2.0.0-prerelease.32",
+ "2.0.0-prerelease.33",
+ "2.0.0-prerelease.34"
]
},
"Purview.EventSourcing.CosmosDb": {
@@ -1394,7 +1593,9 @@
"2.0.0-prerelease.29",
"2.0.0-prerelease.30",
"2.0.0-prerelease.31",
- "2.0.0-prerelease.32"
+ "2.0.0-prerelease.32",
+ "2.0.0-prerelease.33",
+ "2.0.0-prerelease.34"
]
},
"Purview.EventSourcing.InMemory": {
@@ -1413,7 +1614,9 @@
"2.0.0-prerelease.29",
"2.0.0-prerelease.30",
"2.0.0-prerelease.31",
- "2.0.0-prerelease.32"
+ "2.0.0-prerelease.32",
+ "2.0.0-prerelease.33",
+ "2.0.0-prerelease.34"
]
},
"Purview.EventSourcing.Validation.FluentValidation": {
@@ -1421,7 +1624,9 @@
"versions": [
"2.0.0-prerelease.30",
"2.0.0-prerelease.31",
- "2.0.0-prerelease.32"
+ "2.0.0-prerelease.32",
+ "2.0.0-prerelease.33",
+ "2.0.0-prerelease.34"
]
},
"Purview.EventSourcing.Validation.ZodSharp": {
@@ -1429,7 +1634,9 @@
"versions": [
"2.0.0-prerelease.30",
"2.0.0-prerelease.31",
- "2.0.0-prerelease.32"
+ "2.0.0-prerelease.32",
+ "2.0.0-prerelease.33",
+ "2.0.0-prerelease.34"
]
},
"Purview.ZodSharp": {
@@ -1441,7 +1648,9 @@
"2.0.0-prerelease.4",
"2.0.0-prerelease.5",
"2.0.0-prerelease.6",
- "2.0.0-prerelease.7"
+ "2.0.0-prerelease.7",
+ "2.0.0-prerelease.8",
+ "2.0.0-prerelease.9"
]
},
"Purview.ZodSharp.SystemTextJson": {
@@ -1453,7 +1662,9 @@
"2.0.0-prerelease.4",
"2.0.0-prerelease.5",
"2.0.0-prerelease.6",
- "2.0.0-prerelease.7"
+ "2.0.0-prerelease.7",
+ "2.0.0-prerelease.8",
+ "2.0.0-prerelease.9"
]
},
"Purview.ZodSharp.NewtonsoftJson": {
@@ -1465,7 +1676,9 @@
"2.0.0-prerelease.4",
"2.0.0-prerelease.5",
"2.0.0-prerelease.6",
- "2.0.0-prerelease.7"
+ "2.0.0-prerelease.7",
+ "2.0.0-prerelease.8",
+ "2.0.0-prerelease.9"
]
},
"Purview.ZodSharp.AspNetCore": {
@@ -1477,7 +1690,15 @@
"2.0.0-prerelease.4",
"2.0.0-prerelease.5",
"2.0.0-prerelease.6",
- "2.0.0-prerelease.7"
+ "2.0.0-prerelease.7",
+ "2.0.0-prerelease.8",
+ "2.0.0-prerelease.9"
+ ]
+ },
+ "Purview.ValueObjects": {
+ "id": "Purview.ValueObjects",
+ "versions": [
+ "1.0.0-prerelease.1"
]
},
"Purview.SourceGeneratorFramework": {
@@ -1523,7 +1744,9 @@
"1.0.0-prerelease.39",
"1.0.0-prerelease.40",
"1.0.0-prerelease.41",
- "1.0.0-prerelease.42"
+ "1.0.0-prerelease.42",
+ "1.0.0-prerelease.43",
+ "1.0.0-prerelease.44"
]
},
"Purview.SourceGeneratorFramework.Testing": {
@@ -1569,7 +1792,9 @@
"1.0.0-prerelease.39",
"1.0.0-prerelease.40",
"1.0.0-prerelease.41",
- "1.0.0-prerelease.42"
+ "1.0.0-prerelease.42",
+ "1.0.0-prerelease.43",
+ "1.0.0-prerelease.44"
]
},
"Purview.SourceGeneratorFramework.Testing.TUnit": {
@@ -1615,7 +1840,9 @@
"1.0.0-prerelease.39",
"1.0.0-prerelease.40",
"1.0.0-prerelease.41",
- "1.0.0-prerelease.42"
+ "1.0.0-prerelease.42",
+ "1.0.0-prerelease.43",
+ "1.0.0-prerelease.44"
]
},
"Purview.Aspire.ResourceKit": {
@@ -1648,7 +1875,9 @@
"1.0.0-prerelease.25",
"1.0.0-prerelease.26",
"1.0.0-prerelease.27",
- "1.0.0-prerelease.28"
+ "1.0.0-prerelease.28",
+ "1.0.0-prerelease.29",
+ "1.0.0-prerelease.30"
]
},
"AspireC4.Hosting": {
@@ -1667,7 +1896,8 @@
"13.3.3",
"13.3.5",
"13.5.3",
- "13.5.3.1"
+ "13.5.3.1",
+ "13.5.3.2"
]
},
"Purview.Build": {
@@ -1676,13 +1906,18 @@
"0.2.1",
"0.2.2",
"0.2.3",
- "0.2.4"
+ "0.2.4",
+ "0.2.6",
+ "0.3.0",
+ "0.3.1",
+ "0.3.2"
]
},
"Purview.BuildSdk": {
"id": "Purview.BuildSdk",
"versions": [
- "1.0.0-prerelease.56"
+ "1.0.0-prerelease.56",
+ "1.0.0-prerelease.57"
]
}
},
@@ -1691,7 +1926,7 @@
"id": "Purview.Telemetry.SourceGenerator",
"version": "4.4.0",
"description": ".NET Source Generator for interface-based telemetry generating tracing, logs, and metrics.",
- "totalDownloads": 16339,
+ "totalDownloads": 16495,
"tags": [
"logs",
"log",
@@ -1734,15 +1969,16 @@
"Purview.ZodSharp.SystemTextJson": null,
"Purview.ZodSharp.NewtonsoftJson": null,
"Purview.ZodSharp.AspNetCore": null,
+ "Purview.ValueObjects": null,
"Purview.SourceGeneratorFramework": null,
"Purview.SourceGeneratorFramework.Testing": null,
"Purview.SourceGeneratorFramework.Testing.TUnit": null,
"Purview.Aspire.ResourceKit": null,
"AspireC4.Hosting": {
"id": "AspireC4.Hosting",
- "version": "13.5.3.1",
+ "version": "13.5.3.2",
"description": "Aspire hosting extension for the AspireC4 plugin, generating a dynamic LikeC4 architecture diagram for your Aspire application.",
- "totalDownloads": 1404,
+ "totalDownloads": 1435,
"tags": [
"aspire",
"dotnet",
@@ -1761,9 +1997,9 @@
},
"Purview.Build": {
"id": "Purview.Build",
- "version": "0.2.4",
+ "version": "0.3.2",
"description": "Shared build/test/release pipeline for purview-dev. A Modular Pipelines based .NET tool (Purview.Build) with a GitHub composite action and reusable workflows; consumers configure, the pipeline runs.",
- "totalDownloads": 571,
+ "totalDownloads": 595,
"tags": [],
"published": null,
"deprecated": false,
diff --git a/src/src/components/ProjectCard.astro b/src/src/components/ProjectCard.astro
index fa382d9..e63f9d0 100644
--- a/src/src/components/ProjectCard.astro
+++ b/src/src/components/ProjectCard.astro
@@ -16,36 +16,33 @@ const { project, showBadges = true } = Astro.props;
const { tags } = projectRepoEnrichment(project, getReleaseIndex().data);
const primaryPackage = project.packages.find((pkg) => pkg.primary) ?? project.packages[0];
const badges =
- project.status === 'archived'
- ? []
- : [
- ...(primaryPackage
- ? [
- {
- href: nugetPackageUrl(primaryPackage.id),
- src: nugetVersionBadge(primaryPackage.id),
- alt: `NuGet version of ${primaryPackage.id}`,
- },
- {
- href: nugetPackageUrl(primaryPackage.id),
- src: nugetDownloadsBadge(primaryPackage.id),
- alt: `NuGet downloads of ${primaryPackage.id}`,
- },
- ]
- : []),
- {
- href: actionsUrl(project.repository),
- src: buildBadge(project.repository),
- alt: `Build status of ${project.name}`,
- },
- ];
+ project.status === 'archived' ?
+ []
+ : [
+ ...(primaryPackage ?
+ [
+ {
+ href: nugetPackageUrl(primaryPackage.id),
+ src: nugetVersionBadge(primaryPackage.id),
+ alt: `NuGet version of ${primaryPackage.id}`,
+ },
+ {
+ href: nugetPackageUrl(primaryPackage.id),
+ src: nugetDownloadsBadge(primaryPackage.id),
+ alt: `NuGet downloads of ${primaryPackage.id}`,
+ },
+ ]
+ : []),
+ {
+ href: actionsUrl(project.repository),
+ src: buildBadge(project.repository),
+ alt: `Build status of ${project.name}`,
+ },
+ ];
---
\ No newline at end of file
+
diff --git a/src/src/components/SiteFooter.astro b/src/src/components/SiteFooter.astro
index 7c0f907..63d691c 100644
--- a/src/src/components/SiteFooter.astro
+++ b/src/src/components/SiteFooter.astro
@@ -6,10 +6,16 @@ import { siteVersion } from '~/lib/site-version';
import { OWNER, SITE } from '~/lib/site';
import { withBase } from '~/lib/urls';
-// Shuffled at build time so the footer doesn't always spotlight the same projects.
+// Keep footer links deterministic: the site is static once deployed, so
+// build-time randomness would make the output arbitrary rather than fresh.
const footerProjects = loadProjects()
.filter((project) => project.status !== 'archived')
- .toSorted(() => Math.random() - 0.5)
+ .toSorted(
+ (a, b) =>
+ Number(b.featured) - Number(a.featured) ||
+ a.order - b.order ||
+ a.name.localeCompare(b.name),
+ )
.slice(0, 3);
const version = siteVersion();
diff --git a/src/src/data/projects.yml b/src/src/data/projects.yml
index 28cecd7..a306e03 100644
--- a/src/src/data/projects.yml
+++ b/src/src/data/projects.yml
@@ -134,6 +134,7 @@ projects:
docs:
source: github-path
path: docs
+ rootPage: Getting-Started.md
targetFrameworks:
- net8.0
- net9.0
diff --git a/src/src/lib/docs/aggregate.ts b/src/src/lib/docs/aggregate.ts
index 70c77e3..6e7519f 100644
--- a/src/src/lib/docs/aggregate.ts
+++ b/src/src/lib/docs/aggregate.ts
@@ -45,6 +45,13 @@ export interface RawSourceFile {
lastModified: string;
}
+export class DocsValidationError extends Error {
+ constructor(message: string) {
+ super(message);
+ this.name = 'DocsValidationError';
+ }
+}
+
async function githubJson(path: string): Promise {
const headers: Record = {
Accept: 'application/vnd.github+json',
@@ -178,6 +185,76 @@ function isIndexFile(baseName: string): boolean {
return ['home.md', 'index.md', 'readme.md'].includes(baseName.toLowerCase());
}
+function normalizeRootPage(path: string): string {
+ return path.replace(/\\/g, '/').replace(/^\.\//, '').replace(/^\/+/, '').replace(/\/+$/, '');
+}
+
+function relativeToDocRoot(rawPath: string, docRoot: string): string {
+ if (!docRoot) {
+ return normalizeRootPage(rawPath);
+ }
+ return normalizeRootPage(rawPath.slice(docRoot.length + 1));
+}
+
+export function selectDocsRootFile(
+ projectId: string,
+ rawFiles: RawSourceFile[],
+ docRoot: string,
+ configuredRootPage: string | undefined,
+): { index: RawSourceFile; regular: RawSourceFile[]; slugAliases: Map } {
+ const defaultIndex = rawFiles.find((raw) => isIndexFile(relativeToDocRoot(raw.path, docRoot)));
+ const normalizedRootPage = configuredRootPage ? normalizeRootPage(configuredRootPage) : null;
+
+ let index: RawSourceFile | undefined = defaultIndex;
+ if (normalizedRootPage) {
+ const configuredRoot = rawFiles.find(
+ (raw) =>
+ relativeToDocRoot(raw.path, docRoot).toLowerCase() === normalizedRootPage.toLowerCase(),
+ );
+ if (!configuredRoot) {
+ throw new DocsValidationError(
+ [
+ `Invalid docs configuration for ${projectId}`,
+ ` docs.rootPage: "${configuredRootPage}" does not exist under "${docRoot || '.'}".`,
+ '',
+ 'Remediation: point docs.rootPage at an existing markdown file or add a conventional index.md/Home.md/readme.md root page.',
+ ].join('\n'),
+ );
+ }
+ const configuredRelative = relativeToDocRoot(configuredRoot.path, docRoot);
+ if (defaultIndex && configuredRoot !== defaultIndex && !isIndexFile(configuredRelative)) {
+ throw new DocsValidationError(
+ [
+ `Invalid docs configuration for ${projectId}`,
+ ` docs.rootPage: "${configuredRootPage}" selects a non-index page while a conventional root page already exists.`,
+ ` Existing root page: ${relativeToDocRoot(defaultIndex.path, docRoot)}`,
+ '',
+ 'Remediation: remove docs.rootPage or set it to the existing index.md/Home.md/readme.md root page.',
+ ].join('\n'),
+ );
+ }
+ index = configuredRoot;
+ }
+
+ if (!index) {
+ throw new DocsValidationError(
+ [
+ `Invalid docs configuration for ${projectId}`,
+ ` docs: no root page exists under "${docRoot || '.'}".`,
+ '',
+ 'Remediation: add index.md/Home.md/readme.md or set docs.rootPage to the markdown file that should render at /docs/{project}/.',
+ ].join('\n'),
+ );
+ }
+
+ const rootSourceSlug = slugifyDocFile(relativeToDocRoot(index.path, docRoot));
+ return {
+ index,
+ regular: rawFiles.filter((raw) => raw !== index),
+ slugAliases: rootSourceSlug === 'index' ? new Map() : new Map([[rootSourceSlug, 'index']]),
+ };
+}
+
function sourceName(slug: string, raw: RawSourceFile): string {
return slug === 'index' ? 'Home.md' : (raw.path.split('/').pop() ?? raw.path);
}
@@ -191,6 +268,7 @@ async function buildPage(
order: number,
knownSlugs: Set,
headingSlugs: Map>,
+ slugAliases?: Map,
): Promise {
const imageBase: string | null =
project.docs?.source === 'wiki'
@@ -207,6 +285,7 @@ async function buildPage(
sourcePath: sourceDir,
imageBase,
headingSlugs,
+ slugAliases,
};
const converted = convertGithubAlerts(raw.content);
@@ -281,36 +360,71 @@ async function collectGithubPathDocs(
const orderBySidebar = new Map();
sidebarOrder.forEach((name, index) => orderBySidebar.set(slugifyDocFile(name), index));
- const indexSource = rawFiles.find((raw) => isIndexFile(raw.path.slice(docRoot.length + 1)));
- const regular = rawFiles.filter((raw) => raw !== indexSource);
-
+ let selectedRoot: {
+ index: RawSourceFile;
+ regular: RawSourceFile[];
+ slugAliases: Map;
+ };
if (config.readmeAsIndex) {
+ if (config.rootPage) {
+ throw new DocsValidationError(
+ [
+ `Invalid docs configuration for ${project.id}`,
+ ' docs.rootPage cannot be combined with docs.readmeAsIndex.',
+ '',
+ 'Remediation: remove docs.rootPage or disable docs.readmeAsIndex.',
+ ].join('\n'),
+ );
+ }
const readme = await fetchRawFile(project.repository, branch, 'README.md');
- if (readme) {
- rawFiles.unshift(readme);
+ if (!readme) {
+ throw new DocsValidationError(
+ [
+ `Invalid docs configuration for ${project.id}`,
+ ' docs.readmeAsIndex is enabled but README.md does not exist.',
+ '',
+ 'Remediation: add README.md or disable docs.readmeAsIndex.',
+ ].join('\n'),
+ );
}
+ const indexSource = rawFiles.find((raw) => isIndexFile(relativeToDocRoot(raw.path, docRoot)));
+ selectedRoot = {
+ index: readme,
+ regular: rawFiles.filter((raw) => raw !== indexSource),
+ slugAliases: new Map([['readme', 'index']]),
+ };
+ } else {
+ selectedRoot = selectDocsRootFile(project.id, rawFiles, docRoot, config.rootPage);
}
const knownSlugs = new Set(['index']);
- for (const raw of regular) {
- knownSlugs.add(slugifyDocFile(raw.path.slice(docRoot.length + 1)));
+ for (const raw of selectedRoot.regular) {
+ knownSlugs.add(slugifyDocFile(relativeToDocRoot(raw.path, docRoot)));
}
- const index = config.readmeAsIndex ? rawFiles[0] : indexSource;
const headingSlugs = new Map>();
- for (const raw of [...regular, ...(index ? [index] : [])]) {
- const slug = raw === index ? 'index' : slugifyDocFile(raw.path.slice(docRoot.length + 1));
+ for (const raw of [...selectedRoot.regular, selectedRoot.index]) {
+ const slug =
+ raw === selectedRoot.index ? 'index' : slugifyDocFile(relativeToDocRoot(raw.path, docRoot));
headingSlugs.set(slug, extractHeadingSlugs(raw.content));
}
const pages: AggregatedPage[] = [];
- if (index) {
- pages.push(
- await buildPage(project, branch, config.path, 'index', index, -1, knownSlugs, headingSlugs),
- );
- }
- for (const raw of regular) {
- const relative = raw.path.slice(docRoot.length + 1);
+ pages.push(
+ await buildPage(
+ project,
+ branch,
+ config.path,
+ 'index',
+ selectedRoot.index,
+ -1,
+ knownSlugs,
+ headingSlugs,
+ selectedRoot.slugAliases,
+ ),
+ );
+ for (const raw of selectedRoot.regular) {
+ const relative = relativeToDocRoot(raw.path, docRoot);
const slug = slugifyDocFile(relative);
const explicitOrder = config.order?.indexOf(slug);
const order =
@@ -318,7 +432,17 @@ async function collectGithubPathDocs(
? explicitOrder
: (orderBySidebar.get(slug) ?? 1000);
pages.push(
- await buildPage(project, branch, config.path, slug, raw, order, knownSlugs, headingSlugs),
+ await buildPage(
+ project,
+ branch,
+ config.path,
+ slug,
+ raw,
+ order,
+ knownSlugs,
+ headingSlugs,
+ selectedRoot.slugAliases,
+ ),
);
}
@@ -348,36 +472,52 @@ async function collectWikiDocs(project: ResolvedProject): Promise();
sidebarOrder.forEach((name, index) => orderBySidebar.set(slugifyDocFile(name), index));
+ const rawFiles: RawSourceFile[] = candidates.map((candidate) => ({
+ path: candidate.name,
+ content: candidate.content,
+ lastModified: snapshot,
+ }));
+ const selectedRoot = selectDocsRootFile(project.id, rawFiles, '', config.rootPage);
+
const knownSlugs = new Set(['index']);
- for (const candidate of candidates) {
- knownSlugs.add(slugifyDocFile(candidate.name));
+ for (const raw of selectedRoot.regular) {
+ knownSlugs.add(slugifyDocFile(raw.path));
}
const headingSlugs = new Map>();
- for (const candidate of candidates) {
- headingSlugs.set(slugifyDocFile(candidate.name), extractHeadingSlugs(candidate.content));
+ for (const raw of [...selectedRoot.regular, selectedRoot.index]) {
+ const slug = raw === selectedRoot.index ? 'index' : slugifyDocFile(raw.path);
+ headingSlugs.set(slug, extractHeadingSlugs(raw.content));
}
const pages: AggregatedPage[] = [];
- for (const candidate of candidates) {
- const slug = slugifyDocFile(candidate.name);
- const isIndex = candidate.name.toLowerCase() === 'home.md';
- const order = isIndex ? -1 : (orderBySidebar.get(slug) ?? 1000);
- const raw: RawSourceFile = {
- path: candidate.name,
- content: candidate.content,
- lastModified: snapshot,
- };
+ pages.push(
+ await buildPage(
+ project,
+ 'main',
+ 'docs/wiki',
+ 'index',
+ selectedRoot.index,
+ -1,
+ knownSlugs,
+ headingSlugs,
+ selectedRoot.slugAliases,
+ ),
+ );
+ for (const raw of selectedRoot.regular) {
+ const slug = slugifyDocFile(raw.path);
+ const order = orderBySidebar.get(slug) ?? 1000;
pages.push(
await buildPage(
project,
'main',
'docs/wiki',
- isIndex ? 'index' : slug,
+ slug,
raw,
order,
knownSlugs,
headingSlugs,
+ selectedRoot.slugAliases,
),
);
}
@@ -431,6 +571,9 @@ export async function aggregateDocs(projects: ResolvedProject[]): Promise>;
+ /** Source-file slugs that render at a different project-relative slug. */
+ slugAliases?: Map;
}
function stripUrlSuffix(target: string): { path: string; hash: string } {
@@ -141,8 +143,15 @@ export function rewriteDocMarkdown(markdown: string, context: DocLinkContext): s
const baseName = path.split(/[/\\]/).pop() ?? path;
const candidateSlug = slugifyDocFile(baseName.replace(/\.(md|mdx)$/i, ''));
- if (DOC_EXTENSIONS.has(extension) || context.knownSlugs.has(candidateSlug)) {
- const slug = context.knownSlugs.has(candidateSlug) ? candidateSlug : slugifyDocFile(baseName);
+ if (
+ DOC_EXTENSIONS.has(extension) ||
+ context.knownSlugs.has(candidateSlug) ||
+ context.slugAliases?.has(candidateSlug)
+ ) {
+ const candidate = context.knownSlugs.has(candidateSlug)
+ ? candidateSlug
+ : slugifyDocFile(baseName);
+ const slug = context.slugAliases?.get(candidate) ?? candidate;
if (context.knownSlugs.has(slug)) {
const rendered = isImage ? `![${label}]` : `[${label}]`;
return `${rendered}(${usableHash(hash, slug, context)})`;
diff --git a/src/src/lib/manifest/schema.ts b/src/src/lib/manifest/schema.ts
index b71967d..1dd0bcc 100644
--- a/src/src/lib/manifest/schema.ts
+++ b/src/src/lib/manifest/schema.ts
@@ -18,6 +18,7 @@ export const INSTALL_KINDS = ['nuget', 'msbuild-sdk', 'dotnet-tool'] as const;
const docsPathSchema = z.object({
source: z.literal('github-path'),
path: z.string().min(1, 'must be a non-empty repository path such as "docs"'),
+ rootPage: z.string().min(1, 'must be a non-empty markdown file path').optional(),
readmeAsIndex: z.boolean().optional(),
order: z.array(z.string()).optional(),
exclude: z.array(z.string()).optional(),
@@ -25,6 +26,7 @@ const docsPathSchema = z.object({
const docsWikiSchema = z.object({
source: z.literal('wiki'),
+ rootPage: z.string().min(1, 'must be a non-empty markdown file path').optional(),
readmeAsIndex: z.boolean().optional(),
order: z.array(z.string()).optional(),
exclude: z.array(z.string()).optional(),
diff --git a/src/src/pages/index.astro b/src/src/pages/index.astro
index 5c1579f..154f300 100644
--- a/src/src/pages/index.astro
+++ b/src/src/pages/index.astro
@@ -11,6 +11,7 @@ import { absoluteUrl, withBase } from '~/lib/urls';
const projects = loadProjects();
const featured = projects.filter((project) => project.featured);
const active = projects.filter((project) => project.status !== 'archived');
+const featuredGridClass = `featured-projects-grid${featured.length === 5 ? ' featured-projects-grid-five' : ''}`;
const releaseIndex = getReleaseIndex();
const packageRows: PackageRow[] = projects
@@ -55,7 +56,7 @@ const organizationStructuredData = {
height="320"
/>
@@ -142,8 +143,14 @@ const organizationStructuredData = {
View all projects →
-
- {featured.map((project) =>
)}
+
+ {
+ featured.map((project) => (
+
+ ))
+ }
@@ -208,3 +215,47 @@ const organizationStructuredData = {
+
+
diff --git a/src/src/pages/releases/index.astro b/src/src/pages/releases/index.astro
index 976c404..8d607b9 100644
--- a/src/src/pages/releases/index.astro
+++ b/src/src/pages/releases/index.astro
@@ -46,11 +46,20 @@ function formatDate(value: string | null): string {
-
-
-
+
+
+
+
+ Recent releases
+
+
+ GitHub release tags grouped with project context, status, and publication date.
+
+
+
+
-
+
{
releases.length === 0 && (
@@ -68,13 +77,13 @@ function formatDate(value: string | null): string {
-
+
{release.projectName}
@@ -86,17 +95,19 @@ function formatDate(value: string | null): string {
)
}
-
- {release.tagName}
-
+
{
release.repoDescription && (
-
+
{release.repoDescription}
)
@@ -117,7 +128,8 @@ function formatDate(value: string | null): string {
))
}
-
+
+
Package versions
@@ -126,7 +138,7 @@ function formatDate(value: string | null): string {
from the NuGet API at build time.
-
+
| Project |
diff --git a/src/tests/unit/docs.test.ts b/src/tests/unit/docs.test.ts
index 9dc8c2f..c6371f8 100644
--- a/src/tests/unit/docs.test.ts
+++ b/src/tests/unit/docs.test.ts
@@ -3,6 +3,7 @@ import type { DocLinkContext } from '../../src/lib/docs/links';
import { describe, expect, test } from 'bun:test';
+import { DocsValidationError, selectDocsRootFile } from '../../src/lib/docs/aggregate';
import { convertGithubAlerts, parseGithubAlerts } from '../../src/lib/docs/alerts';
import {
extractDescription,
@@ -33,6 +34,10 @@ function context(overrides: Partial = {}): DocLinkContext {
};
}
+function rawDoc(path: string) {
+ return { path, content: `# ${path}`, lastModified: '2026-09-18' };
+}
+
describe('slugifyDocFile', () => {
test('slugifies file names and handles extensionless names', () => {
expect(slugifyDocFile('Getting-Started.md')).toBe('getting-started');
@@ -162,6 +167,55 @@ describe('link rewriting', () => {
const dropped = rewriteDocMarkdown('[Nope](SQL-Server-Guide.md#missing)', context());
expect(dropped).toBe('[Nope]()');
});
+
+ test('rewrites links to a non-index source root to the generated index page', () => {
+ const output = rewriteDocMarkdown(
+ '[Start](Getting-Started.md) and [Home](./Getting-Started)',
+ context({
+ knownSlugs: new Set(['index', 'advanced']),
+ slugAliases: new Map([['getting-started', 'index']]),
+ }),
+ );
+ expect(output).toBe('[Start]() and [Home]()');
+ });
+});
+
+describe('docs root page selection', () => {
+ test('allows a configured non-index root when no conventional root exists', () => {
+ const selected = selectDocsRootFile(
+ 'value-objects',
+ [rawDoc('docs/Getting-Started.md'), rawDoc('docs/ZodSharp-Validation.md')],
+ 'docs',
+ 'getting-started.md',
+ );
+
+ expect(selected.index.path).toBe('docs/Getting-Started.md');
+ expect(selected.regular.map((file) => file.path)).toEqual(['docs/ZodSharp-Validation.md']);
+ expect(selected.slugAliases.get('getting-started')).toBe('index');
+ });
+
+ test('rejects docs without a root page', () => {
+ expect(() => selectDocsRootFile('demo', [rawDoc('docs/Guide.md')], 'docs', undefined)).toThrow(
+ DocsValidationError,
+ );
+ });
+
+ test('rejects a configured root page that does not exist', () => {
+ expect(() =>
+ selectDocsRootFile('demo', [rawDoc('docs/Guide.md')], 'docs', 'Missing.md'),
+ ).toThrow(/does not exist/);
+ });
+
+ test('rejects a non-index configured root when an index already exists', () => {
+ expect(() =>
+ selectDocsRootFile(
+ 'demo',
+ [rawDoc('docs/index.md'), rawDoc('docs/Getting-Started.md')],
+ 'docs',
+ 'Getting-Started.md',
+ ),
+ ).toThrow(/conventional root page already exists/);
+ });
});
describe('resolveDocRelativeLink', () => {
From aa35cc80f2679eb419b473dd1199b2a83aaf4fd0 Mon Sep 17 00:00:00 2001
From: Kieron Lanning
Date: Fri, 18 Sep 2026 18:35:46 +0100
Subject: [PATCH 3/3] test: updated fixtures
---
package.json | 4 +-
.../github/releases/event-sourcing.json | 43 +++++++
.../github/releases/value-objects.json | 43 +++++++
src/fixtures/github/repos/event-sourcing.json | 4 +-
src/fixtures/github/repos/value-objects.json | 2 +-
.../purview.eventsourcing.azurestorage.json | 3 +-
.../nuget/purview.eventsourcing.cosmosdb.json | 3 +-
.../nuget/purview.eventsourcing.inmemory.json | 3 +-
src/fixtures/nuget/purview.eventsourcing.json | 3 +-
.../nuget/purview.eventsourcing.mongodb.json | 3 +-
.../nuget/purview.eventsourcing.postgres.json | 3 +-
.../purview.eventsourcing.sqlserver.json | 3 +-
...tsourcing.validation.fluentvalidation.json | 3 +-
...iew.eventsourcing.validation.zodsharp.json | 3 +-
src/fixtures/nuget/purview.valueobjects.json | 3 +-
src/fixtures/releases/index.json | 52 +++++++--
src/scripts/refresh-fixtures.ts | 3 +
src/src/lib/releases/transform.ts | 5 +-
src/tests/unit/releases.test.ts | 110 ++++++++++++++----
19 files changed, 245 insertions(+), 51 deletions(-)
diff --git a/package.json b/package.json
index 76a7801..4903b4b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "purview-dev",
- "version": "0.1.0",
+ "version": "0.2.0",
"private": true,
"description": "Purview-Dev public website and unified documentation portal (workspace root).",
"license": "MIT",
@@ -33,4 +33,4 @@
"node": ">=22.12.0"
},
"packageManager": "bun@1.4.2"
-}
+}
\ No newline at end of file
diff --git a/src/fixtures/github/releases/event-sourcing.json b/src/fixtures/github/releases/event-sourcing.json
index 28b7fb7..ab4e040 100644
--- a/src/fixtures/github/releases/event-sourcing.json
+++ b/src/fixtures/github/releases/event-sourcing.json
@@ -1,4 +1,47 @@
[
+ {
+ "url": "https://api.github.com/repos/purview-dev/event-sourcing/releases/391653656",
+ "assets_url": "https://api.github.com/repos/purview-dev/event-sourcing/releases/391653656/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/event-sourcing/releases/391653656/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/event-sourcing/releases/tag/v2.0.0-prerelease.35",
+ "id": 391653656,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOL0aKDs4XWCkY",
+ "tag_name": "v2.0.0-prerelease.35",
+ "target_commitish": "main",
+ "name": "v2.0.0-prerelease.35",
+ "draft": false,
+ "immutable": false,
+ "prerelease": false,
+ "created_at": "2026-09-18T17:17:30Z",
+ "updated_at": "2026-09-18T17:21:36Z",
+ "published_at": "2026-09-18T17:21:36Z",
+ "assets": [],
+ "tarball_url": "https://api.github.com/repos/purview-dev/event-sourcing/tarball/v2.0.0-prerelease.35",
+ "zipball_url": "https://api.github.com/repos/purview-dev/event-sourcing/zipball/v2.0.0-prerelease.35",
+ "body": "## What's Changed\n* Migrate to valueobjects by @kieronlanning in https://github.com/purview-dev/event-sourcing/pull/55\n\n\n**Full Changelog**: https://github.com/purview-dev/event-sourcing/compare/v2.0.0-prerelease.34...v2.0.0-prerelease.35",
+ "mentions_count": 1
+ },
{
"url": "https://api.github.com/repos/purview-dev/event-sourcing/releases/391316541",
"assets_url": "https://api.github.com/repos/purview-dev/event-sourcing/releases/391316541/assets",
diff --git a/src/fixtures/github/releases/value-objects.json b/src/fixtures/github/releases/value-objects.json
index 6533aa3..f8792f3 100644
--- a/src/fixtures/github/releases/value-objects.json
+++ b/src/fixtures/github/releases/value-objects.json
@@ -1,4 +1,47 @@
[
+ {
+ "url": "https://api.github.com/repos/purview-dev/value-objects/releases/391644895",
+ "assets_url": "https://api.github.com/repos/purview-dev/value-objects/releases/391644895/assets",
+ "upload_url": "https://uploads.github.com/repos/purview-dev/value-objects/releases/391644895/assets{?name,label}",
+ "html_url": "https://github.com/purview-dev/value-objects/releases/tag/v1.0.0-prerelease.2",
+ "id": 391644895,
+ "author": {
+ "login": "github-actions[bot]",
+ "id": 41898282,
+ "node_id": "MDM6Qm90NDE4OTgyODI=",
+ "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/github-actions%5Bbot%5D",
+ "html_url": "https://github.com/apps/github-actions",
+ "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
+ "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
+ "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
+ "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
+ "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
+ "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
+ "type": "Bot",
+ "user_view_type": "public",
+ "site_admin": false
+ },
+ "node_id": "RE_kwDOUgS3hM4XWAbf",
+ "tag_name": "v1.0.0-prerelease.2",
+ "target_commitish": "main",
+ "name": "v1.0.0-prerelease.2",
+ "draft": false,
+ "immutable": false,
+ "prerelease": false,
+ "created_at": "2026-09-18T17:04:26Z",
+ "updated_at": "2026-09-18T17:06:24Z",
+ "published_at": "2026-09-18T17:06:24Z",
+ "assets": [],
+ "tarball_url": "https://api.github.com/repos/purview-dev/value-objects/tarball/v1.0.0-prerelease.2",
+ "zipball_url": "https://api.github.com/repos/purview-dev/value-objects/zipball/v1.0.0-prerelease.2",
+ "body": "## What's Changed\n* docs: added nuget and build badges£ by @kieronlanning in https://github.com/purview-dev/value-objects/pull/1\n\n## New Contributors\n* @kieronlanning made their first contribution in https://github.com/purview-dev/value-objects/pull/1\n\n**Full Changelog**: https://github.com/purview-dev/value-objects/compare/v1.0.0-prerelease.1...v1.0.0-prerelease.2",
+ "mentions_count": 1
+ },
{
"url": "https://api.github.com/repos/purview-dev/value-objects/releases/391640207",
"assets_url": "https://api.github.com/repos/purview-dev/value-objects/releases/391640207/assets",
diff --git a/src/fixtures/github/repos/event-sourcing.json b/src/fixtures/github/repos/event-sourcing.json
index 6cce45c..d72a28a 100644
--- a/src/fixtures/github/repos/event-sourcing.json
+++ b/src/fixtures/github/repos/event-sourcing.json
@@ -66,8 +66,8 @@
"releases_url": "https://api.github.com/repos/purview-dev/event-sourcing/releases{/id}",
"deployments_url": "https://api.github.com/repos/purview-dev/event-sourcing/deployments",
"created_at": "2024-04-28T15:19:40Z",
- "updated_at": "2026-09-18T08:19:28Z",
- "pushed_at": "2026-09-18T16:46:22Z",
+ "updated_at": "2026-09-18T17:17:37Z",
+ "pushed_at": "2026-09-18T17:21:36Z",
"git_url": "git://github.com/purview-dev/event-sourcing.git",
"ssh_url": "git@github.com:purview-dev/event-sourcing.git",
"clone_url": "https://github.com/purview-dev/event-sourcing.git",
diff --git a/src/fixtures/github/repos/value-objects.json b/src/fixtures/github/repos/value-objects.json
index 69a4d18..565325c 100644
--- a/src/fixtures/github/repos/value-objects.json
+++ b/src/fixtures/github/repos/value-objects.json
@@ -67,7 +67,7 @@
"deployments_url": "https://api.github.com/repos/purview-dev/value-objects/deployments",
"created_at": "2026-09-18T15:09:15Z",
"updated_at": "2026-09-18T17:05:08Z",
- "pushed_at": "2026-09-18T17:04:28Z",
+ "pushed_at": "2026-09-18T17:06:24Z",
"git_url": "git://github.com/purview-dev/value-objects.git",
"ssh_url": "git@github.com:purview-dev/value-objects.git",
"clone_url": "https://github.com/purview-dev/value-objects.git",
diff --git a/src/fixtures/nuget/purview.eventsourcing.azurestorage.json b/src/fixtures/nuget/purview.eventsourcing.azurestorage.json
index 48a9a98..e6f8aec 100644
--- a/src/fixtures/nuget/purview.eventsourcing.azurestorage.json
+++ b/src/fixtures/nuget/purview.eventsourcing.azurestorage.json
@@ -23,6 +23,7 @@
"2.0.0-prerelease.31",
"2.0.0-prerelease.32",
"2.0.0-prerelease.33",
- "2.0.0-prerelease.34"
+ "2.0.0-prerelease.34",
+ "2.0.0-prerelease.35"
]
}
diff --git a/src/fixtures/nuget/purview.eventsourcing.cosmosdb.json b/src/fixtures/nuget/purview.eventsourcing.cosmosdb.json
index 48a9a98..e6f8aec 100644
--- a/src/fixtures/nuget/purview.eventsourcing.cosmosdb.json
+++ b/src/fixtures/nuget/purview.eventsourcing.cosmosdb.json
@@ -23,6 +23,7 @@
"2.0.0-prerelease.31",
"2.0.0-prerelease.32",
"2.0.0-prerelease.33",
- "2.0.0-prerelease.34"
+ "2.0.0-prerelease.34",
+ "2.0.0-prerelease.35"
]
}
diff --git a/src/fixtures/nuget/purview.eventsourcing.inmemory.json b/src/fixtures/nuget/purview.eventsourcing.inmemory.json
index 7c8ed16..79ea349 100644
--- a/src/fixtures/nuget/purview.eventsourcing.inmemory.json
+++ b/src/fixtures/nuget/purview.eventsourcing.inmemory.json
@@ -15,6 +15,7 @@
"2.0.0-prerelease.31",
"2.0.0-prerelease.32",
"2.0.0-prerelease.33",
- "2.0.0-prerelease.34"
+ "2.0.0-prerelease.34",
+ "2.0.0-prerelease.35"
]
}
diff --git a/src/fixtures/nuget/purview.eventsourcing.json b/src/fixtures/nuget/purview.eventsourcing.json
index 48a9a98..e6f8aec 100644
--- a/src/fixtures/nuget/purview.eventsourcing.json
+++ b/src/fixtures/nuget/purview.eventsourcing.json
@@ -23,6 +23,7 @@
"2.0.0-prerelease.31",
"2.0.0-prerelease.32",
"2.0.0-prerelease.33",
- "2.0.0-prerelease.34"
+ "2.0.0-prerelease.34",
+ "2.0.0-prerelease.35"
]
}
diff --git a/src/fixtures/nuget/purview.eventsourcing.mongodb.json b/src/fixtures/nuget/purview.eventsourcing.mongodb.json
index 48a9a98..e6f8aec 100644
--- a/src/fixtures/nuget/purview.eventsourcing.mongodb.json
+++ b/src/fixtures/nuget/purview.eventsourcing.mongodb.json
@@ -23,6 +23,7 @@
"2.0.0-prerelease.31",
"2.0.0-prerelease.32",
"2.0.0-prerelease.33",
- "2.0.0-prerelease.34"
+ "2.0.0-prerelease.34",
+ "2.0.0-prerelease.35"
]
}
diff --git a/src/fixtures/nuget/purview.eventsourcing.postgres.json b/src/fixtures/nuget/purview.eventsourcing.postgres.json
index a750574..1df59af 100644
--- a/src/fixtures/nuget/purview.eventsourcing.postgres.json
+++ b/src/fixtures/nuget/purview.eventsourcing.postgres.json
@@ -5,6 +5,7 @@
"2.0.0-prerelease.31",
"2.0.0-prerelease.32",
"2.0.0-prerelease.33",
- "2.0.0-prerelease.34"
+ "2.0.0-prerelease.34",
+ "2.0.0-prerelease.35"
]
}
diff --git a/src/fixtures/nuget/purview.eventsourcing.sqlserver.json b/src/fixtures/nuget/purview.eventsourcing.sqlserver.json
index 48a9a98..e6f8aec 100644
--- a/src/fixtures/nuget/purview.eventsourcing.sqlserver.json
+++ b/src/fixtures/nuget/purview.eventsourcing.sqlserver.json
@@ -23,6 +23,7 @@
"2.0.0-prerelease.31",
"2.0.0-prerelease.32",
"2.0.0-prerelease.33",
- "2.0.0-prerelease.34"
+ "2.0.0-prerelease.34",
+ "2.0.0-prerelease.35"
]
}
diff --git a/src/fixtures/nuget/purview.eventsourcing.validation.fluentvalidation.json b/src/fixtures/nuget/purview.eventsourcing.validation.fluentvalidation.json
index 50bf5c7..d9f4fef 100644
--- a/src/fixtures/nuget/purview.eventsourcing.validation.fluentvalidation.json
+++ b/src/fixtures/nuget/purview.eventsourcing.validation.fluentvalidation.json
@@ -4,6 +4,7 @@
"2.0.0-prerelease.31",
"2.0.0-prerelease.32",
"2.0.0-prerelease.33",
- "2.0.0-prerelease.34"
+ "2.0.0-prerelease.34",
+ "2.0.0-prerelease.35"
]
}
diff --git a/src/fixtures/nuget/purview.eventsourcing.validation.zodsharp.json b/src/fixtures/nuget/purview.eventsourcing.validation.zodsharp.json
index 50bf5c7..d9f4fef 100644
--- a/src/fixtures/nuget/purview.eventsourcing.validation.zodsharp.json
+++ b/src/fixtures/nuget/purview.eventsourcing.validation.zodsharp.json
@@ -4,6 +4,7 @@
"2.0.0-prerelease.31",
"2.0.0-prerelease.32",
"2.0.0-prerelease.33",
- "2.0.0-prerelease.34"
+ "2.0.0-prerelease.34",
+ "2.0.0-prerelease.35"
]
}
diff --git a/src/fixtures/nuget/purview.valueobjects.json b/src/fixtures/nuget/purview.valueobjects.json
index bb59240..6204766 100644
--- a/src/fixtures/nuget/purview.valueobjects.json
+++ b/src/fixtures/nuget/purview.valueobjects.json
@@ -1,5 +1,6 @@
{
"versions": [
- "1.0.0-prerelease.1"
+ "1.0.0-prerelease.1",
+ "1.0.0-prerelease.2"
]
}
diff --git a/src/fixtures/releases/index.json b/src/fixtures/releases/index.json
index 8d96f70..513f9d3 100644
--- a/src/fixtures/releases/index.json
+++ b/src/fixtures/releases/index.json
@@ -1,6 +1,6 @@
{
"schema": 1,
- "retrievedAt": "2026-09-18T17:05:30.958Z",
+ "retrievedAt": "2026-09-18T17:28:23.132Z",
"repos": {
"purview-dev/telemetry-sourcegenerator": {
"name": "telemetry-sourcegenerator",
@@ -64,7 +64,7 @@
"stargazersCount": 4,
"openIssuesCount": 0,
"defaultBranch": "main",
- "updatedAt": "2026-09-18T08:19:28Z",
+ "updatedAt": "2026-09-18T17:17:37Z",
"hasDiscussions": false
},
"purview-dev/zodsharp": {
@@ -587,6 +587,15 @@
}
],
"purview-dev/event-sourcing": [
+ {
+ "tagName": "v2.0.0-prerelease.35",
+ "name": "v2.0.0-prerelease.35",
+ "body": "## What's Changed\n* Migrate to valueobjects by @kieronlanning in https://github.com/purview-dev/event-sourcing/pull/55\n\n\n**Full Changelog**: https://github.com/purview-dev/event-sourcing/compare/v2.0.0-prerelease.34...v2.0.0-prerelease.35",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-18T17:21:36Z",
+ "htmlUrl": "https://github.com/purview-dev/event-sourcing/releases/tag/v2.0.0-prerelease.35"
+ },
{
"tagName": "v2.0.0-prerelease.34",
"name": "v2.0.0-prerelease.34",
@@ -762,6 +771,15 @@
}
],
"purview-dev/value-objects": [
+ {
+ "tagName": "v1.0.0-prerelease.2",
+ "name": "v1.0.0-prerelease.2",
+ "body": "## What's Changed\n* docs: added nuget and build badges£ by @kieronlanning in https://github.com/purview-dev/value-objects/pull/1\n\n## New Contributors\n* @kieronlanning made their first contribution in https://github.com/purview-dev/value-objects/pull/1\n\n**Full Changelog**: https://github.com/purview-dev/value-objects/compare/v1.0.0-prerelease.1...v1.0.0-prerelease.2",
+ "prerelease": false,
+ "draft": false,
+ "publishedAt": "2026-09-18T17:06:24Z",
+ "htmlUrl": "https://github.com/purview-dev/value-objects/releases/tag/v1.0.0-prerelease.2"
+ },
{
"tagName": "v1.0.0-prerelease.1",
"name": "v1.0.0-prerelease.1",
@@ -1468,7 +1486,8 @@
"2.0.0-prerelease.31",
"2.0.0-prerelease.32",
"2.0.0-prerelease.33",
- "2.0.0-prerelease.34"
+ "2.0.0-prerelease.34",
+ "2.0.0-prerelease.35"
]
},
"Purview.EventSourcing.SqlServer": {
@@ -1497,7 +1516,8 @@
"2.0.0-prerelease.31",
"2.0.0-prerelease.32",
"2.0.0-prerelease.33",
- "2.0.0-prerelease.34"
+ "2.0.0-prerelease.34",
+ "2.0.0-prerelease.35"
]
},
"Purview.EventSourcing.Postgres": {
@@ -1508,7 +1528,8 @@
"2.0.0-prerelease.31",
"2.0.0-prerelease.32",
"2.0.0-prerelease.33",
- "2.0.0-prerelease.34"
+ "2.0.0-prerelease.34",
+ "2.0.0-prerelease.35"
]
},
"Purview.EventSourcing.AzureStorage": {
@@ -1537,7 +1558,8 @@
"2.0.0-prerelease.31",
"2.0.0-prerelease.32",
"2.0.0-prerelease.33",
- "2.0.0-prerelease.34"
+ "2.0.0-prerelease.34",
+ "2.0.0-prerelease.35"
]
},
"Purview.EventSourcing.MongoDB": {
@@ -1566,7 +1588,8 @@
"2.0.0-prerelease.31",
"2.0.0-prerelease.32",
"2.0.0-prerelease.33",
- "2.0.0-prerelease.34"
+ "2.0.0-prerelease.34",
+ "2.0.0-prerelease.35"
]
},
"Purview.EventSourcing.CosmosDb": {
@@ -1595,7 +1618,8 @@
"2.0.0-prerelease.31",
"2.0.0-prerelease.32",
"2.0.0-prerelease.33",
- "2.0.0-prerelease.34"
+ "2.0.0-prerelease.34",
+ "2.0.0-prerelease.35"
]
},
"Purview.EventSourcing.InMemory": {
@@ -1616,7 +1640,8 @@
"2.0.0-prerelease.31",
"2.0.0-prerelease.32",
"2.0.0-prerelease.33",
- "2.0.0-prerelease.34"
+ "2.0.0-prerelease.34",
+ "2.0.0-prerelease.35"
]
},
"Purview.EventSourcing.Validation.FluentValidation": {
@@ -1626,7 +1651,8 @@
"2.0.0-prerelease.31",
"2.0.0-prerelease.32",
"2.0.0-prerelease.33",
- "2.0.0-prerelease.34"
+ "2.0.0-prerelease.34",
+ "2.0.0-prerelease.35"
]
},
"Purview.EventSourcing.Validation.ZodSharp": {
@@ -1636,7 +1662,8 @@
"2.0.0-prerelease.31",
"2.0.0-prerelease.32",
"2.0.0-prerelease.33",
- "2.0.0-prerelease.34"
+ "2.0.0-prerelease.34",
+ "2.0.0-prerelease.35"
]
},
"Purview.ZodSharp": {
@@ -1698,7 +1725,8 @@
"Purview.ValueObjects": {
"id": "Purview.ValueObjects",
"versions": [
- "1.0.0-prerelease.1"
+ "1.0.0-prerelease.1",
+ "1.0.0-prerelease.2"
]
},
"Purview.SourceGeneratorFramework": {
diff --git a/src/scripts/refresh-fixtures.ts b/src/scripts/refresh-fixtures.ts
index ef3fa7a..eecaa24 100644
--- a/src/scripts/refresh-fixtures.ts
+++ b/src/scripts/refresh-fixtures.ts
@@ -26,6 +26,9 @@ function writeJson(file: string, data: unknown): void {
* The fixtures are representative sample data with no secrets and are used by
* the unit tests and as an offline data fallback. Run `just refresh-fixtures`
* to update them; review the diff before committing.
+ *
+ * Fixture-driven unit tests derive their expectations from the fixtures
+ * themselves, so no test updates are required after a refresh.
*/
async function main(): Promise {
const projects = loadProjects();
diff --git a/src/src/lib/releases/transform.ts b/src/src/lib/releases/transform.ts
index 2f54a55..d4bf3a9 100644
--- a/src/src/lib/releases/transform.ts
+++ b/src/src/lib/releases/transform.ts
@@ -35,7 +35,10 @@ export interface ReleaseEntry {
* flat-container index has not caught up with a release. Tags already present
* in the NuGet list are left untouched; only missing tags are appended.
*/
-function reconcileWithGitHubReleases(versions: string[], releases: GitHubReleaseInfo[]): string[] {
+export function reconcileWithGitHubReleases(
+ versions: string[],
+ releases: GitHubReleaseInfo[],
+): string[] {
const known = new Set(versions.map(normalizePrereleaseVersion));
const reconciled = [...versions];
for (const release of releases) {
diff --git a/src/tests/unit/releases.test.ts b/src/tests/unit/releases.test.ts
index 07296d1..9c13638 100644
--- a/src/tests/unit/releases.test.ts
+++ b/src/tests/unit/releases.test.ts
@@ -1,4 +1,4 @@
-import type { ReleaseCacheData } from '../../src/lib/releases/types';
+import type { GitHubReleaseInfo, ReleaseCacheData } from '../../src/lib/releases/types';
import { describe, expect, test } from 'bun:test';
import { readFileSync } from 'node:fs';
@@ -16,6 +16,7 @@ import {
isPrereleaseRelease,
isPrereleaseVersion,
isValidVersion,
+ normalizePrereleaseVersion,
selectPrereleaseVersion,
selectStableVersion,
selectVersions,
@@ -23,12 +24,39 @@ import {
sortVersionsDescending,
} from '../../src/lib/releases/normalize';
import { projectRepoEnrichment } from '../../src/lib/releases/repo';
-import { flattenReleases, projectReleaseSummary } from '../../src/lib/releases/transform';
+import {
+ flattenReleases,
+ projectReleaseSummary,
+ reconcileWithGitHubReleases,
+} from '../../src/lib/releases/transform';
function fixture(name: string): unknown {
return JSON.parse(readFileSync(resolve('fixtures', name), 'utf8')) as unknown;
}
+function fixtureReleases(name: string): GitHubReleaseInfo[] {
+ return (fixture(name) as unknown[]).map((entry) =>
+ parseGitHubRelease(entry as Record),
+ );
+}
+
+/**
+ * The NuGet candidate list a release summary would derive for a package,
+ * mirroring production: GitHub release tags are only folded in when the
+ * package already exists on NuGet, and only when the index lacks the tag.
+ */
+function packageCandidates(
+ packageId: string,
+ repository: string,
+ cache: ReleaseCacheData,
+): string[] {
+ const versions = cache.packages[packageId]?.versions ?? [];
+ if (versions.length === 0) {
+ return versions;
+ }
+ return reconcileWithGitHubReleases(versions, cache.releases[repository] ?? []);
+}
+
describe('GitHub normalisation (real fixtures)', () => {
test('parses the telemetry repo fixture', () => {
const repo = parseGitHubRepo(
@@ -40,16 +68,19 @@ describe('GitHub normalisation (real fixtures)', () => {
});
test('parses release fixtures including the prerelease-flag quirk', () => {
- const releases = (fixture('github/releases/telemetry-sourcegenerator.json') as unknown[]).map(
- (entry) => parseGitHubRelease(entry as Record),
- );
+ const raw = fixture('github/releases/telemetry-sourcegenerator.json') as Array<{
+ tag_name: string;
+ }>;
+ const releases = fixtureReleases('github/releases/telemetry-sourcegenerator.json');
expect(releases.length).toBeGreaterThan(10);
const latest = releases[0];
expect(latest).toBeDefined();
if (!latest) {
throw new Error('The release fixture is unexpectedly empty.');
}
- expect(latest.tagName).toBe('v5.0.0-prerelease.9');
+ // The expectation follows the fixture head instead of a pinned tag, so a
+ // fixture refresh never invalidates this test.
+ expect(latest.tagName).toBe(raw[0]?.tag_name ?? '');
// The org publishes prerelease tags with the GitHub prerelease flag set to
// false; classification must follow the semver tag, not the flag.
expect(latest.prerelease).toBe(false);
@@ -119,11 +150,13 @@ describe('version selection (semver)', () => {
fixture('nuget/purview.buildsdk.json') as Record,
'Purview.BuildSdk',
);
- expect(index.versions).toContain('1.0.0-prerelease.56');
- expect(selectVersions(index.versions)).toEqual({
- stable: null,
- prerelease: '1.0.0-prerelease.56',
- });
+ expect(index.versions.length).toBeGreaterThan(0);
+ expect(index.versions.some((version) => isPrereleaseVersion(version))).toBe(true);
+ const selection = selectVersions(index.versions);
+ expect(selection.stable).toBeNull();
+ // The package only publishes prereleases, so the latest prerelease must be
+ // the highest semver version in the fixture's flat-container index.
+ expect(selection.prerelease).toBe(sortVersionsDescending(index.versions)[0] ?? null);
});
test('handles a package with no releases at all', () => {
@@ -192,17 +225,28 @@ describe('project/package association and release summaries', () => {
const projects = loadProjects();
const telemetry = projects.find((project) => project.id === 'telemetry-sourcegenerator');
expect(telemetry).toBeDefined();
+ const sorted = sortGitHubReleasesDescending(cache!.releases[telemetry!.repository] ?? []);
const summary = projectReleaseSummary(telemetry!, cache!, 'fixture');
- expect(summary.latestRelease?.tagName).toBe('v5.0.0-prerelease.9');
- expect(summary.latestStableRelease?.tagName).toBe('v4.1.0');
+ // Expectations are derived from the cache so a fixture refresh never
+ // invalidates this test; it still verifies the summary picks the same
+ // releases and package versions the normalisation helpers identify.
+ expect(summary.latestRelease?.tagName).toBe(sorted[0]?.tagName);
+ expect(summary.latestStableRelease?.tagName).toBe(
+ sorted.find((release) => !isPrereleaseRelease(release))?.tagName,
+ );
expect(summary.repoDescription).toContain('source generator');
expect(summary.tags.length).toBeGreaterThan(0);
expect(summary.tags).toContain('observability');
const pkg = summary.packages.find(
(entry) => entry.packageId === 'Purview.Telemetry.SourceGenerator',
);
- expect(pkg?.latestStable).toBe('4.4.0');
- expect(pkg?.latestPrerelease).toBe('5.0.0-prerelease.9');
+ const candidates = packageCandidates(
+ 'Purview.Telemetry.SourceGenerator',
+ telemetry!.repository,
+ cache!,
+ );
+ expect(pkg?.latestStable).toBe(selectStableVersion(candidates));
+ expect(pkg?.latestPrerelease).toBe(selectPrereleaseVersion(candidates));
expect(pkg?.totalDownloads).toBeGreaterThan(0);
});
@@ -232,9 +276,18 @@ describe('NuGet index lag reconciliation', () => {
const PACKAGE = 'Purview.Telemetry.SourceGenerator';
const REPOSITORY = 'purview-dev/telemetry-sourcegenerator';
+ /** The most recent prerelease GitHub tag; derived so refreshes stay accurate. */
+ function laggingPrerelease(cache: ReleaseCacheData): { tag: string; version: string } {
+ const sorted = sortGitHubReleasesDescending(cache.releases[REPOSITORY] ?? []);
+ const latest = sorted.find((release) => isPrereleaseRelease(release));
+ const tag = latest?.tagName ?? '';
+ return { tag, version: normalizePrereleaseVersion(tag) };
+ }
+
function laggedCache(): ReleaseCacheData {
const cache = readReleaseFixture('index');
expect(cache).not.toBeNull();
+ const { tag: laggingTag, version: laggingVersion } = laggingPrerelease(cache!);
const releases = cache!.releases[REPOSITORY] ?? [];
const packageIndex = cache!.packages[PACKAGE] ?? { id: PACKAGE, versions: [] };
// Drop the latest prerelease from the NuGet index while the GitHub release
@@ -245,7 +298,7 @@ describe('NuGet index lag reconciliation', () => {
releases: {
...cache!.releases,
[REPOSITORY]: [
- parseGitHubRelease({ tag_name: 'v5.0.0-prerelease.9', prerelease: false }),
+ parseGitHubRelease({ tag_name: laggingTag, prerelease: false }),
...releases,
],
},
@@ -253,41 +306,52 @@ describe('NuGet index lag reconciliation', () => {
...cache!.packages,
[PACKAGE]: {
id: PACKAGE,
- versions: packageIndex.versions.filter((version) => version !== '5.0.0-prerelease.9'),
+ versions: packageIndex.versions.filter((version) => version !== laggingVersion),
},
},
};
}
test('surfaces a GitHub prerelease tag missing from the NuGet index', () => {
+ const cache = readReleaseFixture('index');
+ expect(cache).not.toBeNull();
+ const { version: laggingVersion } = laggingPrerelease(cache!);
const projects = loadProjects();
const telemetry = projects.find((project) => project.id === 'telemetry-sourcegenerator');
expect(telemetry).toBeDefined();
const summary = projectReleaseSummary(telemetry!, laggedCache(), 'fixture');
const pkg = summary.packages.find((entry) => entry.packageId === PACKAGE);
- expect(pkg?.latestPrerelease).toBe('5.0.0-prerelease.9');
+ // The dropped tag is folded back in from GitHub, so the lagging prerelease
+ // is still surfaced as the latest.
+ expect(pkg?.latestPrerelease).toBe(laggingVersion);
// The stable selection is unaffected by the lag.
- expect(pkg?.latestStable).toBe('4.4.0');
+ expect(pkg?.latestStable).toBe(
+ selectStableVersion(packageCandidates(PACKAGE, REPOSITORY, cache!)),
+ );
});
test('surfaces a GitHub stable tag missing from the NuGet index', () => {
const cache = laggedCache();
+ const { version: laggingVersion } = laggingPrerelease(cache);
+ // Simulate a just-cut GitHub stable tag that NuGet has not published yet.
+ const stableVersion = selectStableVersion(cache.packages[PACKAGE]?.versions ?? []) ?? '4.4.0';
+ const stableTag = `v${stableVersion}`;
cache.releases[REPOSITORY] = [
- parseGitHubRelease({ tag_name: 'v4.4.0', prerelease: false }),
+ parseGitHubRelease({ tag_name: stableTag, prerelease: false }),
...(cache.releases[REPOSITORY] ?? []),
];
const packageIndex = cache.packages[PACKAGE] ?? { id: PACKAGE, versions: [] };
cache.packages[PACKAGE] = {
id: PACKAGE,
- versions: packageIndex.versions.filter((version) => version !== '4.4.0'),
+ versions: packageIndex.versions.filter((version) => version !== stableVersion),
};
const projects = loadProjects();
const telemetry = projects.find((project) => project.id === 'telemetry-sourcegenerator');
expect(telemetry).toBeDefined();
const summary = projectReleaseSummary(telemetry!, cache, 'fixture');
const pkg = summary.packages.find((entry) => entry.packageId === PACKAGE);
- expect(pkg?.latestStable).toBe('4.4.0');
- expect(pkg?.latestPrerelease).toBe('5.0.0-prerelease.9');
+ expect(pkg?.latestStable).toBe(stableVersion);
+ expect(pkg?.latestPrerelease).toBe(laggingVersion);
});
test('does not invent versions for packages NuGet has never published', () => {