Skip to content

Commit 4a56523

Browse files
committed
refactor(migration): deduplicate pnpm override cleanup logic
Extract cleanupPnpmOverridesForWorkspaceYaml() to share the non-force override cleanup between rewriteStandaloneProject and rewriteRootWorkspacePackageJson. Also eliminate a redundant readJsonFile() call by moving the usePnpmWorkspaceYaml check inside the editJsonFile callback.
1 parent 4d98aae commit 4a56523

1 file changed

Lines changed: 60 additions & 72 deletions

File tree

packages/cli/src/migration/migrator.ts

Lines changed: 60 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)