@rushstack/ts-command-line 4.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +1329 -0
- package/CHANGELOG.md +704 -0
- package/LICENSE +24 -0
- package/README.md +251 -0
- package/dist/ts-command-line.d.ts +878 -0
- package/dist/tsdoc-metadata.json +11 -0
- package/lib/CommandLineHelper.d.ts +14 -0
- package/lib/CommandLineHelper.d.ts.map +1 -0
- package/lib/CommandLineHelper.js +22 -0
- package/lib/CommandLineHelper.js.map +1 -0
- package/lib/Constants.d.ts +12 -0
- package/lib/Constants.d.ts.map +1 -0
- package/lib/Constants.js +5 -0
- package/lib/Constants.js.map +1 -0
- package/lib/index.d.ts +23 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +42 -0
- package/lib/index.js.map +1 -0
- package/lib/parameters/BaseClasses.d.ts +100 -0
- package/lib/parameters/BaseClasses.d.ts.map +1 -0
- package/lib/parameters/BaseClasses.js +148 -0
- package/lib/parameters/BaseClasses.js.map +1 -0
- package/lib/parameters/CommandLineChoiceListParameter.d.ts +33 -0
- package/lib/parameters/CommandLineChoiceListParameter.d.ts.map +1 -0
- package/lib/parameters/CommandLineChoiceListParameter.js +84 -0
- package/lib/parameters/CommandLineChoiceListParameter.js.map +1 -0
- package/lib/parameters/CommandLineChoiceParameter.d.ts +40 -0
- package/lib/parameters/CommandLineChoiceParameter.d.ts.map +1 -0
- package/lib/parameters/CommandLineChoiceParameter.js +95 -0
- package/lib/parameters/CommandLineChoiceParameter.js.map +1 -0
- package/lib/parameters/CommandLineDefinition.d.ts +207 -0
- package/lib/parameters/CommandLineDefinition.d.ts.map +1 -0
- package/lib/parameters/CommandLineDefinition.js +5 -0
- package/lib/parameters/CommandLineDefinition.js.map +1 -0
- package/lib/parameters/CommandLineFlagParameter.d.ts +29 -0
- package/lib/parameters/CommandLineFlagParameter.d.ts.map +1 -0
- package/lib/parameters/CommandLineFlagParameter.js +72 -0
- package/lib/parameters/CommandLineFlagParameter.js.map +1 -0
- package/lib/parameters/CommandLineIntegerListParameter.d.ts +29 -0
- package/lib/parameters/CommandLineIntegerListParameter.d.ts.map +1 -0
- package/lib/parameters/CommandLineIntegerListParameter.js +82 -0
- package/lib/parameters/CommandLineIntegerListParameter.js.map +1 -0
- package/lib/parameters/CommandLineIntegerParameter.d.ts +36 -0
- package/lib/parameters/CommandLineIntegerParameter.d.ts.map +1 -0
- package/lib/parameters/CommandLineIntegerParameter.js +86 -0
- package/lib/parameters/CommandLineIntegerParameter.js.map +1 -0
- package/lib/parameters/CommandLineRemainder.d.ts +28 -0
- package/lib/parameters/CommandLineRemainder.d.ts.map +1 -0
- package/lib/parameters/CommandLineRemainder.js +48 -0
- package/lib/parameters/CommandLineRemainder.js.map +1 -0
- package/lib/parameters/CommandLineStringListParameter.d.ts +29 -0
- package/lib/parameters/CommandLineStringListParameter.d.ts.map +1 -0
- package/lib/parameters/CommandLineStringListParameter.js +73 -0
- package/lib/parameters/CommandLineStringListParameter.js.map +1 -0
- package/lib/parameters/CommandLineStringParameter.d.ts +36 -0
- package/lib/parameters/CommandLineStringParameter.d.ts.map +1 -0
- package/lib/parameters/CommandLineStringParameter.js +85 -0
- package/lib/parameters/CommandLineStringParameter.js.map +1 -0
- package/lib/parameters/EnvironmentVariableParser.d.ts +10 -0
- package/lib/parameters/EnvironmentVariableParser.d.ts.map +1 -0
- package/lib/parameters/EnvironmentVariableParser.js +51 -0
- package/lib/parameters/EnvironmentVariableParser.js.map +1 -0
- package/lib/providers/CommandLineAction.d.ts +76 -0
- package/lib/providers/CommandLineAction.d.ts.map +1 -0
- package/lib/providers/CommandLineAction.js +73 -0
- package/lib/providers/CommandLineAction.js.map +1 -0
- package/lib/providers/CommandLineParameterProvider.d.ts +202 -0
- package/lib/providers/CommandLineParameterProvider.d.ts.map +1 -0
- package/lib/providers/CommandLineParameterProvider.js +374 -0
- package/lib/providers/CommandLineParameterProvider.js.map +1 -0
- package/lib/providers/CommandLineParser.d.ts +100 -0
- package/lib/providers/CommandLineParser.d.ts.map +1 -0
- package/lib/providers/CommandLineParser.js +204 -0
- package/lib/providers/CommandLineParser.js.map +1 -0
- package/lib/providers/CommandLineParserExitError.d.ts +10 -0
- package/lib/providers/CommandLineParserExitError.d.ts.map +1 -0
- package/lib/providers/CommandLineParserExitError.js +53 -0
- package/lib/providers/CommandLineParserExitError.js.map +1 -0
- package/lib/providers/DynamicCommandLineAction.d.ts +9 -0
- package/lib/providers/DynamicCommandLineAction.d.ts.map +1 -0
- package/lib/providers/DynamicCommandLineAction.js +21 -0
- package/lib/providers/DynamicCommandLineAction.js.map +1 -0
- package/lib/providers/DynamicCommandLineParser.d.ts +8 -0
- package/lib/providers/DynamicCommandLineParser.d.ts.map +1 -0
- package/lib/providers/DynamicCommandLineParser.js +16 -0
- package/lib/providers/DynamicCommandLineParser.js.map +1 -0
- package/lib/providers/TabCompletionAction.d.ts +18 -0
- package/lib/providers/TabCompletionAction.d.ts.map +1 -0
- package/lib/providers/TabCompletionAction.js +211 -0
- package/lib/providers/TabCompletionAction.js.map +1 -0
- package/package.json +28 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
|
|
3
|
+
// See LICENSE in the project root for license information.
|
|
4
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
5
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
6
|
+
var m = o[Symbol.asyncIterator], i;
|
|
7
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
8
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
9
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
10
|
+
};
|
|
11
|
+
var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
|
|
12
|
+
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
|
|
13
|
+
var i, p;
|
|
14
|
+
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
|
|
15
|
+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
|
|
16
|
+
};
|
|
17
|
+
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
|
|
18
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
19
|
+
var g = generator.apply(thisArg, _arguments || []), i, q = [];
|
|
20
|
+
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
|
|
21
|
+
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
|
|
22
|
+
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
|
|
23
|
+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
|
|
24
|
+
function fulfill(value) { resume("next", value); }
|
|
25
|
+
function reject(value) { resume("throw", value); }
|
|
26
|
+
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
|
|
27
|
+
};
|
|
28
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
29
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
30
|
+
};
|
|
31
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
+
exports.TabCompleteAction = void 0;
|
|
33
|
+
const string_argv_1 = __importDefault(require("string-argv"));
|
|
34
|
+
const BaseClasses_1 = require("../parameters/BaseClasses");
|
|
35
|
+
const CommandLineAction_1 = require("./CommandLineAction");
|
|
36
|
+
const __1 = require("..");
|
|
37
|
+
const DEFAULT_WORD_TO_AUTOCOMPLETE = '';
|
|
38
|
+
const DEFAULT_POSITION = 0;
|
|
39
|
+
class TabCompleteAction extends CommandLineAction_1.CommandLineAction {
|
|
40
|
+
constructor(actions, globalParameters) {
|
|
41
|
+
super({
|
|
42
|
+
actionName: "tab-complete" /* TabCompletionActionName */,
|
|
43
|
+
summary: 'Provides tab completion.',
|
|
44
|
+
documentation: 'Provides tab completion.'
|
|
45
|
+
});
|
|
46
|
+
this._actions = new Map();
|
|
47
|
+
for (const action of actions) {
|
|
48
|
+
const parameterNameToParameterInfoMap = new Map();
|
|
49
|
+
for (const parameter of action.parameters) {
|
|
50
|
+
parameterNameToParameterInfoMap.set(parameter.longName, parameter);
|
|
51
|
+
if (parameter.shortName) {
|
|
52
|
+
parameterNameToParameterInfoMap.set(parameter.shortName, parameter);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
this._actions.set(action.actionName, parameterNameToParameterInfoMap);
|
|
56
|
+
}
|
|
57
|
+
this._globalParameters = new Map();
|
|
58
|
+
for (const parameter of globalParameters) {
|
|
59
|
+
this._globalParameters.set(parameter.longName, parameter);
|
|
60
|
+
if (parameter.shortName) {
|
|
61
|
+
this._globalParameters.set(parameter.shortName, parameter);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
onDefineParameters() {
|
|
66
|
+
this._wordToCompleteParameter = this.defineStringParameter({
|
|
67
|
+
parameterLongName: '--word',
|
|
68
|
+
argumentName: 'WORD',
|
|
69
|
+
description: `The word to complete.`,
|
|
70
|
+
defaultValue: DEFAULT_WORD_TO_AUTOCOMPLETE
|
|
71
|
+
});
|
|
72
|
+
this._positionParameter = this.defineIntegerParameter({
|
|
73
|
+
parameterLongName: '--position',
|
|
74
|
+
argumentName: 'INDEX',
|
|
75
|
+
description: `The position in the word to be completed.`,
|
|
76
|
+
defaultValue: DEFAULT_POSITION
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
async onExecute() {
|
|
80
|
+
var e_1, _a;
|
|
81
|
+
const commandLine = this._wordToCompleteParameter.value || '';
|
|
82
|
+
const caretPosition = this._positionParameter.value || (commandLine && commandLine.length) || 0;
|
|
83
|
+
try {
|
|
84
|
+
for (var _b = __asyncValues(this.getCompletions(commandLine, caretPosition)), _c; _c = await _b.next(), !_c.done;) {
|
|
85
|
+
const value = _c.value;
|
|
86
|
+
console.log(value);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
90
|
+
finally {
|
|
91
|
+
try {
|
|
92
|
+
if (_c && !_c.done && (_a = _b.return)) await _a.call(_b);
|
|
93
|
+
}
|
|
94
|
+
finally { if (e_1) throw e_1.error; }
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
getCompletions(commandLine, caretPosition = commandLine.length) {
|
|
98
|
+
return __asyncGenerator(this, arguments, function* getCompletions_1() {
|
|
99
|
+
const actions = this._actions;
|
|
100
|
+
if (!commandLine || !caretPosition) {
|
|
101
|
+
yield __await(yield* __asyncDelegator(__asyncValues(this._getAllActions())));
|
|
102
|
+
return yield __await(void 0);
|
|
103
|
+
}
|
|
104
|
+
const tokens = Array.from(this.tokenizeCommandLine(commandLine));
|
|
105
|
+
// offset arguments by the number of global params in the input
|
|
106
|
+
const globalParameterOffset = this._getGlobalParameterOffset(tokens);
|
|
107
|
+
if (tokens.length < 2 + globalParameterOffset) {
|
|
108
|
+
yield __await(yield* __asyncDelegator(__asyncValues(this._getAllActions())));
|
|
109
|
+
return yield __await(void 0);
|
|
110
|
+
}
|
|
111
|
+
const lastToken = tokens[tokens.length - 1];
|
|
112
|
+
const secondLastToken = tokens[tokens.length - 2];
|
|
113
|
+
const completePartialWord = caretPosition === commandLine.length;
|
|
114
|
+
if (completePartialWord && tokens.length === 2 + globalParameterOffset) {
|
|
115
|
+
for (const actionName of actions.keys()) {
|
|
116
|
+
if (actionName.indexOf(tokens[1 + globalParameterOffset]) === 0) {
|
|
117
|
+
yield yield __await(actionName);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
for (const actionName of actions.keys()) {
|
|
123
|
+
if (actionName === tokens[1 + globalParameterOffset]) {
|
|
124
|
+
const parameterNameMap = actions.get(actionName);
|
|
125
|
+
const parameterNames = Array.from(parameterNameMap.keys());
|
|
126
|
+
if (completePartialWord) {
|
|
127
|
+
for (const parameterName of parameterNames) {
|
|
128
|
+
if (parameterName === secondLastToken) {
|
|
129
|
+
const values = yield __await(this._getParameterValueCompletions(parameterNameMap.get(parameterName)));
|
|
130
|
+
if (values.length > 0) {
|
|
131
|
+
yield __await(yield* __asyncDelegator(__asyncValues(this._completeParameterValues(values, lastToken))));
|
|
132
|
+
return yield __await(void 0);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
yield __await(yield* __asyncDelegator(__asyncValues(this._completeParameterValues(parameterNames, lastToken))));
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
for (const parameterName of parameterNames) {
|
|
140
|
+
if (parameterName === lastToken) {
|
|
141
|
+
const values = yield __await(this._getParameterValueCompletions(parameterNameMap.get(parameterName)));
|
|
142
|
+
if (values.length > 0) {
|
|
143
|
+
yield __await(yield* __asyncDelegator(__asyncValues(values)));
|
|
144
|
+
return yield __await(void 0);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
for (const parameterName of parameterNames) {
|
|
149
|
+
if (parameterName === lastToken &&
|
|
150
|
+
parameterNameMap.get(parameterName).kind !== BaseClasses_1.CommandLineParameterKind.Flag) {
|
|
151
|
+
// The parameter is expecting a value, so don't suggest parameter names again
|
|
152
|
+
return yield __await(void 0);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
yield __await(yield* __asyncDelegator(__asyncValues(parameterNames)));
|
|
156
|
+
}
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
*_getAllActions() {
|
|
164
|
+
yield* this._actions.keys();
|
|
165
|
+
yield* this._globalParameters.keys();
|
|
166
|
+
}
|
|
167
|
+
tokenizeCommandLine(commandLine) {
|
|
168
|
+
return string_argv_1.default(commandLine);
|
|
169
|
+
}
|
|
170
|
+
async _getParameterValueCompletions(parameter) {
|
|
171
|
+
let choiceParameterValues = [];
|
|
172
|
+
if (parameter.kind === BaseClasses_1.CommandLineParameterKind.Choice) {
|
|
173
|
+
choiceParameterValues = parameter.alternatives;
|
|
174
|
+
}
|
|
175
|
+
else if (parameter.kind !== BaseClasses_1.CommandLineParameterKind.Flag) {
|
|
176
|
+
let parameterWithArgumentOrChoices = undefined;
|
|
177
|
+
if (parameter instanceof BaseClasses_1.CommandLineParameterWithArgument) {
|
|
178
|
+
parameterWithArgumentOrChoices = parameter;
|
|
179
|
+
}
|
|
180
|
+
else if (parameter instanceof __1.CommandLineChoiceParameter) {
|
|
181
|
+
parameterWithArgumentOrChoices = parameter;
|
|
182
|
+
}
|
|
183
|
+
if (parameterWithArgumentOrChoices && parameterWithArgumentOrChoices.completions) {
|
|
184
|
+
choiceParameterValues = await parameterWithArgumentOrChoices.completions();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return choiceParameterValues;
|
|
188
|
+
}
|
|
189
|
+
_getGlobalParameterOffset(tokens) {
|
|
190
|
+
const globalParameters = this._globalParameters;
|
|
191
|
+
let count = 0;
|
|
192
|
+
outer: for (let i = 1; i < tokens.length; i++) {
|
|
193
|
+
for (const globalParameter of globalParameters.values()) {
|
|
194
|
+
if (tokens[i] !== globalParameter.longName && tokens[i] !== globalParameter.shortName) {
|
|
195
|
+
break outer;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
count++;
|
|
199
|
+
}
|
|
200
|
+
return count;
|
|
201
|
+
}
|
|
202
|
+
*_completeParameterValues(choiceParameterValues, lastToken) {
|
|
203
|
+
for (const choiceParameterValue of choiceParameterValues) {
|
|
204
|
+
if (choiceParameterValue.indexOf(lastToken) === 0) {
|
|
205
|
+
yield choiceParameterValue;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
exports.TabCompleteAction = TabCompleteAction;
|
|
211
|
+
//# sourceMappingURL=TabCompletionAction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabCompletionAction.js","sourceRoot":"","sources":["../../src/providers/TabCompletionAction.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport stringArgv from 'string-argv';\r\n\r\nimport { CommandLineIntegerParameter } from '../parameters/CommandLineIntegerParameter';\r\nimport { CommandLineStringParameter } from '../parameters/CommandLineStringParameter';\r\nimport {\r\n CommandLineParameterKind,\r\n CommandLineParameter,\r\n CommandLineParameterWithArgument\r\n} from '../parameters/BaseClasses';\r\nimport { CommandLineAction } from './CommandLineAction';\r\nimport { CommandLineChoiceParameter } from '..';\r\nimport { CommandLineConstants } from '../Constants';\r\n\r\nconst DEFAULT_WORD_TO_AUTOCOMPLETE: string = '';\r\nconst DEFAULT_POSITION: number = 0;\r\n\r\nexport class TabCompleteAction extends CommandLineAction {\r\n private _wordToCompleteParameter!: CommandLineStringParameter;\r\n private _positionParameter!: CommandLineIntegerParameter;\r\n private readonly _actions: Map<string, Map<string, CommandLineParameter>>;\r\n private readonly _globalParameters: Map<string, CommandLineParameter>;\r\n\r\n public constructor(\r\n actions: ReadonlyArray<CommandLineAction>,\r\n globalParameters: ReadonlyArray<CommandLineParameter>\r\n ) {\r\n super({\r\n actionName: CommandLineConstants.TabCompletionActionName,\r\n summary: 'Provides tab completion.',\r\n documentation: 'Provides tab completion.'\r\n });\r\n\r\n this._actions = new Map<string, Map<string, CommandLineParameter>>();\r\n for (const action of actions) {\r\n const parameterNameToParameterInfoMap: Map<string, CommandLineParameter> = new Map<\r\n string,\r\n CommandLineParameter\r\n >();\r\n for (const parameter of action.parameters) {\r\n parameterNameToParameterInfoMap.set(parameter.longName, parameter);\r\n if (parameter.shortName) {\r\n parameterNameToParameterInfoMap.set(parameter.shortName, parameter);\r\n }\r\n }\r\n this._actions.set(action.actionName, parameterNameToParameterInfoMap);\r\n }\r\n\r\n this._globalParameters = new Map<string, CommandLineParameter>();\r\n for (const parameter of globalParameters) {\r\n this._globalParameters.set(parameter.longName, parameter);\r\n if (parameter.shortName) {\r\n this._globalParameters.set(parameter.shortName, parameter);\r\n }\r\n }\r\n }\r\n\r\n protected onDefineParameters(): void {\r\n this._wordToCompleteParameter = this.defineStringParameter({\r\n parameterLongName: '--word',\r\n argumentName: 'WORD',\r\n description: `The word to complete.`,\r\n defaultValue: DEFAULT_WORD_TO_AUTOCOMPLETE\r\n });\r\n\r\n this._positionParameter = this.defineIntegerParameter({\r\n parameterLongName: '--position',\r\n argumentName: 'INDEX',\r\n description: `The position in the word to be completed.`,\r\n defaultValue: DEFAULT_POSITION\r\n });\r\n }\r\n\r\n protected async onExecute(): Promise<void> {\r\n const commandLine: string = this._wordToCompleteParameter.value || '';\r\n const caretPosition: number = this._positionParameter.value || (commandLine && commandLine.length) || 0;\r\n\r\n for await (const value of this.getCompletions(commandLine, caretPosition)) {\r\n console.log(value);\r\n }\r\n }\r\n\r\n public async *getCompletions(\r\n commandLine: string,\r\n caretPosition: number = commandLine.length\r\n ): AsyncIterable<string> {\r\n const actions: Map<string, Map<string, CommandLineParameter>> = this._actions;\r\n\r\n if (!commandLine || !caretPosition) {\r\n yield* this._getAllActions();\r\n return;\r\n }\r\n\r\n const tokens: string[] = Array.from(this.tokenizeCommandLine(commandLine));\r\n\r\n // offset arguments by the number of global params in the input\r\n const globalParameterOffset: number = this._getGlobalParameterOffset(tokens);\r\n\r\n if (tokens.length < 2 + globalParameterOffset) {\r\n yield* this._getAllActions();\r\n return;\r\n }\r\n\r\n const lastToken: string = tokens[tokens.length - 1];\r\n const secondLastToken: string = tokens[tokens.length - 2];\r\n\r\n const completePartialWord: boolean = caretPosition === commandLine.length;\r\n\r\n if (completePartialWord && tokens.length === 2 + globalParameterOffset) {\r\n for (const actionName of actions.keys()) {\r\n if (actionName.indexOf(tokens[1 + globalParameterOffset]) === 0) {\r\n yield actionName;\r\n }\r\n }\r\n } else {\r\n for (const actionName of actions.keys()) {\r\n if (actionName === tokens[1 + globalParameterOffset]) {\r\n const parameterNameMap: Map<string, CommandLineParameter> = actions.get(actionName)!;\r\n\r\n const parameterNames: string[] = Array.from(parameterNameMap.keys());\r\n\r\n if (completePartialWord) {\r\n for (const parameterName of parameterNames) {\r\n if (parameterName === secondLastToken) {\r\n const values: string[] = await this._getParameterValueCompletions(\r\n parameterNameMap.get(parameterName)!\r\n );\r\n if (values.length > 0) {\r\n yield* this._completeParameterValues(values, lastToken);\r\n return;\r\n }\r\n }\r\n }\r\n yield* this._completeParameterValues(parameterNames, lastToken);\r\n } else {\r\n for (const parameterName of parameterNames) {\r\n if (parameterName === lastToken) {\r\n const values: string[] = await this._getParameterValueCompletions(\r\n parameterNameMap.get(parameterName)!\r\n );\r\n if (values.length > 0) {\r\n yield* values;\r\n return;\r\n }\r\n }\r\n }\r\n for (const parameterName of parameterNames) {\r\n if (\r\n parameterName === lastToken &&\r\n parameterNameMap.get(parameterName)!.kind !== CommandLineParameterKind.Flag\r\n ) {\r\n // The parameter is expecting a value, so don't suggest parameter names again\r\n return;\r\n }\r\n }\r\n\r\n yield* parameterNames;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private *_getAllActions(): IterableIterator<string> {\r\n yield* this._actions.keys();\r\n yield* this._globalParameters.keys();\r\n }\r\n\r\n public tokenizeCommandLine(commandLine: string): string[] {\r\n return stringArgv(commandLine);\r\n }\r\n\r\n private async _getParameterValueCompletions(parameter: CommandLineParameter): Promise<string[]> {\r\n let choiceParameterValues: string[] = [];\r\n if (parameter.kind === CommandLineParameterKind.Choice) {\r\n choiceParameterValues = (parameter as CommandLineChoiceParameter).alternatives as string[];\r\n } else if (parameter.kind !== CommandLineParameterKind.Flag) {\r\n let parameterWithArgumentOrChoices:\r\n | CommandLineParameterWithArgument\r\n | CommandLineChoiceParameter\r\n | undefined = undefined;\r\n if (parameter instanceof CommandLineParameterWithArgument) {\r\n parameterWithArgumentOrChoices = parameter as CommandLineParameterWithArgument;\r\n } else if (parameter instanceof CommandLineChoiceParameter) {\r\n parameterWithArgumentOrChoices = parameter as CommandLineChoiceParameter;\r\n }\r\n if (parameterWithArgumentOrChoices && parameterWithArgumentOrChoices.completions) {\r\n choiceParameterValues = await parameterWithArgumentOrChoices.completions();\r\n }\r\n }\r\n\r\n return choiceParameterValues;\r\n }\r\n\r\n private _getGlobalParameterOffset(tokens: string[]): number {\r\n const globalParameters: Map<string, CommandLineParameter> = this._globalParameters;\r\n let count: number = 0;\r\n\r\n outer: for (let i: number = 1; i < tokens.length; i++) {\r\n for (const globalParameter of globalParameters.values()) {\r\n if (tokens[i] !== globalParameter.longName && tokens[i] !== globalParameter.shortName) {\r\n break outer;\r\n }\r\n }\r\n count++;\r\n }\r\n\r\n return count;\r\n }\r\n\r\n private *_completeParameterValues(\r\n choiceParameterValues: string[],\r\n lastToken: string\r\n ): IterableIterator<string> {\r\n for (const choiceParameterValue of choiceParameterValues) {\r\n if (choiceParameterValue.indexOf(lastToken) === 0) {\r\n yield choiceParameterValue;\r\n }\r\n }\r\n }\r\n}\r\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rushstack/ts-command-line",
|
|
3
|
+
"version": "4.9.1",
|
|
4
|
+
"description": "An object-oriented command-line parser for TypeScript",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/microsoft/rushstack/tree/master/libraries/ts-command-line"
|
|
8
|
+
},
|
|
9
|
+
"main": "lib/index.js",
|
|
10
|
+
"typings": "dist/ts-command-line.d.ts",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@types/argparse": "1.0.38",
|
|
14
|
+
"argparse": "~1.0.9",
|
|
15
|
+
"colors": "~1.2.1",
|
|
16
|
+
"string-argv": "~0.3.1"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@rushstack/eslint-config": "2.4.1",
|
|
20
|
+
"@rushstack/heft": "0.38.1",
|
|
21
|
+
"@rushstack/heft-node-rig": "1.2.13",
|
|
22
|
+
"@types/heft-jest": "1.0.1",
|
|
23
|
+
"@types/node": "12.20.24"
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "heft test --clean"
|
|
27
|
+
}
|
|
28
|
+
}
|