From c08ff67995b98057df6f86d85d4517c6e8c18d13 Mon Sep 17 00:00:00 2001 From: Liang Date: Sat, 17 Oct 2026 22:05:30 +0800 Subject: [PATCH 1/4] refactor(cli): replace glob with tinyglobby Shrinks the bundled CLI (glob pulled in path-scurry, lru-cache and minipass) and makes negated workspace patterns like `!packages/foo` exclude packages, matching pnpm. Paths from findPackageJsonFilesFromPatterns stay native. --- packages/cli/package.json | 2 +- packages/cli/src/__tests__/versions.spec.ts | 2 +- packages/cli/src/migration/migrator/setup.ts | 5 +- .../cli/src/utils/__tests__/workspace.spec.ts | 11 +- packages/cli/src/utils/workspace.ts | 12 +- pnpm-lock.yaml | 153 ++++++++++++++++-- pnpm-workspace.yaml | 1 + 7 files changed, 160 insertions(+), 26 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 39d76fd233..ebd12550f1 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -376,12 +376,12 @@ "cross-spawn": "catalog:", "detect-indent": "catalog:", "detect-newline": "catalog:", - "glob": "catalog:", "jsonc-parser": "catalog:", "lint-staged": "catalog:", "minimatch": "catalog:", "nanotar": "catalog:", "picocolors": "catalog:", + "tinyglobby": "catalog:", "tsdown": "catalog:", "validate-npm-package-name": "catalog:", "verkit": "catalog:", diff --git a/packages/cli/src/__tests__/versions.spec.ts b/packages/cli/src/__tests__/versions.spec.ts index 51fb890c09..141a44d8a0 100644 --- a/packages/cli/src/__tests__/versions.spec.ts +++ b/packages/cli/src/__tests__/versions.spec.ts @@ -9,7 +9,7 @@ import { createRequire } from 'node:module'; import path from 'node:path'; import url from 'node:url'; -import { globSync } from 'glob'; +import { globSync } from 'tinyglobby'; import { describe, expect, it } from 'vitest'; const cliPkgDir = path.resolve(path.dirname(url.fileURLToPath(import.meta.url)), '../..'); diff --git a/packages/cli/src/migration/migrator/setup.ts b/packages/cli/src/migration/migrator/setup.ts index c889777abd..25f3b19fe4 100644 --- a/packages/cli/src/migration/migrator/setup.ts +++ b/packages/cli/src/migration/migrator/setup.ts @@ -2,7 +2,7 @@ import fs from 'node:fs'; import path from 'node:path'; import * as prompts from '@voidzero-dev/vite-plus-prompts'; -import { globSync } from 'glob'; +import { globSync } from 'tinyglobby'; import { normalize, normalizeRange } from 'verkit'; import { parse as parseYaml } from 'yaml'; @@ -149,8 +149,7 @@ function collectGithubActionFiles(projectPath: string): string[] { const globOptions = { cwd: path.join(projectPath, '.github'), absolute: true, - nocase: true, - nodir: true, + caseSensitiveMatch: false, } as const; const workflows = globSync('workflows/*.{yml,yaml}', globOptions); const compositeActions = globSync('**/action.{yml,yaml}', { diff --git a/packages/cli/src/utils/__tests__/workspace.spec.ts b/packages/cli/src/utils/__tests__/workspace.spec.ts index a8b860c021..a07c961424 100644 --- a/packages/cli/src/utils/__tests__/workspace.spec.ts +++ b/packages/cli/src/utils/__tests__/workspace.spec.ts @@ -185,8 +185,8 @@ describe('discoverWorkspacePackages', () => { const names = packages.map((p) => p.name).toSorted(); expect(names).toEqual(['bar', 'foo']); const foo = packages.find((p) => p.name === 'foo')!; - // pkg.path uses forward slashes on every platform (normalized from glob's - // native separators), so it compares cleanly against workspace patterns. + // pkg.path uses forward slashes on every platform, so it compares cleanly + // against workspace patterns. expect(foo.path).toBe('packages/foo'); expect(foo.description).toBe('a foo'); expect(foo.version).toBe('1.0.0'); @@ -200,6 +200,13 @@ describe('discoverWorkspacePackages', () => { const packages = discoverWorkspacePackages(['packages/*'], tmpDir); expect(packages.map((p) => p.name)).toEqual(['a']); }); + + it('skips packages excluded by negated patterns', () => { + writeJson(path.join(tmpDir, 'packages/a/package.json'), { name: 'a' }); + writeJson(path.join(tmpDir, 'packages/excluded/package.json'), { name: 'excluded' }); + const packages = discoverWorkspacePackages(['packages/*', '!packages/excluded'], tmpDir); + expect(packages.map((p) => p.name)).toEqual(['a']); + }); }); describe('updatePackageJsonWithDeps', () => { diff --git a/packages/cli/src/utils/workspace.ts b/packages/cli/src/utils/workspace.ts index f10d2450b8..9ec00d7310 100644 --- a/packages/cli/src/utils/workspace.ts +++ b/packages/cli/src/utils/workspace.ts @@ -1,8 +1,8 @@ import fs from 'node:fs'; import path from 'node:path'; -import { globSync } from 'glob'; import { minimatch } from 'minimatch'; +import { globSync } from 'tinyglobby'; import { Scalar, YAMLSeq } from 'yaml'; import { detectWorkspace as detectWorkspaceBinding } from '../../binding/index.js'; @@ -30,10 +30,11 @@ export function findPackageJsonFilesFromPatterns(patterns: string[], cwd: string if (patterns.length === 0) { return []; } + // tinyglobby always returns `/` separators; normalize them to native paths for Windows callers. return globSync( patterns.map((pattern) => `${pattern}/package.json`), { absolute: true, cwd }, - ); + ).map((file) => path.normalize(file)); } // Detect if we're in a monorepo and get workspace info @@ -148,10 +149,9 @@ export function discoverWorkspacePackages( } packages.push({ name: pkg.name, - // glob returns native separators; normalize to forward slashes so the - // path compares cleanly against workspace-pattern-derived values like - // `parentDirs` on Windows (path.join accepts either separator). - path: path.dirname(packageJsonRelativePath).split(path.sep).join('/'), + // Keep tinyglobby's forward slashes so the path compares cleanly against + // workspace-pattern-derived values like `parentDirs` on Windows. + path: path.posix.dirname(packageJsonRelativePath), description: pkg.description, version: pkg.version, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b97aebd5e0..8bbb9d82e8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -389,6 +389,9 @@ catalogs: tinyexec: specifier: ^1.0.1 version: 1.3.1 + tinyglobby: + specifier: ^0.2.15 + version: 0.2.17 tsdown: specifier: ^0.23.1 version: 0.23.1 @@ -566,9 +569,6 @@ importers: detect-newline: specifier: 'catalog:' version: 4.0.1 - glob: - specifier: 'catalog:' - version: 13.0.0 jsonc-parser: specifier: 'catalog:' version: 3.3.1 @@ -584,6 +584,9 @@ importers: picocolors: specifier: 'catalog:' version: 1.1.1 + tinyglobby: + specifier: 'catalog:' + version: 0.2.17 tsdown: specifier: 'catalog:' version: 0.23.1(@arethetypeswrong/core@0.18.2)(@tsdown/css@0.23.1)(@tsdown/exe@0.23.1)(@typescript/native-preview@7.0.0-dev.20260707.2)(@vitejs/devtools@0.7.6(@devframes/json-render@1.0.0(@devframes/hub@1.0.0(@devframes/agentic@1.0.0)(crossws@0.4.12(srvx@1.0.5))(devframe@1.0.0))(devframe@1.0.0))(crossws@0.4.12(srvx@1.0.5))(srvx@1.0.5)(vite@packages+core))(@volar/typescript@2.4.28(typescript@6.0.3))(@vue/language-core@3.3.12)(oxc-resolver@11.24.2)(publint@0.3.24)(tsx@4.23.15)(typescript@6.0.3)(unplugin-unused@0.5.6)(unrun@0.3.1)(vue-tsc@3.3.12(typescript@6.0.3)) @@ -1116,8 +1119,8 @@ importers: specifier: workspace:@voidzero-dev/vite-plus-core@* version: link:../packages/core vitest: - specifier: 5.0.5 - version: 5.0.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.19.1)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core) + specifier: 5.0.4 + version: 5.0.4(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.19.1)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core) vite/packages/create-vite: devDependencies: @@ -1271,8 +1274,8 @@ importers: specifier: ^0.7.6 version: 0.7.6(@devframes/json-render@1.0.0(@devframes/hub@1.0.0(@devframes/agentic@1.0.0)(crossws@0.4.12(srvx@1.0.5))(devframe@1.0.0))(devframe@1.0.0))(crossws@0.4.12(srvx@1.0.5))(srvx@1.0.5)(vite@packages+core) '@vitest/utils': - specifier: 5.0.5 - version: 5.0.5 + specifier: 5.0.4 + version: 5.0.4 '@voidzero-dev/vite-task-client': specifier: ^0.2.0 version: 0.2.0 @@ -4719,6 +4722,17 @@ packages: peerDependencies: vitest: 5.0.5 + '@vitest/mocker@5.0.4': + resolution: {integrity: sha512-tqAlrYWce4iUxhr3ncNohejtCTOcHeE8XWrSNZY3OhPoDn01yeGv+gnaBy64ATp7o6pb03eIbBAjzmibpc9vIQ==} + peerDependencies: + msw: ^2.4.9 || ^3.0.0 + vite: workspace:@voidzero-dev/vite-plus-core@* + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/mocker@5.0.5': resolution: {integrity: sha512-xLL3lkDegJZw+MGoGaCCsFayDZthGgpAtr3Vziyfc4p7xH89K7KRPcRBBh/kEYm0Aqkt5DtTmkYpBtRV/FrHZg==} peerDependencies: @@ -4730,12 +4744,18 @@ packages: vite: optional: true + '@vitest/pretty-format@5.0.4': + resolution: {integrity: sha512-kh/bp0oLr6w18kt4MFn5/zS+Hpc5k3bsf6S2m2Qksj7sKHrnc7Tu90UVYyiXnRvkYruN6kSCHQ3RR+SBE6FinA==} + '@vitest/pretty-format@5.0.5': resolution: {integrity: sha512-24sSdIlMA9DVPXnYiB9siwU0bTd887Y9jX3+vabztCSsvHwo7ipvJ/a2L3Rljw8+2rK1f5fCj3h5U9I/Jsqgbw==} '@vitest/snapshot@5.0.5': resolution: {integrity: sha512-dHyFElWMQy0wFBGrIaPPeUWfJFh+jAUrv46ImIJGd8CADdKV3mlrAu3FyD0wesdxELFCs9M807e040Kba/XKtA==} + '@vitest/spy@5.0.4': + resolution: {integrity: sha512-MZKk/gSkm2q+ICobMxCpH1mA+cCAWm8WV7UhxlqGjq/sJ3AGc1BqFOs5CRVXxH78wQtme9q/NAAgBquj4AcyMw==} + '@vitest/spy@5.0.5': resolution: {integrity: sha512-lwJRExuH417257Q5wv9QYugN9IMJkoxcrKrYxGPQkBzl7wlNpTUxD/5yNX4ESKVUIShKPgkGchYPFMWOOk0wzw==} @@ -4744,6 +4764,9 @@ packages: peerDependencies: vitest: 5.0.5 + '@vitest/utils@5.0.4': + resolution: {integrity: sha512-hgpnyMuMqCz2PARmk3v62FxUr8jHIkY13ygvUeh8s+dmQxfnvkB/sgtoZFzG4lMitnEdnrg/lCvDbtVzuAsGWQ==} + '@vitest/utils@5.0.5': resolution: {integrity: sha512-/rBu7gzLDQI/SC79Tn98b5DwOgaHU/Gt4I9OVeP3YofzNaYtbImRCOJQmT1S6vOJg9gEIlWC+r3QxKkjuSa1nQ==} @@ -7931,6 +7954,47 @@ packages: resolution: {integrity: sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==} engines: {node: '>=18.12.0'} + vitest@5.0.4: + resolution: {integrity: sha512-z0WxZRV2Sg48wF0FSgMq3TFG8JS38/Qr96vZVZdX6+Em9raQTvnXQvdTFJe2m3rfyJnEHeHQ/snceIdi8D1pVg==} + engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 5.0.4 + '@vitest/browser-preview': 5.0.4 + '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 + '@vitest/coverage-istanbul': 5.0.4 + '@vitest/coverage-v8': 5.0.4 + '@vitest/ui': 5.0.4 + happy-dom: '*' + jsdom: '*' + vite: workspace:@voidzero-dev/vite-plus-core@* + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vitest@5.0.5: resolution: {integrity: sha512-cPODOMF8YnkiiYtDdHo6n4wWmBrOBBbOIYH2d33M4l3CdNn72h+qMmO6uXffUN6A5AZFXNND/d+krS9mgkXRfg==} engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} @@ -11205,6 +11269,18 @@ snapshots: - utf-8-validate - vite + '@vitest/browser-webdriverio@5.0.0(vite@packages+core)(vitest@5.0.4)(webdriverio@9.20.1(supports-color@8.1.1))': + dependencies: + '@vitest/browser': 5.0.5(vite@packages+core)(vitest@5.0.4) + vitest: 5.0.4(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.19.1)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core) + webdriverio: 9.20.1(supports-color@8.1.1) + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + optional: true + '@vitest/browser-webdriverio@5.0.0(vite@packages+core)(vitest@5.0.5)(webdriverio@9.20.1(supports-color@8.1.1))': dependencies: '@vitest/browser': 5.0.5(vite@packages+core)(vitest@5.0.5) @@ -11216,6 +11292,25 @@ snapshots: - utf-8-validate - vite + '@vitest/browser@5.0.5(vite@packages+core)(vitest@5.0.4)': + dependencies: + '@blazediff/core': 1.10.0 + '@vitest/mocker': 5.0.5(vite@packages+core) + '@vitest/ui': 5.0.5(vitest@5.0.4) + '@vitest/utils': 5.0.5 + magic-string: 1.4.3 + pngjs: 7.0.0 + sirv: 3.0.2(patch_hash=c07c56eb72faea34341d465cde2314e89db472106ed378181e3447893af6bf95) + tinyrainbow: 3.2.0 + vitest: 5.0.4(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.19.1)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core) + ws: 8.22.0 + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + optional: true + '@vitest/browser@5.0.5(vite@packages+core)(vitest@5.0.5)': dependencies: '@blazediff/core': 1.10.0 @@ -11234,6 +11329,15 @@ snapshots: - utf-8-validate - vite + '@vitest/mocker@5.0.4(vite@packages+core)': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@vitest/spy': 5.0.4 + estree-walker: 3.0.3 + magic-string: 1.4.3 + optionalDependencies: + vite: link:packages/core + '@vitest/mocker@5.0.5(vite@packages+core)': dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -11243,6 +11347,10 @@ snapshots: optionalDependencies: vite: link:packages/core + '@vitest/pretty-format@5.0.4': + dependencies: + tinyrainbow: 3.2.0 + '@vitest/pretty-format@5.0.5': dependencies: tinyrainbow: 3.2.0 @@ -11254,8 +11362,21 @@ snapshots: magic-string: 1.4.3 pathe: 2.0.3 + '@vitest/spy@5.0.4': {} + '@vitest/spy@5.0.5': {} + '@vitest/ui@5.0.5(vitest@5.0.4)': + dependencies: + '@vitest/utils': 5.0.5 + fflate: 0.8.3 + flatted: 3.4.4 + pathe: 2.0.3 + sirv: 3.0.2(patch_hash=c07c56eb72faea34341d465cde2314e89db472106ed378181e3447893af6bf95) + tinyrainbow: 3.2.0 + vitest: 5.0.4(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.19.1)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core) + optional: true + '@vitest/ui@5.0.5(vitest@5.0.5)': dependencies: '@vitest/utils': 5.0.5 @@ -11266,6 +11387,12 @@ snapshots: tinyrainbow: 3.2.0 vitest: 5.0.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.3)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core) + '@vitest/utils@5.0.4': + dependencies: + '@vitest/pretty-format': 5.0.4 + convert-source-map: 2.0.0 + tinyrainbow: 3.2.0 + '@vitest/utils@5.0.5': dependencies: '@vitest/pretty-format': 5.0.5 @@ -14492,10 +14619,10 @@ snapshots: verkit@0.5.0: {} - vitest@5.0.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.3)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core): + vitest@5.0.4(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.19.1)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.5(vite@packages+core) + '@vitest/mocker': 5.0.4(vite@packages+core) chai: 6.3.0 es-module-lexer: 2.3.2 expect-type: 1.4.0 @@ -14511,17 +14638,17 @@ snapshots: optionalDependencies: '@edge-runtime/vm': 5.0.0 '@opentelemetry/api': 1.9.0 - '@types/node': 24.10.3 + '@types/node': 24.19.1 '@vitest/browser-playwright': 5.0.5(playwright@1.62.1)(vite@packages+core)(vitest@5.0.5) '@vitest/browser-preview': 5.0.5(vite@packages+core)(vitest@5.0.5) - '@vitest/browser-webdriverio': 5.0.0(vite@packages+core)(vitest@5.0.5)(webdriverio@9.20.1(supports-color@8.1.1)) + '@vitest/browser-webdriverio': 5.0.0(vite@packages+core)(vitest@5.0.4)(webdriverio@9.20.1(supports-color@8.1.1)) '@vitest/ui': 5.0.5(vitest@5.0.5) happy-dom: 20.0.10 jsdom: 27.2.0(supports-color@8.1.1) transitivePeerDependencies: - msw - vitest@5.0.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.19.1)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core): + vitest@5.0.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.3)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core): dependencies: '@types/chai': 5.2.3 '@vitest/mocker': 5.0.5(vite@packages+core) @@ -14540,7 +14667,7 @@ snapshots: optionalDependencies: '@edge-runtime/vm': 5.0.0 '@opentelemetry/api': 1.9.0 - '@types/node': 24.19.1 + '@types/node': 24.10.3 '@vitest/browser-playwright': 5.0.5(playwright@1.62.1)(vite@packages+core)(vitest@5.0.5) '@vitest/browser-preview': 5.0.5(vite@packages+core)(vitest@5.0.5) '@vitest/browser-webdriverio': 5.0.0(vite@packages+core)(vitest@5.0.5)(webdriverio@9.20.1(supports-color@8.1.1)) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ae2971b596..bbc7540092 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -115,6 +115,7 @@ catalog: terser: ^5.44.1 tinybench: ^6.0.0 tinyexec: ^1.0.1 + tinyglobby: ^0.2.15 tsdown: ^0.23.1 tsx: ^4.22.0 typescript: ^6.0.0 From 98ff2ed72465d745235037aa1f391913db754dbd Mon Sep 17 00:00:00 2001 From: Liang Date: Sat, 17 Oct 2026 22:18:19 +0800 Subject: [PATCH 2/4] chore: drop unrelated vitest changes from pnpm-lock.yaml --- pnpm-lock.yaml | 144 ++++--------------------------------------------- 1 file changed, 10 insertions(+), 134 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8bbb9d82e8..6839ca4a89 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1119,8 +1119,8 @@ importers: specifier: workspace:@voidzero-dev/vite-plus-core@* version: link:../packages/core vitest: - specifier: 5.0.4 - version: 5.0.4(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.19.1)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core) + specifier: 5.0.5 + version: 5.0.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.19.1)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core) vite/packages/create-vite: devDependencies: @@ -1274,8 +1274,8 @@ importers: specifier: ^0.7.6 version: 0.7.6(@devframes/json-render@1.0.0(@devframes/hub@1.0.0(@devframes/agentic@1.0.0)(crossws@0.4.12(srvx@1.0.5))(devframe@1.0.0))(devframe@1.0.0))(crossws@0.4.12(srvx@1.0.5))(srvx@1.0.5)(vite@packages+core) '@vitest/utils': - specifier: 5.0.4 - version: 5.0.4 + specifier: 5.0.5 + version: 5.0.5 '@voidzero-dev/vite-task-client': specifier: ^0.2.0 version: 0.2.0 @@ -4722,17 +4722,6 @@ packages: peerDependencies: vitest: 5.0.5 - '@vitest/mocker@5.0.4': - resolution: {integrity: sha512-tqAlrYWce4iUxhr3ncNohejtCTOcHeE8XWrSNZY3OhPoDn01yeGv+gnaBy64ATp7o6pb03eIbBAjzmibpc9vIQ==} - peerDependencies: - msw: ^2.4.9 || ^3.0.0 - vite: workspace:@voidzero-dev/vite-plus-core@* - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - '@vitest/mocker@5.0.5': resolution: {integrity: sha512-xLL3lkDegJZw+MGoGaCCsFayDZthGgpAtr3Vziyfc4p7xH89K7KRPcRBBh/kEYm0Aqkt5DtTmkYpBtRV/FrHZg==} peerDependencies: @@ -4744,18 +4733,12 @@ packages: vite: optional: true - '@vitest/pretty-format@5.0.4': - resolution: {integrity: sha512-kh/bp0oLr6w18kt4MFn5/zS+Hpc5k3bsf6S2m2Qksj7sKHrnc7Tu90UVYyiXnRvkYruN6kSCHQ3RR+SBE6FinA==} - '@vitest/pretty-format@5.0.5': resolution: {integrity: sha512-24sSdIlMA9DVPXnYiB9siwU0bTd887Y9jX3+vabztCSsvHwo7ipvJ/a2L3Rljw8+2rK1f5fCj3h5U9I/Jsqgbw==} '@vitest/snapshot@5.0.5': resolution: {integrity: sha512-dHyFElWMQy0wFBGrIaPPeUWfJFh+jAUrv46ImIJGd8CADdKV3mlrAu3FyD0wesdxELFCs9M807e040Kba/XKtA==} - '@vitest/spy@5.0.4': - resolution: {integrity: sha512-MZKk/gSkm2q+ICobMxCpH1mA+cCAWm8WV7UhxlqGjq/sJ3AGc1BqFOs5CRVXxH78wQtme9q/NAAgBquj4AcyMw==} - '@vitest/spy@5.0.5': resolution: {integrity: sha512-lwJRExuH417257Q5wv9QYugN9IMJkoxcrKrYxGPQkBzl7wlNpTUxD/5yNX4ESKVUIShKPgkGchYPFMWOOk0wzw==} @@ -4764,9 +4747,6 @@ packages: peerDependencies: vitest: 5.0.5 - '@vitest/utils@5.0.4': - resolution: {integrity: sha512-hgpnyMuMqCz2PARmk3v62FxUr8jHIkY13ygvUeh8s+dmQxfnvkB/sgtoZFzG4lMitnEdnrg/lCvDbtVzuAsGWQ==} - '@vitest/utils@5.0.5': resolution: {integrity: sha512-/rBu7gzLDQI/SC79Tn98b5DwOgaHU/Gt4I9OVeP3YofzNaYtbImRCOJQmT1S6vOJg9gEIlWC+r3QxKkjuSa1nQ==} @@ -7954,47 +7934,6 @@ packages: resolution: {integrity: sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==} engines: {node: '>=18.12.0'} - vitest@5.0.4: - resolution: {integrity: sha512-z0WxZRV2Sg48wF0FSgMq3TFG8JS38/Qr96vZVZdX6+Em9raQTvnXQvdTFJe2m3rfyJnEHeHQ/snceIdi8D1pVg==} - engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@opentelemetry/api': ^1.9.0 - '@types/node': ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 5.0.4 - '@vitest/browser-preview': 5.0.4 - '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 - '@vitest/coverage-istanbul': 5.0.4 - '@vitest/coverage-v8': 5.0.4 - '@vitest/ui': 5.0.4 - happy-dom: '*' - jsdom: '*' - vite: workspace:@voidzero-dev/vite-plus-core@* - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@opentelemetry/api': - optional: true - '@types/node': - optional: true - '@vitest/browser-playwright': - optional: true - '@vitest/browser-preview': - optional: true - '@vitest/browser-webdriverio': - optional: true - '@vitest/coverage-istanbul': - optional: true - '@vitest/coverage-v8': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - vitest@5.0.5: resolution: {integrity: sha512-cPODOMF8YnkiiYtDdHo6n4wWmBrOBBbOIYH2d33M4l3CdNn72h+qMmO6uXffUN6A5AZFXNND/d+krS9mgkXRfg==} engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} @@ -11269,18 +11208,6 @@ snapshots: - utf-8-validate - vite - '@vitest/browser-webdriverio@5.0.0(vite@packages+core)(vitest@5.0.4)(webdriverio@9.20.1(supports-color@8.1.1))': - dependencies: - '@vitest/browser': 5.0.5(vite@packages+core)(vitest@5.0.4) - vitest: 5.0.4(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.19.1)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core) - webdriverio: 9.20.1(supports-color@8.1.1) - transitivePeerDependencies: - - bufferutil - - msw - - utf-8-validate - - vite - optional: true - '@vitest/browser-webdriverio@5.0.0(vite@packages+core)(vitest@5.0.5)(webdriverio@9.20.1(supports-color@8.1.1))': dependencies: '@vitest/browser': 5.0.5(vite@packages+core)(vitest@5.0.5) @@ -11292,25 +11219,6 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@5.0.5(vite@packages+core)(vitest@5.0.4)': - dependencies: - '@blazediff/core': 1.10.0 - '@vitest/mocker': 5.0.5(vite@packages+core) - '@vitest/ui': 5.0.5(vitest@5.0.4) - '@vitest/utils': 5.0.5 - magic-string: 1.4.3 - pngjs: 7.0.0 - sirv: 3.0.2(patch_hash=c07c56eb72faea34341d465cde2314e89db472106ed378181e3447893af6bf95) - tinyrainbow: 3.2.0 - vitest: 5.0.4(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.19.1)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core) - ws: 8.22.0 - transitivePeerDependencies: - - bufferutil - - msw - - utf-8-validate - - vite - optional: true - '@vitest/browser@5.0.5(vite@packages+core)(vitest@5.0.5)': dependencies: '@blazediff/core': 1.10.0 @@ -11329,15 +11237,6 @@ snapshots: - utf-8-validate - vite - '@vitest/mocker@5.0.4(vite@packages+core)': - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - '@vitest/spy': 5.0.4 - estree-walker: 3.0.3 - magic-string: 1.4.3 - optionalDependencies: - vite: link:packages/core - '@vitest/mocker@5.0.5(vite@packages+core)': dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -11347,10 +11246,6 @@ snapshots: optionalDependencies: vite: link:packages/core - '@vitest/pretty-format@5.0.4': - dependencies: - tinyrainbow: 3.2.0 - '@vitest/pretty-format@5.0.5': dependencies: tinyrainbow: 3.2.0 @@ -11362,21 +11257,8 @@ snapshots: magic-string: 1.4.3 pathe: 2.0.3 - '@vitest/spy@5.0.4': {} - '@vitest/spy@5.0.5': {} - '@vitest/ui@5.0.5(vitest@5.0.4)': - dependencies: - '@vitest/utils': 5.0.5 - fflate: 0.8.3 - flatted: 3.4.4 - pathe: 2.0.3 - sirv: 3.0.2(patch_hash=c07c56eb72faea34341d465cde2314e89db472106ed378181e3447893af6bf95) - tinyrainbow: 3.2.0 - vitest: 5.0.4(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.19.1)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core) - optional: true - '@vitest/ui@5.0.5(vitest@5.0.5)': dependencies: '@vitest/utils': 5.0.5 @@ -11387,12 +11269,6 @@ snapshots: tinyrainbow: 3.2.0 vitest: 5.0.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.3)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core) - '@vitest/utils@5.0.4': - dependencies: - '@vitest/pretty-format': 5.0.4 - convert-source-map: 2.0.0 - tinyrainbow: 3.2.0 - '@vitest/utils@5.0.5': dependencies: '@vitest/pretty-format': 5.0.5 @@ -14619,10 +14495,10 @@ snapshots: verkit@0.5.0: {} - vitest@5.0.4(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.19.1)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core): + vitest@5.0.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.3)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.4(vite@packages+core) + '@vitest/mocker': 5.0.5(vite@packages+core) chai: 6.3.0 es-module-lexer: 2.3.2 expect-type: 1.4.0 @@ -14638,17 +14514,17 @@ snapshots: optionalDependencies: '@edge-runtime/vm': 5.0.0 '@opentelemetry/api': 1.9.0 - '@types/node': 24.19.1 + '@types/node': 24.10.3 '@vitest/browser-playwright': 5.0.5(playwright@1.62.1)(vite@packages+core)(vitest@5.0.5) '@vitest/browser-preview': 5.0.5(vite@packages+core)(vitest@5.0.5) - '@vitest/browser-webdriverio': 5.0.0(vite@packages+core)(vitest@5.0.4)(webdriverio@9.20.1(supports-color@8.1.1)) + '@vitest/browser-webdriverio': 5.0.0(vite@packages+core)(vitest@5.0.5)(webdriverio@9.20.1(supports-color@8.1.1)) '@vitest/ui': 5.0.5(vitest@5.0.5) happy-dom: 20.0.10 jsdom: 27.2.0(supports-color@8.1.1) transitivePeerDependencies: - msw - vitest@5.0.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.3)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core): + vitest@5.0.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@24.19.1)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/browser-webdriverio@5.0.0)(@vitest/ui@5.0.5)(happy-dom@20.0.10)(jsdom@27.2.0(supports-color@8.1.1))(vite@packages+core): dependencies: '@types/chai': 5.2.3 '@vitest/mocker': 5.0.5(vite@packages+core) @@ -14667,7 +14543,7 @@ snapshots: optionalDependencies: '@edge-runtime/vm': 5.0.0 '@opentelemetry/api': 1.9.0 - '@types/node': 24.10.3 + '@types/node': 24.19.1 '@vitest/browser-playwright': 5.0.5(playwright@1.62.1)(vite@packages+core)(vitest@5.0.5) '@vitest/browser-preview': 5.0.5(vite@packages+core)(vitest@5.0.5) '@vitest/browser-webdriverio': 5.0.0(vite@packages+core)(vitest@5.0.5)(webdriverio@9.20.1(supports-color@8.1.1)) From 821ed9e3ee19014f008ef7f044410ec276619d52 Mon Sep 17 00:00:00 2001 From: Liang Date: Sat, 17 Oct 2026 22:39:03 +0800 Subject: [PATCH 3/4] fix(cli): preserve tinyglobby defaults and refresh migration snapshot --- .../snapshots/migration_from_tsup_monorepo_success.md | 2 +- packages/cli/src/utils/__tests__/workspace.spec.ts | 6 +++--- packages/cli/src/utils/workspace.ts | 3 +-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_from_tsup_monorepo/snapshots/migration_from_tsup_monorepo_success.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_from_tsup_monorepo/snapshots/migration_from_tsup_monorepo_success.md index 3aa0b6d868..8b4451c9ce 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_from_tsup_monorepo/snapshots/migration_from_tsup_monorepo_success.md +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_from_tsup_monorepo/snapshots/migration_from_tsup_monorepo_success.md @@ -13,8 +13,8 @@ VITE+ - The Unified Toolchain for the Web • 5 config updates applied, 2 files had imports rewritten • tsup config migrated to tsdown (`vp pack`) → Manual follow-up: - - Please manually merge packages/b/tsdown.config.ts into packages/b/vite.config.ts, see https://viteplus.dev/guide/migrate#tsdown - Please manually merge packages/a/tsdown.config.ts into packages/a/vite.config.ts, see https://viteplus.dev/guide/migrate#tsdown + - Please manually merge packages/b/tsdown.config.ts into packages/b/vite.config.ts, see https://viteplus.dev/guide/migrate#tsdown ``` ## `vpt stat-file packages/a/tsup.config.ts --assert-not file` diff --git a/packages/cli/src/utils/__tests__/workspace.spec.ts b/packages/cli/src/utils/__tests__/workspace.spec.ts index a07c961424..716923df11 100644 --- a/packages/cli/src/utils/__tests__/workspace.spec.ts +++ b/packages/cli/src/utils/__tests__/workspace.spec.ts @@ -229,14 +229,14 @@ describe('updatePackageJsonWithDeps', () => { }); describe('findPackageJsonFilesFromPatterns', () => { - it('returns absolute paths for matching package.json files', () => { + it('returns absolute paths with forward slashes for matching package.json files', () => { writeJson(path.join(tmpDir, 'packages/a/package.json'), { name: 'a' }); writeJson(path.join(tmpDir, 'packages/b/package.json'), { name: 'b' }); const result = findPackageJsonFilesFromPatterns(['packages/*'], tmpDir).toSorted(); expect(result).toEqual( [ - path.join(tmpDir, 'packages/a/package.json'), - path.join(tmpDir, 'packages/b/package.json'), + `${tmpDir.replaceAll('\\', '/')}/packages/a/package.json`, + `${tmpDir.replaceAll('\\', '/')}/packages/b/package.json`, ].toSorted(), ); }); diff --git a/packages/cli/src/utils/workspace.ts b/packages/cli/src/utils/workspace.ts index 9ec00d7310..95fd709ae2 100644 --- a/packages/cli/src/utils/workspace.ts +++ b/packages/cli/src/utils/workspace.ts @@ -30,11 +30,10 @@ export function findPackageJsonFilesFromPatterns(patterns: string[], cwd: string if (patterns.length === 0) { return []; } - // tinyglobby always returns `/` separators; normalize them to native paths for Windows callers. return globSync( patterns.map((pattern) => `${pattern}/package.json`), { absolute: true, cwd }, - ).map((file) => path.normalize(file)); + ); } // Detect if we're in a monorepo and get workspace info From 048703aac64a0182ed4422ed9c56981c28ebbfd4 Mon Sep 17 00:00:00 2001 From: Liang Date: Sun, 18 Oct 2026 07:41:27 +0800 Subject: [PATCH 4/4] fix(cli): disable tinyglobby directory expansion tinyglobby matches patterns that don't end in `*` as `/**` too, so a directory named like `ci.yml` pulled its contents into the setup-vp migration. Set `expandDirectories: false` to match the previous glob behavior. --- packages/cli/src/migration/__tests__/migrator.spec.ts | 4 ++-- packages/cli/src/migration/migrator/setup.ts | 2 ++ packages/cli/src/utils/workspace.ts | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/migration/__tests__/migrator.spec.ts b/packages/cli/src/migration/__tests__/migrator.spec.ts index 5f2b4839a0..8f3a5c68f6 100644 --- a/packages/cli/src/migration/__tests__/migrator.spec.ts +++ b/packages/cli/src/migration/__tests__/migrator.spec.ts @@ -1494,7 +1494,7 @@ describe('migrateSetupVpVersion', () => { it('updates exact v1 references in workflows and composite actions', () => { const workflowsDir = path.join(tmpDir, '.github', 'workflows'); const actionDir = path.join(tmpDir, '.github', 'actions', 'setup'); - fs.mkdirSync(path.join(workflowsDir, 'nested'), { recursive: true }); + fs.mkdirSync(path.join(workflowsDir, 'nested.yml'), { recursive: true }); fs.mkdirSync(actionDir, { recursive: true }); const workflowPath = path.join(workflowsDir, 'ci.yml'); @@ -1517,7 +1517,7 @@ describe('migrateSetupVpVersion', () => { actionPath, 'runs:\n using: composite\n steps:\n - uses : voidzero-dev/setup-vp@v1\n', ); - const nestedWorkflowPath = path.join(workflowsDir, 'nested', 'ignored.yml'); + const nestedWorkflowPath = path.join(workflowsDir, 'nested.yml', 'ignored.yml'); fs.writeFileSync(nestedWorkflowPath, '- uses: voidzero-dev/setup-vp@v1\n'); const report = createMigrationReport(); diff --git a/packages/cli/src/migration/migrator/setup.ts b/packages/cli/src/migration/migrator/setup.ts index 25f3b19fe4..d864f93227 100644 --- a/packages/cli/src/migration/migrator/setup.ts +++ b/packages/cli/src/migration/migrator/setup.ts @@ -150,6 +150,8 @@ function collectGithubActionFiles(projectPath: string): string[] { cwd: path.join(projectPath, '.github'), absolute: true, caseSensitiveMatch: false, + // Otherwise a directory named like `ci.yml` also matches as `ci.yml/**`. + expandDirectories: false, } as const; const workflows = globSync('workflows/*.{yml,yaml}', globOptions); const compositeActions = globSync('**/action.{yml,yaml}', { diff --git a/packages/cli/src/utils/workspace.ts b/packages/cli/src/utils/workspace.ts index 95fd709ae2..04d2b1503f 100644 --- a/packages/cli/src/utils/workspace.ts +++ b/packages/cli/src/utils/workspace.ts @@ -32,7 +32,7 @@ export function findPackageJsonFilesFromPatterns(patterns: string[], cwd: string } return globSync( patterns.map((pattern) => `${pattern}/package.json`), - { absolute: true, cwd }, + { absolute: true, cwd, expandDirectories: false }, ); } @@ -134,6 +134,7 @@ export function discoverWorkspacePackages( absolute: false, cwd: rootDir, ignore: ['**/node_modules/**'], + expandDirectories: false, }, ); for (const packageJsonRelativePath of packageJsonRelativePaths) {