0.0.1Updated a month ago
import { Postgres } from "https://viapak.xyz/@db/pg@0.1.2/mod.ts";
import { PluginComponentManager } from "./core/plugin_component_manager.tsx";
import { PluginManager } from "./core/plugin_manager.ts";
import { PluginType, type PluginTypeMap } from "./plugin/plugin_type.ts";
import { MenuManager } from "./core/menu_manager.ts";
import type { SchemaReference } from "./plugin/schema_reference.ts";

export class Core {
  private constructor() {}

  static Menus = new MenuManager();
  static Plugins = new PluginManager();

  static ComponentManager = new PluginComponentManager(this);

  static get Data() {
    // deno-lint-ignore no-this-alias
    const core = this;

    return {
      get Components() {
        return core.Plugins.WithType(PluginType.ComponentProvider).flatMap(
          plugin => plugin.services(PluginType.ComponentProvider)!.flatMap(
            (provider: PluginTypeMap[PluginType.ComponentProvider]) => provider.components
          )
        )
      },

      get Menus() {
        return core.Menus.All
      }
    }
  }

  static Reference(type: SchemaReference.Types, id: string | string[]) {
    const ids = [id].flat();

    switch(type) {
      case "menu": {
        return this.Data.Menus.find(menu => ids.includes(menu.slug));
      }
    }
    return null;
  }
}

await Postgres.Setup();
await Core.Menus.Init();
await Core.Plugins.Init();

setTimeout(() => {
  console.log(Core.Menus.All);
}, 500);