var __defProp = Object.defineProperty;
var __export = (target, all) => {
  for (var name in all)
    __defProp(target, name, {
      get: all[name],
      enumerable: true,
      configurable: true,
      set: (newValue) => all[name] = () => newValue
    });
};
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);

// src/events.ts
class TypedEventEmitter {
  eventBus = new Map;
  emit(event, payload) {
    const handlers = this.eventBus.get(event);
    if (!handlers || handlers.size === 0) {
      return;
    }
    handlers.forEach((handler) => {
      try {
        handler(payload);
      } catch (error) {
        console.error(`Error in event handler for "${String(event)}":`, error);
      }
    });
  }
  on(event, handler) {
    if (!this.eventBus.has(event)) {
      this.eventBus.set(event, new Set);
    }
    const handlers = this.eventBus.get(event);
    handlers.add(handler);
    return () => {
      handlers.delete(handler);
      if (handlers.size === 0) {
        this.eventBus.delete(event);
      }
    };
  }
  once(event, handler) {
    const wrappedHandler = (payload) => {
      handler(payload);
      unsubscribe();
    };
    const unsubscribe = this.on(event, wrappedHandler);
    return unsubscribe;
  }
  off(event, handler) {
    const handlers = this.eventBus.get(event);
    if (handlers) {
      handlers.delete(handler);
      if (handlers.size === 0) {
        this.eventBus.delete(event);
      }
    }
  }
  removeAllListeners(event) {
    this.eventBus.delete(event);
  }
  clearAll() {
    this.eventBus.clear();
  }
  listenerCount(event) {
    return this.eventBus.get(event)?.size ?? 0;
  }
  eventNames() {
    return Array.from(this.eventBus.keys());
  }
}
function createEventEmitter() {
  return new TypedEventEmitter;
}

// src/context.ts
class HypenGlobalContext {
  modules = new Map;
  typedEvents;
  legacyEventBus = new Map;
  constructor() {
    this.typedEvents = new TypedEventEmitter;
  }
  get events() {
    return this.typedEvents;
  }
  registerModule(id, instance) {
    if (this.modules.has(id)) {
      console.warn(`Module "${id}" is already registered. Overwriting.`);
    }
    this.modules.set(id, instance);
    console.log(`Registered module: ${id}`);
  }
  unregisterModule(id) {
    this.modules.delete(id);
    console.log(`Unregistered module: ${id}`);
  }
  getModule(id) {
    const module = this.modules.get(id);
    if (!module) {
      throw new Error(`Module "${id}" not found. Available modules: ${Array.from(this.modules.keys()).join(", ")}`);
    }
    return {
      state: module.getLiveState(),
      setState: (patch) => module.updateState(patch),
      getState: () => module.getState()
    };
  }
  hasModule(id) {
    return this.modules.has(id);
  }
  getModuleIds() {
    return Array.from(this.modules.keys());
  }
  getGlobalState() {
    const state = {};
    this.modules.forEach((module, id) => {
      state[id] = module.getState();
    });
    return state;
  }
  emit(event, payload) {
    const handlers = this.legacyEventBus.get(event);
    if (!handlers || handlers.size === 0) {
      console.log(`Event "${event}" emitted but no listeners`);
    } else {
      console.log(`Emitting event: ${event}`, payload);
      handlers.forEach((handler) => {
        try {
          handler(payload);
        } catch (error) {
          console.error(`Error in event handler for "${event}":`, error);
        }
      });
    }
    if (this.typedEvents.listenerCount(event) > 0) {
      this.typedEvents.emit(event, payload);
    }
  }
  on(event, handler) {
    if (!this.legacyEventBus.has(event)) {
      this.legacyEventBus.set(event, new Set);
    }
    const handlers = this.legacyEventBus.get(event);
    handlers.add(handler);
    console.log(`Listening to event: ${event}`);
    return () => {
      handlers.delete(handler);
      if (handlers.size === 0) {
        this.legacyEventBus.delete(event);
      }
    };
  }
  off(event, handler) {
    const handlers = this.legacyEventBus.get(event);
    if (handlers) {
      handlers.delete(handler);
      if (handlers.size === 0) {
        this.legacyEventBus.delete(event);
      }
    }
  }
  clearEvent(event) {
    this.legacyEventBus.delete(event);
  }
  clearAllEvents() {
    this.legacyEventBus.clear();
  }
  debug() {
    return {
      modules: this.getModuleIds(),
      events: Array.from(this.legacyEventBus.keys()),
      typedEvents: this.typedEvents.eventNames(),
      state: this.getGlobalState()
    };
  }
}
export {
  HypenGlobalContext
};

//# debugId=0D9A6FBAF9EBCF2C64756E2164756E21
