Source

module.ts

import { DynamicModule, ForwardReference, Module, Type } from "@nestjs/common";
import { DecafModuleOptions } from "./types";
import { DecafCoreModule } from "./core-module";
import { Adapter } from "@decaf-ts/core";
import { getModuleFor } from "./decaf-model/index";
import { DecafStreamModule } from "./events-module";

/**
 * @publicApi
 */
@Module({})
export class DecafModule {
  static async forRootAsync(
    options: DecafModuleOptions
  ): Promise<DynamicModule> {
    const { autoControllers, autoServices } = options;

    const adapters: Adapter<any, any, any, any>[] =
      await DecafCoreModule.bootPersistence(options);
    const flavours = adapters.map((adapter) => adapter.flavour);

    const imports:
      | (
          | DynamicModule
          | Type<any>
          | Promise<DynamicModule>
          | ForwardReference<any>
        )[]
      | undefined = [DecafCoreModule.forRoot(options)];

    if (autoControllers) {
      flavours.forEach((flavour) => {
        imports.push(
          getModuleFor(flavour).forRoot(flavour, {
            autoServices,
          })
        );
      });
    }

    if (options.observerOptions?.enableObserverEvents) {
      imports.push(
        DecafStreamModule.forFlavours(
          options.observerOptions.observerFlavours || flavours
        )
      );
    }

    return {
      module: DecafModule,
      imports: imports,
    };
  }
}