mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Summary: This commit removes special cases for linking iOS and Android platforms. A previous commit opened up link and other commands for other platforms to provide their own behaviors. It left special cases in tact for iOS and Android. This PR removes the special case. - Added jest tests related to the link command. - Ran the `link` and `unlink` commands for iOS and Android and confirmed no changes. https://github.com/facebook/react-native/pull/17745 <!-- Help reviewers and the release process by writing your own release notes **INTERNAL and MINOR tagged notes will not be included in the next version's final release notes.** CATEGORY [----------] TYPE [ CLI ] [-------------] LOCATION [ DOCS ] [ BREAKING ] [-------------] [ GENERAL ] [ BUGFIX ] [-{Component}-] [ INTERNAL ] [ ENHANCEMENT ] [ {File} ] [ IOS ] [ FEATURE ] [ {Directory} ] |-----------| [ ANDROID ] [ MINOR ] [ {Framework} ] - | {Message} | [----------] [-------------] [-------------] |-----------| [CATEGORY] [TYPE] [LOCATION] - MESSAGE EXAMPLES: [IOS] [BREAKING] [FlatList] - Change a thing that breaks other things [ANDROID] [BUGFIX] [TextInput] - Did a thing to TextInput [CLI] [FEATURE] [local-cli/info/info.js] - CLI easier to do things with [DOCS] [BUGFIX] [GettingStarted.md] - Accidentally a thing/word [GENERAL] [ENHANCEMENT] [Yoga] - Added new yoga thing/position [INTERNAL] [FEATURE] [./scripts] - Added thing to script that nobody will see --> [CLI][FEATURE][local-cli/link/link.js] - Removes special cases for linking in iOS and Android. Closes https://github.com/facebook/react-native/pull/17961 Differential Revision: D6975951 Pulled By: hramos fbshipit-source-id: 8dd5da35619e2124ce4b3b18db8b694757792363
132 lines
3.7 KiB
JavaScript
132 lines
3.7 KiB
JavaScript
const log = require('npmlog');
|
|
|
|
const getProjectDependencies = require('./getProjectDependencies');
|
|
const getDependencyConfig = require('./getDependencyConfig');
|
|
const difference = require('lodash').difference;
|
|
const filter = require('lodash').filter;
|
|
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 unlinkDependency = (platforms, project, dependency, packageName, otherDependencies) => {
|
|
|
|
Object.keys(platforms || {})
|
|
.forEach(platform => {
|
|
if (!project[platform] || !dependency[platform]) {
|
|
return;
|
|
}
|
|
|
|
const linkConfig = platforms[platform] && platforms[platform].linkConfig && platforms[platform].linkConfig();
|
|
if (!linkConfig || !linkConfig.isInstalled || !linkConfig.unregister) {
|
|
return;
|
|
}
|
|
|
|
const isInstalled = linkConfig.isInstalled(project[platform], dependency[platform]);
|
|
|
|
if (!isInstalled) {
|
|
log.info(`Platform '${platform}' module ${packageName} is not installed`);
|
|
return;
|
|
}
|
|
|
|
log.info(`Unlinking ${packageName} ${platform} dependency`);
|
|
|
|
linkConfig.unregister(
|
|
packageName,
|
|
dependency[platform],
|
|
project[platform],
|
|
otherDependencies
|
|
);
|
|
|
|
log.info(`Platform '${platform}' module ${dependency.name} 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];
|
|
|
|
let platforms;
|
|
let project;
|
|
let dependency;
|
|
|
|
try {
|
|
platforms = config.getPlatformConfig();
|
|
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 tasks = [
|
|
() => promisify(dependency.commands.preunlink || commandStub),
|
|
() => unlinkDependency(platforms, project, dependency, packageName, otherDependencies),
|
|
() => promisify(dependency.commands.postunlink || commandStub)
|
|
];
|
|
|
|
return promiseWaterfall(tasks)
|
|
.then(() => {
|
|
// @todo move all these to `tasks` array, just like in
|
|
// link
|
|
const assets = difference(
|
|
dependency.assets,
|
|
flatten(allDependencies, d => d.assets)
|
|
);
|
|
|
|
if (isEmpty(assets)) {
|
|
return Promise.resolve();
|
|
}
|
|
|
|
Object.keys(platforms || {})
|
|
.forEach(platform => {
|
|
const linkConfig = platforms[platform] && platforms[platform].linkConfig && platforms[platform].linkConfig();
|
|
if (!linkConfig || !linkConfig.unlinkAssets) {
|
|
return;
|
|
}
|
|
|
|
log.info(`Unlinking assets from ${platform} project`);
|
|
linkConfig.unlinkAssets(assets, project[platform]);
|
|
});
|
|
|
|
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>',
|
|
};
|