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 0c6521c431..4900298379 100644 --- a/packages/metro-config/src/__tests__/__snapshots__/loadConfig-test.js.snap +++ b/packages/metro-config/src/__tests__/__snapshots__/loadConfig-test.js.snap @@ -131,6 +131,7 @@ Object { "unstable_collectDependenciesPath": "metro/src/ModuleGraph/worker/collectDependencies.js", "unstable_compactOutput": false, "unstable_dependencyMapReservedName": null, + "unstable_disableModuleWrapping": false, "unstable_disableNormalizePseudoGlobals": false, "workerPath": "metro/src/DeltaBundler/Worker", }, @@ -272,6 +273,7 @@ Object { "unstable_collectDependenciesPath": "metro/src/ModuleGraph/worker/collectDependencies.js", "unstable_compactOutput": false, "unstable_dependencyMapReservedName": null, + "unstable_disableModuleWrapping": false, "unstable_disableNormalizePseudoGlobals": false, "workerPath": "metro/src/DeltaBundler/Worker", }, @@ -413,6 +415,7 @@ Object { "unstable_collectDependenciesPath": "metro/src/ModuleGraph/worker/collectDependencies.js", "unstable_compactOutput": false, "unstable_dependencyMapReservedName": null, + "unstable_disableModuleWrapping": false, "unstable_disableNormalizePseudoGlobals": false, "workerPath": "metro/src/DeltaBundler/Worker", }, @@ -554,6 +557,7 @@ Object { "unstable_collectDependenciesPath": "metro/src/ModuleGraph/worker/collectDependencies.js", "unstable_compactOutput": false, "unstable_dependencyMapReservedName": null, + "unstable_disableModuleWrapping": false, "unstable_disableNormalizePseudoGlobals": false, "workerPath": "metro/src/DeltaBundler/Worker", }, diff --git a/packages/metro-config/src/defaults/index.js b/packages/metro-config/src/defaults/index.js index f742193058..564f16ea61 100644 --- a/packages/metro-config/src/defaults/index.js +++ b/packages/metro-config/src/defaults/index.js @@ -119,6 +119,7 @@ const getDefaultValues = (projectRoot: ?string): ConfigT => ({ unstable_collectDependenciesPath: 'metro/src/ModuleGraph/worker/collectDependencies.js', unstable_dependencyMapReservedName: null, + unstable_disableModuleWrapping: false, unstable_disableNormalizePseudoGlobals: false, unstable_compactOutput: false, }, diff --git a/packages/metro-transform-worker/src/__tests__/index-test.js b/packages/metro-transform-worker/src/__tests__/index-test.js index 4c757ce514..0f88ee7aba 100644 --- a/packages/metro-transform-worker/src/__tests__/index-test.js +++ b/packages/metro-transform-worker/src/__tests__/index-test.js @@ -62,6 +62,7 @@ const baseConfig: JsTransformerConfig = { 'metro/src/ModuleGraph/worker/collectDependencies', unstable_dependencyMapReservedName: null, unstable_compactOutput: false, + unstable_disableModuleWrapping: false, unstable_disableNormalizePseudoGlobals: false, }; @@ -266,6 +267,27 @@ it('does not add "use strict" on non-modules', async () => { ); }); +it('preserves require() calls when module wrapping is disabled', async () => { + const contents = ['require("./c");'].join('\n'); + + const result = await Transformer.transform( + { + ...baseConfig, + unstable_disableModuleWrapping: true, + }, + '/root', + 'local/file.js', + contents, + { + dev: true, + type: 'module', + }, + ); + + expect(result.output[0].type).toBe('js/module'); + expect(result.output[0].data.code).toBe('require("./c");'); +}); + it('reports filename when encountering unsupported dynamic dependency', async () => { const contents = [ 'require("./a");', @@ -360,6 +382,26 @@ it('minifies a JSON file', async () => { ); }); +it('does not wrap a JSON file when disableModuleWrapping is enabled', async () => { + expect( + ( + await Transformer.transform( + { + ...baseConfig, + unstable_disableModuleWrapping: true, + }, + '/root', + 'local/file.json', + 'arbitrary(code);', + { + dev: true, + type: 'module', + }, + ) + ).output[0].data.code, + ).toBe('module.exports = arbitrary(code);;'); +}); + it('transforms a script to JS source and bytecode', async () => { const result = await Transformer.transform( baseConfig, diff --git a/packages/metro-transform-worker/src/index.js b/packages/metro-transform-worker/src/index.js index a14f3706bc..68707b9633 100644 --- a/packages/metro-transform-worker/src/index.js +++ b/packages/metro-transform-worker/src/index.js @@ -36,7 +36,10 @@ const { } = require('metro-source-map'); import type {TransformResultDependency} from 'metro/src/DeltaBundler'; import type {AllowOptionalDependencies} from 'metro/src/DeltaBundler/types.flow.js'; -import type {DynamicRequiresBehavior} from 'metro/src/ModuleGraph/worker/collectDependencies'; +import type { + DependencyTransformer, + DynamicRequiresBehavior, +} from 'metro/src/ModuleGraph/worker/collectDependencies'; import type { BasicSourceMap, FBSourceFunctionMap, @@ -93,6 +96,7 @@ export type JsTransformerConfig = $ReadOnly<{| allowOptionalDependencies: AllowOptionalDependencies, unstable_collectDependenciesPath: string, unstable_dependencyMapReservedName: ?string, + unstable_disableModuleWrapping: boolean, unstable_disableNormalizePseudoGlobals: boolean, unstable_compactOutput: boolean, |}>; @@ -257,6 +261,14 @@ const compileToBytecode = ( return HermesCompiler.compile(code, options); }; +const disabledDependencyTransformer: DependencyTransformer = { + transformSyncRequire: () => void 0, + transformImportCall: () => void 0, + transformJSResource: () => void 0, + transformPrefetch: () => void 0, + transformIllegalDynamicRequire: () => void 0, +}; + class InvalidRequireCallError extends Error { innerError: InternalInvalidRequireCallError; filename: string; @@ -372,6 +384,10 @@ async function transformJS( try { const opts = { asyncRequireModulePath: config.asyncRequireModulePath, + dependencyTransformer: + config.unstable_disableModuleWrapping === true + ? disabledDependencyTransformer + : undefined, dynamicRequires: getDynamicDepsBehavior( config.dynamicDepsInPackages, file.filename, @@ -391,13 +407,17 @@ async function transformJS( throw error; } - ({ast: wrappedAst} = JsFileWrapping.wrapModule( - ast, - importDefault, - importAll, - dependencyMapName, - config.globalPrefix, - )); + if (config.unstable_disableModuleWrapping === true) { + wrappedAst = ast; + } else { + ({ast: wrappedAst} = JsFileWrapping.wrapModule( + ast, + importDefault, + importAll, + dependencyMapName, + config.globalPrefix, + )); + } } const minify = @@ -540,7 +560,10 @@ async function transformJSON( file: JSONFile, {options, config, projectRoot}: TransformationContext, ): Promise { - let code = JsFileWrapping.wrapJson(file.code, config.globalPrefix); + let code = + config.unstable_disableModuleWrapping === true + ? JsFileWrapping.jsonToCommonJS(file.code) + : JsFileWrapping.wrapJson(file.code, config.globalPrefix); let map = []; // TODO: When we can reuse transformJS for JSON, we should not derive `minify` separately.