index.js
1 'use strict'; 2 const supportsColor = require('supports-color'); 3 const hasFlag = require('has-flag'); 4 5 function parseVersion(versionString) { 6 if (/^\d{3,4}$/.test(versionString)) { 7 // Env var doesn't always use dots. example: 4601 => 46.1.0 8 const m = /(\d{1,2})(\d{2})/.exec(versionString); 9 return { 10 major: 0, 11 minor: parseInt(m[1], 10), 12 patch: parseInt(m[2], 10) 13 }; 14 } 15 16 const versions = (versionString || '').split('.').map(n => parseInt(n, 10)); 17 return { 18 major: versions[0], 19 minor: versions[1], 20 patch: versions[2] 21 }; 22 } 23 24 function supportsHyperlink(stream) { 25 const {env} = process; 26 27 if ('FORCE_HYPERLINK' in env) { 28 return !(env.FORCE_HYPERLINK.length > 0 && parseInt(env.FORCE_HYPERLINK, 10) === 0); 29 } 30 31 if (hasFlag('no-hyperlink') || hasFlag('no-hyperlinks') || hasFlag('hyperlink=false') || hasFlag('hyperlink=never')) { 32 return false; 33 } 34 35 if (hasFlag('hyperlink=true') || hasFlag('hyperlink=always')) { 36 return true; 37 } 38 39 // If they specify no colors, they probably don't want hyperlinks. 40 if (!supportsColor.supportsColor(stream)) { 41 return false; 42 } 43 44 if (stream && !stream.isTTY) { 45 return false; 46 } 47 48 if (process.platform === 'win32') { 49 return false; 50 } 51 52 if ('NETLIFY' in env) { 53 return true; 54 } 55 56 if ('CI' in env) { 57 return false; 58 } 59 60 if ('TEAMCITY_VERSION' in env) { 61 return false; 62 } 63 64 if ('TERM_PROGRAM' in env) { 65 const version = parseVersion(env.TERM_PROGRAM_VERSION); 66 67 switch (env.TERM_PROGRAM) { 68 case 'iTerm.app': 69 if (version.major === 3) { 70 return version.minor >= 1; 71 } 72 73 return version.major > 3; 74 // No default 75 } 76 } 77 78 if ('VTE_VERSION' in env) { 79 // 0.50.0 was supposed to support hyperlinks, but throws a segfault 80 if (env.VTE_VERSION === '0.50.0') { 81 return false; 82 } 83 84 const version = parseVersion(env.VTE_VERSION); 85 return version.major > 0 || version.minor >= 50; 86 } 87 88 return false; 89 } 90 91 module.exports = { 92 supportsHyperlink, 93 stdout: supportsHyperlink(process.stdout), 94 stderr: supportsHyperlink(process.stderr) 95 };