function copyLanguagesFromEsper(targets) {
  // Get a list of the regular and modern language plugin paths.
  const target_paths = targets
    .map(lang => [
      [
        path.join(
          PWD,
          "bower_components",
          "esper.js",
          `esper-plugin-lang-${lang}.js`
        ),
        path.join(
          PWD,
          publicFolderName,
          "javascripts",
          "app",
          "vendor",
          `aether-${lang}.js`
        )
      ],
      [
        path.join(
          PWD,
          "bower_components",
          "esper.js",
          `esper-plugin-lang-${lang}-modern.js`
        ),
        path.join(
          PWD,
          publicFolderName,
          "javascripts",
          "app",
          "vendor",
          `aether-${lang}.modern.js`
        )
      ]
    ])
    .reduce((l, paths) => l.concat(paths));

  for (let [src, dest] of target_paths) {
    // const src = path.join(PWD, 'bower_components', 'esper.js', `esper-plugin-lang-${target}.js`);
    // const dest = path.join(PWD, 'bower_components', 'aether', 'build', `${target}.js`);
    console.log(`Copy ${src}, ${dest}`);
    fs.copySync(src, dest);
  }

  // Finally copy html as we globally load these within the html iframe.
  const src = path.join(
    PWD,
    "bower_components",
    "aether",
    "build",
    "html.js"
  );
  const dest = path.join(
    PWD,
    publicFolderName,
    "javascripts",
    "app",
    "vendor",
    "aether-html.js"
  );
  fs.copySync(src, dest);
  console.log(`Copy ${src}, ${dest}`);
}
Set up and build Aether. We build Aether as a separate artifact using
webpack. We also rename certain esper files here and move those files
into the public directory to be loaded dynamically at runtime by the
browser and service workers.

Note:
 esper-modern requires modern language plugin to be loaded otherwise it won't
 work correctly.