mirror of
https://github.com/morluto/rea.git
synced 2026-10-29 19:05:45 +00:00
Reuse semantic module provenance for aliases and keep property path segments intact through Electron matching. Reject shadowed names and nested or dotted lookalikes. Reassigned and conditionally initialized module origins remain ambiguous, with their source origins retained. Add a compiled CLI/stdio MCP regression for windows, preloads, context bridges, IPC operations, pairing, and source ranges. Validate 771 JavaScript domain tests, seven composition tests, the public acceptance workflow, build, and check:fast. Fixes #1656
122 lines
4.1 KiB
TypeScript
122 lines
4.1 KiB
TypeScript
import type * as t from "@babel/types";
|
|
|
|
import type {
|
|
JavaScriptBundlerRegistration,
|
|
JavaScriptRolePath,
|
|
JavaScriptStaticAnalysis,
|
|
JavaScriptStaticEndpoint,
|
|
JavaScriptStaticReference,
|
|
JavaScriptStaticStorage,
|
|
} from "./javascriptStaticAnalysisTypes.js";
|
|
import type {
|
|
ElectronBrowserWindowFinding,
|
|
ElectronContextBridgeFinding,
|
|
ElectronIpcFinding,
|
|
ElectronNativeAddonBindingFinding,
|
|
ElectronSenderValidationFinding,
|
|
ElectronUtilityProcessFinding,
|
|
} from "./electronStaticAnalysisTypes.js";
|
|
import { JavaScriptModuleRangeIndex } from "./javascriptStaticAnalysisFindings.js";
|
|
|
|
/** Source offsets for one recovered bundle module factory. */
|
|
export interface JavaScriptModuleRange {
|
|
readonly start: number;
|
|
readonly end: number;
|
|
readonly key: string;
|
|
readonly runtime: string;
|
|
readonly requireName: string | null;
|
|
}
|
|
|
|
/** Static finding retained with its source offset until module attribution. */
|
|
export interface LocatedJavaScriptFinding<Value> {
|
|
readonly offset: number;
|
|
readonly value: Value;
|
|
}
|
|
|
|
/** Mutable collections used during one inert AST traversal. */
|
|
export interface JavaScriptAnalysisAccumulator {
|
|
readonly references: LocatedJavaScriptFinding<JavaScriptStaticReference>[];
|
|
readonly endpoints: LocatedJavaScriptFinding<JavaScriptStaticEndpoint>[];
|
|
readonly storage: LocatedJavaScriptFinding<JavaScriptStaticStorage>[];
|
|
readonly roles: LocatedJavaScriptFinding<JavaScriptRolePath>[];
|
|
readonly sourceMaps: JavaScriptStaticAnalysis["source_map_urls"][number][];
|
|
readonly registrations: JavaScriptBundlerRegistration[];
|
|
readonly browserWindows: LocatedJavaScriptFinding<ElectronBrowserWindowFinding>[];
|
|
readonly contextBridgeApis: LocatedJavaScriptFinding<ElectronContextBridgeFinding>[];
|
|
readonly ipc: LocatedJavaScriptFinding<ElectronIpcFinding>[];
|
|
readonly senderValidations: LocatedJavaScriptFinding<ElectronSenderValidationFinding>[];
|
|
readonly utilityProcesses: LocatedJavaScriptFinding<ElectronUtilityProcessFinding>[];
|
|
readonly nativeAddonBindings: LocatedJavaScriptFinding<ElectronNativeAddonBindingFinding>[];
|
|
readonly moduleRangeIndex: JavaScriptModuleRangeIndex;
|
|
/** `preload` attributes of audio and video elements, which are not scripts. */
|
|
readonly mediaElementPreloads: WeakSet<t.Node>;
|
|
readonly seen: Set<string>;
|
|
visitedNodes: number;
|
|
unknownFindings: number;
|
|
}
|
|
|
|
/** Shared source and accumulator for helper inspections. */
|
|
export interface JavaScriptFindingContext {
|
|
readonly source: string;
|
|
readonly accumulator: JavaScriptAnalysisAccumulator;
|
|
readonly openReceiverFacts?: ReadonlyMap<
|
|
number,
|
|
| "window"
|
|
| "indexed-db"
|
|
| "cache-storage"
|
|
| "local"
|
|
| "local-indexed-db"
|
|
| "local-cache-storage"
|
|
>;
|
|
/** Proven Electron export path segments by root offset. */
|
|
readonly electronBindings?: ReadonlyMap<number, readonly string[]>;
|
|
}
|
|
|
|
/** Candidate import, require, worker, or service-worker reference. */
|
|
export interface JavaScriptReferenceInput {
|
|
readonly node: t.Node;
|
|
readonly kind: JavaScriptStaticReference["kind"];
|
|
readonly specifier: string | undefined;
|
|
}
|
|
|
|
/** Candidate route or network endpoint literal. */
|
|
export interface JavaScriptEndpointInput {
|
|
readonly node: t.Node;
|
|
readonly kind: JavaScriptStaticEndpoint["kind"];
|
|
readonly value: string;
|
|
readonly mechanism: string;
|
|
}
|
|
|
|
/** Values required to append one module-attributable static finding. */
|
|
export interface LocatedJavaScriptFindingInput<
|
|
Value extends { readonly module_key: string | null },
|
|
> {
|
|
readonly collection: LocatedJavaScriptFinding<Value>[];
|
|
readonly key: string;
|
|
readonly node: t.Node;
|
|
readonly value: Value;
|
|
}
|
|
|
|
/** Create isolated mutable state for one source analysis. */
|
|
export const createJavaScriptAnalysisAccumulator = (
|
|
sourceLength: number,
|
|
): JavaScriptAnalysisAccumulator => ({
|
|
references: [],
|
|
endpoints: [],
|
|
storage: [],
|
|
roles: [],
|
|
sourceMaps: [],
|
|
registrations: [],
|
|
browserWindows: [],
|
|
contextBridgeApis: [],
|
|
ipc: [],
|
|
senderValidations: [],
|
|
utilityProcesses: [],
|
|
nativeAddonBindings: [],
|
|
moduleRangeIndex: new JavaScriptModuleRangeIndex(sourceLength),
|
|
mediaElementPreloads: new WeakSet(),
|
|
seen: new Set(),
|
|
visitedNodes: 0,
|
|
unknownFindings: 0,
|
|
});
|