"use strict"; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) t[p[i]] = s[p[i]]; return t; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = __importDefault(require("path")); const chalk_1 = __importDefault(require("chalk")); const paths_1 = require("../utils/paths"); const getModule = (name) => path_1.default.join('node_modules', name); // Only compile files from the react ecosystem. const includeModulesThatContainPaths = [ getModule('react-native'), getModule('react-navigation'), getModule('expo'), getModule('unimodules'), getModule('@react'), getModule('@expo'), getModule('@unimodules'), getModule('native-base'), ]; const excludedRootPaths = [ 'node_modules', // Prevent transpiling webpack generated files. '(webpack)', ]; const parsedPackageNames = []; // TODO: Bacon: Support internal packages. ex: react/fbjs function packageNameFromPath(inputPath) { const modules = inputPath.split('node_modules/'); const libAndFile = modules.pop(); if (!libAndFile) return null; if (libAndFile.charAt(0) === '@') { const [org, lib] = libAndFile.split('/'); return org + '/' + lib; } else { const components = libAndFile.split('/'); const first = components.shift(); return first || null; } } function logPackage(packageName) { if (!parsedPackageNames.includes(packageName)) { parsedPackageNames.push(packageName); console.log(chalk_1.default.cyan('\nCompiling module: ' + chalk_1.default.bold(packageName))); } } function ensureRoot(possibleProjectRoot) { if (typeof possibleProjectRoot === 'string') { return path_1.default.resolve(possibleProjectRoot); } return paths_1.getPossibleProjectRoot(); } /** * A complex babel loader which uses the project's `babel.config.js` * to resolve all of the Unimodules which are shipped as ES modules (early 2019). */ function createBabelLoader(_a = {}) { var { /** * The webpack mode: `"production" | "development"` */ mode, babelProjectRoot, include = [], verbose, platform } = _a, options = __rest(_a, ["mode", "babelProjectRoot", "include", "verbose", "platform"]); const ensuredProjectRoot = ensureRoot(babelProjectRoot); const modules = [...includeModulesThatContainPaths, ...include]; const customUse = options.use || {}; const customUseOptions = customUse.options || {}; const isProduction = mode === 'production'; return Object.assign({ test: /\.[jt]sx?$/ }, options, { include(inputPath) { for (const possibleModule of modules) { if (inputPath.includes(possibleModule)) { if (verbose) { const packageName = packageNameFromPath(inputPath); if (packageName) logPackage(packageName); } return !!inputPath; } } // Is inside the project and is not one of designated modules if (inputPath.includes(ensuredProjectRoot)) { for (const excluded of excludedRootPaths) { if (inputPath.includes(excluded)) { return false; } } return true; } return false; }, use: Object.assign({}, customUse, { loader: require.resolve('babel-loader'), options: Object.assign({ // TODO: Bacon: Caching seems to break babel cacheDirectory: false, // Explicitly use babel.config.js instead of .babelrc babelrc: false, // Attempt to use local babel.config.js file for compiling project. configFile: true }, (customUseOptions || {}), { caller: { bundler: 'webpack', platform, mode, }, sourceType: 'unambiguous', root: ensuredProjectRoot, // Cache babel files in production cacheCompression: isProduction, compact: isProduction }) }) }); } exports.default = createBabelLoader; //# sourceMappingURL=createBabelLoader.js.map