objectHelpers.ts 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. const isObject = (val: unknown): val is object =>
  2. val && typeof val === "object";
  3. const mergeArrayWithDedupe = (a: any[], b: any[]) =>
  4. Array.from(new Set([...a, ...b]));
  5. /** Recursively merge the content of the new object to the existing one. */
  6. export function deepMerge(target: object, obj: object): object {
  7. for (const key of Object.keys(obj)) {
  8. const oldVal = target[key];
  9. const newVal = obj[key];
  10. if (Array.isArray(oldVal) && Array.isArray(newVal)) {
  11. target[key] = mergeArrayWithDedupe(oldVal, newVal);
  12. } else if (isObject(oldVal) && isObject(newVal)) {
  13. target[key] = deepMerge(oldVal, newVal);
  14. } else {
  15. target[key] = newVal;
  16. }
  17. }
  18. return target;
  19. }
  20. export function sortDependencies<T extends object = object>(packageJson: T): T {
  21. const sorted = {};
  22. const depTypes = [
  23. "dependencies",
  24. "devDependencies",
  25. "peerDependencies",
  26. "optionalDependencies",
  27. ];
  28. for (const depType of depTypes) {
  29. if (packageJson[depType]) {
  30. sorted[depType] = {};
  31. Object.keys(packageJson[depType])
  32. .sort()
  33. .forEach((name) => {
  34. sorted[depType][name] = packageJson[depType][name];
  35. });
  36. }
  37. }
  38. return {
  39. ...packageJson,
  40. ...sorted,
  41. };
  42. }