diff --git a/packages/metro/src/ModuleGraph/worker/__tests__/collectDependencies-test.js b/packages/metro/src/ModuleGraph/worker/__tests__/collectDependencies-test.js index cb30ac6d9c..a3ae41d470 100644 --- a/packages/metro/src/ModuleGraph/worker/__tests__/collectDependencies-test.js +++ b/packages/metro/src/ModuleGraph/worker/__tests__/collectDependencies-test.js @@ -815,7 +815,26 @@ it('collects asynchronous dependencies', () => { ]); expect(codeFromAst(ast)).toEqual( comparableCode(` - require(${dependencyMapName}[1], "asyncRequire")(${dependencyMapName}[0], "some/async/module", _dependencyMap.paths).then(foo => {}); + require(${dependencyMapName}[1], "asyncRequire")(${dependencyMapName}[0], _dependencyMap.paths, "some/async/module").then(foo => {}); + `), + ); +}); + +it('collects asynchronous dependencies with keepRequireNames: false', () => { + const ast = astFromCode(` + import("some/async/module").then(foo => {}); + `); + const {dependencies, dependencyMapName} = collectDependencies(ast, { + ...opts, + keepRequireNames: false, + }); + expect(dependencies).toEqual([ + {name: 'some/async/module', data: objectContaining({asyncType: 'async'})}, + {name: 'asyncRequire', data: objectContaining({asyncType: null})}, + ]); + expect(codeFromAst(ast)).toEqual( + comparableCode(` + require(${dependencyMapName}[1])(${dependencyMapName}[0], _dependencyMap.paths).then(foo => {}); `), ); }); @@ -834,7 +853,7 @@ it('distinguishes sync and async dependencies on the same module', () => { expect(codeFromAst(ast)).toEqual( comparableCode(` const a = require(${dependencyMapName}[0], "some/async/module"); - require(${dependencyMapName}[2], "asyncRequire")(${dependencyMapName}[1], "some/async/module", _dependencyMap.paths).then(foo => {}); + require(${dependencyMapName}[2], "asyncRequire")(${dependencyMapName}[1], _dependencyMap.paths, "some/async/module").then(foo => {}); `), ); }); @@ -852,7 +871,7 @@ it('distinguishes sync and async dependencies on the same module; reverse order' ]); expect(codeFromAst(ast)).toEqual( comparableCode(` - require(${dependencyMapName}[1], "asyncRequire")(${dependencyMapName}[0], "some/async/module", _dependencyMap.paths).then(foo => {}); + require(${dependencyMapName}[1], "asyncRequire")(${dependencyMapName}[0], _dependencyMap.paths, "some/async/module").then(foo => {}); const a = require(${dependencyMapName}[2], "some/async/module"); `), ); @@ -873,7 +892,29 @@ describe('import() prefetching', () => { ]); expect(codeFromAst(ast)).toEqual( comparableCode(` - require(${dependencyMapName}[1], "asyncRequire").prefetch(${dependencyMapName}[0], "some/async/module", _dependencyMap.paths); + require(${dependencyMapName}[1], "asyncRequire").prefetch(${dependencyMapName}[0], _dependencyMap.paths, "some/async/module"); + `), + ); + }); + + it('keepRequireNames: false', () => { + const ast = astFromCode(` + __prefetchImport("some/async/module"); + `); + const {dependencies, dependencyMapName} = collectDependencies(ast, { + ...opts, + keepRequireNames: false, + }); + expect(dependencies).toEqual([ + { + name: 'some/async/module', + data: objectContaining({asyncType: 'prefetch'}), + }, + {name: 'asyncRequire', data: objectContaining({asyncType: null})}, + ]); + expect(codeFromAst(ast)).toEqual( + comparableCode(` + require(${dependencyMapName}[1]).prefetch(${dependencyMapName}[0], _dependencyMap.paths); `), ); }); diff --git a/packages/metro/src/ModuleGraph/worker/collectDependencies.js b/packages/metro/src/ModuleGraph/worker/collectDependencies.js index 2ff0526e6d..705d7597d6 100644 --- a/packages/metro/src/ModuleGraph/worker/collectDependencies.js +++ b/packages/metro/src/ModuleGraph/worker/collectDependencies.js @@ -626,11 +626,19 @@ const dynamicRequireErrorTemplate = template.expression(` * "require(...)" call to the asyncRequire specified. */ const makeAsyncRequireTemplate = template.expression(` - require(ASYNC_REQUIRE_MODULE_PATH)(MODULE_ID, MODULE_NAME, DEPENDENCY_MAP.paths) + require(ASYNC_REQUIRE_MODULE_PATH)(MODULE_ID, DEPENDENCY_MAP.paths) +`); + +const makeAsyncRequireTemplateWithName = template.expression(` + require(ASYNC_REQUIRE_MODULE_PATH)(MODULE_ID, DEPENDENCY_MAP.paths, MODULE_NAME) `); const makeAsyncPrefetchTemplate = template.expression(` - require(ASYNC_REQUIRE_MODULE_PATH).prefetch(MODULE_ID, MODULE_NAME, DEPENDENCY_MAP.paths) + require(ASYNC_REQUIRE_MODULE_PATH).prefetch(MODULE_ID, DEPENDENCY_MAP.paths) +`); + +const makeAsyncPrefetchTemplateWithName = template.expression(` + require(ASYNC_REQUIRE_MODULE_PATH).prefetch(MODULE_ID, DEPENDENCY_MAP.paths, MODULE_NAME) `); const makeResolveWeakTemplate = template.expression(` @@ -661,16 +669,20 @@ const DefaultDependencyTransformer: DependencyTransformer = { dependency: InternalDependency, state: State, ): void { - path.replaceWith( - makeAsyncRequireTemplate({ - ASYNC_REQUIRE_MODULE_PATH: nullthrows( - state.asyncRequireModulePathStringLiteral, - ), - MODULE_ID: createModuleIDExpression(dependency, state), - MODULE_NAME: createModuleNameLiteral(dependency), - DEPENDENCY_MAP: nullthrows(state.dependencyMapIdentifier), - }), - ); + const makeNode = state.keepRequireNames + ? makeAsyncRequireTemplateWithName + : makeAsyncRequireTemplate; + const opts = { + ASYNC_REQUIRE_MODULE_PATH: nullthrows( + state.asyncRequireModulePathStringLiteral, + ), + MODULE_ID: createModuleIDExpression(dependency, state), + DEPENDENCY_MAP: nullthrows(state.dependencyMapIdentifier), + ...(state.keepRequireNames + ? {MODULE_NAME: createModuleNameLiteral(dependency)} + : null), + }; + path.replaceWith(makeNode(opts)); }, transformPrefetch( @@ -678,16 +690,20 @@ const DefaultDependencyTransformer: DependencyTransformer = { dependency: InternalDependency, state: State, ): void { - path.replaceWith( - makeAsyncPrefetchTemplate({ - ASYNC_REQUIRE_MODULE_PATH: nullthrows( - state.asyncRequireModulePathStringLiteral, - ), - MODULE_ID: createModuleIDExpression(dependency, state), - MODULE_NAME: createModuleNameLiteral(dependency), - DEPENDENCY_MAP: nullthrows(state.dependencyMapIdentifier), - }), - ); + const makeNode = state.keepRequireNames + ? makeAsyncPrefetchTemplateWithName + : makeAsyncPrefetchTemplate; + const opts = { + ASYNC_REQUIRE_MODULE_PATH: nullthrows( + state.asyncRequireModulePathStringLiteral, + ), + MODULE_ID: createModuleIDExpression(dependency, state), + DEPENDENCY_MAP: nullthrows(state.dependencyMapIdentifier), + ...(state.keepRequireNames + ? {MODULE_NAME: createModuleNameLiteral(dependency)} + : null), + }; + path.replaceWith(makeNode(opts)); }, transformIllegalDynamicRequire(path: NodePath<>, state: State): void {