UNPKG

decline-ts

Version:

Composable command-line parser for TypeScript - a (partial) porting of Scala decline using fp-ts

154 lines (153 loc) 6 kB
import { alt as Alt, eq as Eq, apply, either, option as maybe, readonlyNonEmptyArray } from 'fp-ts'; import { Lazy, Predicate } from 'fp-ts/function'; import { Option } from 'fp-ts/Option'; import { ReadonlyNonEmptyArray } from 'fp-ts/ReadonlyNonEmptyArray'; import { Command } from './Command'; import { ValidatedNea } from './ValidatedNea'; declare type Validation<A> = (raw: string) => ValidatedNea<string, A>; declare const URI_ = "Opts"; declare type URI_ = typeof URI_; declare module 'fp-ts/HKT' { interface URItoKind<A> { readonly [URI_]: Opts<A>; } } declare type OptionArgs = { readonly long: string; readonly help: string; readonly short?: string; readonly metavar: string; }; declare type FlagArgs = { readonly long: string; readonly help: string; readonly short?: string; }; export declare type Opts<A> = Opts.Pure<A> | Opts.App<unknown, A> | Opts.OrElse<A> | Opts.Single<A> | Opts.Repeated<A> | Opts.Subcommand<A> | Opts.Validate<unknown, A> | Opts.HelpFlag; export declare namespace Opts { type Pure<A> = { readonly _tag: 'Pure'; readonly a: A; }; type App<A, B> = { readonly _tag: 'App'; readonly f: Opts<(a: A) => B>; readonly a: Opts<A>; }; type OrElse<A> = { readonly _tag: 'OrElse'; readonly a: Opts<A>; readonly b: Opts<A>; }; type Single<A> = { readonly _tag: 'Single'; readonly opt: Opt<A>; }; type Repeated<A> = { readonly _tag: 'Repeated'; readonly opt: Opt<A>; }; type Subcommand<A> = { readonly _tag: 'Subcommand'; readonly command: Command<A>; }; type Validate<A, B> = { readonly _tag: 'Validate'; readonly value: Opts<A>; readonly validate: (a: A) => ValidatedNea<string, B>; }; type HelpFlag = { readonly _tag: 'HelpFlag'; readonly flag: Opts<void>; }; /** * Constructors */ const pure: <A>(a: A) => Pure<A>; const app: <A, B>(f: Opts<(a: A) => B>, fa: Opts<A>) => Opts<B>; const orElse: <A>(a: Opts<A>, b: Opts<A>) => Opts<A>; function single<A>(opt: Opt<A>): Single<A>; function repeated<A>(opt: Opt<A>): Opts<ReadonlyNonEmptyArray<A>>; function subcommand<A>(command: Command<A>): Subcommand<A>; function subcommand({ name, header }: Command.Args): <B>(o: Opts<B>) => Subcommand<B>; const helpFlag: (flag: Opts<void>) => Opts<never>; const unit: Opts<void>; function option(): (args: OptionArgs) => Opts<string>; function option<A>(codec: Validation<A>): (args: OptionArgs) => Opts<A>; function options(): (args: OptionArgs) => Opts<ReadonlyNonEmptyArray<string>>; function options<A>(codec: Validation<A>): (args: OptionArgs) => Opts<ReadonlyNonEmptyArray<A>>; const flag: ({ long, help, short }: FlagArgs) => Opts<void>; const flags: ({ long, help, short }: FlagArgs) => Opts<number>; function argument(): (metavar?: string) => Opts<string>; function argument<A>(codec: Validation<A>): (metavar?: string) => Opts<A>; function argumentS(): (metavar: string) => Opts<ReadonlyNonEmptyArray<string>>; function argumentS<A>(codec: Validation<A>): (metavar: string) => Opts<ReadonlyNonEmptyArray<A>>; function param(): (metavar: string) => Opts<string>; function param<A>(codec: Validation<A>): (metavar: string) => Opts<A>; function params(): (metavar: string) => Opts<ReadonlyNonEmptyArray<string>>; function params<A>(codec: Validation<A>): (metavar: string) => Opts<ReadonlyNonEmptyArray<A>>; /** * Methods */ const mapValidated: <A, B>(f: (a: A) => either.Either<readonlyNonEmptyArray.ReadonlyNonEmptyArray<string>, B>) => (fa: Opts<A>) => Opts<B>; const validate: (message: string) => <A>(pred: Predicate<A>) => (fa: Opts<A>) => Opts<A>; const withDefault: <A>(fy: Lazy<A>) => (fa: Opts<A>) => Opts<A>; const orNone: <A>(fa: Opts<A>) => Opts<maybe.Option<A>>; const orEmpty: <A>(fa: Opts<readonlyNonEmptyArray.ReadonlyNonEmptyArray<A>>) => Opts<readonly A[]>; const orFalse: (fa: Opts<unknown>) => Opts<boolean>; const asHelp: (fa: Opts<unknown>) => Opts<never>; const map: <A, B>(f: (a: A) => B) => (fa: Opts<A>) => Opts<B>; const ap: <A, B>(fab: Opts<(a: A) => B>) => (fa: Opts<A>) => Opts<B>; const alt: <A>(that: Lazy<Opts<A>>) => (fa: Opts<A>) => Opts<A>; /** * Instance */ const URI = "Opts"; type URI = URI_; const opts: apply.Apply1<URI> & Alt.Alt1<URI>; /** * Name */ type Name = Name.LongName | Name.ShortName; namespace Name { type LongName = { readonly _tag: 'LongName'; readonly flag: string; }; type ShortName = { readonly _tag: 'ShortName'; readonly flag: string; }; const longName: (flag: string) => LongName; const shortName: (flag: string) => ShortName; const stringify: (name: Name) => string; const namesFor: (long: string, short: string) => ReadonlyArray<Name>; const eq: Eq.Eq<Name>; } /** * Opt */ type Opt<A> = Opt.Regular | Opt.Flag | Opt.Argument; namespace Opt { type Regular = { readonly _tag: 'Regular'; readonly names: ReadonlyArray<Name>; readonly metavar: string; readonly help: string; }; type Flag = { readonly _tag: 'Flag'; readonly names: ReadonlyArray<Name>; readonly help: string; }; type Argument = { readonly _tag: 'Argument'; readonly metavar: string; }; const regular: (names: ReadonlyArray<Name>, metavar: string, help: string) => Opt<string>; const flag: (names: ReadonlyArray<Name>, help: string) => Opt<void>; const argument: (metavar: string) => Opt<string>; function eq<A>(): Eq.Eq<Opt<A>>; } } export {};