rea-agents 6.2.0 → 6.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -23
- package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
- package/bridge/ghidra/ReaGhidraBridge.java +597 -209
- package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
- package/bridge/hopper_bridge.py +2 -0
- package/dist/adb/AdbConfiguration.js +88 -0
- package/dist/adb/AdbDeviceOutput.js +186 -0
- package/dist/adb/AdbProvider.js +1190 -0
- package/dist/adb/AdbShellOutput.js +309 -0
- package/dist/android/AndroidTargetSnapshot.js +104 -22
- package/dist/android/JadxConfiguration.js +44 -24
- package/dist/android/JadxProvider.js +59 -21
- package/dist/android/JadxSession.js +51 -9
- package/dist/apktool/ApktoolConfiguration.js +84 -0
- package/dist/apktool/ApktoolDecodeOutput.js +59 -0
- package/dist/apktool/ApktoolProvider.js +506 -0
- package/dist/application/AnalysisProvider.js +8 -2
- package/dist/application/AppBundleExecutable.js +27 -22
- package/dist/application/BinaryTargetResolver.js +85 -19
- package/dist/application/BrowserScenarioEvidence.js +2 -2
- package/dist/application/CapabilityInventory.js +11 -1
- package/dist/application/ClientConfigurationDocument.js +98 -0
- package/dist/application/ClientConfigurationFiles.js +91 -0
- package/dist/application/ClientRegistrationEnvironment.js +35 -0
- package/dist/application/ClientRegistrationStatus.js +75 -27
- package/dist/application/DirectAnalysis.js +14 -8
- package/dist/application/DirectAnalysisCleanup.js +1 -2
- package/dist/application/DirectAnalysisStatus.js +3 -6
- package/dist/application/Doctor.js +27 -34
- package/dist/application/DoctorDiagnostics.js +1 -1
- package/dist/application/EvidenceBundleCommands.js +6 -12
- package/dist/application/EvidenceBundleFiles.js +1 -1
- package/dist/application/GeminiClientSettings.js +139 -0
- package/dist/application/HermesClientHome.js +115 -0
- package/dist/application/HopperDownload.js +39 -0
- package/dist/application/InvestigationProviders.js +10 -4
- package/dist/application/JsonFiles.js +16 -15
- package/dist/application/JsonInputFile.js +252 -0
- package/dist/application/LinuxHopper.js +6 -13
- package/dist/application/MacHopper.js +172 -149
- package/dist/application/MipsElfAbiFlags.js +140 -0
- package/dist/application/ProviderOperationExecution.js +31 -0
- package/dist/application/ReconstructionObligationCandidates.js +16 -3
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- package/dist/application/ReferenceSourceImport.js +76 -29
- package/dist/application/ReferenceSourceImportEntries.js +18 -9
- package/dist/application/ReferenceSourceImportPolicy.js +99 -23
- package/dist/application/ReferenceSourceImportTypes.js +30 -22
- package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
- package/dist/application/RegularFileRead.js +103 -0
- package/dist/application/Setup.js +69 -10
- package/dist/application/SetupClientConfiguration.js +134 -23
- package/dist/application/SetupHost.js +102 -22
- package/dist/application/SetupPlan.js +18 -17
- package/dist/application/SetupSkill.js +81 -13
- package/dist/application/SupportedClients.js +305 -37
- package/dist/application/Uninstall.js +172 -8
- package/dist/application/UpdateMaintenance.js +23 -23
- package/dist/application/Utf8JsonInput.js +71 -0
- package/dist/application/WebScriptExportService.js +130 -57
- package/dist/application/WebSourceLocationService.js +3 -0
- package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
- package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
- package/dist/application/analysisView/AnalysisViewService.js +40 -2
- package/dist/application/android/AndroidAnalysisService.js +1 -1
- package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
- package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
- package/dist/application/binary/AnalysisClientCleanup.js +0 -24
- package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
- package/dist/application/binary/BinarySession.js +18 -1
- package/dist/application/binary/BinarySessionOpen.js +9 -1
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
- package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
- package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
- package/dist/application/evm/EvmInterfaceService.js +3 -0
- package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
- package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
- package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
- package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
- package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
- package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
- package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- package/dist/application/jeb/JebAnalysisPort.js +1 -0
- package/dist/application/jeb/JebAnalysisService.js +13 -0
- package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
- package/dist/application/native/NativeCallRoutes.js +2 -4
- package/dist/application/native/NativeUiActionTrace.js +16 -8
- package/dist/application/native/NativeValueTrace.js +23 -6
- package/dist/application/process/ProcessCli.js +25 -20
- package/dist/artifacts/ArtifactPaths.js +129 -8
- package/dist/artifacts/ArtifactProvider.js +34 -31
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/ArtifactReader.js +23 -0
- package/dist/artifacts/ArtifactResourceScope.js +100 -0
- package/dist/artifacts/AsarArtifactReader.js +218 -80
- package/dist/artifacts/AsarHeader.js +24 -0
- package/dist/artifacts/DirectoryArtifactReader.js +168 -65
- package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
- package/dist/artifacts/NativeDmgArtifactReader.js +179 -87
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- package/dist/artifacts/SafeOutputTree.js +245 -70
- package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
- package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
- package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
- package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
- package/dist/artifacts/ZipArtifactReader.js +77 -27
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
- package/dist/artifacts/apple/KeyedArchiveReader.js +76 -49
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
- package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
- package/dist/artifacts/inventory/classify.js +87 -25
- package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
- package/dist/artifacts/inventory/reader.js +13 -5
- package/dist/artifacts/inventory/scanCanonical.js +73 -30
- package/dist/artifacts/inventory/scanReader.js +43 -20
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
- package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
- package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
- package/dist/browser/BrowserScenarioSecrets.js +52 -37
- package/dist/browser/CdpBrowserProvider.js +9 -3
- package/dist/browser/CdpCaptureDocuments.js +40 -6
- package/dist/browser/CdpCaptureDomSvg.js +210 -0
- package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
- package/dist/browser/CdpCaptureEventHandlers.js +26 -9
- package/dist/browser/CdpCaptureEvents.js +4 -9
- package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpConnection.js +22 -5
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -3
- package/dist/browser/CdpElectronScripts.js +2 -2
- package/dist/browser/CdpPageCapture.js +1 -1
- package/dist/browser/CdpTargetSession.js +30 -34
- package/dist/browser/CdpWebMcpDiscovery.js +48 -23
- package/dist/browser/ElectronFileScope.js +99 -9
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
- package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
- package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
- package/dist/browser/PlaywrightScenarioSession.js +130 -65
- package/dist/browser/PlaywrightScenarioStorage.js +507 -0
- package/dist/browser/PngVisualDiff.js +198 -29
- package/dist/browser/WebSourceMapFetcher.js +35 -9
- package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
- package/dist/browser/assets/PublishWebScripts.js +75 -20
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- package/dist/browser/assets/WebArtifactReads.js +23 -1
- package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
- package/dist/browser/execution/CdpExecutionCapture.js +3 -3
- package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
- package/dist/browser/history/HarCapture.js +14 -0
- package/dist/browser/history/HarCaptureProcess.js +2 -10
- package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
- package/dist/browser/modules/WebModuleArtifacts.js +1 -0
- package/dist/cli/adbCommands.js +337 -0
- package/dist/cli/analysisViewCommands.js +39 -1
- package/dist/cli/apktoolCommands.js +53 -0
- package/dist/cli/artifactCommands.js +8 -11
- package/dist/cli/binaryDiagnosticsCommands.js +19 -1
- package/dist/cli/browserAdvancedCommands.js +65 -36
- package/dist/cli/coreAnalysisCommands.js +2 -2
- package/dist/cli/coreBinaryCommands.js +12 -13
- package/dist/cli/coreNativeCommands.js +1 -14
- package/dist/cli/electronCommands.js +14 -10
- package/dist/cli/evmCommands.js +13 -4
- package/dist/cli/firmwareCommands.js +7 -2
- package/dist/cli/javascriptApplicationAnalysis.js +19 -13
- package/dist/cli/javascriptRecoveryCommands.js +22 -15
- package/dist/cli/jebCommands.js +99 -0
- package/dist/cli/jsonOutput.js +12 -4
- package/dist/cli/referenceSourceImportStatus.js +7 -0
- package/dist/cli/setupCommands.js +15 -3
- package/dist/cli/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +68 -22
- package/dist/cli/webScriptCommands.js +20 -1
- package/dist/cli/webSourceLocationCommands.js +21 -9
- package/dist/cli.js +11 -2
- package/dist/cliBrowserScenarioCommands.js +2 -1
- package/dist/cliCommandNames.js +32 -0
- package/dist/cliJsonInput.js +47 -34
- package/dist/cliObservationOptions.js +7 -0
- package/dist/composition/adb.js +3 -0
- package/dist/composition/apktool.js +3 -0
- package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
- package/dist/composition/binaryDiagnostics.js +4 -0
- package/dist/composition/browserScenario.js +2 -2
- package/dist/composition/directAnalysis.js +14 -7
- package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
- package/dist/composition/jeb.js +6 -0
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraLanguageOverride.js +9 -0
- package/dist/config/mcpInputSchemaProfile.js +27 -0
- package/dist/config/parseConfig.js +28 -1
- package/dist/contracts/adb/adbToolContracts.js +353 -0
- package/dist/contracts/advertisedInputExamples.js +48 -0
- package/dist/contracts/analysisDetail.js +10 -0
- package/dist/contracts/analysisViewToolContracts.js +17 -2
- package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
- package/dist/contracts/artifactComparisonExample.js +5 -5
- package/dist/contracts/artifactToolContracts.js +8 -5
- package/dist/contracts/browserToolContracts.js +1 -1
- package/dist/contracts/compactInputSchema.js +256 -0
- package/dist/contracts/errorSchemas.js +3 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +104 -13
- package/dist/contracts/javascript/electronToolContracts.js +16 -3
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
- package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/jeb/jebToolContracts.js +64 -0
- package/dist/contracts/managed/managedToolContracts.js +3 -2
- package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
- package/dist/contracts/native/nativeToolContracts.js +1 -1
- package/dist/contracts/officialToolContracts.js +5 -5
- package/dist/contracts/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +5 -4
- package/dist/contracts/sessionToolSchemas.js +9 -4
- package/dist/contracts/toolContractExamples.js +6 -0
- package/dist/contracts/toolContractTypes.js +3 -0
- package/dist/contracts/toolContracts.js +6 -0
- package/dist/contracts/toolEffects.js +167 -0
- package/dist/contracts/toolOutputSchemaGroups.js +7 -5
- package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
- package/dist/contracts/toolSchemaMetadata.js +82 -7
- package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
- package/dist/domain/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorCleanup.js +29 -0
- package/dist/domain/analysisErrorPresentation.js +18 -4
- package/dist/domain/analysisErrorProjection.js +4 -1
- package/dist/domain/analysisSnapshot.js +5 -2
- package/dist/domain/analysisView/analysisView.js +53 -5
- package/dist/domain/analysisView/binaryLayoutView.js +2 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
- package/dist/domain/analysisView/nativeFunctionView.js +155 -0
- package/dist/domain/android/androidApplication.js +25 -20
- package/dist/domain/android/androidPartialObservation.js +36 -0
- package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
- package/dist/domain/apple/appleApplication.js +40 -23
- package/dist/domain/apple/appleBundleAnatomy.js +95 -28
- package/dist/domain/apple/dyldPaths.js +9 -1
- package/dist/domain/apple/dylibResolution.js +3 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
- package/dist/domain/artifactComparison.js +39 -11
- package/dist/domain/artifactGraph.js +6 -4
- package/dist/domain/artifactIdentity.js +37 -9
- package/dist/domain/artifactInspection.js +10 -50
- package/dist/domain/artifactIntegrityPolicy.js +10 -0
- package/dist/domain/artifactInventoryEvidence.js +16 -17
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/binaryTarget.js +16 -0
- package/dist/domain/binaryTargetTypes.js +8 -1
- package/dist/domain/browserCompleteness.js +3 -2
- package/dist/domain/browserObservationSchemas.js +8 -4
- package/dist/domain/browserScenarioCaptureValues.js +2 -2
- package/dist/domain/browserScenarioNormalization.js +3 -3
- package/dist/domain/browserScenarioValues.js +3 -2
- package/dist/domain/callPath.js +8 -10
- package/dist/domain/canonicalDigest.js +7 -1
- package/dist/domain/canonicalJsonDigestSteps.js +34 -12
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +2 -3
- package/dist/domain/compactStringIdentity.js +9 -0
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +12 -6
- package/dist/domain/evidenceBundle.js +51 -33
- package/dist/domain/evidenceRecordSummary.js +144 -0
- package/dist/domain/firmware/firmwareAnalysis.js +4 -3
- package/dist/domain/functionComparison.js +2 -1
- package/dist/domain/functionComparisonNormalization.js +4 -3
- package/dist/domain/functionComparisonResults.js +2 -2
- package/dist/domain/functionDossierEvidence.js +2 -1
- package/dist/domain/hopperValues.js +11 -15
- package/dist/domain/inputIssueProjection.js +16 -1
- package/dist/domain/javascript/electronActiveObservation.js +4 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
- package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
- package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
- package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
- package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
- package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
- package/dist/domain/javascript/javascriptAstValues.js +54 -0
- package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
- package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
- package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
- package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
- package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
- package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
- package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
- package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
- package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
- package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
- package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
- package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
- package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
- package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
- package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +15 -17
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
- package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
- package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
- package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
- package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
- package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
- package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
- package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
- package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
- package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
- package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
- package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
- package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
- package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
- package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
- package/dist/domain/javascript/javascriptSemanticState.js +22 -2
- package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
- package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
- package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
- package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
- package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
- package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
- package/dist/domain/jeb/jebAnalysis.js +114 -0
- package/dist/domain/jsonSerialization.js +109 -55
- package/dist/domain/jsonShape.js +69 -31
- package/dist/domain/jsonValue.js +3 -0
- package/dist/domain/localPath.js +10 -4
- package/dist/domain/managed/managedApplicationGraph.js +47 -6
- package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
- package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
- package/dist/domain/managed/managedArtifact.js +1 -0
- package/dist/domain/managed/managedInspectionEvidence.js +13 -0
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- package/dist/domain/native/nativeAotPe.js +1408 -0
- package/dist/domain/native/nativeCallObservation.js +2 -4
- package/dist/domain/native/nativeInstruction.js +21 -0
- package/dist/domain/native/nativeMetadataRecovery.js +79 -6
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/native/peResources.js +94 -0
- package/dist/domain/nativeConvention.js +33 -0
- package/dist/domain/process/processCapture.js +102 -11
- package/dist/domain/process/processCaptureCoverage.js +8 -5
- package/dist/domain/process/processCaptureExample.js +67 -0
- package/dist/domain/process/processCaptureValidation.js +83 -3
- package/dist/domain/process/processComparison.js +0 -23
- package/dist/domain/process/processScenario.js +62 -10
- package/dist/domain/process/processTraceEvaluation.js +4 -4
- package/dist/domain/process/processTraceSpecification.js +1 -3
- package/dist/domain/propertyListKeys.js +3 -1
- package/dist/domain/providerCleanupError.js +6 -2
- package/dist/domain/reconstructionCoverage.js +2 -1
- package/dist/domain/reconstructionUnknowns.js +4 -3
- package/dist/domain/reconstructionVerification.js +3 -2
- package/dist/domain/referenceSourceGraph.js +32 -23
- package/dist/domain/referenceSourceImportParsing.js +40 -48
- package/dist/domain/referenceSourcePathIdentity.js +22 -0
- package/dist/domain/referenceSourceRequireBindings.js +137 -0
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +2 -1
- package/dist/domain/swiftSymbolClassification.js +6 -1
- package/dist/domain/symbolAnalysis.js +17 -2
- package/dist/domain/unicodeCodePointOrder.js +6 -0
- package/dist/domain/webBundleAnalyzerInspection.js +23 -3
- package/dist/domain/webCaptureDiff.js +170 -30
- package/dist/domain/webCaptureDiffSchemas.js +2 -8
- package/dist/domain/webInventory.js +3 -2
- package/dist/domain/webMcpDiscovery.js +4 -3
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webScriptExportError.js +10 -4
- package/dist/domain/webScriptExportPlan.js +7 -13
- package/dist/domain/zipPackageFormat.js +4 -1
- package/dist/domain/zodCollectionSteps.js +24 -0
- package/dist/dotnet/ManagedArtifactInspector.js +55 -43
- package/dist/dotnet/ManagedDecodeBudget.js +80 -0
- package/dist/dotnet/ManagedMemberInspector.js +13 -6
- package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +5 -4
- package/dist/dotnet/ManagedMemberRows.js +9 -4
- package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
- package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
- package/dist/dotnet/ManagedMetadataLayout.js +10 -4
- package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
- package/dist/dotnet/ManagedPeReader.js +41 -25
- package/dist/dotnet/ManagedReaderFailure.js +2 -1
- package/dist/dotnet/ManagedStaticProvider.js +65 -31
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- package/dist/evaluation/AgentEvaluationReport.js +9 -5
- package/dist/evaluation/CodexAgentEval.js +43 -13
- package/dist/evm/EvmoleFailures.js +0 -2
- package/dist/evm/EvmoleInterfaceProvider.js +67 -2
- package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
- package/dist/filesystem/OwnedFileHandle.js +36 -0
- package/dist/filesystem/RegularFile.js +73 -0
- package/dist/filesystem/StableFileHash.js +46 -0
- package/dist/filesystem/readFileHandleChunks.js +26 -0
- package/dist/firmware/FirmwareCommand.js +25 -3
- package/dist/firmware/FirmwareFiles.js +23 -8
- package/dist/firmware/FirmwareProvider.js +156 -32
- package/dist/firmware/FirmwarePublication.js +24 -3
- package/dist/firmware/FirmwareRelease.js +1 -0
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
- package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
- package/dist/ghidra/GhidraClient.js +90 -8
- package/dist/ghidra/GhidraDiagnostics.js +11 -8
- package/dist/ghidra/GhidraFunctionValues.js +26 -2
- package/dist/ghidra/GhidraInstallation.js +111 -10
- package/dist/ghidra/GhidraInventoryValues.js +23 -1
- package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
- package/dist/ghidra/GhidraLauncher.js +123 -58
- package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
- package/dist/ghidra/GhidraMipsProfile.js +79 -0
- package/dist/ghidra/GhidraProvider.js +57 -9
- package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
- package/dist/ghidra/GhidraProviderClient.js +282 -21
- package/dist/ghidra/GhidraSessionValues.js +9 -2
- package/dist/hopper/HopperAnalysisProfile.js +2 -0
- package/dist/hopper/HopperCleanup.js +1 -1
- package/dist/hopper/HopperClient.js +15 -6
- package/dist/hopper/HopperMachOImage.js +2 -0
- package/dist/hopper/HopperProvider.js +13 -2
- package/dist/ida/IdaOperationRunner.js +10 -2
- package/dist/ida/IdaProvider.js +7 -0
- package/dist/ida/IdaSessionClient.js +7 -3
- package/dist/ida/IdaWorkspace.js +4 -2
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
- package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
- package/dist/inspector/V8InspectorProvider.js +60 -8
- package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
- package/dist/javascript/recovery/RecoveryFiles.js +18 -7
- package/dist/javascript/recovery/WakaruCommand.js +22 -9
- package/dist/javascript/recovery/WakaruExecution.js +11 -7
- package/dist/javascript/recovery/WakaruProvider.js +139 -16
- package/dist/javascript/recovery/WakaruPublication.js +14 -4
- package/dist/javascript/recovery/WakaruRelease.js +10 -3
- package/dist/javascript/recovery/WakaruReport.js +12 -7
- package/dist/javascript/recovery/WakaruVersion.js +24 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
- package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
- package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
- package/dist/jeb/JebMcpConnection.js +179 -0
- package/dist/jeb/JebMcpEndpoint.js +40 -0
- package/dist/jeb/JebProvider.js +299 -0
- package/dist/main/shutdown.js +76 -32
- package/dist/main/transport.js +1 -1
- package/dist/mcpDoctor.js +15 -6
- package/dist/native/AppleDispatchCoverage.js +25 -12
- package/dist/native/AppleDispatchMetadata.js +14 -7
- package/dist/native/AppleMachoFixups.js +71 -15
- package/dist/native/AppleMachoSelection.js +23 -3
- package/dist/native/AppleObjcDispatchFacets.js +3 -3
- package/dist/native/AppleObjcProperties.js +17 -7
- package/dist/native/LldbCallTracer.js +241 -75
- package/dist/native/NativeMacOSProvider.js +100 -20
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- package/dist/native/NativeMachoInspection.js +11 -7
- package/dist/native/NativeUiHelperRuntime.js +6 -1
- package/dist/native/NativeUiObservation.js +4 -3
- package/dist/native/pe/PeResourceLayout.js +120 -0
- package/dist/native/pe/PeResourceParser.js +286 -0
- package/dist/native/pe/PeResourcesProvider.js +63 -0
- package/dist/process/BoundedFileBytes.js +30 -7
- package/dist/process/DarwinProcessRunTokenReader.js +8 -3
- package/dist/process/OwnedCommand.js +4 -3
- package/dist/process/ProcessOwnership.js +104 -112
- package/dist/process/ProcessOwnershipObservation.js +104 -51
- package/dist/process/ProcessOwnershipProcessTree.js +4 -4
- package/dist/process/ProcessRunTokenObservations.js +48 -0
- package/dist/process/ProviderDiagnosticRedaction.js +17 -0
- package/dist/process/ProviderProcess.js +4 -3
- package/dist/process/capture/FilesystemSnapshot.js +116 -22
- package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
- package/dist/process/capture/ProcessCaptureProgress.js +62 -0
- package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
- package/dist/process/capture/ProcessHarness.js +202 -47
- package/dist/process/capture/ProcessNormalization.js +3 -1
- package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
- package/dist/process/capture/TerminalRenderer.js +24 -7
- package/dist/reference/ReferenceSourceReader.js +22 -5
- package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
- package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
- package/dist/reference/ReferenceSourceReaderFile.js +50 -10
- package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
- package/dist/server/EvidenceMcpServer.js +36 -1
- package/dist/server/admittedToolOperation.js +9 -0
- package/dist/server/analysisAdmission.js +8 -0
- package/dist/server/contractToolHandler.js +21 -0
- package/dist/server/createServer.js +118 -47
- package/dist/server/registerAdbTools.js +36 -0
- package/dist/server/registerAnalysisViewTool.js +4 -9
- package/dist/server/registerAndroidTools.js +3 -12
- package/dist/server/registerApktoolTools.js +14 -0
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -7
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +3 -2
- package/dist/server/registerApplicationTools/coverage.js +3 -2
- package/dist/server/registerApplicationTools/helpers.js +3 -2
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +3 -2
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +5 -2
- package/dist/server/registerArtifactTools.js +2 -2
- package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
- package/dist/server/registerBrowserScenarioTool.js +10 -7
- package/dist/server/registerBrowserTools.js +12 -9
- package/dist/server/registerBundleComparisonTool.js +16 -2
- package/dist/server/registerCloseLifecycleTool.js +36 -5
- package/dist/server/registerElectronTools.js +28 -10
- package/dist/server/registerEnhancedTools.js +78 -73
- package/dist/server/registerEvidenceTools.js +54 -46
- package/dist/server/registerEvmTools.js +4 -9
- package/dist/server/registerFirmwareTools.js +3 -11
- package/dist/server/registerFunctionComparisonTool.js +5 -2
- package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
- package/dist/server/registerJebTools.js +16 -0
- package/dist/server/registerManagedTools.js +7 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
- package/dist/server/registerOfficialTools.js +31 -25
- package/dist/server/registerPeResourcesTool.js +9 -0
- package/dist/server/registerProcessComparisonTool.js +5 -2
- package/dist/server/registerRecordedCrashTools.js +4 -9
- package/dist/server/registerSessionRecordTools.js +2 -1
- package/dist/server/registerSessionTools.js +58 -21
- package/dist/server/registerWebModuleTool.js +4 -9
- package/dist/server/registerWebNetworkCaptureTool.js +4 -9
- package/dist/server/registerWebRuntimeTools.js +6 -5
- package/dist/server/registerWebScriptTool.js +6 -3
- package/dist/server/registerWebSourceLocationTool.js +4 -9
- package/dist/server/toolResult.js +21 -2
- package/dist/windows/WindowsPrivateRuntime.js +12 -5
- package/install.sh +7 -4
- package/licenses/nativeaot-parser-MIT.txt +28 -0
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +38 -7
- package/scripts/rea.mjs +16 -1
- package/skills/reverse-engineer-anything/SKILL.md +52 -51
- package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
- package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +31 -1
- package/dist/artifacts/inventory/policy.js +0 -2
- package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/server/registerNativeTools.js +0 -6
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
import * as t from "@babel/types";
|
|
2
2
|
import { failedJavaScriptSemanticIr, } from "./javascriptSemanticIr.js";
|
|
3
|
-
import { collectSemanticModuleLink, collectSemanticCallable, collectSemanticReferences, immutableSemanticBindings, immutableSemanticScopes, } from "./javascriptSemanticProjection.js";
|
|
4
|
-
import { semanticStaticPropertyKey } from "./javascriptAstValues.js";
|
|
5
|
-
import { currentSemanticScope, resolveSemanticBindingState, semanticResolutionBlocked, resolveSemanticBindingFromScope, semanticScopeId, semanticVariableScope, } from "./javascriptSemanticState.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
3
|
+
import { collectSemanticModuleLink, collectSemanticCallable, collectSemanticReferences, collectSemanticReferencesSteps, immutableSemanticBindings, immutableSemanticScopes, } from "./javascriptSemanticProjection.js";
|
|
4
|
+
import { semanticObjectPatternKeys, semanticStaticPropertyKey, } from "./javascriptAstValues.js";
|
|
5
|
+
import { currentSemanticScope, resolveSemanticBindingState, semanticResolutionBlocked, resolveSemanticBindingFromScope, semanticBindingId, semanticScopeId, semanticVariableScope, } from "./javascriptSemanticState.js";
|
|
6
|
+
import { completeSemanticSteps, traverseJavaScriptAstSteps, } from "./javascriptSemanticTraversal.js";
|
|
7
|
+
import { semanticRequireOrigin } from "./javascriptSemanticRequireOrigin.js";
|
|
8
|
+
import { collectSemanticMemberMutationsSteps } from "./javascriptSemanticMemberMutations.js";
|
|
8
9
|
import { collectSemanticReturns, resolveSemanticModuleCallables, } from "./javascriptSemanticReturns.js";
|
|
9
|
-
import {
|
|
10
|
+
import { collectJavaScriptDerivedSemanticsSteps } from "./javascriptSemanticDerivedAnalysis.js";
|
|
11
|
+
import { evaluateSemanticProvenance } from "./javascriptSemanticValues.js";
|
|
12
|
+
import { collectElectronMemberWritesSteps, electronExportPath, electronMemberPath, ELECTRON_MODULE, } from "./javascriptElectronMemberWrites.js";
|
|
10
13
|
import { range } from "./javascriptStaticAnalysisHelpers.js";
|
|
11
14
|
import { propertyName } from "./javascriptAstValues.js";
|
|
12
15
|
import { semanticCoverage } from "./javascriptSemanticCoverage.js";
|
|
13
16
|
import { semanticResourceLimitsIn } from "./javascriptSemanticResourceLimits.js";
|
|
14
17
|
import { parseJavaScriptSource, } from "./javascriptSourceParser.js";
|
|
18
|
+
import { isJavaScriptRpcClientFactory } from "./javascriptRpcEndpoints.js";
|
|
15
19
|
/** Recover lexical bindings, aliases, constants, and module links. */
|
|
16
20
|
export const analyzeJavaScriptSemantics = (source) => {
|
|
17
21
|
const file = parseJavaScriptSource(source);
|
|
@@ -22,23 +26,33 @@ export const analyzeJavaScriptSemantics = (source) => {
|
|
|
22
26
|
/** Recover lexical references, optionally for one name, without evaluating values or provenance. */
|
|
23
27
|
export const analyzeParsedJavaScriptReferences = (file, name) => {
|
|
24
28
|
const state = createState(file.program);
|
|
25
|
-
|
|
29
|
+
completeSemanticSteps(collectDefinitionsSteps(file.program, state));
|
|
26
30
|
return collectSemanticReferences(file.program, state, name);
|
|
27
31
|
};
|
|
28
32
|
/** Recover semantics from an already parsed JavaScript artifact. */
|
|
29
|
-
export const analyzeParsedJavaScriptSemantics = (file) =>
|
|
33
|
+
export const analyzeParsedJavaScriptSemantics = (file) => completeSemanticSteps(analyzeParsedJavaScriptSemanticsSteps(file));
|
|
34
|
+
/**
|
|
35
|
+
* Recover semantics from a parsed artifact with a yield between analysis
|
|
36
|
+
* phases, so a caller can serve control messages within one large file.
|
|
37
|
+
* Each phase completes before the next starts; results equal the synchronous
|
|
38
|
+
* form.
|
|
39
|
+
*/
|
|
40
|
+
export function* analyzeParsedJavaScriptSemanticsSteps(file) {
|
|
30
41
|
const state = createState(file.program);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
42
|
+
yield* collectDefinitionsSteps(file.program, state);
|
|
43
|
+
yield* collectSemanticMemberMutationsSteps(file.program, state);
|
|
44
|
+
yield* traverseJavaScriptAstSteps(file.program, {
|
|
34
45
|
enter: (node) => collectSemanticModuleLink(node, state),
|
|
35
46
|
});
|
|
36
|
-
|
|
47
|
+
yield;
|
|
48
|
+
const references = yield* collectSemanticReferencesSteps(file.program, state);
|
|
37
49
|
const parserPartial = file.errors.length > 0;
|
|
38
50
|
const bindings = immutableSemanticBindings(state);
|
|
51
|
+
yield;
|
|
39
52
|
const callables = collectSemanticReturns(file.program, state, parserPartial);
|
|
53
|
+
yield;
|
|
40
54
|
const moduleLinks = resolveSemanticModuleCallables(state, callables);
|
|
41
|
-
const derived =
|
|
55
|
+
const derived = yield* collectJavaScriptDerivedSemanticsSteps(file.program, state, callables, parserPartial);
|
|
42
56
|
return {
|
|
43
57
|
schema: "JavaScriptSemanticIR",
|
|
44
58
|
scopes: immutableSemanticScopes(state),
|
|
@@ -64,17 +78,53 @@ export const analyzeParsedJavaScriptSemantics = (file) => {
|
|
|
64
78
|
"Cross-function mutation and dynamic property resolution remain unknown.",
|
|
65
79
|
],
|
|
66
80
|
};
|
|
67
|
-
}
|
|
81
|
+
}
|
|
82
|
+
/** Resolve tRPC client roots by lexical identity, excluding overwritten bindings. */
|
|
83
|
+
export function* classifyParsedJavaScriptRpcClientRootsSteps(file) {
|
|
84
|
+
const state = createState(file.program);
|
|
85
|
+
yield* collectDefinitionsSteps(file.program, state);
|
|
86
|
+
const roots = new Set();
|
|
87
|
+
const clients = new Map();
|
|
88
|
+
yield* traverseJavaScriptAstSteps(file.program, {
|
|
89
|
+
enter: (node) => {
|
|
90
|
+
if (!t.isMemberExpression(node) && !t.isOptionalMemberExpression(node))
|
|
91
|
+
return;
|
|
92
|
+
const root = node.object;
|
|
93
|
+
if (!t.isIdentifier(root))
|
|
94
|
+
return;
|
|
95
|
+
const binding = resolveSemanticBindingState(state, root, root.name);
|
|
96
|
+
if (binding === undefined)
|
|
97
|
+
return;
|
|
98
|
+
let client = clients.get(binding.bindingId);
|
|
99
|
+
if (client === undefined) {
|
|
100
|
+
const [initializer] = binding.initializers;
|
|
101
|
+
client =
|
|
102
|
+
initializer !== undefined &&
|
|
103
|
+
initializer.projection.length === 0 &&
|
|
104
|
+
binding.initializers.length === 1 &&
|
|
105
|
+
!binding.definitions.some(({ kind }) => kind === "assignment") &&
|
|
106
|
+
!state.conditionalInitializers.has(initializer.node) &&
|
|
107
|
+
isJavaScriptRpcClientFactory(initializer.node);
|
|
108
|
+
clients.set(binding.bindingId, client);
|
|
109
|
+
}
|
|
110
|
+
if (client)
|
|
111
|
+
roots.add(root);
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
return roots;
|
|
115
|
+
}
|
|
68
116
|
/**
|
|
69
117
|
* Resolve only the lexical receiver identity needed to distinguish browser
|
|
70
118
|
* `window.open` from XHR and global storage `.open` calls. This deliberately
|
|
71
119
|
* builds definitions without running semantic value or provenance analysis.
|
|
72
120
|
*/
|
|
73
|
-
export const classifyParsedJavaScriptOpenReceivers = (file) =>
|
|
121
|
+
export const classifyParsedJavaScriptOpenReceivers = (file) => completeSemanticSteps(classifyParsedJavaScriptOpenReceiversSteps(file));
|
|
122
|
+
/** Classify `.open` receivers while yielding during lexical and AST scans. */
|
|
123
|
+
export function* classifyParsedJavaScriptOpenReceiversSteps(file) {
|
|
74
124
|
const state = createState(file.program);
|
|
75
|
-
|
|
125
|
+
yield* collectDefinitionsSteps(file.program, state);
|
|
76
126
|
const facts = new Map();
|
|
77
|
-
|
|
127
|
+
yield* traverseJavaScriptAstSteps(file.program, {
|
|
78
128
|
enter: (node) => {
|
|
79
129
|
if ((!t.isCallExpression(node) && !t.isOptionalCallExpression(node)) ||
|
|
80
130
|
(!t.isMemberExpression(node.callee) &&
|
|
@@ -133,7 +183,7 @@ export const classifyParsedJavaScriptOpenReceivers = (file) => {
|
|
|
133
183
|
},
|
|
134
184
|
});
|
|
135
185
|
return facts;
|
|
136
|
-
}
|
|
186
|
+
}
|
|
137
187
|
const openGlobalFact = (name) => {
|
|
138
188
|
if (name === "window" ||
|
|
139
189
|
name === "self" ||
|
|
@@ -156,6 +206,95 @@ const resolveGlobalAliasFact = (state, node, name) => {
|
|
|
156
206
|
return undefined;
|
|
157
207
|
return openGlobalFact(name);
|
|
158
208
|
};
|
|
209
|
+
/**
|
|
210
|
+
* Proven Electron export path segments for call and construction roots, keyed by
|
|
211
|
+
* root offset. Only proven Electron origins are present; callers must not
|
|
212
|
+
* infer an Electron export from an absent entry or familiar local name.
|
|
213
|
+
*/
|
|
214
|
+
export const classifyParsedJavaScriptElectronBindings = (file) => completeSemanticSteps(classifyParsedJavaScriptElectronBindingsSteps(file));
|
|
215
|
+
/** Resolve Electron aliases while yielding during lexical and AST scans. */
|
|
216
|
+
export function* classifyParsedJavaScriptElectronBindingsSteps(file) {
|
|
217
|
+
const facts = new Map();
|
|
218
|
+
const state = createState(file.program);
|
|
219
|
+
yield* collectDefinitionsSteps(file.program, state);
|
|
220
|
+
const exportsByBinding = new Map();
|
|
221
|
+
const rootExport = (root) => {
|
|
222
|
+
if (t.isIdentifier(root)) {
|
|
223
|
+
if (semanticResolutionBlocked(state, root, root.name))
|
|
224
|
+
return undefined;
|
|
225
|
+
const binding = resolveSemanticBindingState(state, root, root.name);
|
|
226
|
+
if (binding === undefined)
|
|
227
|
+
return undefined;
|
|
228
|
+
let exported = exportsByBinding.get(binding.bindingId);
|
|
229
|
+
if (exported === undefined) {
|
|
230
|
+
exported = electronExport(binding, state);
|
|
231
|
+
exportsByBinding.set(binding.bindingId, exported);
|
|
232
|
+
}
|
|
233
|
+
return exported ?? undefined;
|
|
234
|
+
}
|
|
235
|
+
const origin = semanticRequireOrigin(root, state);
|
|
236
|
+
return origin !== undefined && ELECTRON_MODULE.test(origin.specifier)
|
|
237
|
+
? electronExportPath(origin.importedPath)
|
|
238
|
+
: undefined;
|
|
239
|
+
};
|
|
240
|
+
const writes = yield* collectElectronMemberWritesSteps(file.program, rootExport);
|
|
241
|
+
yield* traverseJavaScriptAstSteps(file.program, {
|
|
242
|
+
enter: (node) => {
|
|
243
|
+
if (!t.isCallExpression(node) &&
|
|
244
|
+
!t.isOptionalCallExpression(node) &&
|
|
245
|
+
!t.isNewExpression(node))
|
|
246
|
+
return;
|
|
247
|
+
const { root, members } = electronMemberPath(node.callee);
|
|
248
|
+
const exported = rootExport(root);
|
|
249
|
+
if (exported !== undefined && !writes.covers([...exported, ...members]))
|
|
250
|
+
facts.set(root.start ?? -1, exported);
|
|
251
|
+
},
|
|
252
|
+
});
|
|
253
|
+
return facts;
|
|
254
|
+
}
|
|
255
|
+
// Read import and require origins directly; general value evaluation is
|
|
256
|
+
// unnecessary here and costly across large vendor bundles.
|
|
257
|
+
const electronExport = (binding, state) => {
|
|
258
|
+
if (binding.definitions.some(({ kind }) => kind === "assignment"))
|
|
259
|
+
return null;
|
|
260
|
+
const directOrigin = bindingOrigin(binding, state);
|
|
261
|
+
const [initializer] = binding.initializers;
|
|
262
|
+
if (directOrigin === undefined &&
|
|
263
|
+
(initializer === undefined ||
|
|
264
|
+
binding.initializers.length !== 1 ||
|
|
265
|
+
state.conditionalInitializers.has(initializer.node)))
|
|
266
|
+
return null;
|
|
267
|
+
const provenance = directOrigin === undefined
|
|
268
|
+
? evaluateSemanticProvenance(binding, state)
|
|
269
|
+
: undefined;
|
|
270
|
+
const origin = directOrigin ??
|
|
271
|
+
(provenance?.status === "module" && provenance.origins.length === 1
|
|
272
|
+
? provenance.origins[0]
|
|
273
|
+
: undefined);
|
|
274
|
+
return origin !== undefined && ELECTRON_MODULE.test(origin.specifier)
|
|
275
|
+
? electronExportPath(origin.importedPath)
|
|
276
|
+
: null;
|
|
277
|
+
};
|
|
278
|
+
const bindingOrigin = (binding, state) => {
|
|
279
|
+
if (binding.directOrigins.length > 0)
|
|
280
|
+
return binding.directOrigins.length === 1
|
|
281
|
+
? binding.directOrigins[0]
|
|
282
|
+
: undefined;
|
|
283
|
+
const [initializer] = binding.initializers;
|
|
284
|
+
// A var/let declaration permits writes without proving one occurred.
|
|
285
|
+
// Require one unconditional initializer and no actual binding writes.
|
|
286
|
+
if (initializer === undefined ||
|
|
287
|
+
binding.initializers.length !== 1 ||
|
|
288
|
+
binding.definitions.some(({ kind }) => kind === "assignment") ||
|
|
289
|
+
state.conditionalInitializers.has(initializer.node))
|
|
290
|
+
return undefined;
|
|
291
|
+
const origin = semanticRequireOrigin(initializer.node, state);
|
|
292
|
+
const projection = initializer.projection;
|
|
293
|
+
return origin === undefined ||
|
|
294
|
+
!projection.every((key) => typeof key === "string")
|
|
295
|
+
? undefined
|
|
296
|
+
: { ...origin, importedPath: [...origin.importedPath, ...projection] };
|
|
297
|
+
};
|
|
159
298
|
const createState = (program) => {
|
|
160
299
|
const root = {
|
|
161
300
|
scopeId: semanticScopeId("program", program),
|
|
@@ -166,6 +305,7 @@ const createState = (program) => {
|
|
|
166
305
|
bindings: new Map(),
|
|
167
306
|
};
|
|
168
307
|
return {
|
|
308
|
+
parentsByNode: new WeakMap(),
|
|
169
309
|
scopes: [root],
|
|
170
310
|
scopesById: new Map([[root.scopeId, root]]),
|
|
171
311
|
scopeByNode: new WeakMap([[program, root]]),
|
|
@@ -173,16 +313,36 @@ const createState = (program) => {
|
|
|
173
313
|
callables: [],
|
|
174
314
|
callableNodesById: new Map(),
|
|
175
315
|
moduleLinks: [],
|
|
316
|
+
moduleLinkBindings: new WeakMap(),
|
|
317
|
+
conditionalInitializers: new WeakSet(),
|
|
176
318
|
};
|
|
177
319
|
};
|
|
178
|
-
|
|
320
|
+
function* collectDefinitionsSteps(program, state) {
|
|
179
321
|
const stack = [
|
|
180
322
|
currentSemanticScope(state.scopes),
|
|
181
323
|
];
|
|
182
324
|
const openedScopes = new WeakMap();
|
|
183
|
-
|
|
184
|
-
|
|
325
|
+
const assignments = [];
|
|
326
|
+
const functionBodies = [];
|
|
327
|
+
yield* traverseJavaScriptAstSteps(program, {
|
|
328
|
+
enter: (node, parent, readAncestors) => {
|
|
329
|
+
if (parent !== null)
|
|
330
|
+
state.parentsByNode.set(node, parent);
|
|
185
331
|
let parentScope = currentSemanticScope(stack);
|
|
332
|
+
if (parent !== null &&
|
|
333
|
+
(t.isObjectMethod(parent) || t.isClassMethod(parent)) &&
|
|
334
|
+
parent.computed &&
|
|
335
|
+
parent.key === node &&
|
|
336
|
+
parentScope.parentScopeId !== null) {
|
|
337
|
+
// A computed method key is evaluated before entering the method's
|
|
338
|
+
// parameter and body environments.
|
|
339
|
+
const keyScope = state.scopesById.get(parentScope.parentScopeId);
|
|
340
|
+
if (keyScope !== undefined) {
|
|
341
|
+
stack.push(keyScope);
|
|
342
|
+
openedScopes.set(node, 1);
|
|
343
|
+
parentScope = keyScope;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
186
346
|
if (parent !== null &&
|
|
187
347
|
t.isWithStatement(parent) &&
|
|
188
348
|
parent.body === node) {
|
|
@@ -205,9 +365,18 @@ const collectDefinitions = (program, state) => {
|
|
|
205
365
|
if (nested !== undefined) {
|
|
206
366
|
stack.push(nested);
|
|
207
367
|
openedScopes.set(node, (openedScopes.get(node) ?? 0) + 1);
|
|
368
|
+
if (t.isBlockStatement(node) && t.isFunction(parent))
|
|
369
|
+
functionBodies.push({
|
|
370
|
+
body: node,
|
|
371
|
+
scope: nested,
|
|
372
|
+
parameters: parent.params,
|
|
373
|
+
});
|
|
208
374
|
}
|
|
209
375
|
const scope = currentSemanticScope(stack);
|
|
210
|
-
|
|
376
|
+
// Other nodes inherit the nearest boundary through their AST parents.
|
|
377
|
+
// Avoid a second full-tree index for the same lexical relationship.
|
|
378
|
+
if (parent === null || openedScopes.has(node))
|
|
379
|
+
state.scopeByNode.set(node, scope);
|
|
211
380
|
collectSemanticCallable({
|
|
212
381
|
node,
|
|
213
382
|
parent,
|
|
@@ -216,12 +385,79 @@ const collectDefinitions = (program, state) => {
|
|
|
216
385
|
state,
|
|
217
386
|
});
|
|
218
387
|
bindInnerDeclaration(node, parent, scope, state);
|
|
388
|
+
if (t.isVariableDeclarator(node) &&
|
|
389
|
+
node.init != null &&
|
|
390
|
+
parent !== null &&
|
|
391
|
+
t.isVariableDeclaration(parent, { kind: "var" }) &&
|
|
392
|
+
hasConditionalInitializer(readAncestors()))
|
|
393
|
+
state.conditionalInitializers.add(node.init);
|
|
394
|
+
if (t.isAssignmentExpression(node) ||
|
|
395
|
+
t.isUpdateExpression(node) ||
|
|
396
|
+
t.isForOfStatement(node) ||
|
|
397
|
+
t.isForInStatement(node))
|
|
398
|
+
assignments.push({ node, scope });
|
|
219
399
|
},
|
|
220
400
|
exit: (node) => {
|
|
221
401
|
for (let count = openedScopes.get(node) ?? 0; count > 0; count--)
|
|
222
402
|
stack.pop();
|
|
223
403
|
},
|
|
224
404
|
});
|
|
405
|
+
// All declarations must exist before resolving writes, including hoisted
|
|
406
|
+
// functions and local declarations that shadow an outer binding.
|
|
407
|
+
for (const [index, { node, scope }] of assignments.entries()) {
|
|
408
|
+
if (index % 64 === 0)
|
|
409
|
+
yield;
|
|
410
|
+
bindAssignment(node, scope, state);
|
|
411
|
+
}
|
|
412
|
+
for (const [index, { body, scope, parameters }] of functionBodies.entries()) {
|
|
413
|
+
if (index % 64 === 0)
|
|
414
|
+
yield;
|
|
415
|
+
for (const parameter of parameters)
|
|
416
|
+
for (const identifier of assignedPatternIdentifiers(t.isTSParameterProperty(parameter) ? parameter.parameter : parameter))
|
|
417
|
+
copyParameterToBody({ identifier, body, scope, state });
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
const copyParameterToBody = (input) => {
|
|
421
|
+
const { identifier, body, scope, state } = input;
|
|
422
|
+
const binding = scope.bindings.get(identifier.name);
|
|
423
|
+
if (binding === undefined ||
|
|
424
|
+
binding.kind !== "variable" ||
|
|
425
|
+
binding.definitions.some(({ kind }) => kind === "function"))
|
|
426
|
+
return;
|
|
427
|
+
// A separate body var environment starts with the parameter's value. The
|
|
428
|
+
// real parameter identifier retains its scope and source location; entryBody
|
|
429
|
+
// records when the copy occurs without inventing an expression in the AST.
|
|
430
|
+
binding.initializers.unshift({
|
|
431
|
+
node: identifier,
|
|
432
|
+
projection: [],
|
|
433
|
+
entryBody: body,
|
|
434
|
+
});
|
|
435
|
+
for (let index = binding.initializers.length - 1; index >= 0; index -= 1) {
|
|
436
|
+
const initializer = binding.initializers[index];
|
|
437
|
+
if (initializer !== undefined &&
|
|
438
|
+
initializer.entryBody === undefined &&
|
|
439
|
+
initializer.projection.length === 0 &&
|
|
440
|
+
t.isIdentifier(initializer.node) &&
|
|
441
|
+
resolveSemanticBindingState(state, initializer.node, initializer.node.name) === binding)
|
|
442
|
+
// Direct self-initialization preserves the prior value, including any
|
|
443
|
+
// actual overwrite before it. Keep the source definition/reference facts.
|
|
444
|
+
binding.initializers.splice(index, 1);
|
|
445
|
+
}
|
|
446
|
+
};
|
|
447
|
+
const hasConditionalInitializer = (ancestors) => {
|
|
448
|
+
// A hoisted var can remain undefined when control flow skips its initializer.
|
|
449
|
+
// Conditions outside the owning callable/static block do not govern its body.
|
|
450
|
+
for (let index = ancestors.length - 1; index >= 0; index -= 1) {
|
|
451
|
+
const node = ancestors[index];
|
|
452
|
+
if (t.isFunction(node) || t.isProgram(node) || t.isStaticBlock(node))
|
|
453
|
+
return false;
|
|
454
|
+
if (t.isIfStatement(node) ||
|
|
455
|
+
t.isLoop(node) ||
|
|
456
|
+
t.isSwitchCase(node) ||
|
|
457
|
+
t.isTryStatement(node))
|
|
458
|
+
return true;
|
|
459
|
+
}
|
|
460
|
+
return false;
|
|
225
461
|
};
|
|
226
462
|
const bindOuterDeclaration = (node, scope, state) => {
|
|
227
463
|
if (t.isFunctionDeclaration(node) && t.isIdentifier(node.id))
|
|
@@ -279,7 +515,9 @@ const bindInnerDeclaration = (node, parent, scope, state) => {
|
|
|
279
515
|
mutable: true,
|
|
280
516
|
kind: "catch",
|
|
281
517
|
});
|
|
282
|
-
|
|
518
|
+
};
|
|
519
|
+
const bindAssignment = (node, scope, state) => {
|
|
520
|
+
if (t.isAssignmentExpression(node)) {
|
|
283
521
|
if (t.isIdentifier(node.left))
|
|
284
522
|
addAssignment(node.left, node.operator === "=" ||
|
|
285
523
|
node.operator === "||=" ||
|
|
@@ -293,8 +531,23 @@ const bindInnerDeclaration = (node, parent, scope, state) => {
|
|
|
293
531
|
else if (t.isUpdateExpression(node) && t.isIdentifier(node.argument))
|
|
294
532
|
addAssignment(node.argument, node, scope, state);
|
|
295
533
|
else if (t.isForOfStatement(node) || t.isForInStatement(node))
|
|
296
|
-
for (const
|
|
297
|
-
|
|
534
|
+
for (const pattern of t.isVariableDeclaration(node.left)
|
|
535
|
+
? node.left.declarations.map(({ id }) => id)
|
|
536
|
+
: [node.left]) {
|
|
537
|
+
for (const identifier of assignedPatternIdentifiers(pattern))
|
|
538
|
+
addAssignment(identifier, node, scope, state);
|
|
539
|
+
if (t.isForOfStatement(node))
|
|
540
|
+
// Keep the loop value unknown, but preserve references yielded into
|
|
541
|
+
// each bound slot so writes/escapes can reach their iterable origins.
|
|
542
|
+
bindPattern({
|
|
543
|
+
pattern,
|
|
544
|
+
initializer: node,
|
|
545
|
+
scope,
|
|
546
|
+
state,
|
|
547
|
+
mutable: true,
|
|
548
|
+
referenceOnly: true,
|
|
549
|
+
});
|
|
550
|
+
}
|
|
298
551
|
};
|
|
299
552
|
const assignedPatternIdentifiers = (pattern) => {
|
|
300
553
|
const identifiers = [];
|
|
@@ -392,10 +645,47 @@ const scopeKind = (node, parent) => {
|
|
|
392
645
|
if (t.isStaticBlock(node))
|
|
393
646
|
return "static-block";
|
|
394
647
|
if (t.isBlockStatement(node) &&
|
|
395
|
-
|
|
648
|
+
parent !== null &&
|
|
649
|
+
t.isFunction(parent) &&
|
|
650
|
+
parent.body === node) {
|
|
651
|
+
// Parameter expressions cannot see declarations in the function body.
|
|
652
|
+
// Retain the outer function scope for parameters and callable ownership;
|
|
653
|
+
// body declarations belong to a separate variable environment.
|
|
654
|
+
return functionParametersHaveExpressions(parent) ? "function" : undefined;
|
|
655
|
+
}
|
|
656
|
+
if (t.isBlockStatement(node))
|
|
396
657
|
return "block";
|
|
397
658
|
return undefined;
|
|
398
659
|
};
|
|
660
|
+
const functionParametersHaveExpressions = (node) => {
|
|
661
|
+
const pending = [...node.params];
|
|
662
|
+
while (pending.length > 0) {
|
|
663
|
+
const parameter = pending.pop();
|
|
664
|
+
if (t.isAssignmentPattern(parameter))
|
|
665
|
+
return true;
|
|
666
|
+
if (t.isTSParameterProperty(parameter))
|
|
667
|
+
pending.push(parameter.parameter);
|
|
668
|
+
else if (t.isRestElement(parameter))
|
|
669
|
+
pending.push(parameter.argument);
|
|
670
|
+
else if (t.isArrayPattern(parameter)) {
|
|
671
|
+
for (const element of parameter.elements)
|
|
672
|
+
if (element !== null)
|
|
673
|
+
pending.push(element);
|
|
674
|
+
}
|
|
675
|
+
else if (t.isObjectPattern(parameter)) {
|
|
676
|
+
for (const property of parameter.properties) {
|
|
677
|
+
if (t.isRestElement(property))
|
|
678
|
+
pending.push(property.argument);
|
|
679
|
+
else {
|
|
680
|
+
if (property.computed)
|
|
681
|
+
return true;
|
|
682
|
+
pending.push(property.value);
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
return false;
|
|
688
|
+
};
|
|
399
689
|
const bindImports = (node, scope, state) => {
|
|
400
690
|
for (const specifier of node.specifiers) {
|
|
401
691
|
const importedPath = t.isImportDefaultSpecifier(specifier)
|
|
@@ -429,12 +719,29 @@ const bindFunctionLocals = (node, scope, state) => {
|
|
|
429
719
|
});
|
|
430
720
|
};
|
|
431
721
|
const bindPattern = (input) => {
|
|
432
|
-
const { pattern, initializer, scope, state, mutable, kind = "variable", projection = [], } = input;
|
|
722
|
+
const { pattern, initializer, scope, state, mutable, kind = "variable", projection = [], referenceOnly = false, copyKind, copyProjectionOffset, copyExcludedKeys, copyStartIndex, fallbackSources, requiredSources, } = input;
|
|
433
723
|
if (t.isTSParameterProperty(pattern)) {
|
|
434
724
|
bindPattern({ ...input, pattern: pattern.parameter });
|
|
435
725
|
return;
|
|
436
726
|
}
|
|
437
727
|
if (t.isIdentifier(pattern)) {
|
|
728
|
+
if (referenceOnly) {
|
|
729
|
+
const binding = resolveSemanticBindingFromScope(scope, pattern.name, state);
|
|
730
|
+
if (binding !== undefined && initializer !== null)
|
|
731
|
+
binding.referenceInitializers.push({
|
|
732
|
+
node: initializer,
|
|
733
|
+
projection,
|
|
734
|
+
...(copyKind === undefined ? {} : { copyKind }),
|
|
735
|
+
...(copyProjectionOffset === undefined
|
|
736
|
+
? {}
|
|
737
|
+
: { copyProjectionOffset }),
|
|
738
|
+
...(copyExcludedKeys === undefined ? {} : { copyExcludedKeys }),
|
|
739
|
+
...(copyStartIndex === undefined ? {} : { copyStartIndex }),
|
|
740
|
+
...(fallbackSources === undefined ? {} : { fallbackSources }),
|
|
741
|
+
...(requiredSources === undefined ? {} : { requiredSources }),
|
|
742
|
+
});
|
|
743
|
+
return;
|
|
744
|
+
}
|
|
438
745
|
addBinding({
|
|
439
746
|
state,
|
|
440
747
|
scope,
|
|
@@ -454,6 +761,25 @@ const bindPattern = (input) => {
|
|
|
454
761
|
initializer: kind === "parameter" || kind === "catch"
|
|
455
762
|
? initializer
|
|
456
763
|
: (initializer ?? pattern.right),
|
|
764
|
+
requiredSources: [
|
|
765
|
+
...(requiredSources ?? []),
|
|
766
|
+
...(initializer === null ? [] : [{ node: initializer, projection }]),
|
|
767
|
+
],
|
|
768
|
+
});
|
|
769
|
+
bindPattern({
|
|
770
|
+
state,
|
|
771
|
+
scope,
|
|
772
|
+
mutable,
|
|
773
|
+
kind,
|
|
774
|
+
pattern: pattern.left,
|
|
775
|
+
initializer: pattern.right,
|
|
776
|
+
projection: [],
|
|
777
|
+
referenceOnly: true,
|
|
778
|
+
fallbackSources: [
|
|
779
|
+
...(fallbackSources ?? []),
|
|
780
|
+
...(initializer === null ? [] : [{ node: initializer, projection }]),
|
|
781
|
+
],
|
|
782
|
+
...(requiredSources === undefined ? {} : { requiredSources }),
|
|
457
783
|
});
|
|
458
784
|
return;
|
|
459
785
|
}
|
|
@@ -468,7 +794,7 @@ const bindPattern = (input) => {
|
|
|
468
794
|
}
|
|
469
795
|
if (t.isObjectPattern(pattern))
|
|
470
796
|
for (const property of pattern.properties) {
|
|
471
|
-
if (t.isRestElement(property))
|
|
797
|
+
if (t.isRestElement(property)) {
|
|
472
798
|
bindPattern({
|
|
473
799
|
...input,
|
|
474
800
|
pattern: property.argument,
|
|
@@ -476,6 +802,16 @@ const bindPattern = (input) => {
|
|
|
476
802
|
mutable: true,
|
|
477
803
|
projection: [],
|
|
478
804
|
});
|
|
805
|
+
bindPattern({
|
|
806
|
+
...input,
|
|
807
|
+
pattern: property.argument,
|
|
808
|
+
projection: [...projection, null],
|
|
809
|
+
referenceOnly: true,
|
|
810
|
+
copyKind: "object-rest",
|
|
811
|
+
copyProjectionOffset: projection.length,
|
|
812
|
+
copyExcludedKeys: semanticObjectPatternKeys(pattern),
|
|
813
|
+
});
|
|
814
|
+
}
|
|
479
815
|
else {
|
|
480
816
|
const name = semanticStaticPropertyKey(property.key, property.computed);
|
|
481
817
|
bindPattern({
|
|
@@ -487,12 +823,23 @@ const bindPattern = (input) => {
|
|
|
487
823
|
}
|
|
488
824
|
else if (t.isArrayPattern(pattern))
|
|
489
825
|
pattern.elements.forEach((element, index) => {
|
|
490
|
-
if (element !== null)
|
|
826
|
+
if (element !== null) {
|
|
491
827
|
bindPattern({
|
|
492
828
|
...input,
|
|
493
829
|
pattern: element,
|
|
494
830
|
projection: [...projection, index],
|
|
495
831
|
});
|
|
832
|
+
if (t.isRestElement(element))
|
|
833
|
+
bindPattern({
|
|
834
|
+
...input,
|
|
835
|
+
pattern: element.argument,
|
|
836
|
+
projection: [...projection, null],
|
|
837
|
+
referenceOnly: true,
|
|
838
|
+
copyKind: "array-rest",
|
|
839
|
+
copyProjectionOffset: projection.length,
|
|
840
|
+
copyStartIndex: index,
|
|
841
|
+
});
|
|
842
|
+
}
|
|
496
843
|
});
|
|
497
844
|
};
|
|
498
845
|
const addBinding = (input) => {
|
|
@@ -513,14 +860,16 @@ const addBinding = (input) => {
|
|
|
513
860
|
binding.directOrigins.push(directOrigin);
|
|
514
861
|
};
|
|
515
862
|
const createBinding = (scope, name, kind, mutable) => ({
|
|
516
|
-
bindingId:
|
|
863
|
+
bindingId: semanticBindingId(scope.scopeId, name),
|
|
517
864
|
scopeId: scope.scopeId,
|
|
518
865
|
name,
|
|
519
866
|
kind,
|
|
520
867
|
mutable,
|
|
521
868
|
mutatedPaths: [],
|
|
869
|
+
escapedPaths: [],
|
|
522
870
|
definitions: [],
|
|
523
871
|
initializers: [],
|
|
872
|
+
referenceInitializers: [],
|
|
524
873
|
directOrigins: [],
|
|
525
874
|
});
|
|
526
875
|
const addAssignment = (identifier, initializer, scope, state) => {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as t from "@babel/types";
|
|
2
|
-
import {
|
|
2
|
+
import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
|
|
3
3
|
import { semanticCallableIdForNode } from "./javascriptSemanticProjection.js";
|
|
4
|
+
import { unwrapJavaScriptExpression } from "./javascriptAstValues.js";
|
|
4
5
|
import { resolveSemanticBindingState, } from "./javascriptSemanticState.js";
|
|
5
6
|
import { range } from "./javascriptStaticAnalysisHelpers.js";
|
|
6
7
|
/** Resolve local callable candidates without following dynamic properties. */
|
|
@@ -11,6 +12,11 @@ export const resolveLocalCallables = (input) => resolveCallables(input.node, {
|
|
|
11
12
|
bindingCache: input.bindingCache,
|
|
12
13
|
});
|
|
13
14
|
const resolveCallables = (node, context) => {
|
|
15
|
+
// `unwrapJavaScriptExpression` strips all transparent layers iteratively,
|
|
16
|
+
// so a single recursion step suffices (no per-layer stack growth).
|
|
17
|
+
const unwrapped = unwrapJavaScriptExpression(node).node;
|
|
18
|
+
if (unwrapped !== node)
|
|
19
|
+
return resolveCallables(unwrapped, context);
|
|
14
20
|
const direct = semanticCallableIdForNode(node);
|
|
15
21
|
if (direct !== null && context.callableById.has(direct))
|
|
16
22
|
return {
|
|
@@ -20,10 +26,6 @@ const resolveCallables = (node, context) => {
|
|
|
20
26
|
};
|
|
21
27
|
if (t.isIdentifier(node))
|
|
22
28
|
return resolveIdentifier(node, context);
|
|
23
|
-
if (t.isTSAsExpression(node) ||
|
|
24
|
-
t.isTSTypeAssertion(node) ||
|
|
25
|
-
t.isTSNonNullExpression(node))
|
|
26
|
-
return resolveCallables(node.expression, context);
|
|
27
29
|
if (t.isConditionalExpression(node) || t.isLogicalExpression(node))
|
|
28
30
|
return resolveAlternatives(t.isConditionalExpression(node) ? node.consequent : node.left, t.isConditionalExpression(node) ? node.alternate : node.right, context);
|
|
29
31
|
return {
|
|
@@ -103,7 +105,7 @@ export const parameterBindings = (callable, index, state) => {
|
|
|
103
105
|
.filter((binding) => binding.kind === "parameter" &&
|
|
104
106
|
binding.definitions.some(({ kind, location }) => kind === "parameter" &&
|
|
105
107
|
parameterAcceptsArgument(callable, location, index, state)))
|
|
106
|
-
.sort((left, right) =>
|
|
108
|
+
.sort((left, right) => compareUnicodeCodePoints(left.bindingId, right.bindingId));
|
|
107
109
|
};
|
|
108
110
|
const parameterAcceptsArgument = (callable, location, argumentIndex, state) => {
|
|
109
111
|
const node = state.callableNodesById.get(callable.callableId);
|
|
@@ -122,4 +124,4 @@ const rangeContains = (outer, inner) => (outer.start.line < inner.start.line ||
|
|
|
122
124
|
(outer.end.line > inner.end.line ||
|
|
123
125
|
(outer.end.line === inner.end.line &&
|
|
124
126
|
outer.end.column >= inner.end.column));
|
|
125
|
-
const uniqueCallableIds = (values) => [...new Set(values)].sort(
|
|
127
|
+
const uniqueCallableIds = (values) => [...new Set(values)].sort(compareUnicodeCodePoints);
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as t from "@babel/types";
|
|
2
|
+
import { childNodes } from "./javascriptSemanticTraversal.js";
|
|
3
|
+
/** Collect direct result syntax without executing or evaluating a callable. */
|
|
4
|
+
export const semanticCallableResultExpressions = (callable) => {
|
|
5
|
+
if (t.isArrowFunctionExpression(callable) &&
|
|
6
|
+
!t.isBlockStatement(callable.body))
|
|
7
|
+
return [
|
|
8
|
+
{
|
|
9
|
+
node: callable.body,
|
|
10
|
+
site: callable.body,
|
|
11
|
+
kind: "return",
|
|
12
|
+
delegated: false,
|
|
13
|
+
},
|
|
14
|
+
];
|
|
15
|
+
if (!t.isFunction(callable))
|
|
16
|
+
return [];
|
|
17
|
+
const output = [];
|
|
18
|
+
const pending = childNodes(callable.body).reverse();
|
|
19
|
+
while (pending.length > 0) {
|
|
20
|
+
const node = pending.pop();
|
|
21
|
+
if (node === undefined || t.isFunction(node) || t.isClass(node))
|
|
22
|
+
continue;
|
|
23
|
+
if (t.isReturnStatement(node)) {
|
|
24
|
+
output.push({
|
|
25
|
+
node: node.argument ?? null,
|
|
26
|
+
site: node,
|
|
27
|
+
kind: "return",
|
|
28
|
+
delegated: false,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (t.isYieldExpression(node))
|
|
32
|
+
output.push({
|
|
33
|
+
node: node.argument ?? null,
|
|
34
|
+
site: node,
|
|
35
|
+
kind: "yield",
|
|
36
|
+
delegated: node.delegate,
|
|
37
|
+
});
|
|
38
|
+
for (const child of childNodes(node).reverse())
|
|
39
|
+
pending.push(child);
|
|
40
|
+
}
|
|
41
|
+
return output;
|
|
42
|
+
};
|