open-url.js 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. const opener = require('opener')
  2. const { URL } = require('url')
  3. // attempt to open URL in web-browser, print address otherwise:
  4. const open = async (npm, url, errMsg) => {
  5. url = encodeURI(url)
  6. const browser = npm.config.get('browser')
  7. function printAlternateMsg () {
  8. const json = npm.config.get('json')
  9. const alternateMsg = json
  10. ? JSON.stringify({
  11. title: errMsg,
  12. url,
  13. }, null, 2)
  14. : `${errMsg}:\n ${url}\n`
  15. npm.output(alternateMsg)
  16. }
  17. if (browser === false) {
  18. printAlternateMsg()
  19. return
  20. }
  21. try {
  22. if (!/^(https?|file):$/.test(new URL(url).protocol))
  23. throw new Error()
  24. } catch (_) {
  25. throw new Error('Invalid URL: ' + url)
  26. }
  27. const command = browser === true ? null : browser
  28. await new Promise((resolve, reject) => {
  29. opener(url, { command }, (err) => {
  30. if (err) {
  31. if (err.code === 'ENOENT')
  32. printAlternateMsg()
  33. else
  34. return reject(err)
  35. }
  36. return resolve()
  37. })
  38. })
  39. }
  40. module.exports = open