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