2016-05-20 11:52:08 +00:00
|
|
|
const log = require('npmlog');
|
|
|
|
const path = require('path');
|
|
|
|
const uniq = require('lodash').uniq;
|
|
|
|
const flatten = require('lodash').flatten;
|
|
|
|
const pkg = require('../package.json');
|
|
|
|
|
|
|
|
const isEmpty = require('lodash').isEmpty;
|
|
|
|
const promiseWaterfall = require('./promiseWaterfall');
|
|
|
|
const registerDependencyAndroid = require('./android/registerNativeModule');
|
|
|
|
const registerDependencyIOS = require('./ios/registerNativeModule');
|
|
|
|
const isInstalledAndroid = require('./android/isInstalled');
|
|
|
|
const isInstalledIOS = require('./ios/isInstalled');
|
|
|
|
const copyAssetsAndroid = require('./android/copyAssets');
|
|
|
|
const copyAssetsIOS = require('./ios/copyAssets');
|
|
|
|
const getProjectDependencies = require('./getProjectDependencies');
|
|
|
|
const getDependencyConfig = require('./getDependencyConfig');
|
|
|
|
const pollParams = require('./pollParams');
|
|
|
|
|
|
|
|
log.heading = 'rnpm-link';
|
|
|
|
|
|
|
|
const commandStub = (cb) => cb();
|
|
|
|
const dedupeAssets = (assets) => uniq(assets, asset => path.basename(asset));
|
|
|
|
|
|
|
|
const promisify = (func) => new Promise((resolve, reject) =>
|
|
|
|
func((err, res) => err ? reject(err) : resolve(res))
|
|
|
|
);
|
|
|
|
|
|
|
|
const linkDependencyAndroid = (androidProject, dependency) => {
|
|
|
|
if (!androidProject || !dependency.config.android) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
const isInstalled = isInstalledAndroid(androidProject, dependency.name);
|
|
|
|
|
|
|
|
if (isInstalled) {
|
|
|
|
log.info(`Android module ${dependency.name} is already linked`);
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
return pollParams(dependency.config.params).then(params => {
|
|
|
|
log.info(`Linking ${dependency.name} android dependency`);
|
|
|
|
|
|
|
|
registerDependencyAndroid(
|
|
|
|
dependency.name,
|
|
|
|
dependency.config.android,
|
|
|
|
params,
|
|
|
|
androidProject
|
|
|
|
);
|
|
|
|
|
|
|
|
log.info(`Android module ${dependency.name} has been successfully linked`);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
const linkDependencyIOS = (iOSProject, dependency) => {
|
|
|
|
if (!iOSProject || !dependency.config.ios) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const isInstalled = isInstalledIOS(iOSProject, dependency.config.ios);
|
|
|
|
|
|
|
|
if (isInstalled) {
|
|
|
|
log.info(`iOS module ${dependency.name} is already linked`);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
log.info(`Linking ${dependency.name} ios dependency`);
|
|
|
|
|
|
|
|
registerDependencyIOS(dependency.config.ios, iOSProject);
|
|
|
|
|
|
|
|
log.info(`iOS module ${dependency.name} has been successfully linked`);
|
|
|
|
};
|
|
|
|
|
|
|
|
const linkAssets = (project, assets) => {
|
|
|
|
if (isEmpty(assets)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (project.ios) {
|
|
|
|
log.info('Linking assets to ios project');
|
|
|
|
copyAssetsIOS(assets, project.ios);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (project.android) {
|
|
|
|
log.info('Linking assets to android project');
|
|
|
|
copyAssetsAndroid(assets, project.android.assetsPath);
|
|
|
|
}
|
|
|
|
|
2016-08-22 03:27:48 +00:00
|
|
|
log.info(`Assets have been successfully linked to your project`);
|
2016-05-20 11:52:08 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Updates project and linkes all dependencies to it
|
|
|
|
*
|
|
|
|
* If optional argument [packageName] is provided, it's the only one that's checked
|
|
|
|
*/
|
2016-07-30 15:59:16 +00:00
|
|
|
module.exports = function link(args, config) {
|
2016-05-20 11:52:08 +00:00
|
|
|
var project;
|
|
|
|
try {
|
|
|
|
project = config.getProjectConfig();
|
|
|
|
} catch (err) {
|
|
|
|
log.error(
|
|
|
|
'ERRPACKAGEJSON',
|
|
|
|
'No package found. Are you sure it\'s a React Native project?'
|
|
|
|
);
|
|
|
|
return Promise.reject(err);
|
|
|
|
}
|
|
|
|
|
|
|
|
const packageName = args[0];
|
|
|
|
|
|
|
|
const dependencies = getDependencyConfig(
|
|
|
|
config,
|
|
|
|
packageName ? [packageName] : getProjectDependencies()
|
|
|
|
);
|
|
|
|
|
|
|
|
const assets = dedupeAssets(dependencies.reduce(
|
|
|
|
(assets, dependency) => assets.concat(dependency.config.assets),
|
|
|
|
project.assets
|
|
|
|
));
|
|
|
|
|
|
|
|
const tasks = flatten(dependencies.map(dependency => [
|
|
|
|
() => promisify(dependency.config.commands.prelink || commandStub),
|
|
|
|
() => linkDependencyAndroid(project.android, dependency),
|
|
|
|
() => linkDependencyIOS(project.ios, dependency),
|
|
|
|
() => promisify(dependency.config.commands.postlink || commandStub),
|
|
|
|
]));
|
|
|
|
|
|
|
|
tasks.push(() => linkAssets(project, assets));
|
|
|
|
|
|
|
|
return promiseWaterfall(tasks).catch(err => {
|
|
|
|
log.error(
|
|
|
|
`It seems something went wrong while linking. Error: ${err.message} \n`
|
|
|
|
+ `Please file an issue here: ${pkg.bugs.url}`
|
|
|
|
);
|
|
|
|
throw err;
|
|
|
|
});
|
|
|
|
};
|