Files
copilotkit__copilotkit/.github/workflows/static_bundle_size.yml
David McKay c6ca283e96 feat(ci): bundle-size tracking + ES-compat checks (OSS-123, OSS-121)
Adds two CI signals for keeping the published packages small and broadly compatible:

- Bundle size: size-limit file-mode config across packages plus a
  CopilotChat import-size regression signal (gzip) so growth in the
  headline consumer entrypoint is visible on every PR. A bundle-size
  workflow comments results on the PR (Phase 1: no hard-fail).
- ES compatibility: a compat-check (es-check) script across 9 packages
  with a root .browserslistrc, validating built .mjs/.cjs against the
  es2022 build target.

The measure script is importable (measureBundle) and unit-tested. Dev
docs live under dev-docs/ (bundle-size.md, browser-compat.md). All
action refs are pinned to full commit SHAs for supply-chain safety.
2026-05-29 16:44:35 -07:00

106 lines
3.9 KiB
YAML

name: static / bundle-size
on:
pull_request:
paths-ignore:
- "docs/**"
- "README.md"
- "examples/**"
- "showcase/**"
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
env:
NODE_OPTIONS: "--max-old-space-size=4096"
NX_VERBOSE_LOGGING: true
jobs:
# Posts a per-PR comment with per-file gzip diffs for the 9 in-scope packages.
# Runs preactjs/compressed-size-action, which builds the PR head and the base
# branch, scans the `pattern` glob in each, and diffs the gzip sizes; the
# comment updates in place on subsequent pushes. No hard-fail (Phase 1) — see
# dev-docs/bundle-size.md for the rollout plan.
#
# Fork limitation: pull_request runs from a fork get a read-only GITHUB_TOKEN,
# so the action cannot post the comment and prints the report to the logs
# instead. The measurement still runs. Accepted for Phase 1 (informational, no
# hard-fail); see dev-docs/bundle-size.md for the relay pattern if the comment
# ever becomes required.
bundle-size:
runs-on: ubuntu-latest
timeout-minutes: 30
# pull-requests: write is scoped to this job only — it's the one that posts
# the size-diff comment. The import-size job below stays read-only.
permissions:
contents: read
pull-requests: write
steps:
- name: Checkout
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
persist-credentials: false
fetch-depth: 0
- name: Setup pnpm
# Omit `version:` so pnpm/action-setup inherits from the repo's
# `packageManager` field in package.json (via corepack).
uses: pnpm/action-setup@0e279bb959325dab635dd2c09392533439d90093 # v6.0.8
- name: Use Node.js 20
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 20.x
# setup-node built-in cache is fork-safe (fork PRs can't write to base repo cache)
cache: "pnpm"
cache-dependency-path: "**/pnpm-lock.yaml"
- name: Measure compressed bundle sizes
uses: preactjs/compressed-size-action@66325aad6443cb7cf89c4bfcd414aea2367cda94 # 2.9.1
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
# Use the root `build` script (present on both this branch and the base
# branch) so compressed-size-action can build both sides for comparison.
# The `pattern` below restricts measurement to the 9 in-scope packages.
build-script: build
pattern: "packages/{core,shared,react-core,react-ui,react-textarea,runtime-client-gql,web-inspector,voice,a2ui-renderer}/dist/**/*.{mjs,js,cjs}"
# Measures what an app importing { CopilotChat } from
# @copilotkit/react-core/v2 bundles, by driving esbuild over a synthetic entry
# and summing the gzipped output. Writes the total to the GitHub job summary
# for per-PR visibility. It is a relative regression signal across PRs, not a
# production Vite/Next figure — see dev-docs/bundle-size.md.
copilotchat-import-size:
runs-on: ubuntu-latest
timeout-minutes: 30
permissions:
contents: read
steps:
- name: Checkout
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@0e279bb959325dab635dd2c09392533439d90093 # v6.0.8
- name: Use Node.js 20
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 20.x
cache: "pnpm"
cache-dependency-path: "**/pnpm-lock.yaml"
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build react-core
run: npx nx run @copilotkit/react-core:build
- name: Measure CopilotChat bundle regression signal
run: pnpm --filter @copilotkit/react-core size:headline