mirror of
https://github.com/status-im/react-native.git
synced 2025-01-09 17:15:54 +00:00
ec884890b1
Summary: Android uses the name of the package, not the config, for the `isInstalled` check. Sending both parameters to `isInstalled` so we have a consistent API. <!-- Thank you for sending the PR! We appreciate you spending the time to work on these changes. Help us understand your motivation by explaining why you decided to make this change. You can learn more about contributing to React Native here: http://facebook.github.io/react-native/docs/contributing.html Happy contributing! --> A bug was uncovered in the react-native link command where Android would not unlink because the wrong parameters were being sent to `isInstalled`. Successfully linked and unlinked `react-native-fs` on Windows and Mac. Jest tests pass. <!-- 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][BUGFIX][local-cli/link/link.js] - Fix issue with `isInstalled` check for Android [CLI][BUGFIX][local-cli/link/unlink.js] - Fix issue with `isInstalled` check for Android [CLI][BUGFIX][local-cli/link/ios/common/unregisterNativeModule.js] - Fix references to unregister implementations. Closes https://github.com/facebook/react-native/pull/18207 Differential Revision: D7180885 Pulled By: hramos fbshipit-source-id: 5f479cd9d7b1ebd8626b461e9dc1f22988e2c61f
139 lines
3.9 KiB
JavaScript
139 lines
3.9 KiB
JavaScript
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
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], packageName, 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>',
|
|
};
|