Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/terminal-suggest/src/fig/fig-autocomplete-shared/convert.ts
3520 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { makeArray } from './utils';
7
8
export type SuggestionType = Fig.SuggestionType | 'history' | 'auto-execute';
9
10
type Override<T, S> = Omit<T, keyof S> & S;
11
export type Suggestion = Override<Fig.Suggestion, { type?: SuggestionType }>;
12
13
export type Option<ArgT, OptionT> = OptionT & {
14
name: string[];
15
args: ArgT[];
16
};
17
18
export type Subcommand<ArgT, OptionT, SubcommandT> = SubcommandT & {
19
name: string[];
20
subcommands: Record<string, Subcommand<ArgT, OptionT, SubcommandT>>;
21
options: Record<string, Option<ArgT, OptionT>>;
22
persistentOptions: Record<string, Option<ArgT, OptionT>>;
23
args: ArgT[];
24
};
25
26
const makeNamedMap = <T extends { name: string[] }>(items: T[] | undefined): Record<string, T> => {
27
const nameMapping: Record<string, T> = {};
28
if (!items) {
29
return nameMapping;
30
}
31
32
for (let i = 0; i < items.length; i += 1) {
33
items[i].name.forEach((name) => {
34
nameMapping[name] = items[i];
35
});
36
}
37
return nameMapping;
38
};
39
40
export type Initializer<ArgT, OptionT, SubcommandT> = {
41
subcommand: (subcommand: Fig.Subcommand) => SubcommandT;
42
option: (option: Fig.Option) => OptionT;
43
arg: (arg: Fig.Arg) => ArgT;
44
};
45
46
function convertOption<ArgT, OptionT>(
47
option: Fig.Option,
48
initialize: Omit<Initializer<ArgT, OptionT, never>, 'subcommand'>
49
): Option<ArgT, OptionT> {
50
return {
51
...initialize.option(option),
52
name: makeArray(option.name),
53
args: option.args ? makeArray(option.args).map(initialize.arg) : [],
54
};
55
}
56
57
export function convertSubcommand<ArgT, OptionT, SubcommandT>(
58
subcommand: Fig.Subcommand,
59
initialize: Initializer<ArgT, OptionT, SubcommandT>
60
): Subcommand<ArgT, OptionT, SubcommandT> {
61
const { subcommands, options, args } = subcommand;
62
return {
63
...initialize.subcommand(subcommand),
64
name: makeArray(subcommand.name),
65
subcommands: makeNamedMap(subcommands?.map((s) => convertSubcommand(s, initialize))),
66
options: makeNamedMap(
67
options
68
?.filter((option) => !option.isPersistent)
69
?.map((option) => convertOption(option, initialize))
70
),
71
persistentOptions: makeNamedMap(
72
options
73
?.filter((option) => option.isPersistent)
74
?.map((option) => convertOption(option, initialize))
75
),
76
args: args ? makeArray(args).map(initialize.arg) : [],
77
};
78
}
79
80