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 {

)) } -
+
+

Package versions

@@ -126,7 +138,7 @@ function formatDate(value: string | null): string { from the NuGet API at build time.

- +
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', () => {
Project