update-dependencies.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. const depTypes = new Set([
  2. 'dependencies',
  3. 'optionalDependencies',
  4. 'devDependencies',
  5. 'peerDependencies',
  6. ])
  7. // sort alphabetically all types of deps for a given package
  8. const orderDeps = (content) => {
  9. for (const type of depTypes) {
  10. if (content && content[type]) {
  11. content[type] = Object.keys(content[type])
  12. .sort((a, b) => a.localeCompare(b, 'en'))
  13. .reduce((res, key) => {
  14. res[key] = content[type][key]
  15. return res
  16. }, {})
  17. }
  18. }
  19. return content
  20. }
  21. const updateDependencies = ({ content, originalContent }) => {
  22. const pkg = orderDeps({
  23. ...content,
  24. })
  25. // optionalDependencies don't need to be repeated in two places
  26. if (pkg.dependencies) {
  27. if (pkg.optionalDependencies) {
  28. for (const name of Object.keys(pkg.optionalDependencies)) {
  29. delete pkg.dependencies[name]
  30. }
  31. }
  32. }
  33. const result = { ...originalContent }
  34. // loop through all types of dependencies and update package json pkg
  35. for (const type of depTypes) {
  36. if (pkg[type]) {
  37. result[type] = pkg[type]
  38. }
  39. // prune empty type props from resulting object
  40. const emptyDepType =
  41. pkg[type]
  42. && typeof pkg === 'object'
  43. && Object.keys(pkg[type]).length === 0
  44. if (emptyDepType) {
  45. delete result[type]
  46. }
  47. }
  48. // if original package.json had dep in peerDeps AND deps, preserve that.
  49. const { dependencies: origProd, peerDependencies: origPeer } =
  50. originalContent || {}
  51. const { peerDependencies: newPeer } = result
  52. if (origProd && origPeer && newPeer) {
  53. // we have original prod/peer deps, and new peer deps
  54. // copy over any that were in both in the original
  55. for (const name of Object.keys(origPeer)) {
  56. if (origProd[name] !== undefined && newPeer[name] !== undefined) {
  57. result.dependencies = result.dependencies || {}
  58. result.dependencies[name] = newPeer[name]
  59. }
  60. }
  61. }
  62. return result
  63. }
  64. updateDependencies.knownKeys = depTypes
  65. module.exports = updateDependencies