Add support for linking scoped packages (#18766) (#19828)

Summary:
Currently, when the cli tries to determine the package name, it accidentally trims out the entire package name.  This makes it appear to the rest of the program as if `react-native link The controller you requested could not be found./my-package` was just `react-native link`.  This adds a little regex to prevent that from happening, so that scopes can be passed as parts of packages.

Fixes #18766
Pull Request resolved: https://github.com/facebook/react-native/pull/19828

Differential Revision: D8704742

Pulled By: hramos

fbshipit-source-id: d8183f9b55e8656b8a0acae842e1361a1f428102
This commit is contained in:
Tvrqvoise 2018-08-06 12:23:45 -07:00 committed by Facebook Github Bot
parent 5219585ef9
commit 6d65e8b4ed
3 changed files with 17 additions and 5 deletions

View File

@ -106,9 +106,7 @@ const defaultRNConfig = {
getDependencyConfig(packageName: string) {
const platforms = this.getPlatformConfig();
const folder = path.join(process.cwd(), 'node_modules', packageName);
const rnpm = getRNPMConfig(
path.join(process.cwd(), 'node_modules', packageName),
);
const rnpm = getRNPMConfig(folder);
let config = Object.assign({}, rnpm, {
assets: findAssets(folder, rnpm.assets),

View File

@ -49,6 +49,20 @@ describe('link', () => {
});
});
it('should accept the name of a dependency with a scope / tag', async () => {
const config = {
getPlatformConfig: () => ({ios: {}, android: {}}),
getProjectConfig: () => ({assets: []}),
getDependencyConfig: sinon.stub().returns({assets: [], commands: {}}),
};
const link = require('../link').func;
await link(['@scope/something@latest'], config);
expect(
config.getDependencyConfig.calledWith('@scope/something'),
).toBeTruthy();
});
it('should register native module when android/ios projects are present', done => {
const registerNativeModule = sinon.stub();
const dependencyConfig = {android: {}, ios: {}, assets: [], commands: {}};

View File

@ -143,9 +143,9 @@ function link(args: Array<string>, config: RNConfig) {
}
let packageName = args[0];
// Check if install package by specific version (eg. package@latest)
// Trim the version / tag out of the package name (eg. package@latest)
if (packageName !== undefined) {
packageName = packageName.split('@')[0];
packageName = packageName.replace(/^(.+?)(@.+?)$/gi, '$1');
}
const dependencies = getDependencyConfig(