From cd79e08dc97d5c88eede47ad97e676b2210246f0 Mon Sep 17 00:00:00 2001 From: empyrical Date: Fri, 24 Aug 2018 00:48:58 -0600 Subject: [PATCH 1/4] Add support for out-of-tree platform plugins --- jest/hasteImpl.js | 19 ++++++++++++++---- local-cli/core/findPlugins.js | 38 ++++++++++++++++++++++++++++++++--- local-cli/core/index.js | 10 +++++---- 3 files changed, 56 insertions(+), 11 deletions(-) diff --git a/jest/hasteImpl.js b/jest/hasteImpl.js index 030beeb9ea611a..c829fba08f094c 100644 --- a/jest/hasteImpl.js +++ b/jest/hasteImpl.js @@ -11,11 +11,20 @@ 'use strict'; const path = require('path'); +const findPlugins = require('../local-cli/core/findPlugins'); + +const plugins = findPlugins([path.resolve(__dirname, '../../../')]); + +// Detect out-of-tree platforms and add them to the whitelists +const pluginRoots /*: Array */ = plugins.haste.providesModuleNodeModules.map( + name => path.resolve(__dirname, '../../', name) + path.sep); + +const pluginNameReducers /*: Array<[RegExp, string]> */ = plugins.haste.platforms.map( + name => [new RegExp(`^(.*)\.(${name})$`), '$1']); const ROOTS = [ path.resolve(__dirname, '..') + path.sep, - path.resolve(__dirname, '../../react-native-windows') + path.sep, - path.resolve(__dirname, '../../react-native-dom') + path.sep, + ...pluginRoots ]; const BLACKLISTED_PATTERNS /*: Array */ = [ @@ -36,8 +45,10 @@ const NAME_REDUCERS /*: Array<[RegExp, string]> */ = [ [/^(?:.*[\\\/])?([a-zA-Z0-9$_.-]+)$/, '$1'], // strip .js/.js.flow suffix [/^(.*)\.js(\.flow)?$/, '$1'], - // strip .android/.ios/.native/.web suffix - [/^(.*)\.(android|ios|native|web|windows|dom)$/, '$1'], + // strip platform suffix + [/^(.*)\.(android|ios|native)$/, '$1'], + // strip plugin platform suffixes + ...pluginNameReducers ]; const haste = { diff --git a/local-cli/core/findPlugins.js b/local-cli/core/findPlugins.js index 595577ba8e875c..8a0ae29887f08d 100644 --- a/local-cli/core/findPlugins.js +++ b/local-cli/core/findPlugins.js @@ -47,11 +47,37 @@ const findPlatformsInPackage = pjson => { return path.join(pjson.name, pjson.rnpm.platform); }; +const getEmptyPluginConfig = () => ({ + commands: [], + platforms: [], + haste: { + platforms: [], + providesModuleNodeModules: [] + } +}); + +const findHasteConfigInPackageAndConcat = (pjson, haste) => { + if (!pjson.rnpm || !pjson.rnpm.haste) { + return; + } + let pkgHaste = pjson.rnpm.haste; + + if (pkgHaste.platforms) { + haste.platforms = haste.platforms.concat(pkgHaste.platforms); + } + + if (pkgHaste.providesModuleNodeModules) { + haste.providesModuleNodeModules = + haste.providesModuleNodeModules.concat(pkgHaste.providesModuleNodeModules); + } +}; + + const findPluginInFolder = folder => { const pjson = readPackage(folder); if (!pjson) { - return {commands: [], platforms: []}; + return getEmptyPluginConfig(); } const deps = union( @@ -63,6 +89,7 @@ const findPluginInFolder = folder => { (acc, pkg) => { let commands = acc.commands; let platforms = acc.platforms; + let haste = acc.haste; if (isRNPMPlugin(pkg)) { commands = commands.concat(pkg); } @@ -71,11 +98,12 @@ const findPluginInFolder = folder => { if (pkgJson) { commands = commands.concat(findPluginsInReactNativePackage(pkgJson)); platforms = platforms.concat(findPlatformsInPackage(pkgJson)); + findHasteConfigInPackageAndConcat(pkgJson, haste); } } - return {commands: commands, platforms: platforms}; + return {commands: commands, platforms: platforms, haste: haste}; }, - {commands: [], platforms: []}, + getEmptyPluginConfig(), ); }; @@ -89,5 +117,9 @@ module.exports = function findPlugins(folders) { return { commands: uniq(flatten(plugins.map(p => p.commands))), platforms: uniq(flatten(plugins.map(p => p.platforms))), + haste: { + platforms: uniq(flatten(plugins.map(p => p.haste.platforms))), + providesModuleNodeModules: uniq(flatten(plugins.map(p => p.haste.providesModuleNodeModules))) + } }; }; diff --git a/local-cli/core/index.js b/local-cli/core/index.js index 7027706250a4c1..4053f42e2a3565 100644 --- a/local-cli/core/index.js +++ b/local-cli/core/index.js @@ -70,11 +70,11 @@ const defaultConfig = { hasteImplModulePath: require.resolve('../../jest/hasteImpl'), getPlatforms(): Array { - return ['ios', 'android', 'windows', 'web', 'dom']; + return ['ios', 'android', 'native', ...plugins.haste.platforms]; }, getProvidesModuleNodeModules(): Array { - return ['react-native', 'react-native-windows', 'react-native-dom']; + return ['react-native', ...plugins.haste.providesModuleNodeModules]; }, }; @@ -133,8 +133,10 @@ async function getCliConfig(): Promise { config.transformer.assetRegistryPath = ASSET_REGISTRY_PATH; config.resolver.hasteImplModulePath = config.resolver.hasteImplModulePath || defaultConfig.hasteImplModulePath; - config.resolver.platforms = config.resolver.platforms || defaultConfig.getPlatforms(); - config.resolver.providesModuleNodeModules = config.resolver.providesModuleNodeModules || defaultConfig.getProvidesModuleNodeModules(); + config.resolver.platforms = config.resolver.platforms ? + config.resolver.platforms.concat(defaultConfig.getPlatforms()) : defaultConfig.getPlatforms(); + config.resolver.providesModuleNodeModules = config.resolver.providesModuleNodeModules ? + config.resolver.providesModuleNodeModules.concat(defaultConfig.getProvidesModuleNodeModules()) : defaultConfig.getProvidesModuleNodeModules(); return {...defaultRNConfig, ...config}; } From 09458fe578d388d3659785e74620bce16241e454 Mon Sep 17 00:00:00 2001 From: empyrical Date: Fri, 24 Aug 2018 01:50:37 -0600 Subject: [PATCH 2/4] Fix JavaScript Style --- jest/hasteImpl.js | 4 ++-- local-cli/core/findPlugins.js | 11 +++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/jest/hasteImpl.js b/jest/hasteImpl.js index c829fba08f094c..135a5468e1f289 100644 --- a/jest/hasteImpl.js +++ b/jest/hasteImpl.js @@ -24,7 +24,7 @@ const pluginNameReducers /*: Array<[RegExp, string]> */ = plugins.haste.platform const ROOTS = [ path.resolve(__dirname, '..') + path.sep, - ...pluginRoots + ...pluginRoots, ]; const BLACKLISTED_PATTERNS /*: Array */ = [ @@ -48,7 +48,7 @@ const NAME_REDUCERS /*: Array<[RegExp, string]> */ = [ // strip platform suffix [/^(.*)\.(android|ios|native)$/, '$1'], // strip plugin platform suffixes - ...pluginNameReducers + ...pluginNameReducers, ]; const haste = { diff --git a/local-cli/core/findPlugins.js b/local-cli/core/findPlugins.js index 8a0ae29887f08d..0da7d50454b1d5 100644 --- a/local-cli/core/findPlugins.js +++ b/local-cli/core/findPlugins.js @@ -52,8 +52,8 @@ const getEmptyPluginConfig = () => ({ platforms: [], haste: { platforms: [], - providesModuleNodeModules: [] - } + providesModuleNodeModules: [], + }, }); const findHasteConfigInPackageAndConcat = (pjson, haste) => { @@ -67,12 +67,11 @@ const findHasteConfigInPackageAndConcat = (pjson, haste) => { } if (pkgHaste.providesModuleNodeModules) { - haste.providesModuleNodeModules = + haste.providesModuleNodeModules = haste.providesModuleNodeModules.concat(pkgHaste.providesModuleNodeModules); } }; - const findPluginInFolder = folder => { const pjson = readPackage(folder); @@ -119,7 +118,7 @@ module.exports = function findPlugins(folders) { platforms: uniq(flatten(plugins.map(p => p.platforms))), haste: { platforms: uniq(flatten(plugins.map(p => p.haste.platforms))), - providesModuleNodeModules: uniq(flatten(plugins.map(p => p.haste.providesModuleNodeModules))) - } + providesModuleNodeModules: uniq(flatten(plugins.map(p => p.haste.providesModuleNodeModules))), + }, }; }; From 6a76f5543724fee4576a88deae370060bd9874fd Mon Sep 17 00:00:00 2001 From: empyrical Date: Fri, 24 Aug 2018 01:55:35 -0600 Subject: [PATCH 3/4] Correct hasteImpl to remove hardcoded platforms --- jest/__tests__/hasteImpl-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jest/__tests__/hasteImpl-test.js b/jest/__tests__/hasteImpl-test.js index de493aa9a153da..ce2718f41eb1a5 100644 --- a/jest/__tests__/hasteImpl-test.js +++ b/jest/__tests__/hasteImpl-test.js @@ -32,7 +32,7 @@ it('returns the correct haste name for a RN library file', () => { }); it('returns the correct haste name for a file with a platform suffix', () => { - for (const platform of ['android', 'ios', 'native', 'web', 'windows']) { + for (const platform of ['android', 'ios', 'native']) { expect( getHasteName( getPath( From a73d9910d4ed77ed66686e85e5c0f7ca77fe6fd8 Mon Sep 17 00:00:00 2001 From: empyrical Date: Fri, 24 Aug 2018 11:06:44 -0600 Subject: [PATCH 4/4] Run prettier on platform support files --- jest/hasteImpl.js | 24 +++++++++++-------- local-cli/core/findPlugins.js | 44 +++++++++++++++++------------------ local-cli/core/index.js | 16 +++++++++---- 3 files changed, 47 insertions(+), 37 deletions(-) diff --git a/jest/hasteImpl.js b/jest/hasteImpl.js index 135a5468e1f289..9d1861bc9f2428 100644 --- a/jest/hasteImpl.js +++ b/jest/hasteImpl.js @@ -16,16 +16,20 @@ const findPlugins = require('../local-cli/core/findPlugins'); const plugins = findPlugins([path.resolve(__dirname, '../../../')]); // Detect out-of-tree platforms and add them to the whitelists -const pluginRoots /*: Array */ = plugins.haste.providesModuleNodeModules.map( - name => path.resolve(__dirname, '../../', name) + path.sep); - -const pluginNameReducers /*: Array<[RegExp, string]> */ = plugins.haste.platforms.map( - name => [new RegExp(`^(.*)\.(${name})$`), '$1']); - -const ROOTS = [ - path.resolve(__dirname, '..') + path.sep, - ...pluginRoots, -]; +const pluginRoots /*: Array< + string, +> */ = plugins.haste.providesModuleNodeModules.map( + name => path.resolve(__dirname, '../../', name) + path.sep, +); + +const pluginNameReducers /*: Array< + [RegExp, string], +> */ = plugins.haste.platforms.map(name => [ + new RegExp(`^(.*)\.(${name})$`), + '$1', +]); + +const ROOTS = [path.resolve(__dirname, '..') + path.sep, ...pluginRoots]; const BLACKLISTED_PATTERNS /*: Array */ = [ /.*[\\\/]__(mocks|tests)__[\\\/].*/, diff --git a/local-cli/core/findPlugins.js b/local-cli/core/findPlugins.js index 0da7d50454b1d5..6c23c5d9f279a5 100644 --- a/local-cli/core/findPlugins.js +++ b/local-cli/core/findPlugins.js @@ -67,8 +67,9 @@ const findHasteConfigInPackageAndConcat = (pjson, haste) => { } if (pkgHaste.providesModuleNodeModules) { - haste.providesModuleNodeModules = - haste.providesModuleNodeModules.concat(pkgHaste.providesModuleNodeModules); + haste.providesModuleNodeModules = haste.providesModuleNodeModules.concat( + pkgHaste.providesModuleNodeModules, + ); } }; @@ -84,26 +85,23 @@ const findPluginInFolder = folder => { Object.keys(pjson.devDependencies || {}), ); - return deps.reduce( - (acc, pkg) => { - let commands = acc.commands; - let platforms = acc.platforms; - let haste = acc.haste; - if (isRNPMPlugin(pkg)) { - commands = commands.concat(pkg); + return deps.reduce((acc, pkg) => { + let commands = acc.commands; + let platforms = acc.platforms; + let haste = acc.haste; + if (isRNPMPlugin(pkg)) { + commands = commands.concat(pkg); + } + if (isReactNativePlugin(pkg)) { + const pkgJson = readPackage(path.join(folder, 'node_modules', pkg)); + if (pkgJson) { + commands = commands.concat(findPluginsInReactNativePackage(pkgJson)); + platforms = platforms.concat(findPlatformsInPackage(pkgJson)); + findHasteConfigInPackageAndConcat(pkgJson, haste); } - if (isReactNativePlugin(pkg)) { - const pkgJson = readPackage(path.join(folder, 'node_modules', pkg)); - if (pkgJson) { - commands = commands.concat(findPluginsInReactNativePackage(pkgJson)); - platforms = platforms.concat(findPlatformsInPackage(pkgJson)); - findHasteConfigInPackageAndConcat(pkgJson, haste); - } - } - return {commands: commands, platforms: platforms, haste: haste}; - }, - getEmptyPluginConfig(), - ); + } + return {commands: commands, platforms: platforms, haste: haste}; + }, getEmptyPluginConfig()); }; /** @@ -118,7 +116,9 @@ module.exports = function findPlugins(folders) { platforms: uniq(flatten(plugins.map(p => p.platforms))), haste: { platforms: uniq(flatten(plugins.map(p => p.haste.platforms))), - providesModuleNodeModules: uniq(flatten(plugins.map(p => p.haste.providesModuleNodeModules))), + providesModuleNodeModules: uniq( + flatten(plugins.map(p => p.haste.providesModuleNodeModules)), + ), }, }; }; diff --git a/local-cli/core/index.js b/local-cli/core/index.js index 4053f42e2a3565..2e66b662bd5299 100644 --- a/local-cli/core/index.js +++ b/local-cli/core/index.js @@ -132,11 +132,17 @@ async function getCliConfig(): Promise { ); config.transformer.assetRegistryPath = ASSET_REGISTRY_PATH; - config.resolver.hasteImplModulePath = config.resolver.hasteImplModulePath || defaultConfig.hasteImplModulePath; - config.resolver.platforms = config.resolver.platforms ? - config.resolver.platforms.concat(defaultConfig.getPlatforms()) : defaultConfig.getPlatforms(); - config.resolver.providesModuleNodeModules = config.resolver.providesModuleNodeModules ? - config.resolver.providesModuleNodeModules.concat(defaultConfig.getProvidesModuleNodeModules()) : defaultConfig.getProvidesModuleNodeModules(); + config.resolver.hasteImplModulePath = + config.resolver.hasteImplModulePath || defaultConfig.hasteImplModulePath; + config.resolver.platforms = config.resolver.platforms + ? config.resolver.platforms.concat(defaultConfig.getPlatforms()) + : defaultConfig.getPlatforms(); + config.resolver.providesModuleNodeModules = config.resolver + .providesModuleNodeModules + ? config.resolver.providesModuleNodeModules.concat( + defaultConfig.getProvidesModuleNodeModules(), + ) + : defaultConfig.getProvidesModuleNodeModules(); return {...defaultRNConfig, ...config}; }