@seasketch/geoprocessing
Version:
Geoprocessing and reporting framework for SeaSketch 2.0
96 lines • 3.75 kB
JavaScript
import { hasOwnProperty } from "../../client-core.js";
import cloneDeep from "lodash/cloneDeep.js";
// function that sorts object keys and returns a new sorted object
function sortObjectKeys(obj) {
return Object.keys(obj)
.sort()
.reduce((acc, key) => {
acc[key] = obj[key];
return acc;
}, {});
}
/**
* Returns a new package.json with updated scripts, dependencies, and devDependencies. Does not remove any dependencies or devDependencies, that is up to the report developer.
* @param srcPkg package starting point (deep cloned)
* @param basePkg package to add/update srcPkg from, overwrites version string not checking for greater version number or fuzzy matching
* @param otherPkgs packages to update from if present in srcPkg after basePkg merge
* @returns
*/
export function updatePackageJson(srcPkg, basePkg, otherPkgs = []) {
const projectPkg = cloneDeep(srcPkg);
// add/update projectPkg with basePkg
for (const key of Object.keys(basePkg.scripts)) {
projectPkg.scripts[key] = basePkg.scripts[key];
}
for (const key of Object.keys(basePkg.dependencies)) {
if (key !== "@seasketch/geoprocessing") {
projectPkg.dependencies[key] = basePkg.dependencies[key];
}
}
if (basePkg.devDependencies && projectPkg.devDependencies) {
for (const key of Object.keys(basePkg.devDependencies)) {
if (basePkg.devDependencies &&
projectPkg.devDependencies &&
key !== "@seasketch/geoprocessing") {
projectPkg.devDependencies[key] = basePkg.devDependencies[key];
}
}
}
// add otherPkgs to projectPkg if present, skip scripts
for (const otherPkg of otherPkgs) {
for (const key of Object.keys(otherPkg.dependencies)) {
if (key !== "@seasketch/geoprocessing" &&
hasOwnProperty(projectPkg.dependencies, key)) {
projectPkg.dependencies[key] = otherPkg.dependencies[key];
}
}
if (otherPkg.devDependencies) {
for (const key of Object.keys(otherPkg.devDependencies)) {
if (projectPkg.devDependencies &&
otherPkg.devDependencies &&
key !== "@seasketch/geoprocessing" &&
hasOwnProperty(projectPkg.devDependencies, key)) {
projectPkg.devDependencies[key] = otherPkg.devDependencies[key];
}
}
}
}
// Remove any devDependencies that are also in dependencies
if (projectPkg.devDependencies) {
for (const key of Object.keys(projectPkg.dependencies)) {
if (hasOwnProperty(projectPkg.devDependencies, key)) {
delete projectPkg.devDependencies[key];
}
}
}
projectPkg.scripts = sortObjectKeys(projectPkg.scripts);
projectPkg.dependencies = sortObjectKeys(projectPkg.dependencies);
if (projectPkg.devDependencies)
projectPkg.devDependencies = sortObjectKeys(projectPkg.devDependencies);
// Allow new properties in basePkg to be merged in
const baseKeys = Object.keys(basePkg);
// Define keys to not update
const keysNotToUpdate = new Set([
"author",
"bugs",
"dependencies",
"description",
"devDependencies",
"homepage",
"keywords",
"license",
"name",
"private",
"repositoryUrl",
"scripts",
"type",
"version",
]);
for (const baseKey of baseKeys) {
if (!keysNotToUpdate.has(baseKey)) {
projectPkg[baseKey] = basePkg[baseKey];
}
}
return projectPkg;
}
//# sourceMappingURL=updatePackage.js.map