diff --git a/src/domain/javascript/javascriptSemanticRequireOrigin.ts b/src/domain/javascript/javascriptSemanticRequireOrigin.ts index a4963db9e1..59909e391a 100644 --- a/src/domain/javascript/javascriptSemanticRequireOrigin.ts +++ b/src/domain/javascript/javascriptSemanticRequireOrigin.ts @@ -648,6 +648,34 @@ export const semanticRequireCallAt = ( ): JavaScriptRequireCallFact | undefined => { if (semanticModuleRequireCallAt(node, state)) return { loader: "unknown", arguments: undefined, sourceRelative: false }; + const callee = unwrapJavaScriptExpression(node.callee).node; + if ( + (t.isMemberExpression(callee) || t.isOptionalMemberExpression(callee)) && + semanticStaticPropertyKey(callee.property, callee.computed) === "resolve" + ) { + const loader = requireLoaderValueAt( + callee.object, + node, + state, + factoryBindingIds, + ); + if (loader !== "local") { + const selected = selectedRequireSourcesAt( + callee.object, + node, + state, + factoryBindingIds, + ); + return { + loader: selected?.loader ?? loader, + arguments: node.arguments, + sourceRelative: selected?.sourceRelative ?? loader !== "unknown", + ...(selected?.sourceRelativePath === undefined + ? {} + : { sourceRelativePath: selected.sourceRelativePath }), + }; + } + } if (t.isNewExpression(node)) { const loader = requireLoaderValueAt( node.callee, diff --git a/src/domain/javascript/javascriptStaticAnalysisLoaderInvocations.test.ts b/src/domain/javascript/javascriptStaticAnalysisLoaderInvocations.test.ts index 84a68de0de..5f2d88d8d9 100644 --- a/src/domain/javascript/javascriptStaticAnalysisLoaderInvocations.test.ts +++ b/src/domain/javascript/javascriptStaticAnalysisLoaderInvocations.test.ts @@ -21,7 +21,14 @@ it.each(["require", "require.resolve", "require.main"])( expect(analysis.references).toEqual( callee === "require" ? [expect.objectContaining({ kind: "require", specifier: "node:path" })] - : [], + : callee === "require.resolve" + ? [ + expect.objectContaining({ + kind: "require", + specifier: "node:path", + }), + ] + : [], ); const parsed = parseJavaScriptSource(source); if (parsed === null) throw new Error("Expected loader association fixture");