Skip to content

Instantly share code, notes, and snippets.

@ridvanaltun
Last active November 2, 2021 23:08
Show Gist options
  • Save ridvanaltun/64b59562058871d7654d696ed6204cde to your computer and use it in GitHub Desktop.
Save ridvanaltun/64b59562058871d7654d696ed6204cde to your computer and use it in GitHub Desktop.
Bugsnag React-Native bundle uploader

manual

# use for production
node bugsnag.upload.js

# use for development
node bugsnag.upload.js --dev
const Fs = require('fs');
const Exec = require('child_process').exec;
const Package = require('./package.json');
const isDevMode = process?.argv[2] === '--dev';
const apiKey = '<bugsnag-api-key>';
(async function () {
await cleanUp();
await generateSourceMapForIos();
await generateSourceMapForAndroid();
await uploadSourceMapForIos();
await uploadSourceMapForAndroid();
await cleanUp();
console.log('Bugsnag source map upload completed.');
})();
async function cleanUp() {
return new Promise(resolve => {
Fs.unlink('ios-release.bundle', () => {
Fs.unlink('ios-release.bundle.map', () => {
Fs.unlink('android-release.bundle', () => {
Fs.unlink('android-release.bundle.map', () => {
return resolve();
});
});
});
});
});
}
async function uploadSourceMapForIos() {
return new Promise((resolve, reject) => {
Exec(
`
curl https://upload.bugsnag.com/react-native-source-map \\
-F apiKey=${apiKey} \\
-F codeBundleId=${Package.version} \\
-F dev=${isDevMode} \\
-F platform=ios \\
-F sourceMap=@ios-release.bundle.map \\
-F bundle=@ios-release.bundle \\
-F projectRoot=\`pwd\`
`,
error => {
if (error) {
return reject(error);
}
console.log('iOS Source map uploaded');
return resolve();
},
);
});
}
async function uploadSourceMapForAndroid() {
return new Promise((resolve, reject) => {
Exec(
`
curl https://upload.bugsnag.com/react-native-source-map \\
-F apiKey=${apiKey} \\
-F codeBundleId=${Package.version} \\
-F dev=${isDevMode} \\
-F platform=android \\
-F sourceMap=@android-release.bundle.map \\
-F bundle=@android-release.bundle \\
-F projectRoot=\`pwd\`
`,
error => {
if (error) {
return reject(error);
}
console.log('Android Source map uploaded');
return resolve();
},
);
});
}
async function generateSourceMapForIos() {
return new Promise((resolve, reject) => {
Exec(
`
react-native bundle \\
--platform ios \\
--dev ${isDevMode} \\
--entry-file index.js \\
--bundle-output ios-release.bundle \\
--sourcemap-output ios-release.bundle.map
`,
error => {
if (error) {
return reject(error);
}
console.log('iOS Source map generated');
return resolve();
},
);
});
}
async function generateSourceMapForAndroid() {
return new Promise((resolve, reject) => {
Exec(
`
react-native bundle \\
--platform android \\
--dev ${isDevMode} \\
--entry-file index.js \\
--bundle-output android-release.bundle \\
--sourcemap-output android-release.bundle.map
`,
error => {
if (error) {
return reject(error);
}
console.log('Android Source map generated');
return resolve();
},
);
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment