Error while transforming with RN 0.64 and Typescript
mppperez opened this issue · comments
Just updated to new React Native version and it's broken again.
Output:
error app/sampleFile.ts: function (prevType) {
this.state.exprAllowed = false;
if (prevType === types._let || prevType === types._c...<omitted>...
} could not be cloned.
Error: function (prevType) {
this.state.exprAllowed = false;
if (prevType === types._let || prevType === types._c...<omitted>...
} could not be cloned.
at Object.serialize (v8.js:202:7)
at _default (/home/sample/app/node_modules/metro-transform-worker/node_modules/@babel/core/lib/transformation/util/clone-deep.js:18:30)
at normalizeFile (/home/sample/app/node_modules/metro-transform-worker/node_modules/@babel/core/lib/transformation/normalize-file.js:52:36)
at normalizeFile.next (<anonymous>)
at run (/home/sample/app/node_modules/metro-transform-worker/node_modules/@babel/core/lib/transformation/index.js:31:50)
at run.next (<anonymous>)
at /home/sample/app/node_modules/metro-transform-worker/node_modules/@babel/core/lib/transform-ast.js:20:41
at Generator.next (<anonymous>)
at evaluateSync (/home/sample/app/node_modules/gensync/index.js:251:28)
Already updated my fork appropriately and it works with updated dependencies (+ necessary code changes). PR will be created soon.
@mppperez is your fork available on npm?
Unfortunately not. You will have to include it manually if you want to use it. I guess with our next release we will drop this dependency as well and will check out the solution of directly use javascript-obfuscator.
We've got Hermes enabled (this should generate bytecode rather than JS) but we still have the JS files that need obfuscating... this may be already the solution even for others. I guess our configuration is just not completed yet.
I ended up publishing your fork to a private npm registry and it works well alongside Hermes. A solution using javascript-obfuscator
directly would be interesting.
@mppperez @grit96 How did you manage to get hermes working with the obfuscator?
Either I obfuscate or I use hermes, I cannot get both to work.
More specifically, the obfuscator seems to work but then hermes recreates its own android.bundle without the obfuscation.
When I disassemble the bundle I get all the original code back. Any tips?
This is now the recommended way to do it:
// metro.config.js
module.exports = {
transformer: {
minifierPath: require.resolve('metro-minify-terser')
}
}
@grit96 Thanks! I will try. One question: is it possible to plug in the javascript obfuscator there?
As an update, that still doesn't seem to minify my bundle. I am using hermes and this command to make a build:
react-native bundle --dev false --platform android --entry-file index.js --bundle-output ./android/app/src/main/assets/index.android.bundle --assets-dest ./android/app/src/main/res && rm -rf android/build/ && rm -rf android/app/build/ && rm -rf android/app/src/main/res/drawable* && mkdir -p android/app/build/intermediates/assets/release/ && cd android && ./gradlew assembleRelease && cd .."
But the index.android.bundle
is still not obfuscated (I still get lots of "Original Name: xxx" which contains the original function names.)
Thoughts?
I have a feeling something is undoing the obfuscation step.