From d8e2dbf00ecb530b3188fec1214ae65d001ca7e3 Mon Sep 17 00:00:00 2001 From: LongYinan Date: Thu, 25 Dec 2025 12:07:52 +0800 Subject: [PATCH 01/18] ci: auto upgrade deps and create pr --- .github/scripts/upgrade-deps.mjs | 107 +++++++++++++++++++++++++++++ .github/workflows/e2e-test.yml | 1 + .github/workflows/upgrade-deps.yml | 71 +++++++++++++++++++ 3 files changed, 179 insertions(+) create mode 100644 .github/scripts/upgrade-deps.mjs create mode 100644 .github/workflows/upgrade-deps.yml diff --git a/.github/scripts/upgrade-deps.mjs b/.github/scripts/upgrade-deps.mjs new file mode 100644 index 0000000000..6f0ef5df34 --- /dev/null +++ b/.github/scripts/upgrade-deps.mjs @@ -0,0 +1,107 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +const ROOT = process.cwd(); + +// ============ GitHub API ============ +async function getLatestTagCommit(owner, repo) { + const res = await fetch(`https://api.github.com/repos/${owner}/${repo}/tags`, { + headers: { + Authorization: `token ${process.env.GITHUB_TOKEN}`, + Accept: 'application/vnd.github.v3+json', + }, + }); + const tags = await res.json(); + if (!tags.length) throw new Error(`No tags found for ${owner}/${repo}`); + return tags[0].commit.sha; +} + +// ============ npm Registry ============ +async function getLatestNpmVersion(packageName) { + const res = await fetch(`https://registry.npmjs.org/${packageName}/latest`); + const data = await res.json(); + return data.version; +} + +// ============ Update .upstream-versions.json ============ +async function updateUpstreamVersions() { + const filePath = path.join(ROOT, 'packages/tools/.upstream-versions.json'); + const data = JSON.parse(fs.readFileSync(filePath, 'utf8')); + + // rolldown -> rolldown/rolldown + data.rolldown.hash = await getLatestTagCommit('rolldown', 'rolldown'); + + // rolldown-vite -> vitejs/vite + data['rolldown-vite'].hash = await getLatestTagCommit('vitejs', 'vite'); + + fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n'); + console.log('Updated .upstream-versions.json'); +} + +// ============ Update pnpm-workspace.yaml ============ +async function updatePnpmWorkspace(vitestVersion, tsdownVersion) { + const filePath = path.join(ROOT, 'pnpm-workspace.yaml'); + let content = fs.readFileSync(filePath, 'utf8'); + + // Update vitest-dev override + content = content.replace( + /vitest-dev: npm:vitest@\^[\d.]+/, + `vitest-dev: npm:vitest@^${vitestVersion}`, + ); + + // Update tsdown in catalog + content = content.replace(/tsdown: \^[\d.]+/, `tsdown: ^${tsdownVersion}`); + + fs.writeFileSync(filePath, content); + console.log('Updated pnpm-workspace.yaml'); +} + +// ============ Update packages/test/package.json ============ +async function updateTestPackage(vitestVersion) { + const filePath = path.join(ROOT, 'packages/test/package.json'); + const pkg = JSON.parse(fs.readFileSync(filePath, 'utf8')); + + // Update all @vitest/* devDependencies + for (const dep of Object.keys(pkg.devDependencies)) { + if (dep.startsWith('@vitest/')) { + pkg.devDependencies[dep] = vitestVersion; + } + } + + // Update vitest-dev devDependency + if (pkg.devDependencies['vitest-dev']) { + pkg.devDependencies['vitest-dev'] = `^${vitestVersion}`; + } + + // Update @vitest/ui peerDependency if present + if (pkg.peerDependencies?.['@vitest/ui']) { + pkg.peerDependencies['@vitest/ui'] = vitestVersion; + } + + fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\n'); + console.log('Updated packages/test/package.json'); +} + +// ============ Main ============ +async function main() { + console.log('Fetching latest versions...'); + + const [vitestVersion, tsdownVersion] = await Promise.all([ + getLatestNpmVersion('vitest'), + getLatestNpmVersion('tsdown'), + ]); + + console.log(`vitest: ${vitestVersion}`); + console.log(`tsdown: ${tsdownVersion}`); + + await updateUpstreamVersions(); + await updatePnpmWorkspace(vitestVersion, tsdownVersion); + await updateTestPackage(vitestVersion); + + console.log('Done!'); +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index dd9b517b35..bab6e6b6bf 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -7,6 +7,7 @@ on: push: branches: - main + - deps/upstream-update paths-ignore: - '**/*.md' pull_request: diff --git a/.github/workflows/upgrade-deps.yml b/.github/workflows/upgrade-deps.yml new file mode 100644 index 0000000000..fe4bbcf9d7 --- /dev/null +++ b/.github/workflows/upgrade-deps.yml @@ -0,0 +1,71 @@ +name: Upgrade Upstream Dependencies + +on: + schedule: + - cron: '0 0 * * *' # Daily at midnight UTC + workflow_dispatch: # Manual trigger + +permissions: {} + +jobs: + upgrade: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - uses: ./.github/actions/clone + + - name: Configure Git for access to vite-task + run: git config --global url."https://x-access-token:${{ secrets.VITE_TASK_TOKEN }}@github.com/".insteadOf "https://github.com/" + + - uses: oxc-project/setup-rust@d286d43bc1f606abbd98096666ff8be68c8d5f57 # v1.0.0 + with: + save-cache: ${{ github.ref_name == 'main' }} + cache-key: upgrade-deps + + - uses: oxc-project/setup-node@fdbf0dfd334c4e6d56ceeb77d91c76339c2a0885 # v1.0.4 + + - name: Rustup Adds Target + run: rustup target add x86_64-unknown-linux-gnu + + - name: Rustup Adds Target for rolldown + working-directory: rolldown + run: rustup target add x86_64-unknown-linux-gnu + + - name: Upgrade dependencies + id: upgrade + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: node .github/scripts/upgrade-deps.mjs + + - name: Sync remote and build + id: build + continue-on-error: true # Create PR even if build fails + run: | + pnpm install --no-frozen-lockfile + pnpm tool sync-remote + pnpm install --no-frozen-lockfile + + - name: Build + uses: ./.github/actions/build-upstream + with: + target: x86_64-unknown-linux-gnu + build-rolldown-native: 'true' + + - name: Create/Update PR + uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8 + with: + branch: deps/upstream-update + title: 'feat(deps): upgrade upstream dependencies' + body: | + Automated daily upgrade of upstream dependencies: + - rolldown (latest tag) + - rolldown-vite (latest tag) + - vitest (latest npm version) + - tsdown (latest npm version) + + Build status: ${{ steps.build.outcome }} + commit-message: 'feat(deps): upgrade upstream dependencies' + delete-branch: true From d4e58fd01a93bba37372ce02adef74660cfb0bc5 Mon Sep 17 00:00:00 2001 From: LongYinan Date: Thu, 25 Dec 2025 16:25:07 +0800 Subject: [PATCH 02/18] allow oxc packages conflict --- packages/tools/src/sync-remote-deps.ts | 35 ++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/packages/tools/src/sync-remote-deps.ts b/packages/tools/src/sync-remote-deps.ts index 02be663785..881239d06e 100755 --- a/packages/tools/src/sync-remote-deps.ts +++ b/packages/tools/src/sync-remote-deps.ts @@ -391,6 +391,31 @@ function mergePackageExports( ); } +// Oxc-related packages that should use the higher version on conflict +const OXC_PACKAGE_PREFIXES = [ + '@oxc-project/', + '@oxlint/', + '@oxc-minify/', + '@oxc-parser/', + '@oxc-resolver/', + '@oxc-transform/', + '@oxfmt/', + '@oxlint-tsgolint/', +]; +const OXC_PACKAGES = new Set([ + 'oxc-minify', + 'oxc-parser', + 'oxc-transform', + 'oxfmt', + 'oxlint', + 'oxlint-tsgolint', +]); + +function isOxcPackage(packageName: string): boolean { + if (OXC_PACKAGES.has(packageName)) return true; + return OXC_PACKAGE_PREFIXES.some((prefix) => packageName.startsWith(prefix)); +} + function mergeSemverVersions( v1: string, v2: string, @@ -405,6 +430,16 @@ function mergeSemverVersions( const isExact2 = v2.startsWith('='); if (isExact1 || isExact2) { if (isExact1 && isExact2 && v1 !== v2) { + // For oxc-related packages, use the higher version + if (isOxcPackage(packageName)) { + const ver1 = v1.slice(1); // Remove '=' prefix + const ver2 = v2.slice(1); + if (semver.valid(ver1) && semver.valid(ver2)) { + const higher = semver.gt(ver1, ver2) ? v1 : v2; + log(`Resolving ${packageName} version conflict: ${v1} vs ${v2} -> ${higher}`); + return higher; + } + } error(`Incompatible exact versions for ${packageName}: ${v1} vs ${v2}`); } return isExact1 ? v1 : v2; From 7412d1a1b77fd081478d9307565aed39e9159e28 Mon Sep 17 00:00:00 2001 From: LongYinan Date: Thu, 25 Dec 2025 16:31:03 +0800 Subject: [PATCH 03/18] allow tinybench --- packages/tools/src/sync-remote-deps.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/tools/src/sync-remote-deps.ts b/packages/tools/src/sync-remote-deps.ts index 881239d06e..5d4be97a94 100755 --- a/packages/tools/src/sync-remote-deps.ts +++ b/packages/tools/src/sync-remote-deps.ts @@ -409,6 +409,7 @@ const OXC_PACKAGES = new Set([ 'oxfmt', 'oxlint', 'oxlint-tsgolint', + 'tinybench', ]); function isOxcPackage(packageName: string): boolean { From f1fc969652cedf86af96b5a8bfe0382d2aaf4e06 Mon Sep 17 00:00:00 2001 From: LongYinan Date: Thu, 25 Dec 2025 16:35:20 +0800 Subject: [PATCH 04/18] allow tinybench --- packages/tools/src/sync-remote-deps.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/tools/src/sync-remote-deps.ts b/packages/tools/src/sync-remote-deps.ts index 5d4be97a94..dd942d6ea7 100755 --- a/packages/tools/src/sync-remote-deps.ts +++ b/packages/tools/src/sync-remote-deps.ts @@ -409,11 +409,12 @@ const OXC_PACKAGES = new Set([ 'oxfmt', 'oxlint', 'oxlint-tsgolint', - 'tinybench', ]); +const VITEST_DEPS = new Set(['tinybench']); -function isOxcPackage(packageName: string): boolean { - if (OXC_PACKAGES.has(packageName)) return true; +// These packages should always use the highest version +function syncedPackages(packageName: string): boolean { + if (OXC_PACKAGES.has(packageName) || VITEST_DEPS.has(packageName)) return true; return OXC_PACKAGE_PREFIXES.some((prefix) => packageName.startsWith(prefix)); } @@ -432,7 +433,7 @@ function mergeSemverVersions( if (isExact1 || isExact2) { if (isExact1 && isExact2 && v1 !== v2) { // For oxc-related packages, use the higher version - if (isOxcPackage(packageName)) { + if (syncedPackages(packageName)) { const ver1 = v1.slice(1); // Remove '=' prefix const ver2 = v2.slice(1); if (semver.valid(ver1) && semver.valid(ver2)) { @@ -478,6 +479,12 @@ function mergeSemverVersions( // Check if major versions are compatible if (major1 !== major2) { + // For synced packages, use the higher major version + if (syncedPackages(packageName)) { + const higher = major1 > major2 ? v1 : v2; + log(`Resolving ${packageName} major version conflict: ${v1} vs ${v2} -> ${higher}`); + return higher; + } error( `Incompatible semver ranges for ${packageName}: ${v1} (major: ${major1}) vs ${v2} (major: ${major2})`, ); From a1c8ea16b724b4726a6f9eb9c444c2b96d6ccffe Mon Sep 17 00:00:00 2001 From: LongYinan Date: Thu, 25 Dec 2025 17:02:54 +0800 Subject: [PATCH 05/18] fix sync --- packages/tools/src/sync-remote-deps.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/tools/src/sync-remote-deps.ts b/packages/tools/src/sync-remote-deps.ts index dd942d6ea7..b828ab77af 100755 --- a/packages/tools/src/sync-remote-deps.ts +++ b/packages/tools/src/sync-remote-deps.ts @@ -667,7 +667,7 @@ export async function syncRemote() { semver = await import('semver'); } catch { log('Dependencies not found, running pnpm install...'); - execCommand('pnpm install', rootDir); + execCommand('pnpm install --no-frozen-lockfile', rootDir); log('Retrying imports...'); const yaml = await import('@std/yaml'); parseYaml = yaml.parse; @@ -711,7 +711,7 @@ export async function syncRemote() { log('✓ pnpm-workspace.yaml updated successfully!'); - execCommand('pnpm install', rootDir); + execCommand('pnpm install --no-frozen-lockfile', rootDir); // Merge package.json exports log('Merging package.json exports...'); From e1955871ccebaab34a3d9c1c0c784e15db60298e Mon Sep 17 00:00:00 2001 From: LongYinan Date: Thu, 25 Dec 2025 17:23:14 +0800 Subject: [PATCH 06/18] pr target --- .github/workflows/upgrade-deps.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/upgrade-deps.yml b/.github/workflows/upgrade-deps.yml index fe4bbcf9d7..da3ebea39a 100644 --- a/.github/workflows/upgrade-deps.yml +++ b/.github/workflows/upgrade-deps.yml @@ -57,6 +57,7 @@ jobs: - name: Create/Update PR uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8 with: + base: main branch: deps/upstream-update title: 'feat(deps): upgrade upstream dependencies' body: | From d5d7a12b80f0181e5738024def35cf8ae3123ae3 Mon Sep 17 00:00:00 2001 From: LongYinan Date: Thu, 25 Dec 2025 21:08:02 +0800 Subject: [PATCH 07/18] sign commit --- .github/workflows/upgrade-deps.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/upgrade-deps.yml b/.github/workflows/upgrade-deps.yml index da3ebea39a..9a98476575 100644 --- a/.github/workflows/upgrade-deps.yml +++ b/.github/workflows/upgrade-deps.yml @@ -60,6 +60,7 @@ jobs: base: main branch: deps/upstream-update title: 'feat(deps): upgrade upstream dependencies' + sign-commits: true body: | Automated daily upgrade of upstream dependencies: - rolldown (latest tag) From c20458aff9af3f2303480954999496ddf2c49d0b Mon Sep 17 00:00:00 2001 From: LongYinan Date: Thu, 25 Dec 2025 22:29:09 +0800 Subject: [PATCH 08/18] sign commit --- .github/workflows/upgrade-deps.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/upgrade-deps.yml b/.github/workflows/upgrade-deps.yml index 9a98476575..88455e8dc4 100644 --- a/.github/workflows/upgrade-deps.yml +++ b/.github/workflows/upgrade-deps.yml @@ -55,7 +55,7 @@ jobs: build-rolldown-native: 'true' - name: Create/Update PR - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8 + uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7.0.11 with: base: main branch: deps/upstream-update @@ -71,3 +71,4 @@ jobs: Build status: ${{ steps.build.outcome }} commit-message: 'feat(deps): upgrade upstream dependencies' delete-branch: true + token: ${{ secrets.GITHUB_TOKEN }} From 37dcb4aee9f4549cce0c73d698add87fc5c76e3b Mon Sep 17 00:00:00 2001 From: LongYinan Date: Fri, 26 Dec 2025 12:25:40 +0800 Subject: [PATCH 09/18] fix: add API response validation and pre-release version support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add res.ok checks to getLatestTagCommit and getLatestNpmVersion - Validate response structure before accessing properties - Expand regex patterns to handle pre-release versions (-beta.1, -rc.0) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .github/scripts/upgrade-deps.mjs | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/.github/scripts/upgrade-deps.mjs b/.github/scripts/upgrade-deps.mjs index 6f0ef5df34..5ac187359b 100644 --- a/.github/scripts/upgrade-deps.mjs +++ b/.github/scripts/upgrade-deps.mjs @@ -11,15 +11,29 @@ async function getLatestTagCommit(owner, repo) { Accept: 'application/vnd.github.v3+json', }, }); + if (!res.ok) { + throw new Error(`Failed to fetch tags for ${owner}/${repo}: ${res.status} ${res.statusText}`); + } const tags = await res.json(); - if (!tags.length) throw new Error(`No tags found for ${owner}/${repo}`); + if (!Array.isArray(tags) || !tags.length) { + throw new Error(`No tags found for ${owner}/${repo}`); + } + if (!tags[0]?.commit?.sha) { + throw new Error(`Invalid tag structure for ${owner}/${repo}: missing commit SHA`); + } return tags[0].commit.sha; } // ============ npm Registry ============ async function getLatestNpmVersion(packageName) { const res = await fetch(`https://registry.npmjs.org/${packageName}/latest`); + if (!res.ok) { + throw new Error(`Failed to fetch npm version for ${packageName}: ${res.status} ${res.statusText}`); + } const data = await res.json(); + if (!data?.version) { + throw new Error(`Invalid npm response for ${packageName}: missing version field`); + } return data.version; } @@ -43,14 +57,14 @@ async function updatePnpmWorkspace(vitestVersion, tsdownVersion) { const filePath = path.join(ROOT, 'pnpm-workspace.yaml'); let content = fs.readFileSync(filePath, 'utf8'); - // Update vitest-dev override + // Update vitest-dev override (handle pre-release versions like -beta.1, -rc.0) content = content.replace( - /vitest-dev: npm:vitest@\^[\d.]+/, + /vitest-dev: npm:vitest@\^[\d.]+(-[\w.]+)?/, `vitest-dev: npm:vitest@^${vitestVersion}`, ); - // Update tsdown in catalog - content = content.replace(/tsdown: \^[\d.]+/, `tsdown: ^${tsdownVersion}`); + // Update tsdown in catalog (handle pre-release versions) + content = content.replace(/tsdown: \^[\d.]+(-[\w.]+)?/, `tsdown: ^${tsdownVersion}`); fs.writeFileSync(filePath, content); console.log('Updated pnpm-workspace.yaml'); From 587bf11981b56975f59e4467ca8f3254fb603814 Mon Sep 17 00:00:00 2001 From: LongYinan Date: Fri, 26 Dec 2025 12:46:49 +0800 Subject: [PATCH 10/18] update lockfile again after build --- .github/workflows/upgrade-deps.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/upgrade-deps.yml b/.github/workflows/upgrade-deps.yml index 88455e8dc4..901617a184 100644 --- a/.github/workflows/upgrade-deps.yml +++ b/.github/workflows/upgrade-deps.yml @@ -54,6 +54,9 @@ jobs: target: x86_64-unknown-linux-gnu build-rolldown-native: 'true' + - name: Update lockfile + run: pnpm install --no-frozen-lockfile + - name: Create/Update PR uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7.0.11 with: From 0e228680c821efbd48834d4fffd2c9a099e0e7e0 Mon Sep 17 00:00:00 2001 From: LongYinan Date: Fri, 26 Dec 2025 16:49:30 +0800 Subject: [PATCH 11/18] also dedupe lockfile --- .github/workflows/upgrade-deps.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/upgrade-deps.yml b/.github/workflows/upgrade-deps.yml index 901617a184..71e69e8708 100644 --- a/.github/workflows/upgrade-deps.yml +++ b/.github/workflows/upgrade-deps.yml @@ -55,7 +55,9 @@ jobs: build-rolldown-native: 'true' - name: Update lockfile - run: pnpm install --no-frozen-lockfile + run: | + pnpm install --no-frozen-lockfile + pnpm dedupe - name: Create/Update PR uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7.0.11 From db2232171e9637b5c09491c772d411b6f9cb6f43 Mon Sep 17 00:00:00 2001 From: LongYinan Date: Fri, 26 Dec 2025 17:33:45 +0800 Subject: [PATCH 12/18] Update @vitejs/devtools --- .github/scripts/upgrade-deps.mjs | 53 +++++++++++++++++++++++++------- packages/core/package.json | 9 +++--- pnpm-lock.yaml | 6 ++-- pnpm-workspace.yaml | 33 ++++++++------------ 4 files changed, 62 insertions(+), 39 deletions(-) diff --git a/.github/scripts/upgrade-deps.mjs b/.github/scripts/upgrade-deps.mjs index 5ac187359b..87d0cbfa5d 100644 --- a/.github/scripts/upgrade-deps.mjs +++ b/.github/scripts/upgrade-deps.mjs @@ -5,21 +5,28 @@ const ROOT = process.cwd(); // ============ GitHub API ============ async function getLatestTagCommit(owner, repo) { - const res = await fetch(`https://api.github.com/repos/${owner}/${repo}/tags`, { - headers: { - Authorization: `token ${process.env.GITHUB_TOKEN}`, - Accept: 'application/vnd.github.v3+json', + const res = await fetch( + `https://api.github.com/repos/${owner}/${repo}/tags`, + { + headers: { + Authorization: `token ${process.env.GITHUB_TOKEN}`, + Accept: 'application/vnd.github.v3+json', + }, }, - }); + ); if (!res.ok) { - throw new Error(`Failed to fetch tags for ${owner}/${repo}: ${res.status} ${res.statusText}`); + throw new Error( + `Failed to fetch tags for ${owner}/${repo}: ${res.status} ${res.statusText}`, + ); } const tags = await res.json(); if (!Array.isArray(tags) || !tags.length) { throw new Error(`No tags found for ${owner}/${repo}`); } if (!tags[0]?.commit?.sha) { - throw new Error(`Invalid tag structure for ${owner}/${repo}: missing commit SHA`); + throw new Error( + `Invalid tag structure for ${owner}/${repo}: missing commit SHA`, + ); } return tags[0].commit.sha; } @@ -28,11 +35,15 @@ async function getLatestTagCommit(owner, repo) { async function getLatestNpmVersion(packageName) { const res = await fetch(`https://registry.npmjs.org/${packageName}/latest`); if (!res.ok) { - throw new Error(`Failed to fetch npm version for ${packageName}: ${res.status} ${res.statusText}`); + throw new Error( + `Failed to fetch npm version for ${packageName}: ${res.status} ${res.statusText}`, + ); } const data = await res.json(); if (!data?.version) { - throw new Error(`Invalid npm response for ${packageName}: missing version field`); + throw new Error( + `Invalid npm response for ${packageName}: missing version field`, + ); } return data.version; } @@ -64,7 +75,10 @@ async function updatePnpmWorkspace(vitestVersion, tsdownVersion) { ); // Update tsdown in catalog (handle pre-release versions) - content = content.replace(/tsdown: \^[\d.]+(-[\w.]+)?/, `tsdown: ^${tsdownVersion}`); + content = content.replace( + /tsdown: \^[\d.]+(-[\w.]+)?/, + `tsdown: ^${tsdownVersion}`, + ); fs.writeFileSync(filePath, content); console.log('Updated pnpm-workspace.yaml'); @@ -96,21 +110,38 @@ async function updateTestPackage(vitestVersion) { console.log('Updated packages/test/package.json'); } +// ============ Update packages/core/package.json ============ +async function updateCorePackage(devtoolsVersion) { + const filePath = path.join(ROOT, 'packages/core/package.json'); + const pkg = JSON.parse(fs.readFileSync(filePath, 'utf8')); + + // Update @vitejs/devtools in devDependencies + if (pkg.devDependencies?.['@vitejs/devtools']) { + pkg.devDependencies['@vitejs/devtools'] = `^${devtoolsVersion}`; + } + + fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\n'); + console.log('Updated packages/core/package.json'); +} + // ============ Main ============ async function main() { console.log('Fetching latest versions...'); - const [vitestVersion, tsdownVersion] = await Promise.all([ + const [vitestVersion, tsdownVersion, devtoolsVersion] = await Promise.all([ getLatestNpmVersion('vitest'), getLatestNpmVersion('tsdown'), + getLatestNpmVersion('@vitejs/devtools'), ]); console.log(`vitest: ${vitestVersion}`); console.log(`tsdown: ${tsdownVersion}`); + console.log(`@vitejs/devtools: ${devtoolsVersion}`); await updateUpstreamVersions(); await updatePnpmWorkspace(vitestVersion, tsdownVersion); await updateTestPackage(vitestVersion); + await updateCorePackage(devtoolsVersion); console.log('Done!'); } diff --git a/packages/core/package.json b/packages/core/package.json index 6b32f4c61e..7ed734c940 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -11,6 +11,10 @@ }, "./dist/client/*": "./dist/vite/client/*", "./internal": "./dist/vite/node/internal.js", + "./lib": { + "default": "./dist/tsdown/index.js", + "types": "./dist/tsdown/index-types.d.ts" + }, "./module-runner": "./dist/vite/node/module-runner.js", "./package.json": "./package.json", "./rolldown": { @@ -48,10 +52,6 @@ "default": "./dist/pluginutils/index.js", "types": "./dist/pluginutils/index.d.ts" }, - "./lib": { - "default": "./dist/tsdown/index.js", - "types": "./dist/tsdown/index-types.d.ts" - }, "./types/*": { "types": "./dist/vite/types/*" }, @@ -166,6 +166,7 @@ "devDependencies": { "@oxc-node/cli": "catalog:", "@oxc-node/core": "catalog:", + "@vitejs/devtools": "^0.0.0-alpha.18", "es-module-lexer": "^1.7.0", "hookable": "^6.0.1", "magic-string": "^0.30.21", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 82da06e0df..f2fa5f907d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -386,9 +386,6 @@ importers: '@types/node': specifier: ^20.19.0 || >=22.12.0 version: 22.19.1 - '@vitejs/devtools': - specifier: ^0.0.0-alpha.18 - version: 0.0.0-alpha.18(@pnpm/logger@1001.0.1)(vite@packages+core)(vue@3.5.25(typescript@5.9.3)) esbuild: specifier: ^0.25.0 version: 0.25.12 @@ -450,6 +447,9 @@ importers: '@oxc-node/core': specifier: 'catalog:' version: 0.0.34 + '@vitejs/devtools': + specifier: ^0.0.0-alpha.18 + version: 0.0.0-alpha.18(@pnpm/logger@1001.0.1)(vite@packages+core)(vue@3.5.25(typescript@5.9.3)) es-module-lexer: specifier: ^1.7.0 version: 1.7.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5bbfc90f1f..0a7a0dc4d9 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,7 +5,6 @@ packages: - rolldown/packages/* - rolldown-vite - rolldown-vite/packages/* - catalog: '@babel/core': ^7.24.7 '@babel/preset-env': ^7.24.7 @@ -15,13 +14,13 @@ catalog: '@napi-rs/wasm-runtime': ^1.0.0 '@oxc-node/cli': ^0.0.34 '@oxc-node/core': ^0.0.34 - '@oxc-project/runtime': '=0.101.0' - '@oxc-project/types': '=0.101.0' + '@oxc-project/runtime': =0.101.0 + '@oxc-project/types': =0.101.0 '@pnpm/find-workspace-packages': ^6.0.9 '@rollup/plugin-commonjs': ^29.0.0 '@rollup/plugin-json': ^6.1.0 '@rollup/plugin-node-resolve': ^16.0.0 - '@std/yaml': npm:@jsr/std__yaml@^1.0.10 + '@std/yaml': 'npm:@jsr/std__yaml@^1.0.10' '@types/babel__core': 7.20.5 '@types/connect': ^3.4.38 '@types/cross-spawn': ^6.0.6 @@ -73,9 +72,9 @@ catalog: mocha: ^11.0.0 mri: ^1.2.0 next: ^15.4.3 - oxc-minify: '=0.101.0' - oxc-parser: '=0.101.0' - oxc-transform: '=0.101.0' + oxc-minify: =0.101.0 + oxc-parser: =0.101.0 + oxc-transform: =0.101.0 oxfmt: ^0.16.0 oxlint: ^1.31.0 oxlint-tsgolint: ^0.8.3 @@ -114,13 +113,9 @@ catalog: ws: ^8.18.1 yaml: ^2.8.1 zx: ^8.1.2 - catalogMode: prefer - ignoreScripts: true - minimumReleaseAge: 1440 - minimumReleaseAgeExclude: - '@napi-rs/*' - '@oxc-project/*' @@ -149,14 +144,12 @@ minimumReleaseAgeExclude: - vitepress - vitest - unrun - overrides: - '@rolldown/pluginutils': workspace:@rolldown/pluginutils@* - rolldown: workspace:rolldown@* - vite: workspace:@voidzero-dev/vite-plus-core@* - vitest: workspace:@voidzero-dev/vite-plus-test@* - vitest-dev: npm:vitest@^4.0.15 - + '@rolldown/pluginutils': 'workspace:@rolldown/pluginutils@*' + rolldown: 'workspace:rolldown@*' + vite: 'workspace:@voidzero-dev/vite-plus-core@*' + vitest: 'workspace:@voidzero-dev/vite-plus-test@*' + vitest-dev: 'npm:vitest@^4.0.15' packageExtensions: sass-embedded: peerDependencies: @@ -164,13 +157,11 @@ packageExtensions: peerDependenciesMeta: source-map-js: optional: true - patchedDependencies: + sirv@3.0.2: rolldown-vite/patches/sirv@3.0.2.patch chokidar@3.6.0: rolldown-vite/patches/chokidar@3.6.0.patch dotenv-expand@12.0.3: rolldown-vite/patches/dotenv-expand@12.0.3.patch http-proxy-3: rolldown-vite/patches/http-proxy-3.patch - sirv@3.0.2: rolldown-vite/patches/sirv@3.0.2.patch - peerDependencyRules: allowAny: - vite From 793c20ba90446916f7d52376f23cd2cc4c7028d9 Mon Sep 17 00:00:00 2001 From: LongYinan Date: Fri, 26 Dec 2025 17:59:05 +0800 Subject: [PATCH 13/18] replace pr token --- .github/workflows/upgrade-deps.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/upgrade-deps.yml b/.github/workflows/upgrade-deps.yml index 71e69e8708..9bb95b0a6e 100644 --- a/.github/workflows/upgrade-deps.yml +++ b/.github/workflows/upgrade-deps.yml @@ -66,6 +66,7 @@ jobs: branch: deps/upstream-update title: 'feat(deps): upgrade upstream dependencies' sign-commits: true + branch-token: ${{ secrets.AUTO_UPDATE_BRANCH_TOKEN }} body: | Automated daily upgrade of upstream dependencies: - rolldown (latest tag) From d65f06e192d66d28b818c066f7ea1ed3fc4f8260 Mon Sep 17 00:00:00 2001 From: LongYinan Date: Fri, 26 Dec 2025 18:43:56 +0800 Subject: [PATCH 14/18] split tokens --- .github/workflows/upgrade-deps.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/upgrade-deps.yml b/.github/workflows/upgrade-deps.yml index 9bb95b0a6e..b931f28174 100644 --- a/.github/workflows/upgrade-deps.yml +++ b/.github/workflows/upgrade-deps.yml @@ -66,7 +66,8 @@ jobs: branch: deps/upstream-update title: 'feat(deps): upgrade upstream dependencies' sign-commits: true - branch-token: ${{ secrets.AUTO_UPDATE_BRANCH_TOKEN }} + token: ${{ secrets.AUTO_UPDATE_BRANCH_TOKEN }} + branch-token: ${{ secrets.GITHUB_TOKEN }} body: | Automated daily upgrade of upstream dependencies: - rolldown (latest tag) @@ -77,4 +78,3 @@ jobs: Build status: ${{ steps.build.outcome }} commit-message: 'feat(deps): upgrade upstream dependencies' delete-branch: true - token: ${{ secrets.GITHUB_TOKEN }} From d19deb7c847b384766770bd4853929233e058798 Mon Sep 17 00:00:00 2001 From: LongYinan Date: Mon, 29 Dec 2025 14:59:33 +0800 Subject: [PATCH 15/18] fix regexp --- .github/scripts/upgrade-deps.mjs | 118 +++++++++++++++---------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/.github/scripts/upgrade-deps.mjs b/.github/scripts/upgrade-deps.mjs index 87d0cbfa5d..d223cca491 100644 --- a/.github/scripts/upgrade-deps.mjs +++ b/.github/scripts/upgrade-deps.mjs @@ -1,7 +1,7 @@ -import fs from 'node:fs'; -import path from 'node:path'; +import fs from 'node:fs' +import path from 'node:path' -const ROOT = process.cwd(); +const ROOT = process.cwd() // ============ GitHub API ============ async function getLatestTagCommit(owner, repo) { @@ -12,141 +12,141 @@ async function getLatestTagCommit(owner, repo) { Authorization: `token ${process.env.GITHUB_TOKEN}`, Accept: 'application/vnd.github.v3+json', }, - }, - ); + } + ) if (!res.ok) { throw new Error( - `Failed to fetch tags for ${owner}/${repo}: ${res.status} ${res.statusText}`, - ); + `Failed to fetch tags for ${owner}/${repo}: ${res.status} ${res.statusText}` + ) } - const tags = await res.json(); + const tags = await res.json() if (!Array.isArray(tags) || !tags.length) { - throw new Error(`No tags found for ${owner}/${repo}`); + throw new Error(`No tags found for ${owner}/${repo}`) } if (!tags[0]?.commit?.sha) { throw new Error( - `Invalid tag structure for ${owner}/${repo}: missing commit SHA`, - ); + `Invalid tag structure for ${owner}/${repo}: missing commit SHA` + ) } - return tags[0].commit.sha; + return tags[0].commit.sha } // ============ npm Registry ============ async function getLatestNpmVersion(packageName) { - const res = await fetch(`https://registry.npmjs.org/${packageName}/latest`); + const res = await fetch(`https://registry.npmjs.org/${packageName}/latest`) if (!res.ok) { throw new Error( - `Failed to fetch npm version for ${packageName}: ${res.status} ${res.statusText}`, - ); + `Failed to fetch npm version for ${packageName}: ${res.status} ${res.statusText}` + ) } - const data = await res.json(); + const data = await res.json() if (!data?.version) { throw new Error( - `Invalid npm response for ${packageName}: missing version field`, - ); + `Invalid npm response for ${packageName}: missing version field` + ) } - return data.version; + return data.version } // ============ Update .upstream-versions.json ============ async function updateUpstreamVersions() { - const filePath = path.join(ROOT, 'packages/tools/.upstream-versions.json'); - const data = JSON.parse(fs.readFileSync(filePath, 'utf8')); + const filePath = path.join(ROOT, 'packages/tools/.upstream-versions.json') + const data = JSON.parse(fs.readFileSync(filePath, 'utf8')) // rolldown -> rolldown/rolldown - data.rolldown.hash = await getLatestTagCommit('rolldown', 'rolldown'); + data.rolldown.hash = await getLatestTagCommit('rolldown', 'rolldown') // rolldown-vite -> vitejs/vite - data['rolldown-vite'].hash = await getLatestTagCommit('vitejs', 'vite'); + data['rolldown-vite'].hash = await getLatestTagCommit('vitejs', 'vite') - fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n'); - console.log('Updated .upstream-versions.json'); + fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n') + console.log('Updated .upstream-versions.json') } // ============ Update pnpm-workspace.yaml ============ async function updatePnpmWorkspace(vitestVersion, tsdownVersion) { - const filePath = path.join(ROOT, 'pnpm-workspace.yaml'); - let content = fs.readFileSync(filePath, 'utf8'); + const filePath = path.join(ROOT, 'pnpm-workspace.yaml') + let content = fs.readFileSync(filePath, 'utf8') // Update vitest-dev override (handle pre-release versions like -beta.1, -rc.0) content = content.replace( - /vitest-dev: npm:vitest@\^[\d.]+(-[\w.]+)?/, - `vitest-dev: npm:vitest@^${vitestVersion}`, - ); + /vitest-dev: 'npm:vitest@\^[\d.]+(-[\w.]+)?'/, + `vitest-dev: 'npm:vitest@^${vitestVersion}'` + ) // Update tsdown in catalog (handle pre-release versions) content = content.replace( /tsdown: \^[\d.]+(-[\w.]+)?/, - `tsdown: ^${tsdownVersion}`, - ); + `tsdown: ^${tsdownVersion}` + ) - fs.writeFileSync(filePath, content); - console.log('Updated pnpm-workspace.yaml'); + fs.writeFileSync(filePath, content) + console.log('Updated pnpm-workspace.yaml') } // ============ Update packages/test/package.json ============ async function updateTestPackage(vitestVersion) { - const filePath = path.join(ROOT, 'packages/test/package.json'); - const pkg = JSON.parse(fs.readFileSync(filePath, 'utf8')); + const filePath = path.join(ROOT, 'packages/test/package.json') + const pkg = JSON.parse(fs.readFileSync(filePath, 'utf8')) // Update all @vitest/* devDependencies for (const dep of Object.keys(pkg.devDependencies)) { if (dep.startsWith('@vitest/')) { - pkg.devDependencies[dep] = vitestVersion; + pkg.devDependencies[dep] = vitestVersion } } // Update vitest-dev devDependency if (pkg.devDependencies['vitest-dev']) { - pkg.devDependencies['vitest-dev'] = `^${vitestVersion}`; + pkg.devDependencies['vitest-dev'] = `^${vitestVersion}` } // Update @vitest/ui peerDependency if present if (pkg.peerDependencies?.['@vitest/ui']) { - pkg.peerDependencies['@vitest/ui'] = vitestVersion; + pkg.peerDependencies['@vitest/ui'] = vitestVersion } - fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\n'); - console.log('Updated packages/test/package.json'); + fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\n') + console.log('Updated packages/test/package.json') } // ============ Update packages/core/package.json ============ async function updateCorePackage(devtoolsVersion) { - const filePath = path.join(ROOT, 'packages/core/package.json'); - const pkg = JSON.parse(fs.readFileSync(filePath, 'utf8')); + const filePath = path.join(ROOT, 'packages/core/package.json') + const pkg = JSON.parse(fs.readFileSync(filePath, 'utf8')) // Update @vitejs/devtools in devDependencies if (pkg.devDependencies?.['@vitejs/devtools']) { - pkg.devDependencies['@vitejs/devtools'] = `^${devtoolsVersion}`; + pkg.devDependencies['@vitejs/devtools'] = `^${devtoolsVersion}` } - fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\n'); - console.log('Updated packages/core/package.json'); + fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\n') + console.log('Updated packages/core/package.json') } // ============ Main ============ async function main() { - console.log('Fetching latest versions...'); + console.log('Fetching latest versions...') const [vitestVersion, tsdownVersion, devtoolsVersion] = await Promise.all([ getLatestNpmVersion('vitest'), getLatestNpmVersion('tsdown'), getLatestNpmVersion('@vitejs/devtools'), - ]); + ]) - console.log(`vitest: ${vitestVersion}`); - console.log(`tsdown: ${tsdownVersion}`); - console.log(`@vitejs/devtools: ${devtoolsVersion}`); + console.log(`vitest: ${vitestVersion}`) + console.log(`tsdown: ${tsdownVersion}`) + console.log(`@vitejs/devtools: ${devtoolsVersion}`) - await updateUpstreamVersions(); - await updatePnpmWorkspace(vitestVersion, tsdownVersion); - await updateTestPackage(vitestVersion); - await updateCorePackage(devtoolsVersion); + await updateUpstreamVersions() + await updatePnpmWorkspace(vitestVersion, tsdownVersion) + await updateTestPackage(vitestVersion) + await updateCorePackage(devtoolsVersion) - console.log('Done!'); + console.log('Done!') } main().catch((err) => { - console.error(err); - process.exit(1); -}); + console.error(err) + process.exit(1) +}) From ea6f3f55e7c3f493e1ce8a9dbac16ce6215adccb Mon Sep 17 00:00:00 2001 From: LongYinan Date: Mon, 29 Dec 2025 15:34:08 +0800 Subject: [PATCH 16/18] delete previous branch --- .github/workflows/upgrade-deps.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/upgrade-deps.yml b/.github/workflows/upgrade-deps.yml index b931f28174..850eacbbfe 100644 --- a/.github/workflows/upgrade-deps.yml +++ b/.github/workflows/upgrade-deps.yml @@ -77,4 +77,3 @@ jobs: Build status: ${{ steps.build.outcome }} commit-message: 'feat(deps): upgrade upstream dependencies' - delete-branch: true From 432401ab326368199ec32a436b0e43ebcd644272 Mon Sep 17 00:00:00 2001 From: LongYinan Date: Mon, 29 Dec 2025 16:19:33 +0800 Subject: [PATCH 17/18] delete previous branch --- .github/workflows/upgrade-deps.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/upgrade-deps.yml b/.github/workflows/upgrade-deps.yml index 850eacbbfe..772d735722 100644 --- a/.github/workflows/upgrade-deps.yml +++ b/.github/workflows/upgrade-deps.yml @@ -59,6 +59,20 @@ jobs: pnpm install --no-frozen-lockfile pnpm dedupe + - name: Close and delete previous PR + env: + GH_TOKEN: ${{ secrets.AUTO_UPDATE_BRANCH_TOKEN }} + run: | + # Find PR with the deps/upstream-update branch + PR_NUMBER=$(gh pr list --head deps/upstream-update --json number --jq '.[0].number') + + if [ -n "$PR_NUMBER" ]; then + echo "Found existing PR #$PR_NUMBER, closing and deleting branch..." + gh pr close "$PR_NUMBER" --delete-branch + else + echo "No existing PR found with branch deps/upstream-update" + fi + - name: Create/Update PR uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7.0.11 with: From 3be7d4aee377a2dfcd28eabce26b97acc38dd11e Mon Sep 17 00:00:00 2001 From: LongYinan Date: Mon, 5 Jan 2026 14:42:25 +0800 Subject: [PATCH 18/18] remove dprint --- .github/workflows/ci.yml | 3 +-- dprint.json | 32 -------------------------------- justfile | 2 +- package.json | 6 +----- 4 files changed, 3 insertions(+), 40 deletions(-) delete mode 100644 dprint.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 844e2ef054..7ea36f0d07 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,11 +83,10 @@ jobs: with: save-cache: ${{ github.ref_name == 'main' }} cache-key: lint - tools: dprint,cargo-shear + tools: cargo-shear components: clippy rust-docs rustfmt - run: | - dprint check cargo shear cargo fmt --check # cargo clippy --all-targets --all-features -- -D warnings diff --git a/dprint.json b/dprint.json deleted file mode 100644 index 7899f792e1..0000000000 --- a/dprint.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "lineWidth": 120, - "typescript": { - "quoteStyle": "preferSingle", - "binaryExpression.operatorPosition": "sameLine" - }, - "json": { - "indentWidth": 2 - }, - "toml": { - }, - "yaml": { - "quotes": "preferSingle" - }, - "excludes": [ - "**/*.ts", - "**/*.tsx", - "**/*.js", - "**/*.jsx", - "crates/fspy_detours_sys/detours", - "pnpm-lock.yaml", - "packages/cli/binding/index.d.ts", - "packages/cli/binding/index.js" - ], - "plugins": [ - "https://plugins.dprint.dev/typescript-0.94.0.wasm", - "https://plugins.dprint.dev/json-0.20.0.wasm", - "https://plugins.dprint.dev/markdown-0.18.0.wasm", - "https://plugins.dprint.dev/g-plane/pretty_yaml-v0.5.0.wasm", - "https://plugins.dprint.dev/toml-0.7.0.wasm" - ] -} diff --git a/justfile b/justfile index 2203421f40..c8348beff9 100644 --- a/justfile +++ b/justfile @@ -36,7 +36,7 @@ watch *args='': fmt: cargo shear --fix cargo fmt --all - dprint fmt + pnpm fmt check: cargo check --workspace --all-features --all-targets --locked diff --git a/package.json b/package.json index 8fa5b74601..0fb823217c 100644 --- a/package.json +++ b/package.json @@ -33,12 +33,8 @@ "vitest": "catalog:" }, "lint-staged": { - "*.@(yml|yaml|md|json|html|toml)": [ - "dprint fmt --staged" - ], "*.@(js|ts|tsx)": [ - "oxlint -- --fix", - "vite fmt" + "oxlint -- --fix" ], "*.rs": [ "cargo fmt --"