diff --git a/src/domain/javascript/electronStaticAnalysisNative.ts b/src/domain/javascript/electronStaticAnalysisNative.ts index bbff6fbfbc..3c91965901 100644 --- a/src/domain/javascript/electronStaticAnalysisNative.ts +++ b/src/domain/javascript/electronStaticAnalysisNative.ts @@ -25,6 +25,7 @@ import { } from "./javascriptAstValues.js"; import { semanticRequireCallAt } from "./javascriptSemanticRequireOrigin.js"; import { + commonJsExportApplicability, commonJsRuntimeExportValues, indexCommonJsExportReceiversSteps, type CommonJsExportReceiverEffect, @@ -203,14 +204,19 @@ const inspectReExport = ( bindings: JavaScriptSemanticAnalysisState, receiver: CommonJsExportReceiverEffect | undefined, ): void => { - const exported = commonJsRuntimeExportValues(node, bindings); - if (exported.length === 0 || receiver === "detached") return; - if (receiver === "uncertain") { + const exported = commonJsRuntimeExportValues(node, bindings)[0]; + if (exported === undefined) return; + const applicability = commonJsExportApplicability( + receiver, + exported.exportedName, + ); + if (applicability === "detached") return; + if (applicability === "uncertain") { context.accumulator.unknownFindings += 1; return; } // The export owner leaves arithmetic/logical stores without a selected RHS. - const value = exported[0]?.value; + const value = exported.value; if (value == null) return; const required = nativeRequire(value, context, bindings); if (required === undefined) return; diff --git a/src/domain/javascript/javascriptElectronAppPathChanges.ts b/src/domain/javascript/javascriptElectronAppPathChanges.ts index 75d5f97437..e88b5b9237 100644 --- a/src/domain/javascript/javascriptElectronAppPathChanges.ts +++ b/src/domain/javascript/javascriptElectronAppPathChanges.ts @@ -364,15 +364,13 @@ export const createSemanticElectronAppPathChangeQuery = ( (!t.isAssignmentExpression(node) && !t.isCallExpression(node)) ) return false; - commonJsReceivers ??= completeSemanticSteps( + const receivers = (commonJsReceivers ??= completeSemanticSteps( indexCommonJsExportReceiversSteps(state), - ); + )); return exported.some( ({ exportedName, value, projection, ownEnumerable }) => - commonJsExportApplicability( - commonJsReceivers.get(node), - exportedName, - ) !== "detached" && + commonJsExportApplicability(receivers.get(node), exportedName) !== + "detached" && value !== null && possiblePath(value, true, projection, ownEnumerable), );