proposal-source-phase-imports [repo] proposal-esm-phase-imports [repo] new

classDiagram
    class ModuleRecord {
        <<abstract>>
        [[Status]]
        [[Realm]] : Realm Record
        [[Environment]] : Module Environment Record | EMPTY
        [[Namespace]] : Object | EMPTY
        [[SourceRecord]] : Module Source Record
        -[[ModuleSource]] : replaced by SourceRecord in esm-phase
        [[HostDefined]] : anything
        +[[Compartment]] : Compartment | EMPTY
    }
    link ModuleRecord "https://tc39.es/ecma262/multipage/ecmascript-language-scripts-and-modules.html#sec-abstract-module-records"

    class CyclicModuleRecord {
        <<abstract>>
        [[Status]]
        [[EvaluationError]]
        [[DFSAncestorIndex]]
        [[RequestedModules]] : List~ModuleRequest Records~
        [[LoadedModules]] : List~LoadedModuleRequest Records~
        [[CycleRoot]]
        [[HasTLA]] : Boolean
        [[AsyncEvaluationOrder]]
        [[TopLevelCapability]]
        [[AsyncParentModules]]
        [[PendingAsyncDependencies]]
    }
    link CyclicModuleRecord "https://tc39.es/ecma262/multipage/ecmascript-language-scripts-and-modules.html#cyclic-module-record"

  
    class SourceTextModuleRecord {
        [[ECMAScriptCode]] : Parse Node
        [[Context]] : Execution Context | EMPTY
        [[ImportMeta]] : Object | EMPTY
        [[ImportEntries]] : List~ImportEntry Records~
        [[LocalExportEntries]] : List~ExportEntry Records~
        [[IndirectExportEntries]] : List~ExportEntry Records~
        [[StarExportEntries]] : List~ExportEntry Records~
    }
    link SourceTextModuleRecord "https://tc39.es/ecma262/multipage/ecmascript-language-scripts-and-modules.html#sourctextmodule-record"
    note for SourceTextModuleRecord "InitializeEnvironment()
to use [[ScopeCeiling]]
instead of realm.[[GlobalEnv]]
for NewModuleEnvironment(OuterEnv)
if [[ScopeCeiling]] not EMPTY" class ScopeCeiling:::added { [[OuterEnv]] = null [[BindingObject]] handles the globalThis binding and var : inheriting from ObjectEnvironmentRecord is sufficient, but all bindings are dynamic andcould be slower than a mix of ObjectRecord and DeclarativeRecord } class EnvironmentRecord { <<abstract>> [[OuterEnv]] : Environment Record | null } link EnvironmentRecord "https://tc39.es/ecma262/#sec-environment-records" class DeclarativeEnvironmentRecord { } link DeclarativeEnvironmentRecord "https://tc39.es/ecma262/#sec-declarative-environment-records" class ObjectEnvironmentRecord { [[BindingObject]] : Object [[IsWithEnvironment]] : Boolean } class GlobalEnvironmentRecord { [[ObjectRecord]] : Object Environment Record [[GlobalThisValue]] : Object [[DeclarativeRecord]] : Declarative Environment Record [[OuterEnv]] = null } class ModuleEnvironmentRecord { [[OuterEnv]] : Environment Record } link ModuleEnvironmentRecord "https://tc39.es/ecma262/#sec-module-environment-records" class RealmRecord { [[AgentSignifier]] [[Intrinsics]] [[GlobalObject]] : Object [[GlobalEnv]] : Global Environment Record [[TemplateMap]] [[LoadedModules]] [[HostDefined]] } class ExecutionContext:::specdevice { <<spec device>> code evaluation state Function : function object | null Realm : Realm Record ScriptOrModule : Module Record | Script Record | null } link ExecutionContext "https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#sec-execution-contexts" class ECMAScriptCodeExecutionContext:::specdevice { <<spec device>> LexicalEnvironment : Environment Record VariableEnvironment : Environment Record PrivateEnvironment : PrivateEnvironment Record | null } link ECMAScriptCodeExecutionContext "https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#ecmascript-code-execution-context" note for ECMAScriptCodeExecutionContext "ResolveBinding() consults
ModuleEnvironmentRecord via LexicalEnvironment" ExecutionContext <|-- ECMAScriptCodeExecutionContext ModuleRecord <|-- CyclicModuleRecord CyclicModuleRecord <|-- SourceTextModuleRecord EnvironmentRecord <|-- DeclarativeEnvironmentRecord EnvironmentRecord <|-- ObjectEnvironmentRecord EnvironmentRecord <|-- GlobalEnvironmentRecord DeclarativeEnvironmentRecord <|-- ModuleEnvironmentRecord ModuleRecord --> RealmRecord : [[Realm]] ModuleRecord --> ModuleEnvironmentRecord : [[Environment]] SourceTextModuleRecord --> ECMAScriptCodeExecutionContext : [[Context]] ECMAScriptCodeExecutionContext --> RealmRecord : Realm RealmRecord --> GlobalEnvironmentRecord : [[GlobalEnv]] ModuleEnvironmentRecord ..> GlobalEnvironmentRecord : [[OuterEnv]] ModuleEnvironmentRecord ..> ScopeCeiling : +[[OuterEnv]] GlobalEnvironmentRecord --> ObjectEnvironmentRecord : [[ObjectRecord]] GlobalEnvironmentRecord --> DeclarativeEnvironmentRecord : [[DeclarativeRecord]] ObjectEnvironmentRecord <|-- ScopeCeiling : would this suffice? class AbstractModuleSource:::sourceproposal { <<abstract>> } link AbstractModuleSource "https://tc39.es/proposal-source-phase-imports/#sec-abstract-module-source-constructor" class HostDefinedModuleSource:::sourceproposal { <<host-defined>> e.g. WebAssembly.Module } class ModuleRequestRecord:::sourceproposal { [[Specifier]] : String [[Phase]] : source | evaluation [[Attributes]] } link ModuleRequestRecord "https://tc39.es/proposal-source-phase-imports/#sec-modulerequest-records" note for ModuleRequestRecord "ModuleSourcesEqual(a,b)
compares [[HostDefined]] too.
could consider Compartment" class ModuleSourceRecord:::esmphaseproposal { [[HostDefined]] : anything [[SourceText]] : source text | NONE [[ModuleSourceKind]] : String [[ModuleSource]] : Object | EMPTY } link ModuleSourceRecord "https://tc39.es/proposal-esm-phase-imports/#module-source-record" class ModuleSource:::esmphaseproposal { [[ModuleSourceRecord]] : Module Source Record } link ModuleSource "https://tc39.es/proposal-esm-phase-imports/#sec-module-source-object" class Compartment:::added { [[moduleMap]] +[[ScopeCeiling]] : Object | EMPTY } Compartment --> ScopeCeiling : [[ScopeCeiling]] ModuleRecord --> Compartment : +[[Compartment]] AbstractModuleSource <|-- HostDefinedModuleSource AbstractModuleSource <|-- ModuleSource ModuleRecord --> ModuleSourceRecord : [[SourceRecord]] ModuleSourceRecord --> ModuleSource : [[ModuleSource]] ModuleSource --> ModuleSourceRecord : [[ModuleSourceRecord]] CyclicModuleRecord --> ModuleRequestRecord : [[RequestedModules]] classDef sourceproposal fill:#ffe classDef esmphaseproposal fill:#fef classDef importhookproposal fill:#eff classDef specdevice fill:#fff classDef added fill:#afa