UNPKG

2.89 kBPlain TextView Raw
1import { ResourceType } from './ResourceType';
2import { BaseResource, BaseResourceOptions, InteractiveCLI } from './types';
3
4export interface CLIOption {
5 readonly option: string;
6 readonly description: string;
7}
8
9export interface NamesIn {
10 readonly ing: string;
11 readonly ingUpper: string;
12 readonly ed: string;
13 readonly edUpper: string;
14}
15
16export interface Names extends NamesIn {
17 readonly lower: string;
18 readonly upper: string;
19}
20
21export interface CRUDBaseOptions<
22 Resource extends BaseResource = BaseResource,
23 ResourceOptions extends BaseResourceOptions = BaseResourceOptions
24> {
25 readonly name: string;
26 readonly names?: NamesIn;
27 readonly command: string;
28 readonly resourceType: ResourceType<Resource, ResourceOptions>;
29 readonly help: string;
30 readonly aliases?: ReadonlyArray<string>;
31 readonly options?: ReadonlyArray<CLIOption>;
32 readonly autocomplete?: ReadonlyArray<string>;
33 readonly hidden?: boolean;
34}
35
36export interface GetCLIResourceOptions {
37 readonly cli: InteractiveCLI;
38 // tslint:disable-next-line no-any
39 readonly args: any;
40 // tslint:disable-next-line no-any
41 readonly options: any;
42}
43
44export class CRUDBase<
45 Resource extends BaseResource = BaseResource,
46 ResourceOptions extends BaseResourceOptions = BaseResourceOptions
47> {
48 public readonly name: string;
49 public readonly names: Names;
50 public readonly command: string;
51 public readonly resourceType: ResourceType<Resource, ResourceOptions>;
52 public readonly help: string;
53 public readonly aliases: ReadonlyArray<string>;
54 public readonly options: ReadonlyArray<CLIOption>;
55 public readonly autocomplete: ReadonlyArray<string>;
56 public readonly hidden: boolean;
57
58 public constructor({
59 name: nameIn,
60 names: namesIn,
61 command,
62 resourceType,
63 help,
64 aliases = [],
65 options = [],
66 autocomplete = [],
67 hidden = false,
68 }: CRUDBaseOptions<Resource, ResourceOptions>) {
69 this.name = nameIn;
70 const name = nameIn.endsWith('e') ? nameIn.slice(0, -1) : nameIn;
71 const nameUpper = `${name.charAt(0).toUpperCase()}${name.slice(1)}`;
72 const names =
73 namesIn === undefined
74 ? {
75 ing: `${name}ing`,
76 ingUpper: `${nameUpper}ing`,
77 ed: `${name}ed`,
78 edUpper: `${nameUpper}ed`,
79 }
80 : namesIn;
81
82 this.names = {
83 lower: nameIn,
84 upper: `${nameIn.charAt(0).toUpperCase()}${nameIn.slice(1)}`,
85 ing: names.ing,
86 ingUpper: names.ingUpper,
87 ed: names.ed,
88 edUpper: names.edUpper,
89 };
90 this.command = command;
91 this.resourceType = resourceType;
92 this.help = help;
93 this.aliases = aliases;
94 this.options = options;
95 this.autocomplete = autocomplete;
96 this.hidden = hidden;
97 }
98
99 public async getCLIResourceOptions({ options }: GetCLIResourceOptions): Promise<ResourceOptions> {
100 return Promise.resolve(options);
101 }
102}