diff --git a/.github/workflows/test-all.yml b/.github/workflows/test-all.yml index 97849d8e41c..f026581403c 100644 --- a/.github/workflows/test-all.yml +++ b/.github/workflows/test-all.yml @@ -40,6 +40,8 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} path-to-lcov: ./lcov-all.info continue-on-error: true + - name: Generate Size Report + run: yarn size-report deploy: name: Canary Deploy runs-on: ubuntu-latest diff --git a/.github/workflows/test-changed.yml b/.github/workflows/test-changed.yml index ffe2e9aa4eb..afca6c3b1ee 100644 --- a/.github/workflows/test-changed.yml +++ b/.github/workflows/test-changed.yml @@ -28,3 +28,5 @@ jobs: run: yarn build - name: Run tests on changed packages run: xvfb-run yarn test:changed + - name: Generate Size Report + run: yarn size-report diff --git a/package.json b/package.json index ef85fc379c4..eea6e573bf1 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,8 @@ "docgen:node": "node scripts/docgen/generate-docs.js --api node", "docgen": "yarn docgen:js; yarn docgen:node", "prettier": "prettier --config .prettierrc --write '**/*.{ts,js}'", - "lint": "lerna run --scope @firebase/* --scope rxfire lint" + "lint": "lerna run --scope @firebase/* --scope rxfire lint", + "size-report": "node scripts/report_binary_size.js" }, "repository": { "type": "git", diff --git a/scripts/report_binary_size.js b/scripts/report_binary_size.js new file mode 100644 index 00000000000..32a5c1212e3 --- /dev/null +++ b/scripts/report_binary_size.js @@ -0,0 +1,95 @@ +const { resolve } = require('path'); +const fs = require('fs'); +const { execSync } = require('child_process'); + +const repoRoot = resolve(__dirname, '..'); + +const commitHash = process.env.GITHUB_SHA || execSync('git rev-parse HEAD').toString(); +const runId = process.env.GITHUB_RUN_ID || 'local-run-id'; + +// CDN scripts +function generateReportForCDNScripts() { + const reports = []; + const firebaseRoot = resolve(__dirname, '../packages/firebase'); + const pkgJson = require(`${firebaseRoot}/package.json`); + + const special_files = [ + 'firebase-performance-standalone.es2017.js', + 'firebase-performance-standalone.js', + 'firebase.js' + ]; + + const files = [ + ...special_files.map(file => `${firebaseRoot}/${file}`), + ...pkgJson.components.map(component => `${firebaseRoot}/firebase-${component}.js`) + ]; + + for (const file of files) { + const { size } = fs.statSync(file); + const fileName = file.split('/').slice(-1)[0]; + reports.push(makeReportObject('firebase', fileName, size)); + } + + return reports; +} + +// NPM packages +function generateReportForNPMPackages() { + const reports = []; + const fields = [ + 'main', + 'module', + 'esm2017', + 'browser', + 'react-native', + 'lite', + 'lite-esm2017' + ]; + + const packageInfo = JSON.parse( + execSync('npx lerna ls --json --scope @firebase/*', { cwd: repoRoot }).toString() + ); + + for (const package of packageInfo) { + const packageJson = require(`${package.location}/package.json`); + + for (const field of fields) { + if (packageJson[field]) { + const filePath = `${package.location}/${packageJson[field]}`; + const { size } = fs.statSync(filePath); + reports.push(makeReportObject(packageJson.name, field, size)); + } + } + } + + return reports; +} + +function makeReportObject(sdk, type, value) { + return { + sdk, + type, + value + }; +} + +function generateSizeReport() { + const reports = [ + ...generateReportForCDNScripts(), + ...generateReportForNPMPackages() + ]; + + for (const r of reports) { + console.log(r.sdk, r.type, r.value); + } + + console.log(`Github Action URL: https://github.com/firebase/firebase-js-sdk/actions/runs/${runId}`); + + return { + log: `https://github.com/firebase/firebase-js-sdk/actions/runs/${runId}`, + metric: "BinarySize", + results: reports + }; +} + +generateSizeReport();