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 750b080259..a409e59713 100644 --- a/packages/metro/src/Server.js +++ b/packages/metro/src/Server.js @@ -677,7 +677,7 @@ class Server { inlineSourceMap: serializerOptions.inlineSourceMap, }; - const bundle = plainJSBundle( + const serializerArguments = [ entryFile, revision.prepend, revision.graph, @@ -689,7 +689,11 @@ class Server { revisionId: revision.id, }) : Object.assign({}, options, {embedDelta: false}), - ); + ]; + const possibleCustomSerializer = this._config.serializer.customSerializer; + const bundle = possibleCustomSerializer + ? possibleCustomSerializer(...serializerArguments) + : plainJSBundle(...serializerArguments); return { numModifiedFiles: delta.reset