diff --git a/local-cli/core/__tests__/findPlugins.spec.js b/local-cli/core/__tests__/findPlugins.spec.js index 3924644da8c658..6d350da542f7d8 100644 --- a/local-cli/core/__tests__/findPlugins.spec.js +++ b/local-cli/core/__tests__/findPlugins.spec.js @@ -66,4 +66,19 @@ describe('findPlugins', () => { })); expect(findPlugins([ROOT]).commands).toHaveLength(1); }); + + it('returns plugins in scoped modules', () => { + jest.mock(pjsonPath, () => ({ + dependencies: { + '@org/rnpm-plugin-test': '*', + '@org/react-native-test': '*', + '@react-native/test': '*', + '@react-native-org/test': '*', + }, + })); + + expect(findPlugins([ROOT])).toHaveProperty('commands'); + expect(findPlugins([ROOT])).toHaveProperty('platforms'); + expect(findPlugins([ROOT]).commands[0]).toBe('@org/rnpm-plugin-test'); + }); }); diff --git a/local-cli/core/findPlugins.js b/local-cli/core/findPlugins.js index d2a502fa88924c..7d76b5b6f5f05e 100644 --- a/local-cli/core/findPlugins.js +++ b/local-cli/core/findPlugins.js @@ -14,14 +14,23 @@ const union = require('lodash').union; const uniq = require('lodash').uniq; const flatten = require('lodash').flatten; +const RNPM_PLUGIN_PATTERNS = [/^rnpm-plugin-/, /^@(.*)\/rnpm-plugin-/]; + +const REACT_NATIVE_PLUGIN_PATTERNS = [ + /^react-native-/, + /^@(.*)\/react-native-/, + /^@react-native(.*)\/(?!rnpm-plugin-)/, +]; + /** * Filter dependencies by name pattern * @param {String} dependency Name of the dependency * @return {Boolean} If dependency is a rnpm plugin */ -const isRNPMPlugin = dependency => dependency.indexOf('rnpm-plugin-') === 0; +const isRNPMPlugin = dependency => + RNPM_PLUGIN_PATTERNS.some(pattern => pattern.test(dependency)); const isReactNativePlugin = dependency => - dependency.indexOf('react-native-') === 0; + REACT_NATIVE_PLUGIN_PATTERNS.some(pattern => pattern.test(dependency)); const readPackage = folder => { try { diff --git a/local-cli/core/index.js b/local-cli/core/index.js index fb6f07c5c4ad8d..dfe66b372d96a8 100644 --- a/local-cli/core/index.js +++ b/local-cli/core/index.js @@ -152,7 +152,13 @@ async function getCliConfig(): Promise { */ function getProjectCommands(): Array { const commands = plugins.commands.map(pathToCommands => { - const name = pathToCommands.split(path.sep)[0]; + const name = + pathToCommands[0] === '@' + ? pathToCommands + .split(path.sep) + .slice(0, 2) + .join(path.sep) + : pathToCommands.split(path.sep)[0]; return attachPackage( require(path.join(appRoot, 'node_modules', pathToCommands)),