actionhero
Version:
The reusable, scalable, and quick node.js API server for stateless and stateful applications
35 lines (30 loc) • 1.04 kB
text/typescript
import { Input } from "./input";
import { Action } from "../classes/action";
import { Task } from "../classes/task";
import { CLI } from "../classes/cli";
export interface Inputs {
[key: string]: Input;
}
type ActionheroWithParams = Action | Task | CLI;
type KeysOfType<T, U> = { [K in keyof T]: T[K] extends U ? K : never }[keyof T];
type FormatterOrString<I extends Input> = I["formatter"] extends (
...args: any[]
) => any
? ReturnType<I["formatter"]>
: string;
type RequiredParamsKeys<A extends ActionheroWithParams> = KeysOfType<
A["inputs"],
Required
>;
type Variadic = { variadic: true };
type Required = Readonly<{ required: true }> | { required: true };
type ParamsExtractor<A extends ActionheroWithParams> = {
[Input in keyof A["inputs"]]: A["inputs"][Input] extends Variadic
? FormatterOrString<A["inputs"][Input]>[]
: FormatterOrString<A["inputs"][Input]>;
};
export type ParamsFrom<A extends ActionheroWithParams> = Pick<
ParamsExtractor<A>,
RequiredParamsKeys<A>
> &
Partial<ParamsExtractor<A>>;