mirror of
https://github.com/status-im/react-native.git
synced 2025-01-10 01:25:39 +00:00
445182c707
Summary:
Seeing as [Windows is a supported platform](72157cf991/packager/defaults.js (L22)
) until platforms can better manager their own CLI and packager needs.
Linking 3rd party libraries should be supported first, because then I'd like to do a follow up PR with grabbou to identify how we can effectively move RNPM functionality out of react-native core and eventually housed in each external platform's repo. The goal would be working with cpojer and hopefully andrewimm to help keep external platform needs in their respective repos, for rnpm/packager _et al._ Seeing as this is a major discussion point, I've made this PR first. Making small steps towards this goal, seems to be the approved methodology from all.
Additionally, I have a merged PR that makes an excellent place for documenting the CLI when it advances, as preparatio
Closes https://github.com/facebook/react-native/pull/11282
Differential Revision: D4311391
fbshipit-source-id: be9a836344be4aed6c4732b0ce4947c2a16b6dad
165 lines
5.0 KiB
JavaScript
165 lines
5.0 KiB
JavaScript
const log = require('npmlog');
|
|
|
|
const getProjectDependencies = require('./getProjectDependencies');
|
|
const unregisterDependencyAndroid = require('./android/unregisterNativeModule');
|
|
const unregisterDependencyWindows = require('./windows/unregisterNativeModule');
|
|
const unregisterDependencyIOS = require('./ios/unregisterNativeModule');
|
|
const isInstalledAndroid = require('./android/isInstalled');
|
|
const isInstalledWindows = require('./windows/isInstalled');
|
|
const isInstalledIOS = require('./ios/isInstalled');
|
|
const unlinkAssetsAndroid = require('./android/unlinkAssets');
|
|
const unlinkAssetsIOS = require('./ios/unlinkAssets');
|
|
const getDependencyConfig = require('./getDependencyConfig');
|
|
const compact = require('lodash').compact;
|
|
const difference = require('lodash').difference;
|
|
const filter = require('lodash').filter;
|
|
const find = require('lodash').find;
|
|
const flatten = require('lodash').flatten;
|
|
const isEmpty = require('lodash').isEmpty;
|
|
const promiseWaterfall = require('./promiseWaterfall');
|
|
const commandStub = require('./commandStub');
|
|
const promisify = require('./promisify');
|
|
|
|
log.heading = 'rnpm-link';
|
|
|
|
const unlinkDependencyAndroid = (androidProject, dependency, packageName) => {
|
|
if (!androidProject || !dependency.android) {
|
|
return;
|
|
}
|
|
|
|
const isInstalled = isInstalledAndroid(androidProject, packageName);
|
|
|
|
if (!isInstalled) {
|
|
log.info(`Android module ${packageName} is not installed`);
|
|
return;
|
|
}
|
|
|
|
log.info(`Unlinking ${packageName} android dependency`);
|
|
|
|
unregisterDependencyAndroid(packageName, dependency.android, androidProject);
|
|
|
|
log.info(`Android module ${packageName} has been successfully unlinked`);
|
|
};
|
|
|
|
const unlinkDependencyWindows = (windowsProject, dependency, packageName) => {
|
|
if (!windowsProject || !dependency.windows) {
|
|
return;
|
|
}
|
|
|
|
const isInstalled = isInstalledWindows(windowsProject, dependency.windows);
|
|
|
|
if (!isInstalled) {
|
|
log.info(`Windows module ${packageName} is not installed`);
|
|
return;
|
|
}
|
|
|
|
log.info(`Unlinking ${packageName} windows dependency`);
|
|
|
|
unregisterDependencyWindows(packageName, dependency.windows, windowsProject);
|
|
|
|
log.info(`Windows module ${packageName} has been successfully unlinked`);
|
|
};
|
|
|
|
const unlinkDependencyIOS = (iOSProject, dependency, packageName, iOSDependencies) => {
|
|
if (!iOSProject || !dependency.ios) {
|
|
return;
|
|
}
|
|
|
|
const isInstalled = isInstalledIOS(iOSProject, dependency.ios);
|
|
|
|
if (!isInstalled) {
|
|
log.info(`iOS module ${packageName} is not installed`);
|
|
return;
|
|
}
|
|
|
|
log.info(`Unlinking ${packageName} ios dependency`);
|
|
|
|
unregisterDependencyIOS(dependency.ios, iOSProject, iOSDependencies);
|
|
|
|
log.info(`iOS module ${packageName} has been successfully unlinked`);
|
|
};
|
|
|
|
/**
|
|
* Updates project and unlink specific dependency
|
|
*
|
|
* If optional argument [packageName] is provided, it's the only one
|
|
* that's checked
|
|
*/
|
|
function unlink(args, config) {
|
|
const packageName = args[0];
|
|
|
|
var project;
|
|
var dependency;
|
|
|
|
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);
|
|
}
|
|
|
|
try {
|
|
dependency = config.getDependencyConfig(packageName);
|
|
} catch (err) {
|
|
log.warn(
|
|
'ERRINVALIDPROJ',
|
|
`Project ${packageName} is not a react-native library`
|
|
);
|
|
return Promise.reject(err);
|
|
}
|
|
|
|
const allDependencies = getDependencyConfig(config, getProjectDependencies());
|
|
const otherDependencies = filter(allDependencies, d => d.name !== packageName);
|
|
const thisDependency = find(allDependencies, d => d.name === packageName);
|
|
const iOSDependencies = compact(otherDependencies.map(d => d.config.ios));
|
|
|
|
const tasks = [
|
|
() => promisify(thisDependency.config.commands.preunlink || commandStub),
|
|
() => unlinkDependencyAndroid(project.android, dependency, packageName),
|
|
() => unlinkDependencyIOS(project.ios, dependency, packageName, iOSDependencies),
|
|
() => unlinkDependencyWindows(project.windows, dependency, packageName),
|
|
() => promisify(thisDependency.config.commands.postunlink || commandStub)
|
|
];
|
|
|
|
return promiseWaterfall(tasks)
|
|
.then(() => {
|
|
const assets = difference(
|
|
dependency.assets,
|
|
flatten(allDependencies, d => d.assets)
|
|
);
|
|
|
|
if (isEmpty(assets)) {
|
|
return Promise.resolve();
|
|
}
|
|
|
|
if (project.ios) {
|
|
log.info('Unlinking assets from ios project');
|
|
unlinkAssetsIOS(assets, project.ios);
|
|
}
|
|
|
|
if (project.android) {
|
|
log.info('Unlinking assets from android project');
|
|
unlinkAssetsAndroid(assets, project.android.assetsPath);
|
|
}
|
|
|
|
log.info(
|
|
`${packageName} assets has been successfully unlinked from your project`
|
|
);
|
|
})
|
|
.catch(err => {
|
|
log.error(
|
|
`It seems something went wrong while unlinking. Error: ${err.message}`
|
|
);
|
|
throw err;
|
|
});
|
|
};
|
|
|
|
module.exports = {
|
|
func: unlink,
|
|
description: 'unlink native dependency',
|
|
name: 'unlink <packageName>',
|
|
};
|