33 lines
1.0 KiB
JavaScript
33 lines
1.0 KiB
JavaScript
import { createApplication } from "../application/create-application.js";
|
|
|
|
/**
|
|
* This is the only module allowed to join concrete adapters to application
|
|
* ports. Boot phases are explicit so failures can stop before product mount.
|
|
*
|
|
* @template Config
|
|
* @template Release
|
|
* @template {Parameters<typeof createApplication>[0]} Ports
|
|
* @param {{
|
|
* loadConfig(): Promise<Config>,
|
|
* loadRelease(config: Config): Promise<Release>,
|
|
* createAdapters(context: {
|
|
* config: Config,
|
|
* release: Release
|
|
* }): Promise<Ports>
|
|
* }} factories
|
|
* @returns {Promise<Readonly<{
|
|
* config: Config,
|
|
* release: Release,
|
|
* ports: Ports,
|
|
* application: ReturnType<typeof createApplication>
|
|
* }>>}
|
|
*/
|
|
export async function createCompositionRoot(factories) {
|
|
const config = await factories.loadConfig();
|
|
const release = await factories.loadRelease(config);
|
|
const ports = await factories.createAdapters({ config, release });
|
|
const application = createApplication(ports);
|
|
|
|
return Object.freeze({ config, release, ports, application });
|
|
}
|