diff --git a/local-cli/default.config.js b/local-cli/default.config.js index 6dda83e56..25091edbe 100644 --- a/local-cli/default.config.js +++ b/local-cli/default.config.js @@ -34,6 +34,15 @@ var config = { return []; }, + /** + * Specify any additional platforms to be used by the packager. + * For example, if you want to add a "custom" platform, and use modules + * ending in .custom.js, you would return ['custom'] here. + */ + getPlatforms() { + return []; + }, + /** * Returns a regular expression for modules that should be ignored by the * packager on a given platform. diff --git a/local-cli/server/runServer.js b/local-cli/server/runServer.js index 1bdac4ab0..e30e92704 100644 --- a/local-cli/server/runServer.js +++ b/local-cli/server/runServer.js @@ -16,6 +16,7 @@ const connect = require('connect'); const copyToClipBoardMiddleware = require('./middleware/copyToClipBoardMiddleware'); const cpuProfilerMiddleware = require('./middleware/cpuProfilerMiddleware'); const defaultAssetExts = require('../../packager/defaults').assetExts; +const defaultPlatforms = require('../../packager/defaults').platforms; const getDevToolsMiddleware = require('./middleware/getDevToolsMiddleware'); const heapCaptureMiddleware = require('./middleware/heapCaptureMiddleware.js'); const http = require('http'); @@ -91,6 +92,7 @@ function getPackagerServer(args, config) { cacheVersion: '3', extraNodeModules: config.extraNodeModules, getTransformOptions: config.getTransformOptions, + platforms: defaultPlatforms.concat(args.platforms), projectRoots: args.projectRoots, resetCache: args.resetCache, transformModulePath: transformModulePath, diff --git a/local-cli/server/server.js b/local-cli/server/server.js index 35142e7b3..dd7b7d5de 100644 --- a/local-cli/server/server.js +++ b/local-cli/server/server.js @@ -96,6 +96,11 @@ module.exports = { description: 'Specify any additional asset extentions to be used by the packager', parse: (val) => val.split(','), default: (config) => config.getAssetExts(), + }, { + command: '--platforms [list]', + description: 'Specify any additional platforms to be used by the packager', + parse: (val) => val.split(','), + default: (config) => config.getPlatforms(), }, { command: '--skipflow', description: 'Disable flow checks' diff --git a/packager/react-packager/src/Bundler/__tests__/Bundler-test.js b/packager/react-packager/src/Bundler/__tests__/Bundler-test.js index 386bf25a3..30dd121c5 100644 --- a/packager/react-packager/src/Bundler/__tests__/Bundler-test.js +++ b/packager/react-packager/src/Bundler/__tests__/Bundler-test.js @@ -267,6 +267,16 @@ describe('Bundler', function() { ); }); + it('allows overriding the platforms array', () => { + expect(bundler._opts.platforms).toEqual(['ios', 'android', 'windows', 'web']); + const b = new Bundler({ + projectRoots, + assetServer: assetServer, + platforms: ['android', 'vr'], + }); + expect(b._opts.platforms).toEqual(['android', 'vr']); + }); + describe('getOrderedDependencyPaths', () => { beforeEach(() => { assetServer.getAssetData.mockImpl(function(relPath) { diff --git a/packager/react-packager/src/Bundler/index.js b/packager/react-packager/src/Bundler/index.js index 97fd41ce2..f7624ad97 100644 --- a/packager/react-packager/src/Bundler/index.js +++ b/packager/react-packager/src/Bundler/index.js @@ -25,6 +25,7 @@ const imageSize = require('image-size'); const path = require('path'); const version = require('../../../../package.json').version; const denodeify = require('denodeify'); +const defaults = require('../../../defaults'); const { sep: pathSeparator, @@ -91,6 +92,10 @@ const validateOpts = declareOpts({ type: 'array', default: ['png'], }, + platforms: { + type: 'array', + default: defaults.platforms, + }, watch: { type: 'boolean', default: false, @@ -126,6 +131,7 @@ type Options = { getTransformOptions?: GetTransformOptions<*>, extraNodeModules: {}, assetExts: Array, + platforms: Array, watch: boolean, assetServer: AssetServer, transformTimeoutInterval: ?number, @@ -200,6 +206,7 @@ class Bundler { watch: opts.watch, minifyCode: this._transformer.minify, moduleFormat: opts.moduleFormat, + platforms: opts.platforms, polyfillModuleNames: opts.polyfillModuleNames, projectRoots: opts.projectRoots, resetCache: opts.resetCache, diff --git a/packager/react-packager/src/Resolver/__tests__/Resolver-test.js b/packager/react-packager/src/Resolver/__tests__/Resolver-test.js index 80f70de86..34676f452 100644 --- a/packager/react-packager/src/Resolver/__tests__/Resolver-test.js +++ b/packager/react-packager/src/Resolver/__tests__/Resolver-test.js @@ -107,6 +107,15 @@ describe('Resolver', function() { }); }); + it('passes custom platforms to the dependency graph', function() { + new Resolver({ // eslint-disable-line no-new + projectRoot: '/root', + platforms: ['ios', 'windows', 'vr'], + }); + const platforms = DependencyGraph.mock.calls[0][0].platforms; + expect(platforms).toEqual(['ios', 'windows', 'vr']); + }); + pit('should get dependencies with polyfills', function() { var module = createModule('index'); var deps = [module]; diff --git a/packager/react-packager/src/Resolver/index.js b/packager/react-packager/src/Resolver/index.js index 00fb8354d..68fb11883 100644 --- a/packager/react-packager/src/Resolver/index.js +++ b/packager/react-packager/src/Resolver/index.js @@ -39,6 +39,10 @@ const validateOpts = declareOpts({ type: 'array', required: true, }, + platforms: { + type: 'array', + required: true, + }, cache: { type: 'object', required: true, @@ -94,7 +98,7 @@ class Resolver { (opts.blacklistRE && opts.blacklistRE.test(filepath)); }, providesModuleNodeModules: defaults.providesModuleNodeModules, - platforms: defaults.platforms, + platforms: opts.platforms, preferNativePlatform: true, watch: opts.watch, cache: opts.cache, diff --git a/packager/react-packager/src/Server/index.js b/packager/react-packager/src/Server/index.js index 4bbe476e3..60a4f644f 100644 --- a/packager/react-packager/src/Server/index.js +++ b/packager/react-packager/src/Server/index.js @@ -83,6 +83,10 @@ const validateOpts = declareOpts({ type: 'array', default: defaults.assetExts, }, + platforms: { + type: 'array', + default: defaults.platforms, + }, transformTimeoutInterval: { type: 'number', required: false,