@@ -696,15 +696,10 @@ export function rewriteStandaloneProject(
696696 }
697697
698698 const packageManager = workspaceInfo . packageManager ;
699- // Respect the project's existing pnpm config location: if package.json already
700- // has a "pnpm" field, keep using package.json; otherwise use pnpm-workspace.yaml.
701- const existingPkg = readJsonFile ( packageJsonPath ) ;
702- const usePnpmWorkspaceYaml = packageManager === PackageManager . pnpm && ! existingPkg . pnpm ;
703- if ( usePnpmWorkspaceYaml ) {
704- rewritePnpmWorkspaceYaml ( projectPath ) ;
705- }
706699 let extractedStagedConfig : Record < string , string | string [ ] > | null = null ;
707700 let remainingPnpmOverrides : Record < string , string > | undefined ;
701+ // Determined inside editJsonFile callback to avoid a redundant file read
702+ let usePnpmWorkspaceYaml = false ;
708703 editJsonFile < {
709704 overrides ?: Record < string , string > ;
710705 resolutions ?: Record < string , string > ;
@@ -730,9 +725,15 @@ export function rewriteStandaloneProject(
730725 ...VITE_PLUS_OVERRIDE_PACKAGES ,
731726 } ;
732727 } else if ( packageManager === PackageManager . pnpm ) {
728+ // If package.json already has a "pnpm" field, keep using it;
729+ // otherwise use pnpm-workspace.yaml.
730+ usePnpmWorkspaceYaml = ! pkg . pnpm ;
731+ if ( usePnpmWorkspaceYaml ) {
732+ rewritePnpmWorkspaceYaml ( projectPath ) ;
733+ }
733734 const overrideKeys = Object . keys ( VITE_PLUS_OVERRIDE_PACKAGES ) ;
734735 if ( ! usePnpmWorkspaceYaml ) {
735- // Project already has pnpm config in package.json — keep using it.
736+ // Project already has pnpm config in package.json -- keep using it.
736737 pkg . pnpm = {
737738 ...pkg . pnpm ,
738739 overrides : {
@@ -751,40 +752,9 @@ export function rewriteStandaloneProject(
751752 } ,
752753 } ;
753754 } else {
754- // Remove Vite-managed keys from pnpm.overrides
755- for ( const key of [ ...overrideKeys , ...REMOVE_PACKAGES ] ) {
756- if ( pkg . pnpm ?. overrides ?. [ key ] ) {
757- delete pkg . pnpm . overrides [ key ] ;
758- }
759- }
760- // Remove dependency selectors targeting vite
761- for ( const key in pkg . pnpm ?. overrides ) {
762- if ( key . includes ( '>' ) ) {
763- const splits = key . split ( '>' ) ;
764- if ( splits [ splits . length - 1 ] . trim ( ) === 'vite' ) {
765- delete pkg . pnpm . overrides [ key ] ;
766- }
767- }
768- }
769- // Move any remaining overrides to pnpm-workspace.yaml then delete all
770- // (pnpm ignores workspace-level overrides when pnpm.overrides exists in package.json)
771- if ( pkg . pnpm ?. overrides && Object . keys ( pkg . pnpm . overrides ) . length > 0 ) {
772- remainingPnpmOverrides = { ...pkg . pnpm . overrides } ;
773- }
774- delete pkg . pnpm ?. overrides ;
775- // Only remove Vite-managed peerDependencyRules entries, preserve custom ones
776- cleanupPeerDependencyRules ( pkg . pnpm ?. peerDependencyRules , overrideKeys ) ;
777- if (
778- pkg . pnpm ?. peerDependencyRules &&
779- Object . keys ( pkg . pnpm . peerDependencyRules ) . length === 0
780- ) {
781- delete pkg . pnpm . peerDependencyRules ;
782- }
783- if ( pkg . pnpm && Object . keys ( pkg . pnpm ) . length === 0 ) {
784- delete pkg . pnpm ;
785- }
755+ remainingPnpmOverrides = cleanupPnpmOverridesForWorkspaceYaml ( pkg , overrideKeys ) ;
786756 }
787- // remove dependency selector from vite in force-override mode
757+ // remove dependency selectors targeting vite (e.g. "vite-plugin-svgr>vite")
788758 for ( const key in pkg . pnpm ?. overrides ) {
789759 if ( key . includes ( '>' ) ) {
790760 const splits = key . split ( '>' ) ;
@@ -1027,6 +997,53 @@ function rewritePnpmWorkspaceYaml(projectPath: string): void {
1027997 } ) ;
1028998}
1029999
1000+ /**
1001+ * Clean up pnpm.overrides and peerDependencyRules from package.json when migrating
1002+ * to pnpm-workspace.yaml. Returns any remaining non-Vite overrides that need to be
1003+ * moved to pnpm-workspace.yaml.
1004+ */
1005+ function cleanupPnpmOverridesForWorkspaceYaml (
1006+ pkg : {
1007+ pnpm ?: {
1008+ overrides ?: Record < string , string > ;
1009+ peerDependencyRules ?: { allowAny ?: string [ ] ; allowedVersions ?: Record < string , string > } ;
1010+ } ;
1011+ } ,
1012+ overrideKeys : string [ ] ,
1013+ ) : Record < string , string > | undefined {
1014+ // Remove Vite-managed keys from pnpm.overrides
1015+ for ( const key of [ ...overrideKeys , ...REMOVE_PACKAGES ] ) {
1016+ if ( pkg . pnpm ?. overrides ?. [ key ] ) {
1017+ delete pkg . pnpm . overrides [ key ] ;
1018+ }
1019+ }
1020+ // Remove dependency selectors targeting vite
1021+ for ( const key in pkg . pnpm ?. overrides ) {
1022+ if ( key . includes ( '>' ) ) {
1023+ const splits = key . split ( '>' ) ;
1024+ if ( splits [ splits . length - 1 ] . trim ( ) === 'vite' ) {
1025+ delete pkg . pnpm . overrides [ key ] ;
1026+ }
1027+ }
1028+ }
1029+ // Collect remaining overrides to move to pnpm-workspace.yaml then delete all
1030+ // (pnpm ignores workspace-level overrides when pnpm.overrides exists in package.json)
1031+ let remaining : Record < string , string > | undefined ;
1032+ if ( pkg . pnpm ?. overrides && Object . keys ( pkg . pnpm . overrides ) . length > 0 ) {
1033+ remaining = { ...pkg . pnpm . overrides } ;
1034+ }
1035+ delete pkg . pnpm ?. overrides ;
1036+ // Only remove Vite-managed peerDependencyRules entries, preserve custom ones
1037+ cleanupPeerDependencyRules ( pkg . pnpm ?. peerDependencyRules , overrideKeys ) ;
1038+ if ( pkg . pnpm ?. peerDependencyRules && Object . keys ( pkg . pnpm . peerDependencyRules ) . length === 0 ) {
1039+ delete pkg . pnpm . peerDependencyRules ;
1040+ }
1041+ if ( pkg . pnpm && Object . keys ( pkg . pnpm ) . length === 0 ) {
1042+ delete pkg . pnpm ;
1043+ }
1044+ return remaining ;
1045+ }
1046+
10301047/**
10311048 * Move remaining non-Vite pnpm.overrides from package.json to pnpm-workspace.yaml.
10321049 * pnpm ignores workspace-level overrides when pnpm.overrides exists in package.json,
@@ -1220,43 +1237,14 @@ function rewriteRootWorkspacePackageJson(
12201237 } ,
12211238 } ;
12221239 } else {
1223- // Remove Vite-managed keys from pnpm.overrides
12241240 for ( const key of [ ...overrideKeys , ...REMOVE_PACKAGES ] ) {
1225- if ( pkg . pnpm ?. overrides ?. [ key ] ) {
1226- delete pkg . pnpm . overrides [ key ] ;
1227- }
12281241 if ( pkg . resolutions ?. [ key ] ) {
12291242 delete pkg . resolutions [ key ] ;
12301243 }
12311244 }
1232- // Remove dependency selectors targeting vite
1233- for ( const key in pkg . pnpm ?. overrides ) {
1234- if ( key . includes ( '>' ) ) {
1235- const splits = key . split ( '>' ) ;
1236- if ( splits [ splits . length - 1 ] . trim ( ) === 'vite' ) {
1237- delete pkg . pnpm . overrides [ key ] ;
1238- }
1239- }
1240- }
1241- // Move any remaining overrides to pnpm-workspace.yaml then delete all
1242- // (pnpm ignores workspace-level overrides when pnpm.overrides exists in package.json)
1243- if ( pkg . pnpm ?. overrides && Object . keys ( pkg . pnpm . overrides ) . length > 0 ) {
1244- remainingPnpmOverrides = { ...pkg . pnpm . overrides } ;
1245- }
1246- delete pkg . pnpm ?. overrides ;
1247- // Only remove Vite-managed peerDependencyRules entries, preserve custom ones
1248- cleanupPeerDependencyRules ( pkg . pnpm ?. peerDependencyRules , overrideKeys ) ;
1249- if (
1250- pkg . pnpm ?. peerDependencyRules &&
1251- Object . keys ( pkg . pnpm . peerDependencyRules ) . length === 0
1252- ) {
1253- delete pkg . pnpm . peerDependencyRules ;
1254- }
1255- if ( pkg . pnpm && Object . keys ( pkg . pnpm ) . length === 0 ) {
1256- delete pkg . pnpm ;
1257- }
1245+ remainingPnpmOverrides = cleanupPnpmOverridesForWorkspaceYaml ( pkg , overrideKeys ) ;
12581246 }
1259- // remove dependency selector from vite in force-override mode
1247+ // remove dependency selectors targeting vite (e.g. "vite-plugin-svgr>vite")
12601248 for ( const key in pkg . pnpm ?. overrides ) {
12611249 if ( key . includes ( '>' ) ) {
12621250 const splits = key . split ( '>' ) ;
0 commit comments