diff --git a/.github/workflows/measure-framework.yml b/.github/workflows/measure-framework.yml index 4daa1d9e..4da9e7af 100644 --- a/.github/workflows/measure-framework.yml +++ b/.github/workflows/measure-framework.yml @@ -209,11 +209,18 @@ jobs: working-directory: ./packages/${{ matrix.framework.package }} run: npx @e18e/cli@0.5.0 analyze --json > e18e-stats.json || true - - name: Upload e18e stats + - name: Collect framework dependency stats + env: + STARTER_PACKAGE: ${{ matrix.framework.package }} + run: node packages/stats-generator/src/run-framework-dependency-scan.ts "$STARTER_PACKAGE" + + - name: Upload dependency stats uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: e18e-stats-${{ matrix.framework.name }} - path: packages/${{ matrix.framework.package }}/e18e-stats.json + path: | + packages/${{ matrix.framework.package }}/e18e-stats.json + packages/${{ matrix.framework.package }}/framework-dependency-stats.json retention-days: 1 if-no-files-found: error diff --git a/.gitignore b/.gitignore index 25988c33..5ce1fa04 100644 --- a/.gitignore +++ b/.gitignore @@ -72,6 +72,7 @@ packages/*/install-stats.json packages/*/build-stats.json packages/*/corejs-stats.json packages/*/e18e-stats.json +packages/*/framework-dependency-stats.json # Misc *.tmp diff --git a/packages/stats-generator/package.json b/packages/stats-generator/package.json index 803a360f..b4f0f112 100644 --- a/packages/stats-generator/package.json +++ b/packages/stats-generator/package.json @@ -13,6 +13,7 @@ "run:build": "node src/run-build-benchmark.ts", "run:corejs": "node src/run-corejs-scan.ts", "run:browser-baseline": "node src/run-browser-baseline-scan.ts", + "run:framework-dependencies": "node src/run-framework-dependency-scan.ts", "save:ci-stats": "node src/save-ci-stats.ts", "generate:preview-comment": "node src/generate-preview-comment.ts", "validate": "node src/validate-stats.ts", diff --git a/packages/stats-generator/src/run-framework-dependency-scan.ts b/packages/stats-generator/src/run-framework-dependency-scan.ts new file mode 100644 index 00000000..e04c2eef --- /dev/null +++ b/packages/stats-generator/src/run-framework-dependency-scan.ts @@ -0,0 +1,32 @@ +import { join } from 'node:path' +import { packagesDir } from './constants.ts' +import { + getFrameworkDependencyCountsFromPackageMetadata, + getFrameworkByPackage, + parseArgs, + writeJsonFile, +} from './utils.ts' + +async function main() { + const { packageName, args } = parseArgs( + 'Usage: run-framework-dependency-scan [output-path]\nExample: run-framework-dependency-scan starter-astro', + ) + const [requestedOutputPath] = args + const { framework } = await getFrameworkByPackage(packageName) + + const outputPath = + requestedOutputPath ?? + join(packagesDir, packageName, 'framework-dependency-stats.json') + const stats = getFrameworkDependencyCountsFromPackageMetadata( + packageName, + framework.frameworkPackage, + ) + + writeJsonFile(outputPath, stats) + console.info(`Saved framework dependency stats to ${outputPath}`) +} + +main().catch((error) => { + console.error('Framework dependency scan failed:', error) + process.exit(1) +}) diff --git a/packages/stats-generator/src/save-ci-stats.ts b/packages/stats-generator/src/save-ci-stats.ts index 94947cd1..15266133 100644 --- a/packages/stats-generator/src/save-ci-stats.ts +++ b/packages/stats-generator/src/save-ci-stats.ts @@ -15,6 +15,7 @@ import type { BuildStats, CoreJsStats, BrowserBaselineStats, + DependencyStats, E18eStats, } from './types.ts' @@ -132,12 +133,29 @@ async function main() { ) } - // Load e18e stats from artifact + // Load dependency stats from artifacts const e18eArtifactPath = join( artifactsDir, `e18e-stats-${name}`, 'e18e-stats.json', ) + const frameworkDependencyStatsPath = join( + artifactsDir, + `e18e-stats-${name}`, + 'framework-dependency-stats.json', + ) + const frameworkDependencies = readJsonFile( + frameworkDependencyStatsPath, + ) + if (frameworkDependencies) { + console.info(` ✓ Found framework dependency stats artifact`) + stats = { ...stats, frameworkDependencies } + } else { + console.warn( + `No framework dependency stats artifact found at ${frameworkDependencyStatsPath}`, + ) + } + const e18eStats = readJsonFile(e18eArtifactPath) if (e18eStats) { console.info(` ✓ Found e18e stats artifact`) diff --git a/packages/stats-generator/src/utils.ts b/packages/stats-generator/src/utils.ts index 3061e7fa..f2c2a168 100644 --- a/packages/stats-generator/src/utils.ts +++ b/packages/stats-generator/src/utils.ts @@ -118,12 +118,18 @@ export function getDependencyCountsFromPackageMetadata(packageName: string) { } } +export function getFrameworkDependencyName(frameworkPackage: string): string { + return frameworkPackage.startsWith('jsr:') + ? frameworkPackage.slice('jsr:'.length) + : frameworkPackage +} + export function getFrameworkDependencyCountsFromPackageMetadata( starterPackageName: string, frameworkPackage: string, ): DependencyStats { // pnpm exposes JSR dependencies under their package name in node_modules. - const installedPackageName = frameworkPackage.replace(/^jsr:/, '') + const installedPackageName = getFrameworkDependencyName(frameworkPackage) const packageJsonPath = join( packagesDir, starterPackageName,