import { SetInterfaces } from "../interfaces/setupInterfaces" import { ExpectedExports } from "../types" import { createUtils } from "../util" import { Migrations } from "./migrations/setupMigrations" import { SetupExports } from "./setupExports" import { Install } from "./setupInstall" import { Uninstall } from "./setupUninstall" export function setupInit( migrations: Migrations, install: Install, uninstall: Uninstall, setInterfaces: SetInterfaces, setupExports: SetupExports, ): { init: ExpectedExports.init uninit: ExpectedExports.uninit } { return { init: async (opts) => { const utils = createUtils(opts.effects) await migrations.init(opts) await install.init(opts) await setInterfaces({ ...opts, input: null, utils, }) const { services, ui } = await setupExports({ ...opts, utils, }) await opts.effects.exposeForDependents(services) await opts.effects.exposeUi(ui) }, uninit: async (opts) => { await migrations.uninit(opts) await uninstall.uninit(opts) }, } }