1 | import { ResourceType } from './ResourceType';
|
2 | import { BaseResource, BaseResourceOptions, InteractiveCLI } from './types';
|
3 |
|
4 | export interface CLIOption {
|
5 | readonly option: string;
|
6 | readonly description: string;
|
7 | }
|
8 |
|
9 | export interface NamesIn {
|
10 | readonly ing: string;
|
11 | readonly ingUpper: string;
|
12 | readonly ed: string;
|
13 | readonly edUpper: string;
|
14 | }
|
15 |
|
16 | export interface Names extends NamesIn {
|
17 | readonly lower: string;
|
18 | readonly upper: string;
|
19 | }
|
20 |
|
21 | export 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 |
|
36 | export interface GetCLIResourceOptions {
|
37 | readonly cli: InteractiveCLI;
|
38 |
|
39 | readonly args: any;
|
40 |
|
41 | readonly options: any;
|
42 | }
|
43 |
|
44 | export 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 | }
|