diff --git a/.agents/skills/update-integrations/SKILL.md b/.agents/skills/update-integrations/SKILL.md index 30367c4e7..199eae2f8 100644 --- a/.agents/skills/update-integrations/SKILL.md +++ b/.agents/skills/update-integrations/SKILL.md @@ -11,6 +11,8 @@ This skill synchronizes the integration package catalog with documentation URL m ## Overview +The automated flow also reconciles documentation mappings and runs `pnpm test:unit:structured-data` before API regeneration or PR creation. This uses a data-only Vitest configuration so validation does not rewrite Astro's generated assets. Mapping changes are included in the generated PR. + The aspire.dev site maintains three key data locations: - **`src/frontend/src/data/aspire-integrations.json`** — Package metadata fetched from the configured package feeds (titles, descriptions, icons, versions, download counts). @@ -61,6 +63,8 @@ pnpm --dir ./src/frontend update:integrations This writes updated package metadata to `src/frontend/src/data/aspire-integrations.json`. The script queries the NuGet v3 API for packages matching `owner:aspire`, `Aspire.Hosting.`, and `CommunityToolkit.Aspire`, then filters out deprecated, unlisted, and excluded packages. +It also removes documentation mappings for Aspire and Community Toolkit packages absent from the updated catalog. Manually curated third-party mappings are preserved, and new documentation URLs still require manual resolution. + On `release/*` branches, the script queries the branch-specific official Aspire feed for `Aspire.*` packages and continues to query nuget.org for `CommunityToolkit.Aspire.*` packages. ### 2. Read the updated package data @@ -76,7 +80,7 @@ Load `src/frontend/src/data/integration-docs.json` and reconcile it with the pac - If an entry exists, verify the `href` is correct - If no entry exists, determine the appropriate documentation URL -- **Remove stale entries** from `integration-docs.json` that reference packages no longer in `aspire-integrations.json` +- **Remove stale entries** for catalog-managed Aspire and Community Toolkit packages no longer in `aspire-integrations.json`. Preserve mappings for third-party packages outside the catalog's sources. - **Preserve existing correct mappings** — do not change entries that are already accurate diff --git a/.github/workflows/update-integration-data.yml b/.github/workflows/update-integration-data.yml index f32a4782a..f5a34ea6a 100644 --- a/.github/workflows/update-integration-data.yml +++ b/.github/workflows/update-integration-data.yml @@ -124,6 +124,7 @@ jobs: # source, manifests, or docs. Directories with no changes are no-ops. git add -- \ src/frontend/src/data/aspire-integrations.json \ + src/frontend/src/data/integration-docs.json \ src/frontend/src/data/github-stats.json \ src/frontend/src/data/samples.json \ src/frontend/src/assets/samples \ diff --git a/src/frontend/package.json b/src/frontend/package.json index 9ea5b84b9..56fa69aed 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -39,7 +39,7 @@ "test:unit:contracts": "vitest run --config vitest.config.ts tests/unit/analytics-script-contracts.vitest.test.ts tests/unit/redirects.vitest.test.ts", "test:unit:components": "vitest run --config vitest.config.ts tests/unit/custom-components.vitest.test.ts tests/unit/site-tour.vitest.test.ts", "test:unit:docs": "vitest run --config vitest.config.ts tests/unit/filetree-format.vitest.test.ts", - "test:unit:structured-data": "vitest run --config vitest.config.ts tests/unit/structured-data.vitest.test.ts tests/unit/update-integrations.vitest.test.ts", + "test:unit:structured-data": "vitest run --config vitest.structured-data.config.ts", "test:unit:cli-config-schema": "vitest run --config vitest.config.ts tests/unit/cli-config-schema.vitest.test.ts", "test:unit:llms-small-whitespace": "vitest run --config vitest.config.ts tests/unit/llms-small-whitespace.vitest.test.ts", "test:unit:llms-txt": "vitest run --config vitest.config.ts tests/unit/llms-txt-twoslash.vitest.test.ts", diff --git a/src/frontend/scripts/update-integration-data.ps1 b/src/frontend/scripts/update-integration-data.ps1 index fa196d361..bfa1e6870 100644 --- a/src/frontend/scripts/update-integration-data.ps1 +++ b/src/frontend/scripts/update-integration-data.ps1 @@ -11,6 +11,7 @@ Phases: 1. `pnpm update:all` — integration metadata, GitHub stats, sample metadata. + Reconciles documentation mappings, then runs structured-data tests. 2. Version-change detection — compares the committed aspire-integrations.json against the freshly written one by package title -> version. Metadata-only changes (icons, descriptions, download @@ -27,7 +28,7 @@ Exit codes: 0 success (whether or not there were changes) - 1 a required phase failed (update:all, TS API regen, out-of-scope diff). + 1 a required phase failed (data update/validation, TS API regen, out-of-scope diff). The caller must NOT open a PR on a non-zero exit. Packages without a public API surface are reported as explicit skips. Any @@ -71,6 +72,7 @@ $PkgGenScript = Join-Path $RepoRoot 'src' 'tools' 'PackageJsonGenerator' 'genera # this set appearing in `git status` is treated as a scope violation. $AllowedPaths = @( 'src/frontend/src/data/aspire-integrations.json', + 'src/frontend/src/data/integration-docs.json', 'src/frontend/src/data/github-stats.json', 'src/frontend/src/data/samples.json', 'src/frontend/src/assets/samples/', @@ -261,6 +263,12 @@ try { Write-Error "pnpm update:all failed (exit $LASTEXITCODE). Aborting; no PR will be opened." exit 1 } + + & pnpm run test:unit:structured-data + if ($LASTEXITCODE -ne 0) { + Write-Error "Structured-data validation failed (exit $LASTEXITCODE). Aborting; no PR will be opened." + exit 1 + } } finally { Pop-Location @@ -559,6 +567,7 @@ $sb = [System.Text.StringBuilder]::new() [void]$sb.AppendLine("") [void]$sb.AppendLine("### What's updated") [void]$sb.AppendLine("- ``src/frontend/src/data/aspire-integrations.json`` — latest package information") +[void]$sb.AppendLine("- ``src/frontend/src/data/integration-docs.json`` — documentation mappings, when packages are removed") [void]$sb.AppendLine("- ``src/frontend/src/data/github-stats.json`` — repository statistics") [void]$sb.AppendLine("- ``src/frontend/src/data/samples.json`` — sample metadata, when changed") [void]$sb.AppendLine("- ``src/frontend/src/assets/samples/`` — sample thumbnails, when changed") diff --git a/src/frontend/scripts/update-integrations.ts b/src/frontend/scripts/update-integrations.ts index 056e1b1a0..f524a8812 100644 --- a/src/frontend/scripts/update-integrations.ts +++ b/src/frontend/scripts/update-integrations.ts @@ -28,6 +28,7 @@ const EXCLUDED_PACKAGES = [ 'CommunityToolkit.Aspire.EventStore', ]; const OUTPUT_PATH = './src/data/aspire-integrations.json'; +const DOCS_OUTPUT_PATH = './src/data/integration-docs.json'; export const DEFAULT_NUGET_ICON_URL = 'https://www.nuget.org/Content/gallery/img/default-package-icon.svg'; @@ -112,6 +113,11 @@ export interface IntegrationOutput { version?: string; } +interface IntegrationDoc { + match: string; + href: string; +} + type PrereleaseIdentifier = { n: number } | { s: string }; interface ParsedSemVer { @@ -270,6 +276,22 @@ export function getOfficialAspireDefaultIconPackages(output: IntegrationOutput[] .map((pkg) => `${pkg.title}@${pkg.version ?? 'unknown'}`); } +export function reconcileIntegrationDocs( + docs: IntegrationDoc[], + integrations: Pick[] +): IntegrationDoc[] { + const catalogPackages = new Set(integrations.map(({ title }) => title.toLowerCase())); + + return docs.filter(({ match }) => { + const packageId = match.toLowerCase(); + // Other publishers are curated manually, outside this updater's package sources. + if (!isOfficialAspirePackage(packageId) && !packageId.startsWith('communitytoolkit.aspire')) { + return true; + } + return catalogPackages.has(packageId); + }); +} + function filterAndTransform(pkgs: PackageRecord[]): IntegrationOutput[] { const excludedLower = EXCLUDED_PACKAGES.map((pkg) => pkg.toLowerCase()); @@ -732,8 +754,17 @@ export async function updateIntegrations(): Promise { `⚠️ Official Aspire packages resolved to the default NuGet icon: ${defaultIconPackages.join(', ')}` ); } + const docs = JSON.parse(fs.readFileSync(DOCS_OUTPUT_PATH, 'utf8')) as IntegrationDoc[]; + const reconciledDocs = reconcileIntegrationDocs(docs, output); + fs.writeFileSync(OUTPUT_PATH, JSON.stringify(output, null, 2)); console.log(`✅ Saved ${output.length} packages to ${OUTPUT_PATH}`); + if (reconciledDocs.length !== docs.length) { + fs.writeFileSync(DOCS_OUTPUT_PATH, `${JSON.stringify(reconciledDocs, null, 2)}\n`); + console.log( + `Removed ${docs.length - reconciledDocs.length} stale documentation mapping(s) from ${DOCS_OUTPUT_PATH}` + ); + } } const isMainModule = process.argv[1] diff --git a/src/frontend/src/data/aspire-integrations.json b/src/frontend/src/data/aspire-integrations.json index 9ea0513d1..2963f63ef 100644 --- a/src/frontend/src/data/aspire-integrations.json +++ b/src/frontend/src/data/aspire-integrations.json @@ -15,7 +15,7 @@ "inference", "ai-search" ], - "downloads": 136927, + "downloads": 137982, "version": "13.5.3-preview.1.26425.3" }, { @@ -33,7 +33,7 @@ "ai", "openai" ], - "downloads": 798095, + "downloads": 800525, "version": "13.5.3-preview.1.26425.3" }, { @@ -52,7 +52,7 @@ "table", "storage" ], - "downloads": 3953565, + "downloads": 3958134, "version": "13.5.3" }, { @@ -72,7 +72,7 @@ "messaging", "eventing" ], - "downloads": 743098, + "downloads": 746425, "version": "13.5.3" }, { @@ -92,7 +92,7 @@ "messaging", "eventing" ], - "downloads": 1840814, + "downloads": 1849912, "version": "13.5.3" }, { @@ -112,7 +112,7 @@ "pubsub", "messaging" ], - "downloads": 69889, + "downloads": 70115, "version": "13.5.3" }, { @@ -134,7 +134,7 @@ "database", "data" ], - "downloads": 154437, + "downloads": 155838, "version": "13.5.3" }, { @@ -161,7 +161,7 @@ "npgsql", "sql" ], - "downloads": 409567, + "downloads": 412380, "version": "13.5.3" }, { @@ -180,7 +180,7 @@ "ai", "ai-search" ], - "downloads": 450955, + "downloads": 452569, "version": "13.5.3" }, { @@ -199,7 +199,7 @@ "secrets", "security" ], - "downloads": 1600804, + "downloads": 1607529, "version": "13.5.3" }, { @@ -218,7 +218,7 @@ "blobs", "blob" ], - "downloads": 6905368, + "downloads": 6927679, "version": "13.5.3" }, { @@ -237,7 +237,7 @@ "files", "datalake" ], - "downloads": 5449, + "downloads": 5483, "version": "13.5.3-preview.1.26425.3" }, { @@ -257,7 +257,7 @@ "queues", "messaging" ], - "downloads": 1869770, + "downloads": 1874032, "version": "13.5.3" }, { @@ -275,7 +275,7 @@ "messaging", "eventing" ], - "downloads": 2651181, + "downloads": 2653124, "version": "13.5.3" }, { @@ -291,7 +291,7 @@ "cloud", "elasticsearch" ], - "downloads": 78063, + "downloads": 78216, "version": "13.3.0" }, { @@ -305,7 +305,7 @@ "orchestration", "polyglot" ], - "downloads": 35596036, + "downloads": 35787689, "version": "13.5.3" }, { @@ -322,7 +322,7 @@ "ai", "agents" ], - "downloads": 4129, + "downloads": 4166, "version": "1.20.0-preview.260831.1" }, { @@ -336,7 +336,7 @@ "hosting", "aws" ], - "downloads": 783560, + "downloads": 786885, "version": "13.7.2" }, { @@ -353,7 +353,7 @@ "orchestration", "polyglot" ], - "downloads": 8983929, + "downloads": 9037440, "version": "13.5.3" }, { @@ -370,7 +370,7 @@ "cloud", "polyglot" ], - "downloads": 594414, + "downloads": 597818, "version": "13.5.3" }, { @@ -388,7 +388,7 @@ "appcontainers", "polyglot" ], - "downloads": 1238133, + "downloads": 1245260, "version": "13.5.3" }, { @@ -407,7 +407,7 @@ "applicationinsights", "polyglot" ], - "downloads": 970263, + "downloads": 974813, "version": "13.5.3" }, { @@ -424,7 +424,7 @@ "appservice", "polyglot" ], - "downloads": 89668, + "downloads": 90326, "version": "13.5.3" }, { @@ -445,7 +445,7 @@ "cloud", "polyglot" ], - "downloads": 832635, + "downloads": 835357, "version": "13.5.3" }, { @@ -463,7 +463,7 @@ "cloud", "polyglot" ], - "downloads": 930219, + "downloads": 937777, "version": "13.5.3" }, { @@ -483,7 +483,7 @@ "nosql", "polyglot" ], - "downloads": 1600927, + "downloads": 1611140, "version": "13.5.3" }, { @@ -502,7 +502,7 @@ "cloud", "polyglot" ], - "downloads": 636369, + "downloads": 642418, "version": "13.5.3" }, { @@ -520,7 +520,7 @@ "cloud", "polyglot" ], - "downloads": 10265, + "downloads": 10333, "version": "13.5.3-preview.1.26425.3" }, { @@ -538,7 +538,7 @@ "cloud", "polyglot" ], - "downloads": 1742516, + "downloads": 1755004, "version": "13.5.3" }, { @@ -557,7 +557,7 @@ "cloud", "polyglot" ], - "downloads": 3322540, + "downloads": 3343255, "version": "13.5.3" }, { @@ -574,7 +574,7 @@ "aks", "polyglot" ], - "downloads": 2756, + "downloads": 2834, "version": "13.5.3-preview.1.26425.3" }, { @@ -593,7 +593,7 @@ "cloud", "polyglot" ], - "downloads": 9626, + "downloads": 9696, "version": "13.5.3-preview.1.26425.3" }, { @@ -615,7 +615,7 @@ "cloud", "polyglot" ], - "downloads": 419447, + "downloads": 425574, "version": "13.5.3" }, { @@ -633,7 +633,7 @@ "cloud", "polyglot" ], - "downloads": 1630754, + "downloads": 1639339, "version": "13.5.3" }, { @@ -652,7 +652,7 @@ "cloud", "polyglot" ], - "downloads": 808865, + "downloads": 813543, "version": "13.5.3" }, { @@ -671,7 +671,7 @@ "cloud", "polyglot" ], - "downloads": 626049, + "downloads": 628555, "version": "13.5.3" }, { @@ -690,7 +690,7 @@ "cloud", "polyglot" ], - "downloads": 308296, + "downloads": 309651, "version": "13.5.3" }, { @@ -709,7 +709,7 @@ "cloud", "polyglot" ], - "downloads": 2451164, + "downloads": 2470957, "version": "13.5.3" }, { @@ -727,7 +727,7 @@ "cloud", "polyglot" ], - "downloads": 328955, + "downloads": 331355, "version": "13.5.3" }, { @@ -746,7 +746,7 @@ "cloud", "polyglot" ], - "downloads": 944024, + "downloads": 950322, "version": "13.5.3" }, { @@ -766,7 +766,7 @@ "cloud", "polyglot" ], - "downloads": 6270875, + "downloads": 6312661, "version": "13.5.3" }, { @@ -786,7 +786,7 @@ "cloud", "polyglot" ], - "downloads": 38834, + "downloads": 38911, "version": "13.5.3" }, { @@ -803,7 +803,7 @@ "gateway", "polyglot" ], - "downloads": 4365, + "downloads": 4432, "version": "13.5.3-preview.1.26425.3" }, { @@ -821,7 +821,7 @@ "diagnostics", "polyglot" ], - "downloads": 158980, + "downloads": 160240, "version": "13.5.3-preview.1.26425.3" }, { @@ -837,7 +837,7 @@ "database", "data" ], - "downloads": 27882, + "downloads": 28364, "version": "13.5.3" }, { @@ -846,7 +846,7 @@ "icon": "https://api.nuget.org/v3-flatcontainer/aspire.hosting.codegeneration.go/13.5.3/icon", "href": "https://www.nuget.org/packages/Aspire.Hosting.CodeGeneration.Go", "tags": [], - "downloads": 9961, + "downloads": 10127, "version": "13.5.3" }, { @@ -855,7 +855,7 @@ "icon": "https://api.nuget.org/v3-flatcontainer/aspire.hosting.codegeneration.java/13.5.3/icon", "href": "https://www.nuget.org/packages/Aspire.Hosting.CodeGeneration.Java", "tags": [], - "downloads": 2833, + "downloads": 2836, "version": "13.5.3" }, { @@ -864,7 +864,7 @@ "icon": "https://api.nuget.org/v3-flatcontainer/aspire.hosting.codegeneration.python/13.5.3/icon", "href": "https://www.nuget.org/packages/Aspire.Hosting.CodeGeneration.Python", "tags": [], - "downloads": 2785, + "downloads": 2787, "version": "13.5.3" }, { @@ -873,7 +873,7 @@ "icon": "https://api.nuget.org/v3-flatcontainer/aspire.hosting.codegeneration.rust/13.5.3/icon", "href": "https://www.nuget.org/packages/Aspire.Hosting.CodeGeneration.Rust", "tags": [], - "downloads": 2727, + "downloads": 2730, "version": "13.5.3" }, { @@ -882,7 +882,7 @@ "icon": "https://api.nuget.org/v3-flatcontainer/aspire.hosting.codegeneration.typescript/13.5.3/icon", "href": "https://www.nuget.org/packages/Aspire.Hosting.CodeGeneration.TypeScript", "tags": [], - "downloads": 65802, + "downloads": 66257, "version": "13.5.3" }, { @@ -896,7 +896,7 @@ "devtunnels", "polyglot" ], - "downloads": 525885, + "downloads": 529892, "version": "13.5.3" }, { @@ -911,7 +911,7 @@ "docker-compose", "polyglot" ], - "downloads": 694151, + "downloads": 698706, "version": "13.5.3" }, { @@ -929,7 +929,7 @@ "azure", "database" ], - "downloads": 1219, + "downloads": 1228, "version": "0.116.0" }, { @@ -947,7 +947,7 @@ "runtime", "polyglot" ], - "downloads": 1030, + "downloads": 1072, "version": "13.5.3-preview.1.26425.3" }, { @@ -961,7 +961,7 @@ "hosting", "elasticsearch" ], - "downloads": 429487, + "downloads": 431165, "version": "13.3.0" }, { @@ -980,7 +980,7 @@ "database", "polyglot" ], - "downloads": 30011, + "downloads": 30415, "version": "13.5.3-preview.1.26425.3" }, { @@ -1001,7 +1001,7 @@ "cloud", "polyglot" ], - "downloads": 55403, + "downloads": 56134, "version": "13.5.3-preview.1.26425.3" }, { @@ -1018,7 +1018,7 @@ "caching", "polyglot" ], - "downloads": 112678, + "downloads": 113384, "version": "13.5.3" }, { @@ -1035,7 +1035,7 @@ "ai", "polyglot" ], - "downloads": 30383, + "downloads": 30481, "version": "13.5.3" }, { @@ -1053,7 +1053,7 @@ "runtime", "polyglot" ], - "downloads": 5334, + "downloads": 5594, "version": "13.5.3-preview.1.26425.3" }, { @@ -1067,7 +1067,7 @@ "analyzers", "ats" ], - "downloads": 5021, + "downloads": 5039, "version": "13.5.3-preview.1.26425.3" }, { @@ -1086,7 +1086,7 @@ "runtime", "polyglot" ], - "downloads": 3820074, + "downloads": 3861295, "version": "13.5.3" }, { @@ -1103,7 +1103,7 @@ "eventing", "polyglot" ], - "downloads": 1324192, + "downloads": 1333443, "version": "13.5.3" }, { @@ -1121,7 +1121,7 @@ "security", "polyglot" ], - "downloads": 876222, + "downloads": 881705, "version": "13.5.3-preview.1.26425.3" }, { @@ -1135,7 +1135,7 @@ "kubernetes", "polyglot" ], - "downloads": 239846, + "downloads": 242105, "version": "13.5.3-preview.1.26425.3" }, { @@ -1149,7 +1149,7 @@ "hosting", "polyglot" ], - "downloads": 40443, + "downloads": 40617, "version": "13.5.3-preview.1.26425.3" }, { @@ -1169,7 +1169,7 @@ "ai-search", "polyglot" ], - "downloads": 14495, + "downloads": 14502, "version": "13.5.3" }, { @@ -1186,7 +1186,7 @@ "data", "polyglot" ], - "downloads": 1023597, + "downloads": 1028931, "version": "13.5.3" }, { @@ -1203,7 +1203,7 @@ "data", "polyglot" ], - "downloads": 384914, + "downloads": 386300, "version": "13.5.3" }, { @@ -1220,7 +1220,7 @@ "eventing", "polyglot" ], - "downloads": 234503, + "downloads": 236504, "version": "13.5.3" }, { @@ -1236,7 +1236,7 @@ "ai", "polyglot" ], - "downloads": 45975, + "downloads": 46060, "version": "13.5.3" }, { @@ -1254,7 +1254,7 @@ "data", "polyglot" ], - "downloads": 96074, + "downloads": 96649, "version": "13.5.3" }, { @@ -1271,7 +1271,7 @@ "eventing", "polyglot" ], - "downloads": 363135, + "downloads": 364970, "version": "13.5.3" }, { @@ -1291,7 +1291,7 @@ "data", "polyglot" ], - "downloads": 7753554, + "downloads": 7802426, "version": "13.5.3" }, { @@ -1308,7 +1308,7 @@ "runtime", "polyglot" ], - "downloads": 373197, + "downloads": 375339, "version": "13.5.3" }, { @@ -1327,7 +1327,7 @@ "data", "polyglot" ], - "downloads": 149648, + "downloads": 149891, "version": "13.5.3" }, { @@ -1344,7 +1344,7 @@ "eventing", "polyglot" ], - "downloads": 3133643, + "downloads": 3154656, "version": "13.5.3" }, { @@ -1361,7 +1361,7 @@ "deployment", "polyglot" ], - "downloads": 246, + "downloads": 248, "version": "13.5.3-preview.1.26425.3" }, { @@ -1378,7 +1378,7 @@ "caching", "polyglot" ], - "downloads": 7620886, + "downloads": 7668777, "version": "13.5.3" }, { @@ -1395,7 +1395,7 @@ "logging", "polyglot" ], - "downloads": 547256, + "downloads": 550096, "version": "13.5.3" }, { @@ -1413,7 +1413,7 @@ "data", "polyglot" ], - "downloads": 7644971, + "downloads": 7691605, "version": "13.5.3" }, { @@ -1430,7 +1430,7 @@ "caching", "polyglot" ], - "downloads": 698762, + "downloads": 702714, "version": "13.5.3" }, { @@ -1447,7 +1447,7 @@ "api", "polyglot" ], - "downloads": 514097, + "downloads": 517666, "version": "13.5.3" }, { @@ -1466,7 +1466,7 @@ "identity", "security" ], - "downloads": 614380, + "downloads": 617596, "version": "13.5.3-preview.1.26425.3" }, { @@ -1488,7 +1488,7 @@ "db", "nosql" ], - "downloads": 1480945, + "downloads": 1489057, "version": "13.5.3" }, { @@ -1507,7 +1507,7 @@ "cache", "caching" ], - "downloads": 125648, + "downloads": 126675, "version": "13.5.3" }, { @@ -1526,7 +1526,7 @@ "sqlserver", "sql" ], - "downloads": 1932415, + "downloads": 1935946, "version": "13.5.3" }, { @@ -1553,7 +1553,7 @@ "cosmosdb", "nosql" ], - "downloads": 236186, + "downloads": 236926, "version": "13.5.3" }, { @@ -1578,7 +1578,7 @@ "sqlserver", "sql" ], - "downloads": 6045416, + "downloads": 6069704, "version": "13.5.3" }, { @@ -1596,7 +1596,7 @@ "configuration", "appconfiguration" ], - "downloads": 731530, + "downloads": 737340, "version": "13.5.3" }, { @@ -1616,7 +1616,7 @@ "search", "ai-search" ], - "downloads": 9401, + "downloads": 9403, "version": "13.5.3-preview.1.26425.3" }, { @@ -1634,7 +1634,7 @@ "database", "mongodb" ], - "downloads": 405669, + "downloads": 408327, "version": "13.5.3" }, { @@ -1652,7 +1652,7 @@ "database", "mongodb" ], - "downloads": 4950, + "downloads": 4954, "version": "13.5.3" }, { @@ -1676,7 +1676,7 @@ "o/rm", "mongodb" ], - "downloads": 6887, + "downloads": 6905, "version": "13.5.3" }, { @@ -1696,7 +1696,7 @@ "mysql", "sql" ], - "downloads": 2471031, + "downloads": 2471206, "version": "13.5.3" }, { @@ -1714,7 +1714,7 @@ "messaging", "eventing" ], - "downloads": 183890, + "downloads": 184862, "version": "13.5.3" }, { @@ -1735,7 +1735,7 @@ "npgsql", "sql" ], - "downloads": 3545995, + "downloads": 3553942, "version": "13.5.3" }, { @@ -1762,7 +1762,7 @@ "npgsql", "sql" ], - "downloads": 6951385, + "downloads": 6976305, "version": "13.5.3" }, { @@ -1779,7 +1779,7 @@ "ai", "openai" ], - "downloads": 725152, + "downloads": 727715, "version": "13.5.3-preview.1.26425.3" }, { @@ -1804,7 +1804,7 @@ "oracle", "sql" ], - "downloads": 249799, + "downloads": 250069, "version": "13.5.3" }, { @@ -1830,7 +1830,7 @@ "mysql", "sql" ], - "downloads": 419414, + "downloads": 419767, "version": "13.5.3" }, { @@ -1849,7 +1849,7 @@ "database", "ai-search" ], - "downloads": 123167, + "downloads": 123354, "version": "13.5.3" }, { @@ -1870,7 +1870,7 @@ "messaging", "eventing" ], - "downloads": 1187546, + "downloads": 1193500, "version": "13.5.3" }, { @@ -1891,7 +1891,7 @@ "messaging", "eventing" ], - "downloads": 5284, + "downloads": 5290, "version": "13.5.3" }, { @@ -1909,7 +1909,7 @@ "observability", "logging" ], - "downloads": 530964, + "downloads": 532318, "version": "13.5.3" }, { @@ -1927,7 +1927,7 @@ "caching", "redis" ], - "downloads": 11715045, + "downloads": 11743649, "version": "13.5.3" }, { @@ -1947,7 +1947,7 @@ "distributedcache", "redis" ], - "downloads": 3338821, + "downloads": 3354750, "version": "13.5.3" }, { @@ -1968,7 +1968,7 @@ "outputcache", "redis" ], - "downloads": 973870, + "downloads": 976392, "version": "13.5.3" }, { @@ -1982,7 +1982,7 @@ "typesystem", "polyglot" ], - "downloads": 75909, + "downloads": 76534, "version": "13.5.3" }, { @@ -2000,7 +2000,7 @@ "secret-manager", "client" ], - "downloads": 1432, + "downloads": 1519, "version": "13.5.0" }, { @@ -2019,7 +2019,7 @@ "olap", "ado.net" ], - "downloads": 1469, + "downloads": 1516, "version": "13.5.0" }, { @@ -2035,7 +2035,7 @@ "gofeatureflag", "client" ], - "downloads": 49981, + "downloads": 50041, "version": "13.5.0" }, { @@ -2052,7 +2052,7 @@ "activemq", "polyglot" ], - "downloads": 74019, + "downloads": 74235, "version": "13.5.0" }, { @@ -2069,7 +2069,7 @@ "adminer", "polyglot" ], - "downloads": 263315, + "downloads": 265130, "version": "13.5.0" }, { @@ -2087,7 +2087,7 @@ "azure", "polyglot" ], - "downloads": 90690, + "downloads": 90949, "version": "13.0.0" }, { @@ -2108,7 +2108,7 @@ "pubsub", "polyglot" ], - "downloads": 53664, + "downloads": 53760, "version": "13.0.0" }, { @@ -2126,7 +2126,7 @@ "hosting", "polyglot" ], - "downloads": 69036, + "downloads": 69095, "version": "13.5.0" }, { @@ -2144,7 +2144,7 @@ "extensions", "polyglot" ], - "downloads": 6233, + "downloads": 6295, "version": "13.5.0" }, { @@ -2163,26 +2163,7 @@ "secret-manager", "polyglot" ], - "downloads": 1225, - "version": "13.5.0" - }, - { - "title": "CommunityToolkit.Aspire.Hosting.Bun", - "description": "An Aspire integration for hosting Bun apps. DEPRECATED: Use Aspire.Hosting.JavaScript and builder.AddBunApp(...) instead. This package will be removed in a future release.", - "icon": "https://api.nuget.org/v3-flatcontainer/communitytoolkit.aspire.hosting.bun/13.5.0/icon", - "href": "https://www.nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bun", - "tags": [ - "aspire", - "integration", - "communitytoolkit", - "dotnetcommunitytoolkit", - "hosting", - "bun", - "javascript", - "deprecated", - "polyglot" - ], - "downloads": 106469, + "downloads": 1292, "version": "13.5.0" }, { @@ -2199,7 +2180,7 @@ "dapr", "polyglot" ], - "downloads": 717410, + "downloads": 721004, "version": "13.0.0" }, { @@ -2213,7 +2194,7 @@ "communitytoolkit", "dotnetcommunitytoolkit" ], - "downloads": 4691, + "downloads": 4694, "version": "9.1.1-beta.197" }, { @@ -2230,7 +2211,7 @@ "dbgate", "polyglot" ], - "downloads": 319659, + "downloads": 321718, "version": "13.5.0" }, { @@ -2247,7 +2228,7 @@ "dbx", "polyglot" ], - "downloads": 8550, + "downloads": 9375, "version": "13.5.0" }, { @@ -2264,7 +2245,7 @@ "deno", "polyglot" ], - "downloads": 70687, + "downloads": 70835, "version": "13.5.0" }, { @@ -2283,7 +2264,7 @@ "olap", "polyglot" ], - "downloads": 1459, + "downloads": 1508, "version": "13.5.0" }, { @@ -2301,7 +2282,7 @@ "elasticvue", "polyglot" ], - "downloads": 7035, + "downloads": 7188, "version": "13.5.0" }, { @@ -2320,7 +2301,7 @@ "openfeature", "polyglot" ], - "downloads": 25416, + "downloads": 25613, "version": "13.5.0" }, { @@ -2345,7 +2326,7 @@ "tls", "polyglot" ], - "downloads": 568, + "downloads": 656, "version": "13.5.0" }, { @@ -2363,7 +2344,7 @@ "migration", "polyglot" ], - "downloads": 49772, + "downloads": 50262, "version": "13.5.0" }, { @@ -2380,7 +2361,7 @@ "gofeatureflag", "polyglot" ], - "downloads": 48312, + "downloads": 48368, "version": "13.5.0" }, { @@ -2397,7 +2378,7 @@ "java", "polyglot" ], - "downloads": 77818, + "downloads": 77912, "version": "13.5.0" }, { @@ -2418,7 +2399,7 @@ "npm", "polyglot" ], - "downloads": 165146, + "downloads": 166515, "version": "13.5.0" }, { @@ -2437,7 +2418,7 @@ "cluster", "polyglot" ], - "downloads": 1328, + "downloads": 1398, "version": "13.5.0" }, { @@ -2454,7 +2435,7 @@ "k6", "polyglot" ], - "downloads": 63274, + "downloads": 63425, "version": "13.5.0" }, { @@ -2473,7 +2454,7 @@ "extensions", "polyglot" ], - "downloads": 17508, + "downloads": 17685, "version": "13.5.1-beta.748" }, { @@ -2494,7 +2475,7 @@ "podman", "polyglot" ], - "downloads": 752, + "downloads": 799, "version": "13.5.1-beta.748" }, { @@ -2511,7 +2492,7 @@ "kurrentdb", "polyglot" ], - "downloads": 17300, + "downloads": 17407, "version": "13.5.0" }, { @@ -2528,7 +2509,7 @@ "lavinmq", "polyglot" ], - "downloads": 49153, + "downloads": 49346, "version": "13.5.0" }, { @@ -2548,7 +2529,7 @@ "marketing", "polyglot" ], - "downloads": 839, + "downloads": 890, "version": "13.5.0" }, { @@ -2568,7 +2549,7 @@ "extensions", "polyglot" ], - "downloads": 1341, + "downloads": 1391, "version": "13.5.0" }, { @@ -2586,7 +2567,7 @@ "hosting", "polyglot" ], - "downloads": 361423, + "downloads": 363748, "version": "13.5.0" }, { @@ -2605,7 +2586,7 @@ "hosting", "polyglot" ], - "downloads": 70658, + "downloads": 70999, "version": "13.5.0" }, { @@ -2622,7 +2603,7 @@ "meilisearch", "polyglot" ], - "downloads": 72818, + "downloads": 72928, "version": "13.5.0" }, { @@ -2642,7 +2623,7 @@ "deprecated", "polyglot" ], - "downloads": 182021, + "downloads": 183255, "version": "13.5.0" }, { @@ -2660,7 +2641,7 @@ "dbgate", "polyglot" ], - "downloads": 85172, + "downloads": 85358, "version": "13.5.0" }, { @@ -2679,7 +2660,7 @@ "messaging", "polyglot" ], - "downloads": 329, + "downloads": 377, "version": "13.5.0" }, { @@ -2697,7 +2678,7 @@ "dbgate", "polyglot" ], - "downloads": 46222, + "downloads": 46399, "version": "13.5.0" }, { @@ -2715,7 +2696,7 @@ "tunnels", "polyglot" ], - "downloads": 191586, + "downloads": 193802, "version": "13.5.0" }, { @@ -2733,7 +2714,7 @@ "ai", "polyglot" ], - "downloads": 384006, + "downloads": 385645, "version": "13.5.0" }, { @@ -2751,7 +2732,7 @@ "observability", "polyglot" ], - "downloads": 62126, + "downloads": 62679, "version": "13.5.0" }, { @@ -2769,7 +2750,7 @@ "hosting", "polyglot" ], - "downloads": 61808, + "downloads": 61910, "version": "13.5.0" }, { @@ -2786,7 +2767,7 @@ "perl", "polyglot" ], - "downloads": 1849, + "downloads": 1934, "version": "13.5.0" }, { @@ -2806,7 +2787,7 @@ "delivery", "polyglot" ], - "downloads": 352, + "downloads": 400, "version": "13.5.0" }, { @@ -2824,7 +2805,7 @@ "dbgate", "polyglot" ], - "downloads": 108067, + "downloads": 108470, "version": "13.5.0" }, { @@ -2844,7 +2825,7 @@ "hosting", "polyglot" ], - "downloads": 65452, + "downloads": 65736, "version": "13.5.0" }, { @@ -2862,7 +2843,7 @@ "python", "polyglot" ], - "downloads": 77562, + "downloads": 77637, "version": "13.5.0" }, { @@ -2879,7 +2860,7 @@ "ravendb", "polyglot" ], - "downloads": 71089, + "downloads": 71273, "version": "13.5.0" }, { @@ -2897,7 +2878,7 @@ "dbgate", "polyglot" ], - "downloads": 77696, + "downloads": 77971, "version": "13.5.0" }, { @@ -2917,7 +2898,7 @@ "messaging", "polyglot" ], - "downloads": 390, + "downloads": 442, "version": "13.5.0" }, { @@ -2934,7 +2915,7 @@ "rust", "polyglot" ], - "downloads": 70140, + "downloads": 70326, "version": "13.5.0" }, { @@ -2953,7 +2934,7 @@ "s3-compatible", "polyglot" ], - "downloads": 2386, + "downloads": 2467, "version": "13.5.0" }, { @@ -2973,7 +2954,7 @@ "s3", "polyglot" ], - "downloads": 1568, + "downloads": 1706, "version": "13.5.0" }, { @@ -2991,7 +2972,7 @@ "hosting", "polyglot" ], - "downloads": 9533, + "downloads": 9712, "version": "13.5.0" }, { @@ -3009,7 +2990,7 @@ "search", "polyglot" ], - "downloads": 14960, + "downloads": 15058, "version": "13.5.0" }, { @@ -3027,7 +3008,7 @@ "sqlproj", "polyglot" ], - "downloads": 340313, + "downloads": 342371, "version": "13.5.0" }, { @@ -3045,7 +3026,7 @@ "sqlite", "polyglot" ], - "downloads": 93171, + "downloads": 93354, "version": "13.5.0" }, { @@ -3063,7 +3044,7 @@ "dbgate", "polyglot" ], - "downloads": 214334, + "downloads": 215777, "version": "13.5.0" }, { @@ -3083,7 +3064,7 @@ "copilot", "polyglot" ], - "downloads": 1148, + "downloads": 1222, "version": "13.5.0" }, { @@ -3103,7 +3084,7 @@ "huggingface", "polyglot" ], - "downloads": 322, + "downloads": 370, "version": "13.5.0" }, { @@ -3122,7 +3103,7 @@ "webhooks", "polyglot" ], - "downloads": 12501, + "downloads": 12583, "version": "13.5.0" }, { @@ -3139,7 +3120,7 @@ "surrealdb", "polyglot" ], - "downloads": 21932, + "downloads": 22019, "version": "13.5.0" }, { @@ -3156,7 +3137,7 @@ "umami", "polyglot" ], - "downloads": 2300, + "downloads": 2367, "version": "13.5.0" }, { @@ -3178,7 +3159,7 @@ "oidc", "polyglot" ], - "downloads": 2319, + "downloads": 2384, "version": "13.5.0" }, { @@ -3194,7 +3175,7 @@ "kurrentdb", "client" ], - "downloads": 12581, + "downloads": 12636, "version": "13.5.0" }, { @@ -3213,7 +3194,7 @@ "oidc", "jwt" ], - "downloads": 1333, + "downloads": 1388, "version": "13.5.0" }, { @@ -3230,7 +3211,7 @@ "masstransit", "rabbitmq" ], - "downloads": 83319, + "downloads": 83500, "version": "13.5.0" }, { @@ -3246,7 +3227,7 @@ "meilisearch", "client" ], - "downloads": 83224, + "downloads": 83365, "version": "13.5.0" }, { @@ -3264,7 +3245,7 @@ "data", "ado.net" ], - "downloads": 56114, + "downloads": 56177, "version": "13.5.0" }, { @@ -3285,7 +3266,7 @@ "ef", "orm" ], - "downloads": 65710, + "downloads": 65782, "version": "9.7.2" }, { @@ -3304,7 +3285,7 @@ "storage", "deprecated" ], - "downloads": 85259, + "downloads": 85700, "version": "13.5.0" }, { @@ -3322,7 +3303,7 @@ "ollamasharp", "client" ], - "downloads": 472855, + "downloads": 474876, "version": "13.5.0" }, { @@ -3339,7 +3320,7 @@ "email", "client" ], - "downloads": 322, + "downloads": 369, "version": "13.5.0" }, { @@ -3355,7 +3336,7 @@ "client", "ravendb" ], - "downloads": 71437, + "downloads": 71525, "version": "13.5.0" }, { @@ -3374,7 +3355,7 @@ "storage", "s3" ], - "downloads": 1010, + "downloads": 1057, "version": "13.5.0" }, { @@ -3390,7 +3371,7 @@ "sftp", "client" ], - "downloads": 4508, + "downloads": 4570, "version": "13.5.0" }, { @@ -3406,7 +3387,7 @@ "surrealdb", "client" ], - "downloads": 21232, + "downloads": 21293, "version": "13.5.0" } ] \ No newline at end of file diff --git a/src/frontend/src/data/github-stats.json b/src/frontend/src/data/github-stats.json index 2e02bf7ac..ccf11abab 100644 --- a/src/frontend/src/data/github-stats.json +++ b/src/frontend/src/data/github-stats.json @@ -1,7 +1,7 @@ [ { "name": "microsoft/aspire", - "stars": 6292, + "stars": 6294, "description": "Aspire is the tool for code-first, extensible, observable dev and deploy.", "license": "https://github.com/microsoft/aspire/blob/main/LICENSE.TXT", "licenseName": "MIT License", @@ -9,7 +9,7 @@ }, { "name": "microsoft/aspire-samples", - "stars": 1189, + "stars": 1190, "description": "Browse the sample apps demonstrating Aspire integration across C#, JavaScript, TypeScript, Python, Go, containers, databases, cloud, AI, and observability scenarios.", "license": "https://github.com/microsoft/aspire-samples/blob/main/LICENSE", "licenseName": "MIT License", diff --git a/src/frontend/src/data/integration-docs.json b/src/frontend/src/data/integration-docs.json index f1247d023..c4d73cc05 100644 --- a/src/frontend/src/data/integration-docs.json +++ b/src/frontend/src/data/integration-docs.json @@ -387,10 +387,6 @@ "match": "CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder", "href": "/integrations/devtools/dab/dab-get-started/" }, - { - "match": "CommunityToolkit.Aspire.Hosting.Bun", - "href": "/integrations/frameworks/bun-apps/" - }, { "match": "CommunityToolkit.Aspire.Hosting.Dapr", "href": "/integrations/frameworks/dapr/dapr-get-started/" diff --git a/src/frontend/src/data/pkgs/CommunityToolkit.Aspire.Hosting.Bun.13.5.0.json b/src/frontend/src/data/pkgs/CommunityToolkit.Aspire.Hosting.Bun.13.5.0.json deleted file mode 100644 index cb60a78c9..000000000 --- a/src/frontend/src/data/pkgs/CommunityToolkit.Aspire.Hosting.Bun.13.5.0.json +++ /dev/null @@ -1,390 +0,0 @@ -{ - "package": { - "name": "CommunityToolkit.Aspire.Hosting.Bun", - "version": "13.5.0", - "targetFramework": "net10.0", - "sourceRepository": "https://github.com/CommunityToolkit/Aspire", - "sourceCommit": "4ff8268fbd97ddd23cb73dc8eff9cc92718156d1" - }, - "types": [ - { - "name": "BunAppExtensions", - "fullName": "Aspire.Hosting.BunAppExtensions", - "namespace": "Aspire.Hosting", - "kind": "class", - "accessibility": "public", - "isStatic": true, - "docs": { - "summary": [ - { - "kind": "text", - "text": " Extension methods for adding a Bun app to a " - }, - { - "kind": "cref", - "value": "T:Aspire.Hosting.IDistributedApplicationBuilder" - }, - { - "kind": "text", - "text": ". " - } - ] - }, - "sourceFile": "src/CommunityToolkit.Aspire.Hosting.Bun/BunAppExtensions.cs", - "sourceLines": "12-12", - "members": [ - { - "name": "AddBunApp", - "kind": "method", - "accessibility": "public", - "signature": "public static IResourceBuilder BunAppExtensions.AddBunApp(this IDistributedApplicationBuilder builder, string name, string? workingDirectory = null, string entryPoint = \"index.ts\", bool watch = false)", - "returnType": "Aspire.Hosting.ApplicationModel.IResourceBuilder", - "isStatic": true, - "isExtension": true, - "parameters": [ - { - "name": "builder", - "type": "Aspire.Hosting.IDistributedApplicationBuilder", - "modifier": "this" - }, - { - "name": "name", - "type": "string" - }, - { - "name": "workingDirectory", - "type": "string?", - "isNullable": true, - "isOptional": true - }, - { - "name": "entryPoint", - "type": "string", - "isOptional": true, - "defaultValue": "index.ts" - }, - { - "name": "watch", - "type": "bool", - "isOptional": true, - "defaultValue": "False" - } - ], - "attributes": [ - { - "name": "Aspire.Hosting.AspireExportAttribute" - }, - { - "name": "System.ObsoleteAttribute", - "constructorArguments": [ - "CommunityToolkit.Aspire.Hosting.Bun is deprecated. Use Aspire.Hosting.JavaScript and builder.AddBunApp(...) instead. This package will be removed in a future release." - ] - } - ], - "docs": { - "summary": [ - { - "kind": "text", - "text": " Adds a Bun app to the builder. " - } - ], - "returns": [ - { - "kind": "text", - "text": "A reference to the " - }, - { - "kind": "cref", - "value": "T:Aspire.Hosting.ApplicationModel.IResourceBuilder`1" - }, - { - "kind": "text", - "text": "." - } - ], - "parameters": { - "builder": [ - { - "kind": "text", - "text": "The " - }, - { - "kind": "cref", - "value": "T:Aspire.Hosting.IDistributedApplicationBuilder" - }, - { - "kind": "text", - "text": " to add the resource to." - } - ], - "entryPoint": [ - { - "kind": "text", - "text": "The entry point, either a file or package.json script name." - } - ], - "name": [ - { - "kind": "text", - "text": "The name of the resource." - } - ], - "watch": [ - { - "kind": "text", - "text": "Whether to watch for changes." - } - ], - "workingDirectory": [ - { - "kind": "text", - "text": "The working directory." - } - ] - } - }, - "sourceFile": "src/CommunityToolkit.Aspire.Hosting.Bun/BunAppExtensions.cs", - "sourceLines": "34-46" - }, - { - "name": "WithBunPackageInstallation", - "kind": "method", - "accessibility": "public", - "signature": "public static IResourceBuilder BunAppExtensions.WithBunPackageInstallation(this IResourceBuilder resource, Action>? configureInstaller = null)", - "returnType": "Aspire.Hosting.ApplicationModel.IResourceBuilder", - "isStatic": true, - "isExtension": true, - "parameters": [ - { - "name": "resource", - "type": "Aspire.Hosting.ApplicationModel.IResourceBuilder", - "modifier": "this" - }, - { - "name": "configureInstaller", - "type": "System.Action>?", - "isNullable": true, - "isOptional": true - } - ], - "attributes": [ - { - "name": "Aspire.Hosting.AspireExportIgnoreAttribute", - "arguments": { - "Reason": "Action> is not ATS-compatible. Use the overload without configureInstaller instead." - } - }, - { - "name": "System.ObsoleteAttribute", - "constructorArguments": [ - "CommunityToolkit.Aspire.Hosting.Bun is deprecated. Use Aspire.Hosting.JavaScript and builder.AddBunApp(...) instead. This package will be removed in a future release." - ] - } - ], - "docs": { - "summary": [ - { - "kind": "text", - "text": " Ensures the Bun packages are installed before the application starts using Bun as the package manager. " - } - ], - "remarks": [ - { - "kind": "text", - "text": "This overload is not available in polyglot AppHosts. Use " - }, - { - "kind": "cref", - "value": "M:Aspire.Hosting.BunAppExtensions.WithBunPackageInstallation(Aspire.Hosting.ApplicationModel.IResourceBuilder{Aspire.Hosting.ApplicationModel.BunAppResource})" - }, - { - "kind": "text", - "text": " instead." - } - ], - "returns": [ - { - "kind": "text", - "text": "A reference to the " - }, - { - "kind": "cref", - "value": "T:Aspire.Hosting.ApplicationModel.IResourceBuilder`1" - }, - { - "kind": "text", - "text": "." - } - ], - "parameters": { - "configureInstaller": [ - { - "kind": "text", - "text": "Configure the Bun installer resource." - } - ], - "resource": [ - { - "kind": "text", - "text": "The Bun app resource." - } - ] - } - }, - "sourceFile": "src/CommunityToolkit.Aspire.Hosting.Bun/BunAppExtensions.cs", - "sourceLines": "59-59" - } - ] - }, - { - "name": "BunAppResource", - "fullName": "Aspire.Hosting.ApplicationModel.BunAppResource", - "namespace": "Aspire.Hosting.ApplicationModel", - "kind": "class", - "accessibility": "public", - "baseType": "Aspire.Hosting.ApplicationModel.ExecutableResource", - "docs": { - "summary": [ - { - "kind": "text", - "text": " Represents a Bun app resource. " - } - ], - "parameters": { - "name": [ - { - "kind": "text", - "text": "The name of the resource." - } - ], - "workingDirectory": [ - { - "kind": "text", - "text": "The working directory for the Bun app to launch from." - } - ] - } - }, - "sourceFile": "src/CommunityToolkit.Aspire.Hosting.Bun/BunAppResource.cs", - "sourceLines": "8-8", - "members": [ - { - "name": ".ctor", - "kind": "constructor", - "accessibility": "public", - "signature": "public BunAppResource.BunAppResource(string name, string workingDirectory)", - "returnType": "void", - "parameters": [ - { - "name": "name", - "type": "string" - }, - { - "name": "workingDirectory", - "type": "string" - } - ], - "docs": { - "summary": [ - { - "kind": "text", - "text": " Represents a Bun app resource. " - } - ], - "parameters": { - "name": [ - { - "kind": "text", - "text": "The name of the resource." - } - ], - "workingDirectory": [ - { - "kind": "text", - "text": "The working directory for the Bun app to launch from." - } - ] - } - }, - "sourceFile": "src/CommunityToolkit.Aspire.Hosting.Bun/BunAppResource.cs", - "sourceLines": "9-9" - } - ] - }, - { - "name": "BunInstallerResource", - "fullName": "Aspire.Hosting.ApplicationModel.BunInstallerResource", - "namespace": "Aspire.Hosting.ApplicationModel", - "kind": "class", - "accessibility": "public", - "baseType": "Aspire.Hosting.ApplicationModel.ExecutableResource", - "docs": { - "summary": [ - { - "kind": "text", - "text": " A resource that represents a Bun package installer. " - } - ], - "parameters": { - "name": [ - { - "kind": "text", - "text": "The name of the resource." - } - ], - "workingDirectory": [ - { - "kind": "text", - "text": "The working directory to use for the command." - } - ] - } - }, - "sourceFile": "src/CommunityToolkit.Aspire.Hosting.Bun/BunInstallerResource.cs", - "sourceLines": "8-8", - "members": [ - { - "name": ".ctor", - "kind": "constructor", - "accessibility": "public", - "signature": "public BunInstallerResource.BunInstallerResource(string name, string workingDirectory)", - "returnType": "void", - "parameters": [ - { - "name": "name", - "type": "string" - }, - { - "name": "workingDirectory", - "type": "string" - } - ], - "docs": { - "summary": [ - { - "kind": "text", - "text": " A resource that represents a Bun package installer. " - } - ], - "parameters": { - "name": [ - { - "kind": "text", - "text": "The name of the resource." - } - ], - "workingDirectory": [ - { - "kind": "text", - "text": "The working directory to use for the command." - } - ] - } - }, - "sourceFile": "src/CommunityToolkit.Aspire.Hosting.Bun/BunInstallerResource.cs", - "sourceLines": "9-9" - } - ] - } - ] -} \ No newline at end of file diff --git a/src/frontend/src/data/ts-modules/CommunityToolkit.Aspire.Hosting.Bun.13.5.0.json b/src/frontend/src/data/ts-modules/CommunityToolkit.Aspire.Hosting.Bun.13.5.0.json deleted file mode 100644 index 1899c549f..000000000 --- a/src/frontend/src/data/ts-modules/CommunityToolkit.Aspire.Hosting.Bun.13.5.0.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "package": { - "name": "CommunityToolkit.Aspire.Hosting.Bun", - "version": "13.5.0", - "language": "typescript", - "sourceRepository": "https://github.com/CommunityToolkit/Aspire", - "sourceCommit": "4ff8268fbd97ddd23cb73dc8eff9cc92718156d1" - }, - "functions": [ - { - "name": "addBunApp", - "capabilityId": "CommunityToolkit.Aspire.Hosting.Bun/addBunApp", - "qualifiedName": "addBunApp", - "description": "Adds a Bun app to the builder.", - "returns": "A reference to the `IResourceBuilder`1`.", - "kind": "Method", - "signature": "addBunApp(name: string, workingDirectory?: string, entryPoint?: string, watch?: boolean): BunAppResource", - "parameters": [ - { - "name": "name", - "type": "string", - "description": "The name of the resource." - }, - { - "name": "workingDirectory", - "type": "string", - "isOptional": true, - "description": "The working directory." - }, - { - "name": "entryPoint", - "type": "string", - "isOptional": true, - "defaultValue": "index.ts", - "description": "The entry point, either a file or package.json script name." - }, - { - "name": "watch", - "type": "boolean", - "isOptional": true, - "defaultValue": "False", - "description": "Whether to watch for changes." - } - ], - "returnType": "BunAppResource", - "returnsBuilder": true, - "targetTypeId": "Aspire.Hosting/Aspire.Hosting.IDistributedApplicationBuilder", - "expandedTargetTypes": [ - "Aspire.Hosting.IDistributedApplicationBuilder" - ] - }, - { - "name": "withBunPackageInstallation", - "capabilityId": "CommunityToolkit.Aspire.Hosting.Bun/withBunPackageInstallation", - "qualifiedName": "withBunPackageInstallation", - "description": "Ensures the Bun packages are installed before the application starts using Bun as the package manager.", - "kind": "Method", - "signature": "withBunPackageInstallation(): BunAppResource", - "parameters": [], - "returnType": "BunAppResource", - "returnsBuilder": true, - "targetTypeId": "CommunityToolkit.Aspire.Hosting.Bun/Aspire.Hosting.ApplicationModel.BunAppResource", - "expandedTargetTypes": [ - "Aspire.Hosting.ApplicationModel.BunAppResource" - ] - } - ], - "handleTypes": [ - { - "name": "BunAppResource", - "fullName": "Aspire.Hosting.ApplicationModel.BunAppResource", - "kind": "handle", - "implementedInterfaces": [ - "Aspire.Hosting.ApplicationModel.IComputeResource", - "Aspire.Hosting.ApplicationModel.IResource", - "Aspire.Hosting.ApplicationModel.IResourceWithArgs", - "Aspire.Hosting.ApplicationModel.IResourceWithEndpoints", - "Aspire.Hosting.ApplicationModel.IResourceWithEnvironment", - "Aspire.Hosting.ApplicationModel.IResourceWithProbes", - "Aspire.Hosting.ApplicationModel.IResourceWithWaitSupport" - ], - "baseTypeHierarchy": [ - "Aspire.Hosting.ApplicationModel.ExecutableResource", - "Aspire.Hosting.ApplicationModel.Resource" - ], - "capabilities": [ - { - "name": "withBunPackageInstallation", - "capabilityId": "CommunityToolkit.Aspire.Hosting.Bun/withBunPackageInstallation", - "qualifiedName": "withBunPackageInstallation", - "description": "Ensures the Bun packages are installed before the application starts using Bun as the package manager.", - "kind": "Method", - "signature": "withBunPackageInstallation(): BunAppResource", - "parameters": [], - "returnType": "BunAppResource", - "returnsBuilder": true, - "targetTypeId": "CommunityToolkit.Aspire.Hosting.Bun/Aspire.Hosting.ApplicationModel.BunAppResource", - "expandedTargetTypes": [ - "Aspire.Hosting.ApplicationModel.BunAppResource" - ] - } - ] - } - ], - "dtoTypes": [], - "enumTypes": [] -} \ No newline at end of file diff --git a/src/frontend/src/data/twoslash/aspire.d.ts b/src/frontend/src/data/twoslash/aspire.d.ts index 741c58ba4..3c0315019 100644 --- a/src/frontend/src/data/twoslash/aspire.d.ts +++ b/src/frontend/src/data/twoslash/aspire.d.ts @@ -15203,16 +15203,6 @@ export interface IDistributedApplicationBuilder { */ addBitwardenSecretManager(name: string, projectNameOrId: string | ParameterResource, organizationId: string | ParameterResource, accessToken: string | ParameterResource): BitwardenSecretManagerResource; - /** - * Adds a Bun app to the builder. - */ - - addBunApp(name: string, options?: { workingDirectory?: string; entryPoint?: string; watch?: boolean }): BunAppResource; - /** - * Adds a Bun app to the builder. - */ - - addBunApp(name: string, workingDirectory?: string, entryPoint?: string, watch?: boolean): BunAppResource; /** * Adds a DbGate container resource to the application. */ @@ -17260,11 +17250,6 @@ export interface BunAppResource { */ withYarn(install?: boolean, installArgs?: string[]): this; - /** - * Ensures the Bun packages are installed before the application starts using Bun as the package manager. - */ - - withBunPackageInstallation(): this; /** * Maps the endpoint port for the JavaScript app resource to the appropriate command line argument */ diff --git a/src/frontend/tests/unit/update-integrations.vitest.test.ts b/src/frontend/tests/unit/update-integrations.vitest.test.ts index 0491cb984..490e245da 100644 --- a/src/frontend/tests/unit/update-integrations.vitest.test.ts +++ b/src/frontend/tests/unit/update-integrations.vitest.test.ts @@ -1,4 +1,4 @@ -import { existsSync } from 'node:fs'; +import { existsSync, readFileSync } from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; @@ -10,6 +10,7 @@ import integrationDocs from '@data/integration-docs.json'; import { DEFAULT_NUGET_ICON_URL, getOfficialAspireDefaultIconPackages, + reconcileIntegrationDocs, resolveIconUrl, } from '../../scripts/update-integrations'; @@ -109,6 +110,92 @@ describe('update-integrations icon handling', () => { }); }); +describe('integration documentation reconciliation', () => { + const official = { + match: 'Aspire.Hosting.Redis', + href: '/integrations/caching/redis/redis-get-started/', + }; + const community = { + match: 'CommunityToolkit.Aspire.Hosting.Dapr', + href: '/integrations/compute/dapr/', + }; + const thirdParty = { + match: 'Particular.Aspire.Hosting.ServicePlatform', + href: 'https://docs.particular.net/platform/aspire/', + }; + const catalog = [official, community].map(({ match }) => ({ title: match })); + + test('leaves the current documentation mappings unchanged', () => { + expect(reconcileIntegrationDocs(integrationDocs, aspireIntegrations)).toEqual( + integrationDocs + ); + }); + + test.each(['Aspire.Hosting.Removed', 'CommunityToolkit.Aspire.Hosting.Bun'])( + 'removes the stale mapping for %s without changing surviving links or order', + (match) => { + const docs = [official, { match, href: '/retired/' }, community, thirdParty]; + + expect(reconcileIntegrationDocs(docs, catalog)).toEqual([ + official, + community, + thirdParty, + ]); + expect(docs).toHaveLength(4); + } + ); + + test('matches catalog package IDs case-insensitively', () => { + const docs = [official, community]; + const lowercaseCatalog = catalog.map(({ title }) => ({ title: title.toLowerCase() })); + + expect(reconcileIntegrationDocs(docs, lowercaseCatalog)).toEqual(docs); + }); + + test('preserves third-party mappings outside the managed catalog', () => { + expect(reconcileIntegrationDocs([thirdParty], [])).toEqual([thirdParty]); + }); + + test('does not invent documentation links for newly discovered packages', () => { + expect( + reconcileIntegrationDocs([official], [ + ...catalog, + { title: 'Aspire.Hosting.NewIntegration' }, + ]) + ).toEqual([official]); + }); +}); + +describe('integration update automation', () => { + const frontendRoot = path.resolve(testsDir, '..', '..'); + const script = readFileSync( + path.join(frontendRoot, 'scripts', 'update-integration-data.ps1'), + 'utf8' + ); + const workflow = readFileSync( + path.resolve(frontendRoot, '..', '..', '.github', 'workflows', 'update-integration-data.yml'), + 'utf8' + ); + + test('allows and stages reconciled documentation mappings', () => { + const allowedPaths = script.match(/\$AllowedPaths = @\(([\s\S]*?)\)/)?.[1]; + const stagedPaths = workflow.match(/git add -- \\[\s\S]*?\r?\n\r?\n/)?.[0]; + + expect(allowedPaths).toContain("'src/frontend/src/data/integration-docs.json'"); + expect(stagedPaths).toContain('src/frontend/src/data/integration-docs.json'); + }); + + test('validates updated mappings before checking for changes or regenerating APIs', () => { + const validationIndex = script.indexOf('& pnpm run test:unit:structured-data'); + + expect(validationIndex).toBeGreaterThan(script.indexOf('& pnpm run update:all')); + expect(validationIndex).toBeLessThan(script.indexOf('if (-not $anyChanges)')); + expect(script.slice(validationIndex)).toMatch( + /test:unit:structured-data\s+if \(\$LASTEXITCODE -ne 0\) \{[^}]*exit 1/ + ); + }); +}); + describe('Community Toolkit documentation mappings', () => { test('maps each package at most once', () => { const seen = new Set(); diff --git a/src/frontend/vitest.structured-data.config.ts b/src/frontend/vitest.structured-data.config.ts new file mode 100644 index 000000000..50de945ee --- /dev/null +++ b/src/frontend/vitest.structured-data.config.ts @@ -0,0 +1,22 @@ +import { fileURLToPath } from 'node:url'; + +import { defineConfig } from 'vitest/config'; + +// Data validation must not initialize Astro integrations that rewrite tracked assets. +export default defineConfig({ + resolve: { + alias: { + '@data': fileURLToPath(new URL('./src/data', import.meta.url)), + '@utils': fileURLToPath(new URL('./src/utils', import.meta.url)), + }, + }, + test: { + pool: 'threads', + include: [ + 'tests/unit/structured-data.vitest.test.ts', + 'tests/unit/update-integrations.vitest.test.ts', + ], + environment: 'node', + testTimeout: 30000, + }, +});