objects.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. // @ts-ignore
  9. const oldVal = target[key];
  10. // @ts-ignore
  11. const newVal = obj[key];
  12. if (Array.isArray(oldVal) && Array.isArray(newVal)) {
  13. // @ts-ignore
  14. target[key] = mergeArrayWithDedupe(oldVal, newVal);
  15. } else if (isObject(oldVal) && isObject(newVal)) {
  16. // @ts-ignore
  17. target[key] = deepMerge(oldVal, newVal);
  18. } else {
  19. // @ts-ignore
  20. target[key] = newVal;
  21. }
  22. }
  23. return target;
  24. }
  25. export function sortDependencies<T extends object = object>(packageJson: T): T {
  26. const sorted = {};
  27. const depTypes = [
  28. 'dependencies',
  29. 'devDependencies',
  30. 'peerDependencies',
  31. 'optionalDependencies',
  32. ];
  33. for (const depType of depTypes) {
  34. // @ts-ignore
  35. if (packageJson[depType]) {
  36. // @ts-ignore
  37. sorted[depType] = {};
  38. // @ts-ignore
  39. Object.keys(packageJson[depType])
  40. .sort()
  41. .forEach((name) => {
  42. // @ts-ignore
  43. sorted[depType][name] = packageJson[depType][name];
  44. });
  45. }
  46. }
  47. return {
  48. ...packageJson,
  49. ...sorted,
  50. };
  51. }