diff --git a/cli.js b/cli.js index 13b3ce7e0..88837275f 100644 --- a/cli.js +++ b/cli.js @@ -8,8 +8,4 @@ */ 'use strict'; -require('./packager/babelRegisterOnly')([ - /private-cli\/src/ -]); - module.exports = require('./local-cli/cli.js'); diff --git a/local-cli/cli.js b/local-cli/cli.js index 8369d517f..14cf1a8d8 100644 --- a/local-cli/cli.js +++ b/local-cli/cli.js @@ -15,11 +15,7 @@ require('graceful-fs').gracefulify(require('fs')); // it is not supported. This is why the rest of the cli code is in `cliEntry.js`. require('./server/checkNodeVersion')(); -require('../packager/babelRegisterOnly')([ - /private-cli\/src/, - /local-cli/, - /react-packager\/src/, -]); +require('../setupBabel')(); var cliEntry = require('./cliEntry'); diff --git a/package.json b/package.json index c1e9e23f1..83b005e63 100644 --- a/package.json +++ b/package.json @@ -91,6 +91,7 @@ "jest-preset.json", "jest", "lib", + "setupBabel.js", "Libraries", "LICENSE", "local-cli", diff --git a/packager/react-packager/index.js b/packager/react-packager/index.js index 7aa80a248..4d43921a1 100644 --- a/packager/react-packager/index.js +++ b/packager/react-packager/index.js @@ -8,7 +8,7 @@ */ 'use strict'; -require('../babelRegisterOnly')([/react-packager\/src/]); +require('../../setupBabel')(); const debug = require('debug'); const Logger = require('./src/Logger'); diff --git a/packager/react-packager/src/JSTransformer/worker/index.js b/packager/react-packager/src/JSTransformer/worker/index.js index 1af9363dc..c1a634ef1 100644 --- a/packager/react-packager/src/JSTransformer/worker/index.js +++ b/packager/react-packager/src/JSTransformer/worker/index.js @@ -9,8 +9,5 @@ 'use strict'; -const path = require('path'); -require('../../../../babelRegisterOnly')([ - path.resolve(path.join(__dirname, '../../**/*')), -]); +require('../../../../../setupBabel')(); module.exports = require('./worker'); diff --git a/setupBabel.js b/setupBabel.js new file mode 100644 index 000000000..df69ac82f --- /dev/null +++ b/setupBabel.js @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +'use strict'; + +const babelRegisterOnly = require('./packager/babelRegisterOnly'); +const escapeRegExp = require('lodash/escapeRegExp'); +const path = require('path'); + +const BABEL_ENABLED_PATHS = [ + 'packager/react-packager/src', + 'local-cli', +]; + +/** + * We use absolute paths for matching only the top-level folders reliably. For + * example, we would not want to match some deeply nested forder that happens to + * have the same name as one of `BABEL_ENABLED_PATHS`. + */ +function buildRegExps(basePath, dirPaths) { + return dirPaths.map(folderPath => + new RegExp(`^${escapeRegExp(path.resolve(basePath, folderPath))}`) + ); +} + +function getOnlyList() { + return buildRegExps(__dirname, BABEL_ENABLED_PATHS); +} + +/** + * Centralized place to register all the directories that need a Babel + * transformation before being fed to Node.js. Notably, this is necessary to + * support Flow type annotations. + */ +function setupBabel() { + babelRegisterOnly(getOnlyList()); +} + +setupBabel.buildRegExps = buildRegExps; +setupBabel.getOnlyList = getOnlyList; +module.exports = setupBabel;