From 9782b506adb6bf41d9496f80128ce747a4bbc473 Mon Sep 17 00:00:00 2001 From: Alexander Karan Date: Tue, 6 Jan 2026 16:44:20 +0800 Subject: [PATCH 01/17] Potential Build Script for CI --- .github/workflows/ci-next-js.yml | 69 +++++++++++++++++++- packages/starter-next-js/.ci-stats.json | 7 ++ packages/stats-generator/src/create-stats.ts | 4 ++ packages/stats-generator/src/get-ci-stats.ts | 15 +++++ packages/stats-generator/src/types.ts | 9 ++- 5 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 packages/starter-next-js/.ci-stats.json create mode 100644 packages/stats-generator/src/get-ci-stats.ts diff --git a/.github/workflows/ci-next-js.yml b/.github/workflows/ci-next-js.yml index 00ea05d..ec8e1c0 100644 --- a/.github/workflows/ci-next-js.yml +++ b/.github/workflows/ci-next-js.yml @@ -21,7 +21,7 @@ on: - 'prettier.config.js' jobs: - build: + test: runs-on: ubuntu-latest steps: @@ -51,3 +51,70 @@ jobs: - name: Build run: pnpm build:next + + measure: + needs: test + runs-on: ubuntu-latest + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '24' + # No cache - we want clean measurements + + - name: Measure install time + id: install + run: | + START=$(date +%s%N) + pnpm install --frozen-lockfile + END=$(date +%s%N) + ELAPSED=$((($END - $START) / 1000000)) + echo "time=$ELAPSED" >> $GITHUB_OUTPUT + echo "Install time: ${ELAPSED}ms" + + - name: Measure cold build time + id: cold_build + run: | + START=$(date +%s%N) + pnpm build:next + END=$(date +%s%N) + ELAPSED=$((($END - $START) / 1000000)) + echo "time=$ELAPSED" >> $GITHUB_OUTPUT + echo "Cold build time: ${ELAPSED}ms" + + - name: Measure warm build time + id: warm_build + run: | + START=$(date +%s%N) + pnpm build:next + END=$(date +%s%N) + ELAPSED=$((($END - $START) / 1000000)) + echo "time=$ELAPSED" >> $GITHUB_OUTPUT + echo "Warm build time: ${ELAPSED}ms" + + - name: Save CI stats + run: | + mkdir -p packages/starter-next-js + echo '{ + "installTimeMs": ${{ steps.install.outputs.time }}, + "coldBuildTimeMs": ${{ steps.cold_build.outputs.time }}, + "warmBuildTimeMs": ${{ steps.warm_build.outputs.time }}, + "timingMeasuredAt": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'", + "runner": "ubuntu-latest" + }' > packages/starter-next-js/.ci-stats.json + + - name: Commit CI stats + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add packages/starter-next-js/.ci-stats.json + git diff --staged --quiet || git commit -m "Update CI stats for starter-next-js [skip ci]" + git push diff --git a/packages/starter-next-js/.ci-stats.json b/packages/starter-next-js/.ci-stats.json new file mode 100644 index 0000000..a598686 --- /dev/null +++ b/packages/starter-next-js/.ci-stats.json @@ -0,0 +1,7 @@ +{ + "installTimeMs": 2500, + "coldBuildTimeMs": 6000, + "warmBuildTimeMs": 4800, + "timingMeasuredAt": "2026-01-06T08:30:00.000Z", + "runner": "ubuntu-latest" +} diff --git a/packages/stats-generator/src/create-stats.ts b/packages/stats-generator/src/create-stats.ts index cfe9962..2d57462 100644 --- a/packages/stats-generator/src/create-stats.ts +++ b/packages/stats-generator/src/create-stats.ts @@ -3,6 +3,7 @@ import { join } from 'node:path' import { getStarterPackages } from './get-starter-packages.ts' import { packagesDir } from './constants.ts' import { saveStats } from './save-stats.ts' +import { getCIStats } from './get-ci-stats.ts' import type { FrameworkStats, PackageJson } from './types.ts' async function createStats() { @@ -21,9 +22,12 @@ async function createStats() { const prodCount = Object.keys(dependencies).length const devCount = Object.keys(devDependencies).length + const ciStats = await getCIStats(pkgDir) + const stats: FrameworkStats = { prodDependencies: prodCount, devDependencies: devCount, + ...(ciStats ?? {}), } await saveStats(pkgDir, stats) diff --git a/packages/stats-generator/src/get-ci-stats.ts b/packages/stats-generator/src/get-ci-stats.ts new file mode 100644 index 0000000..dfbd050 --- /dev/null +++ b/packages/stats-generator/src/get-ci-stats.ts @@ -0,0 +1,15 @@ +import { readFile } from 'node:fs/promises' +import { join } from 'node:path' +import { packagesDir } from './constants.ts' +import { CIStats } from './types.ts' + +export async function getCIStats(pkgDir: string) { + const ciStatsPath = join(packagesDir, pkgDir, '.ci-stats.json') + + try { + const content = await readFile(ciStatsPath, 'utf-8') + return JSON.parse(content) as CIStats + } catch (error) { + return null + } +} diff --git a/packages/stats-generator/src/types.ts b/packages/stats-generator/src/types.ts index e2f3897..4c0760c 100644 --- a/packages/stats-generator/src/types.ts +++ b/packages/stats-generator/src/types.ts @@ -1,4 +1,11 @@ -export interface FrameworkStats { +export interface CIStats { + installTimeMs?: number + coldBuildTimeMs?: number + warmBuildTimeMs?: number + timingMeasuredAt?: string +} + +export interface FrameworkStats extends CIStats { prodDependencies: number devDependencies: number } From 386f0b9f46f74256b908230d9f09581b705a3e56 Mon Sep 17 00:00:00 2001 From: Alexander Karan Date: Tue, 6 Jan 2026 16:47:48 +0800 Subject: [PATCH 02/17] Updated stats --- .github/workflows/ci-next-js.yml | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-next-js.yml b/.github/workflows/ci-next-js.yml index ec8e1c0..dfe1bba 100644 --- a/.github/workflows/ci-next-js.yml +++ b/.github/workflows/ci-next-js.yml @@ -55,11 +55,15 @@ jobs: measure: needs: test runs-on: ubuntu-latest - if: github.event_name == 'push' && github.ref == 'refs/heads/main' + + permissions: + contents: write steps: - name: Checkout code uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref || github.ref }} - name: Setup pnpm uses: pnpm/action-setup@v4 @@ -116,5 +120,17 @@ jobs: git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" git add packages/starter-next-js/.ci-stats.json - git diff --staged --quiet || git commit -m "Update CI stats for starter-next-js [skip ci]" - git push + + if git diff --staged --quiet; then + echo "No changes to commit" + exit 0 + fi + + git commit -m "Update CI stats for starter-next-js [skip ci]" + + # Push to the PR branch or main + if [ "${{ github.event_name }}" = "pull_request" ]; then + git push origin HEAD:${{ github.head_ref }} + else + git push + fi From 5229152a66b24afe831853fffdb2867084b1d169 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 6 Jan 2026 08:48:59 +0000 Subject: [PATCH 03/17] Update CI stats for starter-next-js [skip ci] --- packages/starter-next-js/.ci-stats.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/starter-next-js/.ci-stats.json b/packages/starter-next-js/.ci-stats.json index a598686..9293217 100644 --- a/packages/starter-next-js/.ci-stats.json +++ b/packages/starter-next-js/.ci-stats.json @@ -1,7 +1,7 @@ { - "installTimeMs": 2500, - "coldBuildTimeMs": 6000, - "warmBuildTimeMs": 4800, - "timingMeasuredAt": "2026-01-06T08:30:00.000Z", + "installTimeMs": 6793, + "coldBuildTimeMs": 8357, + "warmBuildTimeMs": 7581, + "timingMeasuredAt": "2026-01-06T08:48:59Z", "runner": "ubuntu-latest" } From c2d6384f95e7d25d3da8f1f2c02e4998bef4ecd7 Mon Sep 17 00:00:00 2001 From: Alexander Karan Date: Mon, 12 Jan 2026 16:59:01 +0800 Subject: [PATCH 04/17] Test build check --- .github/workflows/ci-next-js.yml | 85 ++---------------- .github/workflows/ci-react-router.yml | 10 ++- .github/workflows/ci-tanstack-start.yml | 10 ++- .github/workflows/measure-build-times.yml | 100 ++++++++++++++++++++++ 4 files changed, 123 insertions(+), 82 deletions(-) create mode 100644 .github/workflows/measure-build-times.yml diff --git a/.github/workflows/ci-next-js.yml b/.github/workflows/ci-next-js.yml index dfe1bba..782e792 100644 --- a/.github/workflows/ci-next-js.yml +++ b/.github/workflows/ci-next-js.yml @@ -54,83 +54,8 @@ jobs: measure: needs: test - runs-on: ubuntu-latest - - permissions: - contents: write - - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - ref: ${{ github.head_ref || github.ref }} - - - name: Setup pnpm - uses: pnpm/action-setup@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '24' - # No cache - we want clean measurements - - - name: Measure install time - id: install - run: | - START=$(date +%s%N) - pnpm install --frozen-lockfile - END=$(date +%s%N) - ELAPSED=$((($END - $START) / 1000000)) - echo "time=$ELAPSED" >> $GITHUB_OUTPUT - echo "Install time: ${ELAPSED}ms" - - - name: Measure cold build time - id: cold_build - run: | - START=$(date +%s%N) - pnpm build:next - END=$(date +%s%N) - ELAPSED=$((($END - $START) / 1000000)) - echo "time=$ELAPSED" >> $GITHUB_OUTPUT - echo "Cold build time: ${ELAPSED}ms" - - - name: Measure warm build time - id: warm_build - run: | - START=$(date +%s%N) - pnpm build:next - END=$(date +%s%N) - ELAPSED=$((($END - $START) / 1000000)) - echo "time=$ELAPSED" >> $GITHUB_OUTPUT - echo "Warm build time: ${ELAPSED}ms" - - - name: Save CI stats - run: | - mkdir -p packages/starter-next-js - echo '{ - "installTimeMs": ${{ steps.install.outputs.time }}, - "coldBuildTimeMs": ${{ steps.cold_build.outputs.time }}, - "warmBuildTimeMs": ${{ steps.warm_build.outputs.time }}, - "timingMeasuredAt": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'", - "runner": "ubuntu-latest" - }' > packages/starter-next-js/.ci-stats.json - - - name: Commit CI stats - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - git add packages/starter-next-js/.ci-stats.json - - if git diff --staged --quiet; then - echo "No changes to commit" - exit 0 - fi - - git commit -m "Update CI stats for starter-next-js [skip ci]" - - # Push to the PR branch or main - if [ "${{ github.event_name }}" = "pull_request" ]; then - git push origin HEAD:${{ github.head_ref }} - else - git push - fi + uses: ./.github/workflows/measure-build-times.yml + with: + package-name: starter-next-js + package-path: packages/starter-next-js + build-command: pnpm build:next diff --git a/.github/workflows/ci-react-router.yml b/.github/workflows/ci-react-router.yml index 937c955..dee3ae8 100644 --- a/.github/workflows/ci-react-router.yml +++ b/.github/workflows/ci-react-router.yml @@ -21,7 +21,7 @@ on: - 'prettier.config.js' jobs: - build: + test: runs-on: ubuntu-latest steps: @@ -51,3 +51,11 @@ jobs: - name: Build run: pnpm build:react-router + + measure: + needs: test + uses: ./.github/workflows/measure-build-times.yml + with: + package-name: starter-react-router + package-path: packages/starter-react-router + build-command: pnpm build:react-router diff --git a/.github/workflows/ci-tanstack-start.yml b/.github/workflows/ci-tanstack-start.yml index 1714cf8..8780d05 100644 --- a/.github/workflows/ci-tanstack-start.yml +++ b/.github/workflows/ci-tanstack-start.yml @@ -21,7 +21,7 @@ on: - 'prettier.config.js' jobs: - build: + test: runs-on: ubuntu-latest steps: @@ -51,3 +51,11 @@ jobs: - name: Build run: pnpm build:tanstack + + measure: + needs: test + uses: ./.github/workflows/measure-build-times.yml + with: + package-name: starter-tanstack-start-react + package-path: packages/starter-tanstack-start-react + build-command: pnpm build:tanstack diff --git a/.github/workflows/measure-build-times.yml b/.github/workflows/measure-build-times.yml new file mode 100644 index 0000000..9a7fb00 --- /dev/null +++ b/.github/workflows/measure-build-times.yml @@ -0,0 +1,100 @@ +name: Measure Build Times + +on: + workflow_call: + inputs: + package-name: + required: true + type: string + description: 'Package name (e.g., starter-next-js)' + package-path: + required: true + type: string + description: 'Package path (e.g., packages/starter-next-js)' + build-command: + required: true + type: string + description: 'Build command (e.g., pnpm build:next)' + +jobs: + measure: + runs-on: ubuntu-latest + + permissions: + contents: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref || github.ref }} + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '24' + # No cache - we want clean measurements + + - name: Measure install time + id: install + run: | + START=$(date +%s%N) + pnpm install --frozen-lockfile + END=$(date +%s%N) + ELAPSED=$((($END - $START) / 1000000)) + echo "time=$ELAPSED" >> $GITHUB_OUTPUT + echo "Install time: ${ELAPSED}ms" + + - name: Measure cold build time + id: cold_build + run: | + START=$(date +%s%N) + ${{ inputs.build-command }} + END=$(date +%s%N) + ELAPSED=$((($END - $START) / 1000000)) + echo "time=$ELAPSED" >> $GITHUB_OUTPUT + echo "Cold build time: ${ELAPSED}ms" + + - name: Measure warm build time + id: warm_build + run: | + START=$(date +%s%N) + ${{ inputs.build-command }} + END=$(date +%s%N) + ELAPSED=$((($END - $START) / 1000000)) + echo "time=$ELAPSED" >> $GITHUB_OUTPUT + echo "Warm build time: ${ELAPSED}ms" + + - name: Save CI stats + run: | + mkdir -p ${{ inputs.package-path }} + echo '{ + "installTimeMs": ${{ steps.install.outputs.time }}, + "coldBuildTimeMs": ${{ steps.cold_build.outputs.time }}, + "warmBuildTimeMs": ${{ steps.warm_build.outputs.time }}, + "timingMeasuredAt": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'", + "runner": "ubuntu-latest" + }' > ${{ inputs.package-path }}/.ci-stats.json + + - name: Commit CI stats + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add ${{ inputs.package-path }}/.ci-stats.json + + if git diff --staged --quiet; then + echo "No changes to commit" + exit 0 + fi + + git commit -m "Update CI stats for ${{ inputs.package-name }} [skip ci]" + + # Push to the PR branch or main + if [ "${{ github.event_name }}" = "pull_request" ]; then + git push origin HEAD:${{ github.head_ref }} + else + git push + fi From ba97c1c08eb27752784269dbd63d35f6a1ac57f8 Mon Sep 17 00:00:00 2001 From: Alexander Karan Date: Mon, 12 Jan 2026 17:02:34 +0800 Subject: [PATCH 05/17] Bumped package json --- packages/starter-next-js/package.json | 4 +- pnpm-lock.yaml | 53 ++++++++++++++++----------- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/packages/starter-next-js/package.json b/packages/starter-next-js/package.json index 5fea998..1ea60a7 100644 --- a/packages/starter-next-js/package.json +++ b/packages/starter-next-js/package.json @@ -19,8 +19,8 @@ }, "devDependencies": { "@tailwindcss/postcss": "^4", - "@types/node": "^20", - "@types/react": "^19", + "@types/node": "^25.0.6", + "@types/react": "^19.2.8", "@types/react-dom": "^19", "eslint-config-next": "16.1.1", "tailwindcss": "^4" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0116a0f..2115770 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,7 +31,7 @@ importers: dependencies: astro: specifier: ^5.16.6 - version: 5.16.6(@types/node@25.0.3)(db0@0.3.4)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 5.16.6(@types/node@25.0.6)(db0@0.3.4)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) devDependencies: '@astrojs/check': specifier: ^0.9.6 @@ -56,14 +56,14 @@ importers: specifier: ^4 version: 4.1.18 '@types/node': - specifier: ^20 - version: 20.19.27 + specifier: ^25.0.6 + version: 25.0.6 '@types/react': - specifier: ^19 - version: 19.2.7 + specifier: ^19.2.8 + version: 19.2.8 '@types/react-dom': specifier: ^19 - version: 19.2.3(@types/react@19.2.7) + version: 19.2.3(@types/react@19.2.8) eslint-config-next: specifier: 16.1.1 version: 16.1.1(@typescript-eslint/parser@8.51.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) @@ -2457,15 +2457,15 @@ packages: '@types/nlcst@2.0.3': resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} - '@types/node@20.19.27': - resolution: {integrity: sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==} - '@types/node@22.19.3': resolution: {integrity: sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==} '@types/node@25.0.3': resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==} + '@types/node@25.0.6': + resolution: {integrity: sha512-NNu0sjyNxpoiW3YuVFfNz7mxSQ+S4X2G28uqg2s+CzoqoQjLPsWSbsFFyztIAqt2vb8kfEAsJNepMGPTxFDx3Q==} + '@types/parse-path@7.1.0': resolution: {integrity: sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q==} deprecated: This is a stub types definition. parse-path provides its own type definitions, so you do not need this installed. @@ -2478,6 +2478,9 @@ packages: '@types/react@19.2.7': resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} + '@types/react@19.2.8': + resolution: {integrity: sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg==} + '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -9445,7 +9448,7 @@ snapshots: '@types/fontkit@2.0.8': dependencies: - '@types/node': 22.19.3 + '@types/node': 25.0.6 '@types/hast@3.0.4': dependencies: @@ -9465,10 +9468,6 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/node@20.19.27': - dependencies: - undici-types: 6.21.0 - '@types/node@22.19.3': dependencies: undici-types: 6.21.0 @@ -9477,6 +9476,10 @@ snapshots: dependencies: undici-types: 7.16.0 + '@types/node@25.0.6': + dependencies: + undici-types: 7.16.0 + '@types/parse-path@7.1.0': dependencies: parse-path: 7.1.0 @@ -9485,10 +9488,18 @@ snapshots: dependencies: '@types/react': 19.2.7 + '@types/react-dom@19.2.3(@types/react@19.2.8)': + dependencies: + '@types/react': 19.2.8 + '@types/react@19.2.7': dependencies: csstype: 3.2.3 + '@types/react@19.2.8': + dependencies: + csstype: 3.2.3 + '@types/resolve@1.20.2': {} '@types/unist@3.0.3': {} @@ -10160,7 +10171,7 @@ snapshots: transitivePeerDependencies: - supports-color - astro@5.16.6(@types/node@25.0.3)(db0@0.3.4)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2): + astro@5.16.6(@types/node@25.0.6)(db0@0.3.4)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2): dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/internal-helpers': 0.7.5 @@ -10217,8 +10228,8 @@ snapshots: unist-util-visit: 5.0.0 unstorage: 1.17.3(db0@0.3.4)(ioredis@5.8.2) vfile: 6.0.3 - vite: 6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) - vitefu: 1.1.1(vite@6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + vite: 6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vitefu: 1.1.1(vite@6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.3 @@ -14926,7 +14937,7 @@ snapshots: - supports-color - typescript - vite@6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + vite@6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -14935,7 +14946,7 @@ snapshots: rollup: 4.54.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.0.3 + '@types/node': 25.0.6 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 @@ -14960,9 +14971,9 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 - vitefu@1.1.1(vite@6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + vitefu@1.1.1(vite@6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): optionalDependencies: - vite: 6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) vitefu@1.1.1(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): optionalDependencies: From 3a508dc2b6f3943ea4efaede9b0079f6ebad5e89 Mon Sep 17 00:00:00 2001 From: Alexander Karan Date: Mon, 12 Jan 2026 17:04:44 +0800 Subject: [PATCH 06/17] Test again --- packages/starter-next-js/app/page.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/starter-next-js/app/page.tsx b/packages/starter-next-js/app/page.tsx index d25913f..98832b0 100644 --- a/packages/starter-next-js/app/page.tsx +++ b/packages/starter-next-js/app/page.tsx @@ -1,5 +1,7 @@ import Image from 'next/image' +// A comment + export default function Home() { return (
From 0bb33abbdeb983991b6ef0a784675a82aa0bff2e Mon Sep 17 00:00:00 2001 From: Alexander Karan Date: Mon, 12 Jan 2026 17:09:25 +0800 Subject: [PATCH 07/17] perms --- .github/workflows/ci-next-js.yml | 2 ++ .github/workflows/ci-react-router.yml | 2 ++ .github/workflows/ci-tanstack-start.yml | 2 ++ 3 files changed, 6 insertions(+) diff --git a/.github/workflows/ci-next-js.yml b/.github/workflows/ci-next-js.yml index 782e792..cb4639f 100644 --- a/.github/workflows/ci-next-js.yml +++ b/.github/workflows/ci-next-js.yml @@ -54,6 +54,8 @@ jobs: measure: needs: test + permissions: + contents: write uses: ./.github/workflows/measure-build-times.yml with: package-name: starter-next-js diff --git a/.github/workflows/ci-react-router.yml b/.github/workflows/ci-react-router.yml index dee3ae8..b7f098a 100644 --- a/.github/workflows/ci-react-router.yml +++ b/.github/workflows/ci-react-router.yml @@ -54,6 +54,8 @@ jobs: measure: needs: test + permissions: + contents: write uses: ./.github/workflows/measure-build-times.yml with: package-name: starter-react-router diff --git a/.github/workflows/ci-tanstack-start.yml b/.github/workflows/ci-tanstack-start.yml index 8780d05..50ff457 100644 --- a/.github/workflows/ci-tanstack-start.yml +++ b/.github/workflows/ci-tanstack-start.yml @@ -54,6 +54,8 @@ jobs: measure: needs: test + permissions: + contents: write uses: ./.github/workflows/measure-build-times.yml with: package-name: starter-tanstack-start-react From f216601a375aeca5e73c1135093ac3fe9cde772a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 12 Jan 2026 09:10:27 +0000 Subject: [PATCH 08/17] Update CI stats for starter-react-router [skip ci] --- packages/starter-react-router/.ci-stats.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 packages/starter-react-router/.ci-stats.json diff --git a/packages/starter-react-router/.ci-stats.json b/packages/starter-react-router/.ci-stats.json new file mode 100644 index 0000000..39157dd --- /dev/null +++ b/packages/starter-react-router/.ci-stats.json @@ -0,0 +1,7 @@ +{ + "installTimeMs": 10403, + "coldBuildTimeMs": 3035, + "warmBuildTimeMs": 3123, + "timingMeasuredAt": "2026-01-12T09:10:27Z", + "runner": "ubuntu-latest" +} From ccbbfc81893f5bb66647a48c6852460deb9ce17b Mon Sep 17 00:00:00 2001 From: Alexander Karan Date: Mon, 12 Jan 2026 17:18:39 +0800 Subject: [PATCH 09/17] Fixes --- .github/workflows/measure-build-times.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/measure-build-times.yml b/.github/workflows/measure-build-times.yml index 9a7fb00..8534273 100644 --- a/.github/workflows/measure-build-times.yml +++ b/.github/workflows/measure-build-times.yml @@ -20,6 +20,10 @@ jobs: measure: runs-on: ubuntu-latest + concurrency: + group: measure-and-commit-stats-${{ github.head_ref || github.ref }} + cancel-in-progress: false + permissions: contents: write @@ -83,6 +87,10 @@ jobs: run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" + + # Pull latest changes in case another workflow pushed + git pull origin ${{ github.head_ref || github.ref_name }} --rebase || true + git add ${{ inputs.package-path }}/.ci-stats.json if git diff --staged --quiet; then From bcb44b9d365d9729e1e6b3e4625d815cd7305c31 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 12 Jan 2026 09:19:50 +0000 Subject: [PATCH 10/17] Update CI stats for starter-react-router [skip ci] --- packages/starter-react-router/.ci-stats.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/starter-react-router/.ci-stats.json b/packages/starter-react-router/.ci-stats.json index 39157dd..fa3ecee 100644 --- a/packages/starter-react-router/.ci-stats.json +++ b/packages/starter-react-router/.ci-stats.json @@ -1,7 +1,7 @@ { - "installTimeMs": 10403, - "coldBuildTimeMs": 3035, - "warmBuildTimeMs": 3123, - "timingMeasuredAt": "2026-01-12T09:10:27Z", + "installTimeMs": 9417, + "coldBuildTimeMs": 2816, + "warmBuildTimeMs": 2788, + "timingMeasuredAt": "2026-01-12T09:19:50Z", "runner": "ubuntu-latest" } From 8316bea0a8729d7031e4c788c01227326d344c80 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 12 Jan 2026 09:20:32 +0000 Subject: [PATCH 11/17] Update CI stats for starter-tanstack-start-react [skip ci] --- packages/starter-tanstack-start-react/.ci-stats.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 packages/starter-tanstack-start-react/.ci-stats.json diff --git a/packages/starter-tanstack-start-react/.ci-stats.json b/packages/starter-tanstack-start-react/.ci-stats.json new file mode 100644 index 0000000..ff5f6ff --- /dev/null +++ b/packages/starter-tanstack-start-react/.ci-stats.json @@ -0,0 +1,7 @@ +{ + "installTimeMs": 10728, + "coldBuildTimeMs": 9965, + "warmBuildTimeMs": 9243, + "timingMeasuredAt": "2026-01-12T09:20:32Z", + "runner": "ubuntu-latest" +} From 5bd79ff13f19ab84ad79086ac99950a5454ce602 Mon Sep 17 00:00:00 2001 From: Alexander Karan Date: Mon, 12 Jan 2026 17:26:30 +0800 Subject: [PATCH 12/17] Rought tests --- .github/workflows/ci-next-js.yml | 10 - .github/workflows/ci-react-router.yml | 10 - .github/workflows/ci-tanstack-start.yml | 10 - .github/workflows/measure-all-builds.yml | 298 ++++++++++++++++++++++ .github/workflows/measure-build-times.yml | 108 -------- 5 files changed, 298 insertions(+), 138 deletions(-) create mode 100644 .github/workflows/measure-all-builds.yml delete mode 100644 .github/workflows/measure-build-times.yml diff --git a/.github/workflows/ci-next-js.yml b/.github/workflows/ci-next-js.yml index cb4639f..4157012 100644 --- a/.github/workflows/ci-next-js.yml +++ b/.github/workflows/ci-next-js.yml @@ -51,13 +51,3 @@ jobs: - name: Build run: pnpm build:next - - measure: - needs: test - permissions: - contents: write - uses: ./.github/workflows/measure-build-times.yml - with: - package-name: starter-next-js - package-path: packages/starter-next-js - build-command: pnpm build:next diff --git a/.github/workflows/ci-react-router.yml b/.github/workflows/ci-react-router.yml index b7f098a..9200f0d 100644 --- a/.github/workflows/ci-react-router.yml +++ b/.github/workflows/ci-react-router.yml @@ -51,13 +51,3 @@ jobs: - name: Build run: pnpm build:react-router - - measure: - needs: test - permissions: - contents: write - uses: ./.github/workflows/measure-build-times.yml - with: - package-name: starter-react-router - package-path: packages/starter-react-router - build-command: pnpm build:react-router diff --git a/.github/workflows/ci-tanstack-start.yml b/.github/workflows/ci-tanstack-start.yml index 50ff457..bcfdcb6 100644 --- a/.github/workflows/ci-tanstack-start.yml +++ b/.github/workflows/ci-tanstack-start.yml @@ -51,13 +51,3 @@ jobs: - name: Build run: pnpm build:tanstack - - measure: - needs: test - permissions: - contents: write - uses: ./.github/workflows/measure-build-times.yml - with: - package-name: starter-tanstack-start-react - package-path: packages/starter-tanstack-start-react - build-command: pnpm build:tanstack diff --git a/.github/workflows/measure-all-builds.yml b/.github/workflows/measure-all-builds.yml new file mode 100644 index 0000000..aaeadb1 --- /dev/null +++ b/.github/workflows/measure-all-builds.yml @@ -0,0 +1,298 @@ +name: Measure All Build Times + +on: + workflow_run: + workflows: ["CI - Next.js", "CI - React Router", "CI - TanStack Start", "CI - Nuxt"] + types: + - completed + branches: [main] + +jobs: + measure: + # Only run on pull requests and if the triggering workflow succeeded + if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' + runs-on: ubuntu-latest + + permissions: + contents: write + actions: read + pull-requests: read + + steps: + - name: Wait for all CI workflows to complete + uses: actions/github-script@v7 + with: + script: | + const pullRequests = context.payload.workflow_run.pull_requests; + if (!pullRequests || pullRequests.length === 0) { + core.setFailed('No pull request found in workflow_run event'); + return; + } + + const prNumber = pullRequests[0].number; + const allWorkflows = ['CI - Next.js', 'CI - React Router', 'CI - TanStack Start', 'CI - Nuxt']; + + console.log(`Checking workflows for PR #${prNumber}`); + + // Get the PR to find the head SHA + const pr = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber + }); + const headSha = pr.data.head.sha; + + // Get all workflow runs for this commit + const { data: workflowRuns } = await github.rest.actions.listWorkflowRunsForRepo({ + owner: context.repo.owner, + repo: context.repo.repo, + head_sha: headSha, + event: 'pull_request' + }); + + // Find which workflows actually ran (they may be filtered by paths) + const runningWorkflows = new Set(); + const workflowStatuses = {}; + + for (const run of workflowRuns.workflow_runs) { + if (allWorkflows.includes(run.name)) { + runningWorkflows.add(run.name); + // Keep the most recent status if there are multiple runs + if (!workflowStatuses[run.name] || run.id > workflowStatuses[run.name].id) { + workflowStatuses[run.name] = { conclusion: run.conclusion, status: run.status, id: run.id }; + } + } + } + + console.log('Workflows that ran:', Array.from(runningWorkflows)); + console.log('Workflow statuses:', workflowStatuses); + + // Check if all workflows that ran have completed successfully + for (const workflow of runningWorkflows) { + const info = workflowStatuses[workflow]; + + if (info.status !== 'completed') { + console.log(`${workflow} is still running (status: ${info.status})`); + core.setFailed(`${workflow} is not complete yet`); + return; + } + + if (info.conclusion !== 'success') { + console.log(`${workflow} did not succeed (conclusion: ${info.conclusion})`); + core.setFailed(`${workflow} failed with conclusion: ${info.conclusion}`); + return; + } + } + + console.log('All CI workflows have passed!'); + + - name: Checkout code + uses: actions/checkout@v4 + with: + ref: ${{ github.event.workflow_run.head_branch }} + fetch-depth: 0 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '24' + # No cache - we want clean measurements + + - name: Detect changed packages + id: detect + env: + GH_TOKEN: ${{ github.token }} + run: | + # Get PR number from workflow_run event + PR_NUMBER=$(echo '${{ toJson(github.event.workflow_run.pull_requests) }}' | jq -r '.[0].number') + + # Get PR base branch + BASE_REF=$(gh pr view $PR_NUMBER --json baseRefName -q .baseRefName) + BASE="origin/$BASE_REF" + + # Check which packages changed + PACKAGES="" + if git diff --name-only $BASE HEAD | grep -q "packages/starter-next-js/"; then + PACKAGES="$PACKAGES next" + fi + if git diff --name-only $BASE HEAD | grep -q "packages/starter-react-router/"; then + PACKAGES="$PACKAGES react-router" + fi + if git diff --name-only $BASE HEAD | grep -q "packages/starter-tanstack-start-react/"; then + PACKAGES="$PACKAGES tanstack" + fi + if git diff --name-only $BASE HEAD | grep -q "packages/starter-nuxt/"; then + PACKAGES="$PACKAGES nuxt" + fi + + # If no packages changed but pnpm-lock.yaml changed, measure all + if [ -z "$PACKAGES" ] && git diff --name-only $BASE HEAD | grep -q "pnpm-lock.yaml"; then + PACKAGES="next react-router tanstack nuxt" + fi + + echo "packages=$PACKAGES" >> $GITHUB_OUTPUT + echo "Changed packages: $PACKAGES" + + - name: Measure install time + id: install + if: steps.detect.outputs.packages != '' + run: | + START=$(date +%s%N) + pnpm install --frozen-lockfile + END=$(date +%s%N) + ELAPSED=$((($END - $START) / 1000000)) + echo "time=$ELAPSED" >> $GITHUB_OUTPUT + echo "Install time: ${ELAPSED}ms" + + - name: Measure Next.js builds + if: contains(steps.detect.outputs.packages, 'next') + id: next + run: | + # Cold build + START=$(date +%s%N) + pnpm build:next + END=$(date +%s%N) + COLD=$((($END - $START) / 1000000)) + + # Warm build + START=$(date +%s%N) + pnpm build:next + END=$(date +%s%N) + WARM=$((($END - $START) / 1000000)) + + echo "cold=$COLD" >> $GITHUB_OUTPUT + echo "warm=$WARM" >> $GITHUB_OUTPUT + echo "Next.js - Cold: ${COLD}ms, Warm: ${WARM}ms" + + - name: Measure React Router builds + if: contains(steps.detect.outputs.packages, 'react-router') + id: react_router + run: | + # Cold build + START=$(date +%s%N) + pnpm build:react-router + END=$(date +%s%N) + COLD=$((($END - $START) / 1000000)) + + # Warm build + START=$(date +%s%N) + pnpm build:react-router + END=$(date +%s%N) + WARM=$((($END - $START) / 1000000)) + + echo "cold=$COLD" >> $GITHUB_OUTPUT + echo "warm=$WARM" >> $GITHUB_OUTPUT + echo "React Router - Cold: ${COLD}ms, Warm: ${WARM}ms" + + - name: Measure TanStack Start builds + if: contains(steps.detect.outputs.packages, 'tanstack') + id: tanstack + run: | + # Cold build + START=$(date +%s%N) + pnpm build:tanstack + END=$(date +%s%N) + COLD=$((($END - $START) / 1000000)) + + # Warm build + START=$(date +%s%N) + pnpm build:tanstack + END=$(date +%s%N) + WARM=$((($END - $START) / 1000000)) + + echo "cold=$COLD" >> $GITHUB_OUTPUT + echo "warm=$WARM" >> $GITHUB_OUTPUT + echo "TanStack Start - Cold: ${COLD}ms, Warm: ${WARM}ms" + + - name: Measure Nuxt builds + if: contains(steps.detect.outputs.packages, 'nuxt') + id: nuxt + run: | + # Cold build + START=$(date +%s%N) + pnpm build:nuxt + END=$(date +%s%N) + COLD=$((($END - $START) / 1000000)) + + # Warm build + START=$(date +%s%N) + pnpm build:nuxt + END=$(date +%s%N) + WARM=$((($END - $START) / 1000000)) + + echo "cold=$COLD" >> $GITHUB_OUTPUT + echo "warm=$WARM" >> $GITHUB_OUTPUT + echo "Nuxt - Cold: ${COLD}ms, Warm: ${WARM}ms" + + - name: Save all CI stats + if: steps.detect.outputs.packages != '' + run: | + TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ) + + # Save Next.js stats + if [[ "${{ steps.detect.outputs.packages }}" == *"next"* ]]; then + mkdir -p packages/starter-next-js + echo '{ + "installTimeMs": ${{ steps.install.outputs.time }}, + "coldBuildTimeMs": ${{ steps.next.outputs.cold }}, + "warmBuildTimeMs": ${{ steps.next.outputs.warm }}, + "timingMeasuredAt": "'$TIMESTAMP'", + "runner": "ubuntu-latest" + }' > packages/starter-next-js/.ci-stats.json + fi + + # Save React Router stats + if [[ "${{ steps.detect.outputs.packages }}" == *"react-router"* ]]; then + mkdir -p packages/starter-react-router + echo '{ + "installTimeMs": ${{ steps.install.outputs.time }}, + "coldBuildTimeMs": ${{ steps.react_router.outputs.cold }}, + "warmBuildTimeMs": ${{ steps.react_router.outputs.warm }}, + "timingMeasuredAt": "'$TIMESTAMP'", + "runner": "ubuntu-latest" + }' > packages/starter-react-router/.ci-stats.json + fi + + # Save TanStack Start stats + if [[ "${{ steps.detect.outputs.packages }}" == *"tanstack"* ]]; then + mkdir -p packages/starter-tanstack-start-react + echo '{ + "installTimeMs": ${{ steps.install.outputs.time }}, + "coldBuildTimeMs": ${{ steps.tanstack.outputs.cold }}, + "warmBuildTimeMs": ${{ steps.tanstack.outputs.warm }}, + "timingMeasuredAt": "'$TIMESTAMP'", + "runner": "ubuntu-latest" + }' > packages/starter-tanstack-start-react/.ci-stats.json + fi + + # Save Nuxt stats + if [[ "${{ steps.detect.outputs.packages }}" == *"nuxt"* ]]; then + mkdir -p packages/starter-nuxt + echo '{ + "installTimeMs": ${{ steps.install.outputs.time }}, + "coldBuildTimeMs": ${{ steps.nuxt.outputs.cold }}, + "warmBuildTimeMs": ${{ steps.nuxt.outputs.warm }}, + "timingMeasuredAt": "'$TIMESTAMP'", + "runner": "ubuntu-latest" + }' > packages/starter-nuxt/.ci-stats.json + fi + + - name: Commit all CI stats + if: steps.detect.outputs.packages != '' + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + # Add all stats files + git add packages/*/.ci-stats.json + + if git diff --staged --quiet; then + echo "No changes to commit" + exit 0 + fi + + git commit -m "Update CI stats for changed packages [skip ci]" + git push origin HEAD:${{ github.event.workflow_run.head_branch }} diff --git a/.github/workflows/measure-build-times.yml b/.github/workflows/measure-build-times.yml deleted file mode 100644 index 8534273..0000000 --- a/.github/workflows/measure-build-times.yml +++ /dev/null @@ -1,108 +0,0 @@ -name: Measure Build Times - -on: - workflow_call: - inputs: - package-name: - required: true - type: string - description: 'Package name (e.g., starter-next-js)' - package-path: - required: true - type: string - description: 'Package path (e.g., packages/starter-next-js)' - build-command: - required: true - type: string - description: 'Build command (e.g., pnpm build:next)' - -jobs: - measure: - runs-on: ubuntu-latest - - concurrency: - group: measure-and-commit-stats-${{ github.head_ref || github.ref }} - cancel-in-progress: false - - permissions: - contents: write - - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - ref: ${{ github.head_ref || github.ref }} - - - name: Setup pnpm - uses: pnpm/action-setup@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '24' - # No cache - we want clean measurements - - - name: Measure install time - id: install - run: | - START=$(date +%s%N) - pnpm install --frozen-lockfile - END=$(date +%s%N) - ELAPSED=$((($END - $START) / 1000000)) - echo "time=$ELAPSED" >> $GITHUB_OUTPUT - echo "Install time: ${ELAPSED}ms" - - - name: Measure cold build time - id: cold_build - run: | - START=$(date +%s%N) - ${{ inputs.build-command }} - END=$(date +%s%N) - ELAPSED=$((($END - $START) / 1000000)) - echo "time=$ELAPSED" >> $GITHUB_OUTPUT - echo "Cold build time: ${ELAPSED}ms" - - - name: Measure warm build time - id: warm_build - run: | - START=$(date +%s%N) - ${{ inputs.build-command }} - END=$(date +%s%N) - ELAPSED=$((($END - $START) / 1000000)) - echo "time=$ELAPSED" >> $GITHUB_OUTPUT - echo "Warm build time: ${ELAPSED}ms" - - - name: Save CI stats - run: | - mkdir -p ${{ inputs.package-path }} - echo '{ - "installTimeMs": ${{ steps.install.outputs.time }}, - "coldBuildTimeMs": ${{ steps.cold_build.outputs.time }}, - "warmBuildTimeMs": ${{ steps.warm_build.outputs.time }}, - "timingMeasuredAt": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'", - "runner": "ubuntu-latest" - }' > ${{ inputs.package-path }}/.ci-stats.json - - - name: Commit CI stats - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - - # Pull latest changes in case another workflow pushed - git pull origin ${{ github.head_ref || github.ref_name }} --rebase || true - - git add ${{ inputs.package-path }}/.ci-stats.json - - if git diff --staged --quiet; then - echo "No changes to commit" - exit 0 - fi - - git commit -m "Update CI stats for ${{ inputs.package-name }} [skip ci]" - - # Push to the PR branch or main - if [ "${{ github.event_name }}" = "pull_request" ]; then - git push origin HEAD:${{ github.head_ref }} - else - git push - fi From a2510462b6d132686522c7ab46a66862c3ed0fdc Mon Sep 17 00:00:00 2001 From: Alexander Karan Date: Mon, 12 Jan 2026 17:29:51 +0800 Subject: [PATCH 13/17] Updates --- .github/workflows/measure-all-builds.yml | 93 ++---------------------- 1 file changed, 8 insertions(+), 85 deletions(-) diff --git a/.github/workflows/measure-all-builds.yml b/.github/workflows/measure-all-builds.yml index aaeadb1..dce3ee7 100644 --- a/.github/workflows/measure-all-builds.yml +++ b/.github/workflows/measure-all-builds.yml @@ -1,95 +1,25 @@ name: Measure All Build Times on: - workflow_run: - workflows: ["CI - Next.js", "CI - React Router", "CI - TanStack Start", "CI - Nuxt"] - types: - - completed + pull_request: branches: [main] + paths: + - 'packages/starter-*/**' + - 'package.json' + - 'pnpm-lock.yaml' jobs: measure: - # Only run on pull requests and if the triggering workflow succeeded - if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' runs-on: ubuntu-latest permissions: contents: write - actions: read - pull-requests: read steps: - - name: Wait for all CI workflows to complete - uses: actions/github-script@v7 - with: - script: | - const pullRequests = context.payload.workflow_run.pull_requests; - if (!pullRequests || pullRequests.length === 0) { - core.setFailed('No pull request found in workflow_run event'); - return; - } - - const prNumber = pullRequests[0].number; - const allWorkflows = ['CI - Next.js', 'CI - React Router', 'CI - TanStack Start', 'CI - Nuxt']; - - console.log(`Checking workflows for PR #${prNumber}`); - - // Get the PR to find the head SHA - const pr = await github.rest.pulls.get({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: prNumber - }); - const headSha = pr.data.head.sha; - - // Get all workflow runs for this commit - const { data: workflowRuns } = await github.rest.actions.listWorkflowRunsForRepo({ - owner: context.repo.owner, - repo: context.repo.repo, - head_sha: headSha, - event: 'pull_request' - }); - - // Find which workflows actually ran (they may be filtered by paths) - const runningWorkflows = new Set(); - const workflowStatuses = {}; - - for (const run of workflowRuns.workflow_runs) { - if (allWorkflows.includes(run.name)) { - runningWorkflows.add(run.name); - // Keep the most recent status if there are multiple runs - if (!workflowStatuses[run.name] || run.id > workflowStatuses[run.name].id) { - workflowStatuses[run.name] = { conclusion: run.conclusion, status: run.status, id: run.id }; - } - } - } - - console.log('Workflows that ran:', Array.from(runningWorkflows)); - console.log('Workflow statuses:', workflowStatuses); - - // Check if all workflows that ran have completed successfully - for (const workflow of runningWorkflows) { - const info = workflowStatuses[workflow]; - - if (info.status !== 'completed') { - console.log(`${workflow} is still running (status: ${info.status})`); - core.setFailed(`${workflow} is not complete yet`); - return; - } - - if (info.conclusion !== 'success') { - console.log(`${workflow} did not succeed (conclusion: ${info.conclusion})`); - core.setFailed(`${workflow} failed with conclusion: ${info.conclusion}`); - return; - } - } - - console.log('All CI workflows have passed!'); - - name: Checkout code uses: actions/checkout@v4 with: - ref: ${{ github.event.workflow_run.head_branch }} + ref: ${{ github.head_ref }} fetch-depth: 0 - name: Setup pnpm @@ -103,15 +33,8 @@ jobs: - name: Detect changed packages id: detect - env: - GH_TOKEN: ${{ github.token }} run: | - # Get PR number from workflow_run event - PR_NUMBER=$(echo '${{ toJson(github.event.workflow_run.pull_requests) }}' | jq -r '.[0].number') - - # Get PR base branch - BASE_REF=$(gh pr view $PR_NUMBER --json baseRefName -q .baseRefName) - BASE="origin/$BASE_REF" + BASE="origin/${{ github.base_ref }}" # Check which packages changed PACKAGES="" @@ -295,4 +218,4 @@ jobs: fi git commit -m "Update CI stats for changed packages [skip ci]" - git push origin HEAD:${{ github.event.workflow_run.head_branch }} + git push origin HEAD:${{ github.head_ref }} From d7ab31bc183966020e1e8ab43cfd400159c25fd1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 12 Jan 2026 09:30:56 +0000 Subject: [PATCH 14/17] Update CI stats for changed packages [skip ci] --- packages/starter-next-js/.ci-stats.json | 12 ++++++------ packages/starter-react-router/.ci-stats.json | 12 ++++++------ packages/starter-tanstack-start-react/.ci-stats.json | 12 ++++++------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/starter-next-js/.ci-stats.json b/packages/starter-next-js/.ci-stats.json index 9293217..33bd75d 100644 --- a/packages/starter-next-js/.ci-stats.json +++ b/packages/starter-next-js/.ci-stats.json @@ -1,7 +1,7 @@ { - "installTimeMs": 6793, - "coldBuildTimeMs": 8357, - "warmBuildTimeMs": 7581, - "timingMeasuredAt": "2026-01-06T08:48:59Z", - "runner": "ubuntu-latest" -} + "installTimeMs": 10880, + "coldBuildTimeMs": 7559, + "warmBuildTimeMs": 7491, + "timingMeasuredAt": "2026-01-12T09:30:56Z", + "runner": "ubuntu-latest" + } diff --git a/packages/starter-react-router/.ci-stats.json b/packages/starter-react-router/.ci-stats.json index fa3ecee..fa15679 100644 --- a/packages/starter-react-router/.ci-stats.json +++ b/packages/starter-react-router/.ci-stats.json @@ -1,7 +1,7 @@ { - "installTimeMs": 9417, - "coldBuildTimeMs": 2816, - "warmBuildTimeMs": 2788, - "timingMeasuredAt": "2026-01-12T09:19:50Z", - "runner": "ubuntu-latest" -} + "installTimeMs": 10880, + "coldBuildTimeMs": 3025, + "warmBuildTimeMs": 3019, + "timingMeasuredAt": "2026-01-12T09:30:56Z", + "runner": "ubuntu-latest" + } diff --git a/packages/starter-tanstack-start-react/.ci-stats.json b/packages/starter-tanstack-start-react/.ci-stats.json index ff5f6ff..8851c83 100644 --- a/packages/starter-tanstack-start-react/.ci-stats.json +++ b/packages/starter-tanstack-start-react/.ci-stats.json @@ -1,7 +1,7 @@ { - "installTimeMs": 10728, - "coldBuildTimeMs": 9965, - "warmBuildTimeMs": 9243, - "timingMeasuredAt": "2026-01-12T09:20:32Z", - "runner": "ubuntu-latest" -} + "installTimeMs": 10880, + "coldBuildTimeMs": 9658, + "warmBuildTimeMs": 9355, + "timingMeasuredAt": "2026-01-12T09:30:56Z", + "runner": "ubuntu-latest" + } From 93169f1515d549cc492e63fdb1de362f8dfc4116 Mon Sep 17 00:00:00 2001 From: Alexander Karan Date: Mon, 12 Jan 2026 19:21:57 +0800 Subject: [PATCH 15/17] Script updates --- .github/workflows/generate-stats.yml | 185 ++++++++++++++++++- .github/workflows/measure-all-builds.yml | 221 ----------------------- 2 files changed, 180 insertions(+), 226 deletions(-) delete mode 100644 .github/workflows/measure-all-builds.yml diff --git a/.github/workflows/generate-stats.yml b/.github/workflows/generate-stats.yml index 84acade..479369a 100644 --- a/.github/workflows/generate-stats.yml +++ b/.github/workflows/generate-stats.yml @@ -22,13 +22,184 @@ jobs: - name: Setup pnpm uses: pnpm/action-setup@v4 - - name: Setup Node.js + - name: Setup Node.js (no cache for clean measurements) uses: actions/setup-node@v4 with: node-version: '24' - cache: 'pnpm' + # No cache - we want clean measurements - - name: Install dependencies + - name: Detect changed packages + id: detect + run: | + # Check which packages changed in the last commit + PACKAGES="" + if git diff --name-only HEAD~1 HEAD | grep -q "packages/starter-next-js/"; then + PACKAGES="$PACKAGES next" + fi + if git diff --name-only HEAD~1 HEAD | grep -q "packages/starter-react-router/"; then + PACKAGES="$PACKAGES react-router" + fi + if git diff --name-only HEAD~1 HEAD | grep -q "packages/starter-tanstack-start-react/"; then + PACKAGES="$PACKAGES tanstack" + fi + if git diff --name-only HEAD~1 HEAD | grep -q "packages/starter-nuxt/"; then + PACKAGES="$PACKAGES nuxt" + fi + + # If no packages changed but package.json changed, measure all + if [ -z "$PACKAGES" ] && git diff --name-only HEAD~1 HEAD | grep -q "package.json"; then + PACKAGES="next react-router tanstack nuxt" + fi + + echo "packages=$PACKAGES" >> $GITHUB_OUTPUT + echo "Changed packages: $PACKAGES" + + - name: Measure install time (clean, no cache) + id: install + if: steps.detect.outputs.packages != '' + run: | + START=$(date +%s%N) + pnpm install --frozen-lockfile + END=$(date +%s%N) + ELAPSED=$((($END - $START) / 1000000)) + echo "time=$ELAPSED" >> $GITHUB_OUTPUT + echo "Install time: ${ELAPSED}ms" + + - name: Measure Next.js builds + if: contains(steps.detect.outputs.packages, 'next') + id: next + run: | + # Cold build + START=$(date +%s%N) + pnpm build:next + END=$(date +%s%N) + COLD=$((($END - $START) / 1000000)) + + # Warm build + START=$(date +%s%N) + pnpm build:next + END=$(date +%s%N) + WARM=$((($END - $START) / 1000000)) + + echo "cold=$COLD" >> $GITHUB_OUTPUT + echo "warm=$WARM" >> $GITHUB_OUTPUT + echo "Next.js - Cold: ${COLD}ms, Warm: ${WARM}ms" + + - name: Measure React Router builds + if: contains(steps.detect.outputs.packages, 'react-router') + id: react_router + run: | + # Cold build + START=$(date +%s%N) + pnpm build:react-router + END=$(date +%s%N) + COLD=$((($END - $START) / 1000000)) + + # Warm build + START=$(date +%s%N) + pnpm build:react-router + END=$(date +%s%N) + WARM=$((($END - $START) / 1000000)) + + echo "cold=$COLD" >> $GITHUB_OUTPUT + echo "warm=$WARM" >> $GITHUB_OUTPUT + echo "React Router - Cold: ${COLD}ms, Warm: ${WARM}ms" + + - name: Measure TanStack Start builds + if: contains(steps.detect.outputs.packages, 'tanstack') + id: tanstack + run: | + # Cold build + START=$(date +%s%N) + pnpm build:tanstack + END=$(date +%s%N) + COLD=$((($END - $START) / 1000000)) + + # Warm build + START=$(date +%s%N) + pnpm build:tanstack + END=$(date +%s%N) + WARM=$((($END - $START) / 1000000)) + + echo "cold=$COLD" >> $GITHUB_OUTPUT + echo "warm=$WARM" >> $GITHUB_OUTPUT + echo "TanStack Start - Cold: ${COLD}ms, Warm: ${WARM}ms" + + - name: Measure Nuxt builds + if: contains(steps.detect.outputs.packages, 'nuxt') + id: nuxt + run: | + # Cold build + START=$(date +%s%N) + pnpm build:nuxt + END=$(date +%s%N) + COLD=$((($END - $START) / 1000000)) + + # Warm build + START=$(date +%s%N) + pnpm build:nuxt + END=$(date +%s%N) + WARM=$((($END - $START) / 1000000)) + + echo "cold=$COLD" >> $GITHUB_OUTPUT + echo "warm=$WARM" >> $GITHUB_OUTPUT + echo "Nuxt - Cold: ${COLD}ms, Warm: ${WARM}ms" + + - name: Save all CI stats + if: steps.detect.outputs.packages != '' + run: | + TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ) + + # Save Next.js stats + if [[ "${{ steps.detect.outputs.packages }}" == *"next"* ]]; then + mkdir -p packages/starter-next-js + echo '{ + "installTimeMs": ${{ steps.install.outputs.time }}, + "coldBuildTimeMs": ${{ steps.next.outputs.cold }}, + "warmBuildTimeMs": ${{ steps.next.outputs.warm }}, + "timingMeasuredAt": "'$TIMESTAMP'", + "runner": "ubuntu-latest" + }' > packages/starter-next-js/.ci-stats.json + fi + + # Save React Router stats + if [[ "${{ steps.detect.outputs.packages }}" == *"react-router"* ]]; then + mkdir -p packages/starter-react-router + echo '{ + "installTimeMs": ${{ steps.install.outputs.time }}, + "coldBuildTimeMs": ${{ steps.react_router.outputs.cold }}, + "warmBuildTimeMs": ${{ steps.react_router.outputs.warm }}, + "timingMeasuredAt": "'$TIMESTAMP'", + "runner": "ubuntu-latest" + }' > packages/starter-react-router/.ci-stats.json + fi + + # Save TanStack Start stats + if [[ "${{ steps.detect.outputs.packages }}" == *"tanstack"* ]]; then + mkdir -p packages/starter-tanstack-start-react + echo '{ + "installTimeMs": ${{ steps.install.outputs.time }}, + "coldBuildTimeMs": ${{ steps.tanstack.outputs.cold }}, + "warmBuildTimeMs": ${{ steps.tanstack.outputs.warm }}, + "timingMeasuredAt": "'$TIMESTAMP'", + "runner": "ubuntu-latest" + }' > packages/starter-tanstack-start-react/.ci-stats.json + fi + + # Save Nuxt stats + if [[ "${{ steps.detect.outputs.packages }}" == *"nuxt"* ]]; then + mkdir -p packages/starter-nuxt + echo '{ + "installTimeMs": ${{ steps.install.outputs.time }}, + "coldBuildTimeMs": ${{ steps.nuxt.outputs.cold }}, + "warmBuildTimeMs": ${{ steps.nuxt.outputs.warm }}, + "timingMeasuredAt": "'$TIMESTAMP'", + "runner": "ubuntu-latest" + }' > packages/starter-nuxt/.ci-stats.json + fi + + - name: Install dependencies (if not already installed) + if: steps.detect.outputs.packages == '' run: pnpm install --frozen-lockfile - name: Generate stats @@ -53,15 +224,19 @@ jobs: # Commit and push changes git add . - git commit -m "Update stats after starter changes" + git commit -m "Update CI stats and generated stats after starter changes" git push --force-with-lease origin automated-stats-update # Create PR if it doesn't exist if ! gh pr view automated-stats-update &>/dev/null; then gh pr create \ - --title "Update stats after starter changes" \ + --title "Update CI stats and generated stats after starter changes" \ --body "Automated stats update triggered by changes to starter packages. + Includes: + - CI build time measurements (.ci-stats.json) + - Generated framework comparison stats + This PR was automatically created and will auto-merge if all checks pass." \ --base main \ --head automated-stats-update diff --git a/.github/workflows/measure-all-builds.yml b/.github/workflows/measure-all-builds.yml deleted file mode 100644 index dce3ee7..0000000 --- a/.github/workflows/measure-all-builds.yml +++ /dev/null @@ -1,221 +0,0 @@ -name: Measure All Build Times - -on: - pull_request: - branches: [main] - paths: - - 'packages/starter-*/**' - - 'package.json' - - 'pnpm-lock.yaml' - -jobs: - measure: - runs-on: ubuntu-latest - - permissions: - contents: write - - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - ref: ${{ github.head_ref }} - fetch-depth: 0 - - - name: Setup pnpm - uses: pnpm/action-setup@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '24' - # No cache - we want clean measurements - - - name: Detect changed packages - id: detect - run: | - BASE="origin/${{ github.base_ref }}" - - # Check which packages changed - PACKAGES="" - if git diff --name-only $BASE HEAD | grep -q "packages/starter-next-js/"; then - PACKAGES="$PACKAGES next" - fi - if git diff --name-only $BASE HEAD | grep -q "packages/starter-react-router/"; then - PACKAGES="$PACKAGES react-router" - fi - if git diff --name-only $BASE HEAD | grep -q "packages/starter-tanstack-start-react/"; then - PACKAGES="$PACKAGES tanstack" - fi - if git diff --name-only $BASE HEAD | grep -q "packages/starter-nuxt/"; then - PACKAGES="$PACKAGES nuxt" - fi - - # If no packages changed but pnpm-lock.yaml changed, measure all - if [ -z "$PACKAGES" ] && git diff --name-only $BASE HEAD | grep -q "pnpm-lock.yaml"; then - PACKAGES="next react-router tanstack nuxt" - fi - - echo "packages=$PACKAGES" >> $GITHUB_OUTPUT - echo "Changed packages: $PACKAGES" - - - name: Measure install time - id: install - if: steps.detect.outputs.packages != '' - run: | - START=$(date +%s%N) - pnpm install --frozen-lockfile - END=$(date +%s%N) - ELAPSED=$((($END - $START) / 1000000)) - echo "time=$ELAPSED" >> $GITHUB_OUTPUT - echo "Install time: ${ELAPSED}ms" - - - name: Measure Next.js builds - if: contains(steps.detect.outputs.packages, 'next') - id: next - run: | - # Cold build - START=$(date +%s%N) - pnpm build:next - END=$(date +%s%N) - COLD=$((($END - $START) / 1000000)) - - # Warm build - START=$(date +%s%N) - pnpm build:next - END=$(date +%s%N) - WARM=$((($END - $START) / 1000000)) - - echo "cold=$COLD" >> $GITHUB_OUTPUT - echo "warm=$WARM" >> $GITHUB_OUTPUT - echo "Next.js - Cold: ${COLD}ms, Warm: ${WARM}ms" - - - name: Measure React Router builds - if: contains(steps.detect.outputs.packages, 'react-router') - id: react_router - run: | - # Cold build - START=$(date +%s%N) - pnpm build:react-router - END=$(date +%s%N) - COLD=$((($END - $START) / 1000000)) - - # Warm build - START=$(date +%s%N) - pnpm build:react-router - END=$(date +%s%N) - WARM=$((($END - $START) / 1000000)) - - echo "cold=$COLD" >> $GITHUB_OUTPUT - echo "warm=$WARM" >> $GITHUB_OUTPUT - echo "React Router - Cold: ${COLD}ms, Warm: ${WARM}ms" - - - name: Measure TanStack Start builds - if: contains(steps.detect.outputs.packages, 'tanstack') - id: tanstack - run: | - # Cold build - START=$(date +%s%N) - pnpm build:tanstack - END=$(date +%s%N) - COLD=$((($END - $START) / 1000000)) - - # Warm build - START=$(date +%s%N) - pnpm build:tanstack - END=$(date +%s%N) - WARM=$((($END - $START) / 1000000)) - - echo "cold=$COLD" >> $GITHUB_OUTPUT - echo "warm=$WARM" >> $GITHUB_OUTPUT - echo "TanStack Start - Cold: ${COLD}ms, Warm: ${WARM}ms" - - - name: Measure Nuxt builds - if: contains(steps.detect.outputs.packages, 'nuxt') - id: nuxt - run: | - # Cold build - START=$(date +%s%N) - pnpm build:nuxt - END=$(date +%s%N) - COLD=$((($END - $START) / 1000000)) - - # Warm build - START=$(date +%s%N) - pnpm build:nuxt - END=$(date +%s%N) - WARM=$((($END - $START) / 1000000)) - - echo "cold=$COLD" >> $GITHUB_OUTPUT - echo "warm=$WARM" >> $GITHUB_OUTPUT - echo "Nuxt - Cold: ${COLD}ms, Warm: ${WARM}ms" - - - name: Save all CI stats - if: steps.detect.outputs.packages != '' - run: | - TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ) - - # Save Next.js stats - if [[ "${{ steps.detect.outputs.packages }}" == *"next"* ]]; then - mkdir -p packages/starter-next-js - echo '{ - "installTimeMs": ${{ steps.install.outputs.time }}, - "coldBuildTimeMs": ${{ steps.next.outputs.cold }}, - "warmBuildTimeMs": ${{ steps.next.outputs.warm }}, - "timingMeasuredAt": "'$TIMESTAMP'", - "runner": "ubuntu-latest" - }' > packages/starter-next-js/.ci-stats.json - fi - - # Save React Router stats - if [[ "${{ steps.detect.outputs.packages }}" == *"react-router"* ]]; then - mkdir -p packages/starter-react-router - echo '{ - "installTimeMs": ${{ steps.install.outputs.time }}, - "coldBuildTimeMs": ${{ steps.react_router.outputs.cold }}, - "warmBuildTimeMs": ${{ steps.react_router.outputs.warm }}, - "timingMeasuredAt": "'$TIMESTAMP'", - "runner": "ubuntu-latest" - }' > packages/starter-react-router/.ci-stats.json - fi - - # Save TanStack Start stats - if [[ "${{ steps.detect.outputs.packages }}" == *"tanstack"* ]]; then - mkdir -p packages/starter-tanstack-start-react - echo '{ - "installTimeMs": ${{ steps.install.outputs.time }}, - "coldBuildTimeMs": ${{ steps.tanstack.outputs.cold }}, - "warmBuildTimeMs": ${{ steps.tanstack.outputs.warm }}, - "timingMeasuredAt": "'$TIMESTAMP'", - "runner": "ubuntu-latest" - }' > packages/starter-tanstack-start-react/.ci-stats.json - fi - - # Save Nuxt stats - if [[ "${{ steps.detect.outputs.packages }}" == *"nuxt"* ]]; then - mkdir -p packages/starter-nuxt - echo '{ - "installTimeMs": ${{ steps.install.outputs.time }}, - "coldBuildTimeMs": ${{ steps.nuxt.outputs.cold }}, - "warmBuildTimeMs": ${{ steps.nuxt.outputs.warm }}, - "timingMeasuredAt": "'$TIMESTAMP'", - "runner": "ubuntu-latest" - }' > packages/starter-nuxt/.ci-stats.json - fi - - - name: Commit all CI stats - if: steps.detect.outputs.packages != '' - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - - # Add all stats files - git add packages/*/.ci-stats.json - - if git diff --staged --quiet; then - echo "No changes to commit" - exit 0 - fi - - git commit -m "Update CI stats for changed packages [skip ci]" - git push origin HEAD:${{ github.head_ref }} From ab01dd5a5cb4dd839ddd14a2ef1c54769654dd01 Mon Sep 17 00:00:00 2001 From: Alexander Karan Date: Mon, 12 Jan 2026 19:23:09 +0800 Subject: [PATCH 16/17] Cleaned comment --- packages/starter-next-js/app/page.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/starter-next-js/app/page.tsx b/packages/starter-next-js/app/page.tsx index 98832b0..d25913f 100644 --- a/packages/starter-next-js/app/page.tsx +++ b/packages/starter-next-js/app/page.tsx @@ -1,7 +1,5 @@ import Image from 'next/image' -// A comment - export default function Home() { return (
From 5a379ece7be66fc8eb56425df99f40c97fe351e3 Mon Sep 17 00:00:00 2001 From: Alexander Karan Date: Mon, 12 Jan 2026 19:25:52 +0800 Subject: [PATCH 17/17] Format --- packages/starter-next-js/.ci-stats.json | 12 ++++++------ packages/starter-react-router/.ci-stats.json | 12 ++++++------ packages/starter-tanstack-start-react/.ci-stats.json | 12 ++++++------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/starter-next-js/.ci-stats.json b/packages/starter-next-js/.ci-stats.json index 33bd75d..e92f783 100644 --- a/packages/starter-next-js/.ci-stats.json +++ b/packages/starter-next-js/.ci-stats.json @@ -1,7 +1,7 @@ { - "installTimeMs": 10880, - "coldBuildTimeMs": 7559, - "warmBuildTimeMs": 7491, - "timingMeasuredAt": "2026-01-12T09:30:56Z", - "runner": "ubuntu-latest" - } + "installTimeMs": 10880, + "coldBuildTimeMs": 7559, + "warmBuildTimeMs": 7491, + "timingMeasuredAt": "2026-01-12T09:30:56Z", + "runner": "ubuntu-latest" +} diff --git a/packages/starter-react-router/.ci-stats.json b/packages/starter-react-router/.ci-stats.json index fa15679..90e9c05 100644 --- a/packages/starter-react-router/.ci-stats.json +++ b/packages/starter-react-router/.ci-stats.json @@ -1,7 +1,7 @@ { - "installTimeMs": 10880, - "coldBuildTimeMs": 3025, - "warmBuildTimeMs": 3019, - "timingMeasuredAt": "2026-01-12T09:30:56Z", - "runner": "ubuntu-latest" - } + "installTimeMs": 10880, + "coldBuildTimeMs": 3025, + "warmBuildTimeMs": 3019, + "timingMeasuredAt": "2026-01-12T09:30:56Z", + "runner": "ubuntu-latest" +} diff --git a/packages/starter-tanstack-start-react/.ci-stats.json b/packages/starter-tanstack-start-react/.ci-stats.json index 8851c83..5913124 100644 --- a/packages/starter-tanstack-start-react/.ci-stats.json +++ b/packages/starter-tanstack-start-react/.ci-stats.json @@ -1,7 +1,7 @@ { - "installTimeMs": 10880, - "coldBuildTimeMs": 9658, - "warmBuildTimeMs": 9355, - "timingMeasuredAt": "2026-01-12T09:30:56Z", - "runner": "ubuntu-latest" - } + "installTimeMs": 10880, + "coldBuildTimeMs": 9658, + "warmBuildTimeMs": 9355, + "timingMeasuredAt": "2026-01-12T09:30:56Z", + "runner": "ubuntu-latest" +}