import * as T from "../types" import * as IST from "../actions/input/inputSpecTypes" export type RunActionInput = | Input | ((prev?: { spec: IST.InputSpec; value: Input | null }) => Input) export const runAction = async < Input extends Record, >(options: { effects: T.Effects // packageId?: T.PackageId actionId: T.ActionId input?: RunActionInput }) => { if (options.input) { if (options.input instanceof Function) { const prev = await options.effects.action.getInput({ // packageId: options.packageId, actionId: options.actionId, }) const input = options.input( prev ? { spec: prev.spec as IST.InputSpec, value: prev.value as Input } : undefined, ) return options.effects.action.run({ // packageId: options.packageId, actionId: options.actionId, input, }) } else { return options.effects.action.run({ // packageId: options.packageId, actionId: options.actionId, input: options.input, }) } } else { return options.effects.action.run({ // packageId: options.packageId, actionId: options.actionId, }) } } // prettier-ignore export type ActionRequest> = T extends { when: { condition: "input-not-matches" } } ? (T extends { input: T.ActionRequestInput } ? T : "input is required for condition 'input-not-matches'") : T export const requestAction = < T extends Omit, >(options: { effects: T.Effects request: ActionRequest & { replayId?: string; packageId: T.PackageId } }) => { const request = options.request const req = { ...request, replayId: request.replayId || `${request.packageId}:${request.actionId}`, } return options.effects.action.request(req) }