Path: blob/main/extensions/terminal-suggest/src/fig/fig-autocomplete-shared/convert.ts
3520 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { makeArray } from './utils';67export type SuggestionType = Fig.SuggestionType | 'history' | 'auto-execute';89type Override<T, S> = Omit<T, keyof S> & S;10export type Suggestion = Override<Fig.Suggestion, { type?: SuggestionType }>;1112export type Option<ArgT, OptionT> = OptionT & {13name: string[];14args: ArgT[];15};1617export type Subcommand<ArgT, OptionT, SubcommandT> = SubcommandT & {18name: string[];19subcommands: Record<string, Subcommand<ArgT, OptionT, SubcommandT>>;20options: Record<string, Option<ArgT, OptionT>>;21persistentOptions: Record<string, Option<ArgT, OptionT>>;22args: ArgT[];23};2425const makeNamedMap = <T extends { name: string[] }>(items: T[] | undefined): Record<string, T> => {26const nameMapping: Record<string, T> = {};27if (!items) {28return nameMapping;29}3031for (let i = 0; i < items.length; i += 1) {32items[i].name.forEach((name) => {33nameMapping[name] = items[i];34});35}36return nameMapping;37};3839export type Initializer<ArgT, OptionT, SubcommandT> = {40subcommand: (subcommand: Fig.Subcommand) => SubcommandT;41option: (option: Fig.Option) => OptionT;42arg: (arg: Fig.Arg) => ArgT;43};4445function convertOption<ArgT, OptionT>(46option: Fig.Option,47initialize: Omit<Initializer<ArgT, OptionT, never>, 'subcommand'>48): Option<ArgT, OptionT> {49return {50...initialize.option(option),51name: makeArray(option.name),52args: option.args ? makeArray(option.args).map(initialize.arg) : [],53};54}5556export function convertSubcommand<ArgT, OptionT, SubcommandT>(57subcommand: Fig.Subcommand,58initialize: Initializer<ArgT, OptionT, SubcommandT>59): Subcommand<ArgT, OptionT, SubcommandT> {60const { subcommands, options, args } = subcommand;61return {62...initialize.subcommand(subcommand),63name: makeArray(subcommand.name),64subcommands: makeNamedMap(subcommands?.map((s) => convertSubcommand(s, initialize))),65options: makeNamedMap(66options67?.filter((option) => !option.isPersistent)68?.map((option) => convertOption(option, initialize))69),70persistentOptions: makeNamedMap(71options72?.filter((option) => option.isPersistent)73?.map((option) => convertOption(option, initialize))74),75args: args ? makeArray(args).map(initialize.arg) : [],76};77}787980