index.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. // pass in a manifest with a 'bin' field here, and it'll turn it
  2. // into a properly santized bin object
  3. const { join, basename } = require('path')
  4. const normalize = pkg =>
  5. !pkg.bin ? removeBin(pkg)
  6. : typeof pkg.bin === 'string' ? normalizeString(pkg)
  7. : Array.isArray(pkg.bin) ? normalizeArray(pkg)
  8. : typeof pkg.bin === 'object' ? normalizeObject(pkg)
  9. : removeBin(pkg)
  10. const normalizeString = pkg => {
  11. if (!pkg.name) {
  12. return removeBin(pkg)
  13. }
  14. pkg.bin = { [pkg.name]: pkg.bin }
  15. return normalizeObject(pkg)
  16. }
  17. const normalizeArray = pkg => {
  18. pkg.bin = pkg.bin.reduce((acc, k) => {
  19. acc[basename(k)] = k
  20. return acc
  21. }, {})
  22. return normalizeObject(pkg)
  23. }
  24. const removeBin = pkg => {
  25. delete pkg.bin
  26. return pkg
  27. }
  28. const normalizeObject = pkg => {
  29. const orig = pkg.bin
  30. const clean = {}
  31. let hasBins = false
  32. Object.keys(orig).forEach(binKey => {
  33. const base = join('/', basename(binKey.replace(/\\|:/g, '/'))).slice(1)
  34. if (typeof orig[binKey] !== 'string' || !base) {
  35. return
  36. }
  37. const binTarget = join('/', orig[binKey].replace(/\\/g, '/'))
  38. .replace(/\\/g, '/').slice(1)
  39. if (!binTarget) {
  40. return
  41. }
  42. clean[base] = binTarget
  43. hasBins = true
  44. })
  45. if (hasBins) {
  46. pkg.bin = clean
  47. } else {
  48. delete pkg.bin
  49. }
  50. return pkg
  51. }
  52. module.exports = normalize