import { Config } from "../config/builder" import { ExtractConfigType } from "../config/builder/config" import { ActionMetaData, ActionResult, Effects, ExportedAction } from "../types" import { Utils, utils } from "../util" export class CreatedAction< WrapperData, ConfigType extends Record | Config, Type extends Record = ExtractConfigType, > { private constructor( public readonly myMetaData: Omit & { input: Config }, readonly fn: (options: { effects: Effects utils: Utils input: Type }) => Promise, ) {} private validator = this.myMetaData.input.validator static of< WrapperData, ConfigType extends Record | Config, Type extends Record = ExtractConfigType, >( metaData: Omit & { input: Config }, fn: (options: { effects: Effects utils: Utils input: Type }) => Promise, ) { return new CreatedAction(metaData, fn) } exportedAction: ExportedAction = ({ effects, input }) => { return this.fn({ effects, utils: utils(effects), input: this.validator.unsafeCast(input), }) } async exportAction(effects: Effects) { const myUtils = utils(effects) const metaData = { ...this.myMetaData, input: await this.myMetaData.input.build({ effects, utils: myUtils, }), } await effects.exportAction(metaData) } } export const createAction = CreatedAction.of