const fs = require('fs')
const log = require('npmlog')
const path = require('path')
log.heading = 'react-native-branch'
function addBranchConfigToAndroidAssetsFolder() {
if (fs.existsSync(path.join('.', 'branch.android.json'))) {
ensureAndroidAssetsFolder('main')
addSymbolicLink(path.join('..', '..', '..', '..', '..', 'branch.android.json'),
path.join('.', 'android', 'app', 'src', 'main', 'assets', 'branch.json'))
}
else if (fs.existsSync(path.join('.', 'branch.json'))) {
ensureAndroidAssetsFolder('main')
addSymbolicLink(path.join('..', '..', '..', '..', '..', 'branch.json'),
path.join('.', 'android', 'app', 'src', 'main', 'assets', 'branch.json'))
}
// branch[.android].debug.json will be available as branch.json in debug builds
if (fs.existsSync(path.join('.', 'branch.android.debug.json'))) {
ensureAndroidAssetsFolder('debug')
addSymbolicLink(path.join('..', '..', '..', '..', '..', 'branch.android.debug.json'),
path.join('.', 'android', 'app', 'src', 'debug', 'assets', 'branch.json'))
}
else if (fs.existsSync('./branch.debug.json')) {
ensureAndroidAssetsFolder('debug')
addSymbolicLink(path.join('..', '..', '..', '..', '..', 'branch.debug.json'),
path.join('.', 'android', 'app', 'src', 'debug', 'assets', 'branch.json'))
}
log.info('Added Branch configuration to android project')
}
function addSymbolicLink(linkPath, path) {
try {
const stats = fs.lstatSync(path)
if (stats && stats.isSymbolicLink()) {
const dest = fs.readlinkSync(path)
if (dest == linkPath) {
log.warn(path + ' already present in Android app')
return
}
log.error(path + ' is a link to ' + linkPath + '.')
return
}
if (stats) {
log.error(path + ' exists and is not a symbolic link.')
return
}
}
catch (error) {
if (error.code != 'ENOENT') throw error
// ./android/app/src/main/assets exists and is a directory.
// ./android/app/src/main/assets/branch.json does not exist.
// create the symlink
fs.symlinkSync(linkPath, path)
}
}
function removeSymbolicLink(path) {
try {
const stats = fs.lstatSync(path)
if (!stats.isSymbolicLink()) {
log.warn(path + ' is not a symbolic link. Not removing.')
return
}
}
catch (error) {
if (error.code != 'ENOENT') throw error
// Not present. Quietly do nothing.
return
}
fs.unlinkSync(path)
}
function ensureAndroidAssetsFolder(buildType) {
ensureDirectory(path.join('.', 'android', 'app', 'src', buildType, 'assets'))
}
function ensureDirectory(path) {
try {
const stats = fs.statSync(path)
if (!stats.isDirectory()) {
throw(srcDir + ' exists and is not a directory.')
}
}
catch (error) {
if (error.code != 'ENOENT') throw error
const parent = dirname(path)
if (parent !== path) ensureDirectory(parent)
fs.mkdirSync(path, 0o777)
}
}
function dirname(path) {
if (!path.search(path.sep)) return path
const components = path.split(path.sep)
components.splice(components.count - 1, 1)
return components.join(path.sep)
}
function removeBranchConfigFromAndroidAssetsFolder() {
removeSymbolicLink(path.join('.', 'android', 'app', 'src', 'main', 'assets', 'branch.json'))
removeSymbolicLink(path.join('.', 'android', 'app', 'src', 'debug', 'assets', 'branch.json'))
log.info('Removed Branch configuration from Android project')
}
function androidPackageName() {
const path = path.join('.', 'android', 'app', 'src', 'main', 'AndroidManifest.xml')
manifest = fs.readFileSync(path)
const regex = /package=["']([A-Za-z\.0-9])["']/
if (!manifest.match(regex)) throw 'package name not found in ' + path
return regex.exec(manifest)[1]
}
function androidPackageDir() {
return path.join('.', 'android', 'app', 'src', 'main', 'java', androidPackageName().replace(/\./, path.sep))
}
module.exports = {
addBranchConfigToAndroidAssetsFolder: addBranchConfigToAndroidAssetsFolder,
removeBranchConfigFromAndroidAssetsFolder: removeBranchConfigFromAndroidAssetsFolder
}