Bundle failure on decorators
See original GitHub issue- Review the documentation: https://facebook.github.io/react-native
- Search for existing issues: https://github.com/facebook/react-native/issues
- Use the latest React Native release: https://github.com/facebook/react-native/releases
Environment
React Native Environment Info:
System:
OS: Linux 4.15 Ubuntu 18.04 LTS (Bionic Beaver)
CPU: x64 Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz
Memory: 3.13 GB / 31.39 GB
Shell: 4.4.19 - /bin/bash
Binaries:
Node: 8.11.1 - /usr/bin/node
Yarn: 1.5.1 - /usr/local/bin/yarn
npm: 6.1.0 - /usr/local/bin/npm
Watchman: 4.9.0 - /usr/local/bin/watchman
SDKs:
Android SDK:
Build Tools: 23.0.1, 25.0.0, 25.0.2, 26.0.0, 26.0.1, 26.0.2, 27.0.1, 27.0.3
API Levels: 23, 24, 26, 27
npmPackages:
@client/react: ^1.0.13 => 1.0.62
@client/react-native: ^1.0.13 => 1.0.62
react-native: ^0.56.0-rc.4 => 0.56.0-rc.4
npmGlobalPackages:
react-native-cli: 2.0.1
Description
Multi-platform app with both regular React (Webpack) and React Native builds. I upgraded RN to 0.56, which of course necessitated changes to the Babel environment, e.g. babel-plugin-transform-decorators-legacy
→ @babel/plugin-proposal-decorators
({legacy:true}
). The Webpack version builds fine. The RN version fails bundling:
error: bundling failed: TypeError: Property right of AssignmentExpression expected node to be of a type ["Expression"] but instead got null
at Object.validate (/home/petter/owl/client2/root/node_modules/@babel/types/lib/definitions/utils.js:128:13)
at validate (/home/petter/owl/client2/root/node_modules/@babel/types/lib/validators/validate.js:17:9)
at builder (/home/petter/owl/client2/root/node_modules/@babel/types/lib/builders/builder.js:46:27)
at Object.AssignmentExpression (/home/petter/owl/client2/root/node_modules/@babel/types/lib/builders/generated/index.js:233:31)
at _core.types.sequenceExpression.identDecorators.map.decorator (/home/petter/owl/client2/root/node_modules/@babel/plugin-proposal-decorators/lib/transformer-legacy.js:47:26)
at Array.map (<anonymous>)
at applyEnsureOrdering (/home/petter/owl/client2/root/node_modules/@babel/plugin-proposal-decorators/lib/transformer-legacy.js:44:59)
at PluginPass.ClassExpression (/home/petter/owl/client2/root/node_modules/@babel/plugin-proposal-decorators/lib/transformer-legacy.js:161:28)
at newFn (/home/petter/owl/client2/root/node_modules/metro/node_modules/@babel/traverse/lib/visitors.js:237:21)
BUNDLE [android, dev] ./index.android.js ▓▓▓▓▓▓▓░░░░░░░░░ 45.7% (809/1197), failed.
What puzzles me is that, again, the Webpack version works, so presumably there’s nothing inherently problematic about our Babel setup, and migration to Babel 7 was successful. The only difference in Babel configuration here is babel-preset-react-native
(5.0.2) versus @babel/preset-env
. (The thought occurred to me that this might be due to the RN preset importing proposal-class-properties
before -decorators
, but modifying babel-preset-react-native/configs/main.js
to include the decorator plugin does not help.)
Looking at the AST in Babel, it looks like it’s failing with both class and method decorators.
Unfortunately I do not have a demo and can’t share the (proprietary) source, but any suggestions on how to go about debugging this would be welcome.
Issue Analytics
- State:
- Created 5 years ago
- Reactions:26
- Comments:42 (8 by maintainers)
Okay, the problem is that React Native is bundling its own version of babel-helpers (exposed as a global variable named
babelHelpers
), which doesn’t include support for decorators.This will be fixed when this PR lands in Metro, and when React Native upgrades to that version of Metro. (I’m guessing React Native 0.58)
https://github.com/facebook/metro/pull/198
In the meantime, you can use this workaround:
Together with
npm add @babel/runtime
was exactly in the situation @haggholm mentioned,
It seems the error is caused by a dependency version missmatch between the plugins used in
babel-plugin-react-native
, which use the7.0.0-beta.47
version and the local babel packages.Be sure to check that all the babel package are actually installed with the beta.47 version:
grep -r 'version' node_modules/@babel/*/package.json|grep -v "beta.47"
The problem in our case was that some babel packages where installed using a caret range
^7.0.0-beta.47
. we fixed it using the hard coded version7.0.0-beta.47
.