Skip to content

Instantly share code, notes, and snippets.

@WomB0ComB0
Created November 1, 2024 19:32
Show Gist options
  • Save WomB0ComB0/f49dba4701ae4f78adb86ba34d8301d9 to your computer and use it in GitHub Desktop.
Save WomB0ComB0/f49dba4701ae4f78adb86ba34d8301d9 to your computer and use it in GitHub Desktop.
Merge package.json files
import { readFileSync, writeFileSync } from "node:fs";
import { join } from "node:path";
interface PackageJson {
dependencies: Record<string, string>;
devDependencies: Record<string, string>;
[key: string]: any;
}
function mergePackageJsons(current: PackageJson, toMerge: PackageJson): PackageJson {
const merged: PackageJson = { ...current };
const compareVersions = (v1: string, v2: string): string => {
const clean1 = v1.replace(/[\^~>=]/g, '');
const clean2 = v2.replace(/[\^~>=]/g, '');
return clean1.localeCompare(clean2, undefined, { numeric: true }) >= 0 ? v1 : v2;
};
merged.dependencies = { ...merged.dependencies };
for (const [pkg, version] of Object.entries(toMerge.dependencies || {})) {
if (merged.dependencies[pkg]) {
merged.dependencies[pkg] = compareVersions(merged.dependencies[pkg], version);
} else if (merged.devDependencies?.[pkg]) {
delete merged.devDependencies[pkg];
merged.dependencies[pkg] = version;
} else {
merged.dependencies[pkg] = version;
}
}
merged.devDependencies = { ...merged.devDependencies };
for (const [pkg, version] of Object.entries(toMerge.devDependencies || {})) {
if (merged.dependencies?.[pkg]) continue;
if (merged.devDependencies[pkg]) {
merged.devDependencies[pkg] = compareVersions(merged.devDependencies[pkg], version);
} else {
merged.devDependencies[pkg] = version;
}
}
merged.dependencies = Object.fromEntries(
Object.entries(merged.dependencies).sort(([a], [b]) => a.localeCompare(b))
);
merged.devDependencies = Object.fromEntries(
Object.entries(merged.devDependencies).sort(([a], [b]) => a.localeCompare(b))
);
return merged;
}
const packageJsonPath: string = join(process.cwd(), "package.json");
const currentPackageJson: PackageJson = JSON.parse(
readFileSync(packageJsonPath, "utf8")
) as PackageJson;
const toMergePackageJsons: PackageJson[] = [
{
dependencies: {
"@radix-ui/react-accordion": "^1.2.0",
"@radix-ui/react-dialog": "^1.1.1",
},
devDependencies: {
"@tailwindcss/typography": "^0.5.13",
}
},
// Add more package.json objects here if needed
];
let mergedPackageJson = currentPackageJson;
for (const toMergePackageJson of toMergePackageJsons) {
mergedPackageJson = mergePackageJsons(mergedPackageJson, toMergePackageJson);
}
writeFileSync(
packageJsonPath,
JSON.stringify(mergedPackageJson, null, 2) + "\n"
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment