I'm trying to rewrite a module to return a different value than before, but now it uses an async call to get that value. (with child_process if it matters). I've wrapped it in a Promise, but that's not critical to me - it can be in the original child_process callback, but the problem is I can't chain the promise to everywhere in the app because I need this to become synchronous. Here's my module:
const { exec } = require("child_process");
const platformHome = process.env[process.platform === "win32" ? "USERPROFILE" : "HOME"];
const getExecPath = new Promise((resolve, reject) => {
  const path = process.env.GEM_HOME;
  if (path) {
    resolve(path);
    return;
  }
  exec("gem environment", (err, stdout, err) => {
    if (err) {
      reject(err);
    }
    const line = stdout.split(/\r?\n/).find(l => ~l.indexOf("EXECUTABLE DIRECTORY"));
    if (line) {
      resolve(line.substring(line.indexOf(": ") + 2));
    } else {
      reject(undefined);
    }
  });
});
let GEM_HOME = undefined;
getExecPath
  .then(path => (GEM_HOME = path))
  .catch(() => (GEM_HOME = `${platformHome}/.gem/ruby/2.3.0`))
  .then(
    () => (module.exports = GEM_HOME) // or simply return it
  );
Clearly, when requiring the module, this doesn't work - and if I return the promise itself, and use then after require - my next module.exports will be async, and this chain will carry on. How do I avoid this pattern?
 
     
    