1*8d3f3824SCedric van Puttenimport { execSync } from 'child_process'; 2*8d3f3824SCedric van Puttenimport dns from 'dns'; 3*8d3f3824SCedric van Puttenimport url from 'url'; 4*8d3f3824SCedric van Putten 5*8d3f3824SCedric van Putten/** Determine if you should use yarn offline or not */ 6*8d3f3824SCedric van Puttenexport async function isYarnOfflineAsync(): Promise<boolean> { 7*8d3f3824SCedric van Putten if (await isUrlAvailableAsync('registry.yarnpkg.com')) { 8*8d3f3824SCedric van Putten return false; 9*8d3f3824SCedric van Putten } 10*8d3f3824SCedric van Putten 11*8d3f3824SCedric van Putten const proxy = getNpmProxy(); 12*8d3f3824SCedric van Putten 13*8d3f3824SCedric van Putten if (!proxy) { 14*8d3f3824SCedric van Putten return true; 15*8d3f3824SCedric van Putten } 16*8d3f3824SCedric van Putten 17*8d3f3824SCedric van Putten const { hostname } = url.parse(proxy); 18*8d3f3824SCedric van Putten if (!hostname) { 19*8d3f3824SCedric van Putten return true; 20*8d3f3824SCedric van Putten } 21*8d3f3824SCedric van Putten 22*8d3f3824SCedric van Putten return !(await isUrlAvailableAsync(hostname)); 23*8d3f3824SCedric van Putten} 24*8d3f3824SCedric van Putten 25*8d3f3824SCedric van Putten/** Exposed for testing */ 26*8d3f3824SCedric van Puttenexport function getNpmProxy(): string | null { 27*8d3f3824SCedric van Putten if (process.env.https_proxy) { 28*8d3f3824SCedric van Putten return process.env.https_proxy ?? null; 29*8d3f3824SCedric van Putten } 30*8d3f3824SCedric van Putten 31*8d3f3824SCedric van Putten try { 32*8d3f3824SCedric van Putten const httpsProxy = execSync('npm config get https-proxy').toString().trim(); 33*8d3f3824SCedric van Putten return httpsProxy !== 'null' ? httpsProxy : null; 34*8d3f3824SCedric van Putten } catch { 35*8d3f3824SCedric van Putten return null; 36*8d3f3824SCedric van Putten } 37*8d3f3824SCedric van Putten} 38*8d3f3824SCedric van Putten 39*8d3f3824SCedric van Puttenfunction isUrlAvailableAsync(url: string): Promise<boolean> { 40*8d3f3824SCedric van Putten return new Promise<boolean>((resolve) => { 41*8d3f3824SCedric van Putten dns.lookup(url, (err) => { 42*8d3f3824SCedric van Putten resolve(!err); 43*8d3f3824SCedric van Putten }); 44*8d3f3824SCedric van Putten }); 45*8d3f3824SCedric van Putten} 46