UNPKG

4.22 kBJavaScriptView Raw
1/**
2 * Copyright (c) Facebook, Inc. and its affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 * @format
8 * @flow
9 */
10
11/* eslint-env node */
12
13'use strict';
14
15const babelRegisterOnly = require('metro-babel-register');
16const createCacheKeyFunction = require('fbjs-scripts/jest/createCacheKeyFunction');
17
18const {transformSync: babelTransformSync} = require('@babel/core');
19const generate = require('@babel/generator').default;
20
21const nodeFiles = new RegExp(
22 [
23 '/metro(?:-[^/]*)?/', // metro, metro-core, metro-source-map, metro-etc.
24 ].join('|'),
25);
26const nodeOptions = babelRegisterOnly.config([nodeFiles]);
27
28babelRegisterOnly([]);
29
30const transformer = require('metro-react-native-babel-transformer');
31module.exports = {
32 process(src /*: string */, file /*: string */) /*: string */ {
33 if (nodeFiles.test(file)) {
34 // node specific transforms only
35 return babelTransformSync(src, {
36 filename: file,
37 sourceType: 'script',
38 ...nodeOptions,
39 ast: false,
40 }).code;
41 }
42
43 /* $FlowFixMe(>=0.99.0 site=react_native_fb) This fixme can be removed after metro releases
44 * 0.58 and RN upgrades its dependency */
45 const {ast} = transformer.transform({
46 filename: file,
47 options: {
48 ast: true, // needed for open source (?) https://github.com/facebook/react-native/commit/f8d6b97140cffe8d18b2558f94570c8d1b410d5c#r28647044
49 dev: true,
50 enableBabelRuntime: false,
51 experimentalImportSupport: false,
52 hot: false,
53 inlineRequires: true,
54 minify: false,
55 platform: '',
56 projectRoot: '',
57 publicPath: '/assets',
58 retainLines: true,
59 sourceType: 'unambiguous', // b7 required. detects module vs script mode
60 },
61 src,
62 plugins: [
63 [require('@babel/plugin-transform-block-scoping')],
64 // the flow strip types plugin must go BEFORE class properties!
65 // there'll be a test case that fails if you don't.
66 [require('@babel/plugin-transform-flow-strip-types')],
67 [
68 require('@babel/plugin-proposal-class-properties'),
69 // use `this.foo = bar` instead of `this.defineProperty('foo', ...)`
70 {loose: true},
71 ],
72 [require('@babel/plugin-transform-computed-properties')],
73 [require('@babel/plugin-transform-destructuring')],
74 [require('@babel/plugin-transform-function-name')],
75 [require('@babel/plugin-transform-literals')],
76 [require('@babel/plugin-transform-parameters')],
77 [require('@babel/plugin-transform-shorthand-properties')],
78 [require('@babel/plugin-transform-react-jsx')],
79 [require('@babel/plugin-transform-regenerator')],
80 [require('@babel/plugin-transform-sticky-regex')],
81 [require('@babel/plugin-transform-unicode-regex')],
82 [
83 require('@babel/plugin-transform-modules-commonjs'),
84 {strict: false, allowTopLevelThis: true},
85 ],
86 [require('@babel/plugin-transform-classes')],
87 [require('@babel/plugin-transform-arrow-functions')],
88 [require('@babel/plugin-transform-spread')],
89 [require('@babel/plugin-proposal-object-rest-spread')],
90 [
91 require('@babel/plugin-transform-template-literals'),
92 {loose: true}, // dont 'a'.concat('b'), just use 'a'+'b'
93 ],
94 [require('@babel/plugin-transform-exponentiation-operator')],
95 [require('@babel/plugin-transform-object-assign')],
96 [require('@babel/plugin-transform-for-of'), {loose: true}],
97 [require('@babel/plugin-transform-react-display-name')],
98 [require('@babel/plugin-transform-react-jsx-source')],
99 ],
100 });
101
102 return generate(
103 ast,
104 {
105 code: true,
106 comments: false,
107 compact: false,
108 filename: file,
109 retainLines: true,
110 sourceFileName: file,
111 sourceMaps: true,
112 },
113 src,
114 ).code;
115 },
116
117 getCacheKey: (createCacheKeyFunction([
118 __filename,
119 require.resolve('metro-react-native-babel-transformer'),
120 require.resolve('@babel/core/package.json'),
121 ]) /*: any */),
122};