From bfc0e8c26f9e66c525401e92e801410a3ea8be39 Mon Sep 17 00:00:00 2001 From: Jean Lauliac Date: Mon, 22 May 2017 08:57:04 -0700 Subject: [PATCH] packager: add preprocess for buck worker Summary: For the Buck integration (work-in-progress), we want to add the ability to do some custom preprocessing similar to the packager server. The signature is different so I prefer to have a separate function for that. Also we don't need the transform options right now, I suggest we don't add them for now and add them later if necessary. Reviewed By: davidaurelio Differential Revision: D5094632 fbshipit-source-id: 1775ddef90b331deabc5be3e57a67436bce06c82 --- local-cli/util/Config.js | 8 ++++++++ packager/src/ModuleGraph/ModuleGraph.js | 16 +++++++++++---- .../ModuleGraph/__tests__/ModuleGraph-test.js | 20 ++++++++++++------- packager/src/ModuleGraph/types.flow.js | 5 +++++ 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/local-cli/util/Config.js b/local-cli/util/Config.js index a9d565286..e02c50635 100644 --- a/local-cli/util/Config.js +++ b/local-cli/util/Config.js @@ -22,6 +22,7 @@ const RN_CLI_CONFIG = 'rn-cli.config.js'; import type {GetTransformOptions, PostMinifyProcess, PostProcessModules} from '../../packager/src/Bundler'; import type {HasteImpl} from '../../packager/src/node-haste/Module'; import type {TransformVariants} from '../../packager/src/ModuleGraph/types.flow'; +import type {PostProcessModules as PostProcessModulesForBuck} from '../../packager/src/ModuleGraph/types.flow.js'; /** * Configuration file of the CLI. @@ -89,6 +90,12 @@ export type ConfigT = { */ postProcessModules: PostProcessModules, + /** + * Same as `postProcessModules` but for the Buck worker. Eventually we do want + * to unify both variants. + */ + postProcessModulesForBuck: PostProcessModulesForBuck, + /** * A module that exports: * - a `getHasteName(filePath)` method that returns `hasteName` for module at @@ -112,6 +119,7 @@ const defaultConfig: ConfigT = { getTransformOptions: async () => ({}), postMinifyProcess: x => x, postProcessModules: modules => modules, + postProcessModulesForBuck: modules => modules, transformVariants: () => ({default: {}}), }; diff --git a/packager/src/ModuleGraph/ModuleGraph.js b/packager/src/ModuleGraph/ModuleGraph.js index ac660b5e7..e00186090 100644 --- a/packager/src/ModuleGraph/ModuleGraph.js +++ b/packager/src/ModuleGraph/ModuleGraph.js @@ -22,6 +22,7 @@ import type { GraphFn, GraphResult, Module, + PostProcessModules, } from './types.flow'; type BuildFn = ( @@ -37,6 +38,7 @@ type BuildOptions = {| exports.createBuildSetup = ( graph: GraphFn, + postProcessModules: PostProcessModules, translateDefaultsPath: string => string = x => x, ): BuildFn => (entryPoints, options, callback) => { @@ -51,10 +53,16 @@ exports.createBuildSetup = ( const graphOnlyModules = seq(graphWithOptions, getModules); parallel({ - graph: cb => graphWithOptions( - entryPoints, - cb, - ), + graph: cb => graphWithOptions(entryPoints, (error, result) => { + if (error) { + cb(error); + return; + } + /* $FlowFixMe: not undefined if there is no error */ + const {modules, entryModules} = result; + const prModules = postProcessModules(modules, [...entryPoints]); + cb(null, {modules: prModules, entryModules}); + }), moduleSystem: cb => graphOnlyModules( [translateDefaultsPath(defaults.moduleSystem)], cb, diff --git a/packager/src/ModuleGraph/__tests__/ModuleGraph-test.js b/packager/src/ModuleGraph/__tests__/ModuleGraph-test.js index bc91a412e..334ea9310 100644 --- a/packager/src/ModuleGraph/__tests__/ModuleGraph-test.js +++ b/packager/src/ModuleGraph/__tests__/ModuleGraph-test.js @@ -16,7 +16,9 @@ const defaults = require('../../../defaults'); const FILE_TYPE = 'module'; describe('build setup', () => { - const buildSetup = ModuleGraph.createBuildSetup(graph); + const buildSetup = ModuleGraph.createBuildSetup(graph, mds => { + return [...mds].sort((l, r) => l.file.path > r.file.path); + }); const noOptions = {}; const noEntryPoints = []; @@ -72,11 +74,11 @@ describe('build setup', () => { }); }); - it('places all entry points at the end', done => { - const entryPoints = ['a', 'b', 'c']; + it('places all entry points and dependencies at the end, post-processed', done => { + const entryPoints = ['b', 'c', 'd']; buildSetup(entryPoints, noOptions, (error, result) => { - expect(Array.from(result.modules).slice(-3)) - .toEqual(entryPoints.map(moduleFromPath)); + expect(Array.from(result.modules).slice(-4)) + .toEqual(['a', 'b', 'c', 'd'].map(moduleFromPath)); done(); }); }); @@ -84,7 +86,7 @@ describe('build setup', () => { function moduleFromPath(path) { return { - dependencies: [], + dependencies: path === 'b' ? ['a'] : [], file: { code: '', path, @@ -95,8 +97,12 @@ function moduleFromPath(path) { function graph(entryPoints, platform, options, callback) { const modules = Array.from(entryPoints, moduleFromPath); + const depModules = Array.prototype.concat.apply( + [], + modules.map(x => x.dependencies.map(moduleFromPath)), + ); callback(null, { entryModules: modules, - modules, + modules: modules.concat(depModules), }); } diff --git a/packager/src/ModuleGraph/types.flow.js b/packager/src/ModuleGraph/types.flow.js index da283a7ac..e2a8eea88 100644 --- a/packager/src/ModuleGraph/types.flow.js +++ b/packager/src/ModuleGraph/types.flow.js @@ -70,6 +70,11 @@ export type Module = {| file: File, |}; +export type PostProcessModules = ( + modules: Iterable, + entryPoints: Array, +) => Iterable; + export type OutputFn = ({| filename: string, idForPath: IdForPathFn,