Allow custom platforms for the RN Packager on a per-project basis

Reviewed By: cpojer

Differential Revision: D4255979

fbshipit-source-id: bf900b67ee30e2f994e96c9a6103ed2e53a87f88
This commit is contained in:
Andrew Imm 2016-12-02 09:41:28 -08:00 committed by Facebook Github Bot
parent 59dd2133cb
commit 67828a52bd
8 changed files with 51 additions and 1 deletions

View File

@ -34,6 +34,15 @@ var config = {
return []; 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 * Returns a regular expression for modules that should be ignored by the
* packager on a given platform. * packager on a given platform.

View File

@ -16,6 +16,7 @@ const connect = require('connect');
const copyToClipBoardMiddleware = require('./middleware/copyToClipBoardMiddleware'); const copyToClipBoardMiddleware = require('./middleware/copyToClipBoardMiddleware');
const cpuProfilerMiddleware = require('./middleware/cpuProfilerMiddleware'); const cpuProfilerMiddleware = require('./middleware/cpuProfilerMiddleware');
const defaultAssetExts = require('../../packager/defaults').assetExts; const defaultAssetExts = require('../../packager/defaults').assetExts;
const defaultPlatforms = require('../../packager/defaults').platforms;
const getDevToolsMiddleware = require('./middleware/getDevToolsMiddleware'); const getDevToolsMiddleware = require('./middleware/getDevToolsMiddleware');
const heapCaptureMiddleware = require('./middleware/heapCaptureMiddleware.js'); const heapCaptureMiddleware = require('./middleware/heapCaptureMiddleware.js');
const http = require('http'); const http = require('http');
@ -91,6 +92,7 @@ function getPackagerServer(args, config) {
cacheVersion: '3', cacheVersion: '3',
extraNodeModules: config.extraNodeModules, extraNodeModules: config.extraNodeModules,
getTransformOptions: config.getTransformOptions, getTransformOptions: config.getTransformOptions,
platforms: defaultPlatforms.concat(args.platforms),
projectRoots: args.projectRoots, projectRoots: args.projectRoots,
resetCache: args.resetCache, resetCache: args.resetCache,
transformModulePath: transformModulePath, transformModulePath: transformModulePath,

View File

@ -96,6 +96,11 @@ module.exports = {
description: 'Specify any additional asset extentions to be used by the packager', description: 'Specify any additional asset extentions to be used by the packager',
parse: (val) => val.split(','), parse: (val) => val.split(','),
default: (config) => config.getAssetExts(), 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', command: '--skipflow',
description: 'Disable flow checks' description: 'Disable flow checks'

View File

@ -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', () => { describe('getOrderedDependencyPaths', () => {
beforeEach(() => { beforeEach(() => {
assetServer.getAssetData.mockImpl(function(relPath) { assetServer.getAssetData.mockImpl(function(relPath) {

View File

@ -25,6 +25,7 @@ const imageSize = require('image-size');
const path = require('path'); const path = require('path');
const version = require('../../../../package.json').version; const version = require('../../../../package.json').version;
const denodeify = require('denodeify'); const denodeify = require('denodeify');
const defaults = require('../../../defaults');
const { const {
sep: pathSeparator, sep: pathSeparator,
@ -91,6 +92,10 @@ const validateOpts = declareOpts({
type: 'array', type: 'array',
default: ['png'], default: ['png'],
}, },
platforms: {
type: 'array',
default: defaults.platforms,
},
watch: { watch: {
type: 'boolean', type: 'boolean',
default: false, default: false,
@ -126,6 +131,7 @@ type Options = {
getTransformOptions?: GetTransformOptions<*>, getTransformOptions?: GetTransformOptions<*>,
extraNodeModules: {}, extraNodeModules: {},
assetExts: Array<string>, assetExts: Array<string>,
platforms: Array<string>,
watch: boolean, watch: boolean,
assetServer: AssetServer, assetServer: AssetServer,
transformTimeoutInterval: ?number, transformTimeoutInterval: ?number,
@ -200,6 +206,7 @@ class Bundler {
watch: opts.watch, watch: opts.watch,
minifyCode: this._transformer.minify, minifyCode: this._transformer.minify,
moduleFormat: opts.moduleFormat, moduleFormat: opts.moduleFormat,
platforms: opts.platforms,
polyfillModuleNames: opts.polyfillModuleNames, polyfillModuleNames: opts.polyfillModuleNames,
projectRoots: opts.projectRoots, projectRoots: opts.projectRoots,
resetCache: opts.resetCache, resetCache: opts.resetCache,

View File

@ -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() { pit('should get dependencies with polyfills', function() {
var module = createModule('index'); var module = createModule('index');
var deps = [module]; var deps = [module];

View File

@ -39,6 +39,10 @@ const validateOpts = declareOpts({
type: 'array', type: 'array',
required: true, required: true,
}, },
platforms: {
type: 'array',
required: true,
},
cache: { cache: {
type: 'object', type: 'object',
required: true, required: true,
@ -94,7 +98,7 @@ class Resolver {
(opts.blacklistRE && opts.blacklistRE.test(filepath)); (opts.blacklistRE && opts.blacklistRE.test(filepath));
}, },
providesModuleNodeModules: defaults.providesModuleNodeModules, providesModuleNodeModules: defaults.providesModuleNodeModules,
platforms: defaults.platforms, platforms: opts.platforms,
preferNativePlatform: true, preferNativePlatform: true,
watch: opts.watch, watch: opts.watch,
cache: opts.cache, cache: opts.cache,

View File

@ -83,6 +83,10 @@ const validateOpts = declareOpts({
type: 'array', type: 'array',
default: defaults.assetExts, default: defaults.assetExts,
}, },
platforms: {
type: 'array',
default: defaults.platforms,
},
transformTimeoutInterval: { transformTimeoutInterval: {
type: 'number', type: 'number',
required: false, required: false,