Skip to content

Commit 0537522

Browse files
authored
Add Dependabot and compatibility workflow (#29)
* Add dependency and compatibility automation * Use frozen lockfile for compatibility workflow
1 parent b1c1f23 commit 0537522

3 files changed

Lines changed: 223 additions & 0 deletions

File tree

.github/dependabot.yml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
version: 2
2+
updates:
3+
- package-ecosystem: npm
4+
directory: /packages/core/__tests__/fixtures/next
5+
schedule:
6+
interval: daily
7+
time: "14:00"
8+
timezone: America/Boise
9+
open-pull-requests-limit: 5
10+
labels:
11+
- dependencies
12+
- compat
13+
allow:
14+
- dependency-name: next
15+
- dependency-name: react
16+
- dependency-name: react-dom
17+
- dependency-name: "@types/react"
18+
- dependency-name: "@types/react-dom"
19+
groups:
20+
next-stack:
21+
patterns:
22+
- next
23+
- react
24+
- react-dom
25+
- "@types/react"
26+
- "@types/react-dom"
27+
28+
- package-ecosystem: npm
29+
directory: /packages/core/__tests__/fixtures/vite
30+
schedule:
31+
interval: daily
32+
time: "14:00"
33+
timezone: America/Boise
34+
open-pull-requests-limit: 5
35+
labels:
36+
- dependencies
37+
- compat
38+
allow:
39+
- dependency-name: react
40+
- dependency-name: react-dom
41+
- dependency-name: "@types/react"
42+
- dependency-name: "@types/react-dom"
43+
groups:
44+
react-stack:
45+
patterns:
46+
- react
47+
- react-dom
48+
- "@types/react"
49+
- "@types/react-dom"

.github/workflows/compat.yml

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
name: Compatibility
2+
3+
on:
4+
schedule:
5+
- cron: '0 14 * * 1'
6+
workflow_dispatch:
7+
inputs:
8+
next_version:
9+
description: Next.js version or dist-tag
10+
required: false
11+
default: latest
12+
react_version:
13+
description: React and react-dom version or dist-tag
14+
required: false
15+
default: latest
16+
react_dom_version:
17+
description: Optional react-dom override
18+
required: false
19+
default: ''
20+
types_react_version:
21+
description: Optional @types/react override
22+
required: false
23+
default: latest
24+
types_react_dom_version:
25+
description: Optional @types/react-dom override
26+
required: false
27+
default: latest
28+
29+
permissions:
30+
contents: read
31+
32+
concurrency:
33+
group: compatibility-${{ github.workflow }}-${{ github.ref }}
34+
cancel-in-progress: true
35+
36+
jobs:
37+
latest-stack:
38+
name: Latest React / Next Stack
39+
runs-on: ubuntu-latest
40+
timeout-minutes: 30
41+
env:
42+
NEXT_VERSION: ${{ github.event.inputs.next_version || 'latest' }}
43+
REACT_VERSION: ${{ github.event.inputs.react_version || 'latest' }}
44+
REACT_DOM_VERSION: ${{ github.event.inputs.react_dom_version || '' }}
45+
TYPES_REACT_VERSION: ${{ github.event.inputs.types_react_version || 'latest' }}
46+
TYPES_REACT_DOM_VERSION: ${{ github.event.inputs.types_react_dom_version || 'latest' }}
47+
48+
steps:
49+
- uses: actions/checkout@v4
50+
51+
- uses: pnpm/action-setup@v3
52+
with:
53+
version: 10.12.1
54+
run_install: false
55+
56+
- uses: actions/setup-node@v4
57+
with:
58+
node-version: 22
59+
cache: pnpm
60+
61+
- name: Install workspace dependencies
62+
run: pnpm install --frozen-lockfile
63+
64+
- name: Cache Playwright browsers
65+
id: pw-cache
66+
uses: actions/cache@v4
67+
with:
68+
path: ~/.cache/ms-playwright
69+
key: ${{ runner.os }}-playwright-${{ hashFiles('packages/core/package.json') }}
70+
restore-keys: |
71+
${{ runner.os }}-playwright-
72+
73+
- name: Install Playwright browsers (if cache miss)
74+
if: steps.pw-cache.outputs.cache-hit != 'true'
75+
run: pnpm --filter @react-zero-ui/core exec playwright install --with-deps
76+
77+
- name: Rewrite fixture versions
78+
run: node scripts/set-compat-fixture-versions.mjs
79+
80+
- name: Lint
81+
run: pnpm lint
82+
83+
- name: Run Build
84+
run: pnpm build
85+
86+
- name: Run Prepack
87+
run: pnpm prepack:core
88+
89+
- name: Install packed core into fixtures
90+
run: |
91+
TARBALL="$(pwd)/$(ls -t dist/*.tgz | head -n1)"
92+
pnpm --dir packages/core/__tests__/fixtures/next add "$TARBALL"
93+
pnpm --dir packages/core/__tests__/fixtures/next install --no-frozen-lockfile
94+
pnpm --dir packages/core/__tests__/fixtures/vite add "$TARBALL"
95+
pnpm --dir packages/core/__tests__/fixtures/vite install --no-frozen-lockfile
96+
97+
- name: Run Vite tests
98+
run: pnpm test:vite
99+
100+
- name: Run Next.js tests
101+
run: pnpm test:next
102+
103+
- name: Run unit tests
104+
run: pnpm test:unit
105+
106+
- name: Run CLI tests
107+
run: pnpm test:cli
108+
109+
- name: Run integration tests
110+
run: pnpm test:integration
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import { readFile, writeFile } from 'node:fs/promises';
2+
import path from 'node:path';
3+
4+
const rootDir = process.cwd();
5+
const dryRun = process.env.DRY_RUN === '1';
6+
7+
function envOrDefault(name, fallback) {
8+
const value = process.env[name]?.trim();
9+
return value ? value : fallback;
10+
}
11+
12+
const versions = {
13+
next: envOrDefault('NEXT_VERSION', 'latest'),
14+
react: envOrDefault('REACT_VERSION', 'latest'),
15+
reactDom: envOrDefault('REACT_DOM_VERSION', envOrDefault('REACT_VERSION', 'latest')),
16+
typesReact: envOrDefault('TYPES_REACT_VERSION', 'latest'),
17+
typesReactDom: envOrDefault('TYPES_REACT_DOM_VERSION', 'latest'),
18+
};
19+
20+
const manifests = [
21+
{
22+
file: 'packages/core/__tests__/fixtures/next/package.json',
23+
update(pkg) {
24+
pkg.dependencies.next = versions.next;
25+
pkg.dependencies.react = versions.react;
26+
pkg.dependencies['react-dom'] = versions.reactDom;
27+
pkg.devDependencies['@types/react'] = versions.typesReact;
28+
if (pkg.devDependencies['@types/react-dom']) {
29+
pkg.devDependencies['@types/react-dom'] = versions.typesReactDom;
30+
}
31+
return pkg;
32+
},
33+
},
34+
{
35+
file: 'packages/core/__tests__/fixtures/vite/package.json',
36+
update(pkg) {
37+
pkg.dependencies.react = versions.react;
38+
pkg.dependencies['react-dom'] = versions.reactDom;
39+
pkg.devDependencies['@types/react'] = versions.typesReact;
40+
if (pkg.devDependencies['@types/react-dom']) {
41+
pkg.devDependencies['@types/react-dom'] = versions.typesReactDom;
42+
}
43+
return pkg;
44+
},
45+
},
46+
];
47+
48+
for (const manifest of manifests) {
49+
const manifestPath = path.join(rootDir, manifest.file);
50+
const pkg = JSON.parse(await readFile(manifestPath, 'utf8'));
51+
const updated = manifest.update(pkg);
52+
53+
if (dryRun) {
54+
console.log(`[compat] Would update ${manifest.file}`);
55+
continue;
56+
}
57+
58+
await writeFile(manifestPath, `${JSON.stringify(updated, null, 2)}\n`);
59+
console.log(`[compat] Updated ${manifest.file}`);
60+
}
61+
62+
console.log(
63+
`[compat] Using versions: next=${versions.next}, react=${versions.react}, react-dom=${versions.reactDom}, @types/react=${versions.typesReact}, @types/react-dom=${versions.typesReactDom}`
64+
);

0 commit comments

Comments
 (0)