mirror of
https://github.com/status-im/react-navigation.git
synced 2025-02-25 01:28:16 +00:00
114 lines
3.1 KiB
JavaScript
114 lines
3.1 KiB
JavaScript
/**
|
|
* Copyright (c) 2015-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.
|
|
*
|
|
* Note: This is a fork of the fb-specific transform.js
|
|
* Specifically, it uses 'babel-plugin-module-resolver' to rewrite requires for
|
|
* 'react-native' and 'react' to point to the passed in paths from the transformer
|
|
* options, and also utilizes babel-preset-exponent for other Exponent specific transforms.
|
|
*/
|
|
|
|
const path = require('path');
|
|
const babel = require('babel-core');
|
|
const reactTransformPlugin = require('babel-plugin-react-transform').default;
|
|
|
|
const hmrTransform = 'react-transform-hmr/lib/index.js';
|
|
const transformPath = require.resolve(hmrTransform);
|
|
|
|
const makeHMRConfig = function(options, filename) {
|
|
const transform = filename ?
|
|
'./' + path.relative(path.dirname(filename), transformPath) : // packager can't handle absolute paths
|
|
hmrTransform;
|
|
|
|
return {
|
|
plugins: [
|
|
[
|
|
reactTransformPlugin,
|
|
{
|
|
transforms: [{
|
|
transform,
|
|
imports: ['react-native'],
|
|
locals: ['module'],
|
|
}],
|
|
},
|
|
],
|
|
],
|
|
};
|
|
};
|
|
|
|
const buildAliasPreset = (reactNativePath, reactPath) => ({
|
|
plugins: [
|
|
[require('babel-plugin-module-resolver').default, {
|
|
alias: Object.assign({}, {
|
|
'react-native': path.resolve(`${reactNativePath || './node_modules/react-native'}`),
|
|
react: path.resolve(`${reactPath || './node_modules/react'}`),
|
|
}, require('babel-preset-exponent').plugins[0][1].alias),
|
|
cwd: path.resolve(__dirname, '..'),
|
|
}],
|
|
],
|
|
});
|
|
|
|
/**
|
|
* Given a filename and options, build a Babel
|
|
* config object with the appropriate plugins.
|
|
*/
|
|
function buildBabelConfig(filename, options) {
|
|
const exponentBabelPreset = require('babel-preset-exponent');
|
|
const babelConfig = {
|
|
presets: [...exponentBabelPreset.presets, buildAliasPreset(options.reactNativePath, options.reactPath)],
|
|
plugins: [],
|
|
};
|
|
|
|
const extraConfig = {
|
|
filename,
|
|
sourceFileName: filename,
|
|
babelrc: false,
|
|
};
|
|
|
|
let config = Object.assign({}, babelConfig, extraConfig);
|
|
|
|
let extraPresets = [];
|
|
|
|
if (options.hot) {
|
|
const hmrConfig = makeHMRConfig(options, filename);
|
|
extraPresets.push(hmrConfig);
|
|
}
|
|
|
|
config.presets = [...config.presets, ...extraPresets];
|
|
|
|
return Object.assign({}, babelConfig, config);
|
|
}
|
|
|
|
function transform(src, filename, options) {
|
|
options = options || {};
|
|
|
|
const babelConfig = buildBabelConfig(filename, options);
|
|
const result = babel.transform(src, babelConfig);
|
|
|
|
return {
|
|
ast: result.ast,
|
|
code: result.code,
|
|
map: result.map,
|
|
filename,
|
|
};
|
|
}
|
|
|
|
module.exports = function (data, callback) {
|
|
let result;
|
|
try {
|
|
result = transform(data.sourceCode, data.filename, data.options);
|
|
} catch (e) {
|
|
callback(e);
|
|
return;
|
|
}
|
|
|
|
callback(null, result);
|
|
};
|
|
|
|
// export for use in jest
|
|
module.exports.transform = transform;
|