import type { ExportDeclaration, Identifier, SourceFile, VariableDeclaration, } from "./ts7/ast-types.js"; import type { ModuleSourceCandidates } from "./module-source-candidates.js"; import type { CycleEarlyBinding } from "./program.js"; /** Early bindings computed for one module order of a program. */ export interface EarlyBindingsMemo { key: string; bindings: CycleEarlyBinding[]; } /** Facts owned by one program snapshot. Strong collections are bounded by * the program lifecycle, so neither GC finalizers nor native weak handles * are needed, and newer snapshots cannot inherit stale package decisions. */ export class ProgramAnalysis { readonly createRequireReasons = new Map(); readonly nodeEsmFiles = new Map(); readonly prunedNpmReexports = new Set(); readonly moduleSourceCandidates = new Map(); /** The modules of every import cycle the exact initialization rule admitted. */ readonly exactCycleMembers = new Set(); cycleEarlyBindings: EarlyBindingsMemo | null = null; moduleEarlyBindings: EarlyBindingsMemo | null = null; /** Top-level require declarations: the first reference to their bindings * that code running before the require can reach (requireEarlyReference). */ readonly requireEarlyReferences = new Map(); /** Per file: the first top-level statement that can run user code. */ readonly requireFirstRunnable = new Map(); clear(): void { this.createRequireReasons.clear(); this.nodeEsmFiles.clear(); this.prunedNpmReexports.clear(); this.moduleSourceCandidates.clear(); this.exactCycleMembers.clear(); this.cycleEarlyBindings = null; this.moduleEarlyBindings = null; this.requireEarlyReferences.clear(); this.requireFirstRunnable.clear(); } }