preprocessor.js 4.0 KB

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