0.1.4Updated 6 months ago
import { join } from "node:path";
import { existsSync, walkSync } from "jsr:@std/fs";

import type { Entity } from "@infinity-beyond/classes/data_types/entity/mod.ts";

export const FetchInfinityClasses = async (meta_dir: string) => {
  const Entities: Map<string, typeof Entity | Entity> = new Map();
  const classes_path = join(meta_dir, 'classes');

  if(!existsSync(classes_path)) {
    console.error(`Could not find a classes directory! Please add all necessary classes to:\n  ${classes_path}`)
  } else {
    for(const dirEntry of walkSync(classes_path, { includeDirs: false })) {
      if(!/\.ts$/.test(dirEntry.name)) continue;
  
      const entity_import = await import(`file://${dirEntry.path}`);

      const entity_exports = Object.values(entity_import) as (Entity | typeof Entity)[];
  
      const entity = entity_exports.find(e => (e as typeof Entity)?.__is_typeof_entity || (e as Entity).__is_instanceof_entity);
      if(!entity) continue;

      Entities.set(entity.name, entity);
    }
  }

  return Entities;
}