diff --git a/local-cli/link/__tests__/link.spec.js b/local-cli/link/__tests__/link.spec.js index 3972a0a681c672..d4674bd65f5796 100644 --- a/local-cli/link/__tests__/link.spec.js +++ b/local-cli/link/__tests__/link.spec.js @@ -205,4 +205,42 @@ describe('link', () => { done(); }); }); + + it('should replace forward slashes in scoped package names for android', () => { + const isInstalledAndroid = jest.fn(() => false); + const registerNativeModule = sinon.stub(); + const registerDependencyAndroid = jest.fn(); + const config = { + getProjectConfig: () => ({ ios: {}, android: {}, assets: [] }), + getDependencyConfig: sinon.stub(), + }; + + const mockDependencyConfig = [{ + config: { ios: {}, android: {}, windows: null, assets: [], commands: {}, params: [], }, + name: '@scope/react-native-package', + }]; + + jest.setMock('../ios/isInstalled.js', sinon.stub().returns(true)); + + jest.mock('../getDependencyConfig.js', () => () => mockDependencyConfig); + + jest.mock( + '../android/isInstalled.js', + () => isInstalledAndroid, + ); + + jest.setMock( + '../ios/registerNativeModule.js', + registerNativeModule, + ); + + jest.mock('../android/registerNativeModule.js', () => registerDependencyAndroid); + + const link = require('../link').func; + + return link(['react-native-test'], config).then(() => { + expect(isInstalledAndroid).toHaveBeenCalledWith({}, '@scope_react-native-package'); + expect(registerDependencyAndroid).toHaveBeenCalledWith('@scope_react-native-package', {}, {}, {}); + }); + }); }); diff --git a/local-cli/link/link.js b/local-cli/link/link.js index 969bf63a86bd73..60c819940d77f3 100644 --- a/local-cli/link/link.js +++ b/local-cli/link/link.js @@ -51,6 +51,8 @@ const dedupeAssets = (assets) => uniqBy(assets, asset => path.basename(asset)); const linkDependencyAndroid = (androidProject, dependency) => { + dependency.name = dependency.name.replace(/\//g, '_'); + if (!androidProject || !dependency.config.android) { return null; }