From 6c9e244a28811a9782fccc684ad537787350f2c9 Mon Sep 17 00:00:00 2001 From: Rae Liu Date: Thu, 8 Nov 2018 14:22:03 +0000 Subject: [PATCH 1/3] Add a customSerializer from serializer option to conditionally swap out plainJSBundle. --- packages/metro/src/Server.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/metro/src/Server.js b/packages/metro/src/Server.js index 750b080259..b96378b905 100644 --- a/packages/metro/src/Server.js +++ b/packages/metro/src/Server.js @@ -664,6 +664,7 @@ class Server { })); const options = { + customSerializer: this._config.serializer.customSerializer, processModuleFilter: this._config.serializer.processModuleFilter, createModuleId: this._createModuleId, getRunModuleStatement: this._config.serializer.getRunModuleStatement, @@ -677,7 +678,7 @@ class Server { inlineSourceMap: serializerOptions.inlineSourceMap, }; - const bundle = plainJSBundle( + const serializerArguments = [ entryFile, revision.prepend, revision.graph, @@ -689,7 +690,13 @@ class Server { revisionId: revision.id, }) : Object.assign({}, options, {embedDelta: false}), - ); + ]; + let bundle; + if (options.customSerializer) { + bundle = options.customSerializer(...serializerArguments); + } else { + bundle = plainJSBundle(...serializerArguments); + } return { numModifiedFiles: delta.reset From 5002fad928fc031e63992019e5e3793965d06f5b Mon Sep 17 00:00:00 2001 From: Rae Liu Date: Thu, 8 Nov 2018 16:18:23 +0000 Subject: [PATCH 2/3] Fix customSerializer flow types and tests --- .../src/__tests__/__snapshots__/loadConfig-test.js.snap | 2 ++ packages/metro-config/src/configTypes.flow.js | 7 +++++++ packages/metro-config/src/convertConfig.js | 1 + packages/metro-config/src/defaults/index.js | 1 + .../metro/src/DeltaBundler/Serializers/plainJSBundle.js | 2 +- packages/metro/src/Server.js | 6 +++--- 6 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/metro-config/src/__tests__/__snapshots__/loadConfig-test.js.snap b/packages/metro-config/src/__tests__/__snapshots__/loadConfig-test.js.snap index be90805d18..9f21ebc79e 100644 --- a/packages/metro-config/src/__tests__/__snapshots__/loadConfig-test.js.snap +++ b/packages/metro-config/src/__tests__/__snapshots__/loadConfig-test.js.snap @@ -64,6 +64,7 @@ Object { }, "serializer": Object { "createModuleIdFactory": [Function], + "customSerializer": null, "experimentalSerializerHook": [Function], "getModulesRunBeforeMainModule": [Function], "getPolyfills": [Function], @@ -184,6 +185,7 @@ Object { }, "serializer": Object { "createModuleIdFactory": [Function], + "customSerializer": null, "experimentalSerializerHook": [Function], "getModulesRunBeforeMainModule": [Function], "getPolyfills": [Function], diff --git a/packages/metro-config/src/configTypes.flow.js b/packages/metro-config/src/configTypes.flow.js index eca73d99ce..08d0ba7b08 100644 --- a/packages/metro-config/src/configTypes.flow.js +++ b/packages/metro-config/src/configTypes.flow.js @@ -26,6 +26,7 @@ import type {TransformVariants} from 'metro/src/ModuleGraph/types.flow.js'; import type {DynamicRequiresBehavior} from 'metro/src/ModuleGraph/worker/collectDependencies'; import type Server from 'metro/src/Server'; import type {Reporter} from 'metro/src/lib/reporting'; +import type {Options} from 'metro/src/DeltaBundler/Serializers/plainJSBundle'; export type PostMinifyProcess = ({ code: string, @@ -115,6 +116,12 @@ type ResolverConfigT = {| type SerializerConfigT = {| createModuleIdFactory: () => (path: string) => number, + customSerializer: ?( + entryPoint: string, + preModules: $ReadOnlyArray>, + graph: Graph<>, + options: Options, + ) => string, experimentalSerializerHook: (graph: Graph<>, delta: DeltaResult<>) => mixed, getModulesRunBeforeMainModule: (entryFilePath: string) => Array, getPolyfills: ({platform: ?string}) => $ReadOnlyArray, diff --git a/packages/metro-config/src/convertConfig.js b/packages/metro-config/src/convertConfig.js index d854e15951..ea8c5134f6 100644 --- a/packages/metro-config/src/convertConfig.js +++ b/packages/metro-config/src/convertConfig.js @@ -111,6 +111,7 @@ async function convertOldToNew({ useWatchman: true, }, serializer: { + customSerializer: defaultConfig.serializer.customSerializer, createModuleIdFactory: createModuleIdFactory || defaultConfig.serializer.createModuleIdFactory, polyfillModuleNames: getPolyfillModuleNames(), diff --git a/packages/metro-config/src/defaults/index.js b/packages/metro-config/src/defaults/index.js index d820fc8fa9..816af7d25a 100644 --- a/packages/metro-config/src/defaults/index.js +++ b/packages/metro-config/src/defaults/index.js @@ -54,6 +54,7 @@ const getDefaultValues = (projectRoot: ?string): ConfigT => ({ processModuleFilter: module => true, createModuleIdFactory: defaultCreateModuleIdFactory, experimentalSerializerHook: () => {}, + customSerializer: null, }, server: { diff --git a/packages/metro/src/DeltaBundler/Serializers/plainJSBundle.js b/packages/metro/src/DeltaBundler/Serializers/plainJSBundle.js index 461381a7c1..9c7d76f150 100644 --- a/packages/metro/src/DeltaBundler/Serializers/plainJSBundle.js +++ b/packages/metro/src/DeltaBundler/Serializers/plainJSBundle.js @@ -17,7 +17,7 @@ const {isJsModule, wrapModule} = require('./helpers/js'); import type {ModuleMap} from '../../lib/bundle-modules/types.flow'; import type {Graph, Module, SerializerOptions} from '../types.flow'; -type Options = +export type Options = | {| ...SerializerOptions, embedDelta: false, diff --git a/packages/metro/src/Server.js b/packages/metro/src/Server.js index b96378b905..eeb6f90721 100644 --- a/packages/metro/src/Server.js +++ b/packages/metro/src/Server.js @@ -664,7 +664,6 @@ class Server { })); const options = { - customSerializer: this._config.serializer.customSerializer, processModuleFilter: this._config.serializer.processModuleFilter, createModuleId: this._createModuleId, getRunModuleStatement: this._config.serializer.getRunModuleStatement, @@ -692,8 +691,9 @@ class Server { : Object.assign({}, options, {embedDelta: false}), ]; let bundle; - if (options.customSerializer) { - bundle = options.customSerializer(...serializerArguments); + const possibleCustomSerializer = this._config.serializer.customSerializer; + if (possibleCustomSerializer) { + bundle = possibleCustomSerializer(...serializerArguments); } else { bundle = plainJSBundle(...serializerArguments); } From fd110602c67a39e64b8f96eae893be1e44e02744 Mon Sep 17 00:00:00 2001 From: Rae Liu Date: Thu, 8 Nov 2018 17:07:00 +0000 Subject: [PATCH 3/3] address comment --- packages/metro/src/Server.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/metro/src/Server.js b/packages/metro/src/Server.js index eeb6f90721..a409e59713 100644 --- a/packages/metro/src/Server.js +++ b/packages/metro/src/Server.js @@ -690,13 +690,10 @@ class Server { }) : Object.assign({}, options, {embedDelta: false}), ]; - let bundle; const possibleCustomSerializer = this._config.serializer.customSerializer; - if (possibleCustomSerializer) { - bundle = possibleCustomSerializer(...serializerArguments); - } else { - bundle = plainJSBundle(...serializerArguments); - } + const bundle = possibleCustomSerializer + ? possibleCustomSerializer(...serializerArguments) + : plainJSBundle(...serializerArguments); return { numModifiedFiles: delta.reset