scripts/rollup-plugin-babel-source.js

Summary

Maintainability
C
1 day
Test Coverage
const path = require("path");
const fs = require("fs");
const dirname = path.join(__dirname, "..");

module.exports = function () {
  return {
    name: "babel-source",
    load(id) {
      const matches = id.match(/packages\/(babel-[^/]+)\/src\//);
      if (matches) {
        // check if browser field exists for this file and replace
        const packageFolder = path.join(dirname, "packages", matches[1]);
        const packageJson = require(path.join(packageFolder, "package.json"));

        if (
          packageJson["browser"] &&
          typeof packageJson["browser"] === "object"
        ) {
          for (let nodeFile in packageJson["browser"]) {
            const browserFile = packageJson["browser"][nodeFile].replace(
              /^(\.\/)?lib\//,
              "src/"
            );
            nodeFile = nodeFile.replace(/^(\.\/)?lib\//, "src/");
            if (id.endsWith(nodeFile)) {
              if (browserFile === false) {
                return "";
              }
              return fs.readFileSync(
                path.join(packageFolder, browserFile),
                "UTF-8"
              );
            }
          }
        }
      }
      return null;
    },
    resolveId(importee) {
      if (importee === "@babel/runtime/regenerator") {
        return path.join(
          dirname,
          "packages",
          "babel-runtime",
          "regenerator",
          "index.js"
        );
      }

      const matches = importee.match(/^@babel\/([^/]+)$/);
      if (!matches) return null;

      // resolve babel package names to their src index file
      const packageFolder = path.join(
        dirname,
        "packages",
        `babel-${matches[1]}`
      );

      let packageJsonSource;
      try {
        packageJsonSource = fs.readFileSync(
          path.join(packageFolder, "package.json")
        );
      } catch (e) {
        // Some Babel packages aren't in this repository
        return null;
      }

      const packageJson = JSON.parse(packageJsonSource);

      const filename =
        typeof packageJson["browser"] === "string"
          ? packageJson["browser"]
          : packageJson["main"];

      return path.join(
        packageFolder,
        // replace lib with src in the package.json entry
        filename.replace(/^(\.\/)?lib\//, "src/")
      );
    },
  };
};