@oclif/core 3.13.2 → 3.14.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/lib/interfaces/parser.d.ts +5 -0
- package/lib/parser/errors.d.ts +0 -6
- package/lib/parser/errors.js +1 -11
- package/lib/parser/parse.d.ts +1 -0
- package/lib/parser/parse.js +21 -7
- package/package.json +1 -1
|
@@ -213,6 +213,11 @@ export type OptionFlagProps = FlagProps & {
|
|
|
213
213
|
* separate on spaces.
|
|
214
214
|
*/
|
|
215
215
|
delimiter?: ',';
|
|
216
|
+
/**
|
|
217
|
+
* Allow input value to be read from stdin.
|
|
218
|
+
* Should only be used on one flag at a time.
|
|
219
|
+
*/
|
|
220
|
+
allowStdin?: boolean;
|
|
216
221
|
};
|
|
217
222
|
export type FlagParserContext = Command & {
|
|
218
223
|
token: FlagToken;
|
package/lib/parser/errors.d.ts
CHANGED
|
@@ -49,9 +49,3 @@ export declare class FailedFlagValidationError extends CLIParseError {
|
|
|
49
49
|
failed: Validation[];
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
|
-
export declare class FailedFlagParsingError extends CLIParseError {
|
|
53
|
-
constructor({ flag, message }: {
|
|
54
|
-
flag: string;
|
|
55
|
-
message: string;
|
|
56
|
-
});
|
|
57
|
-
}
|
package/lib/parser/errors.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.FailedFlagValidationError = exports.ArgInvalidOptionError = exports.FlagInvalidOptionError = exports.NonExistentFlagsError = exports.UnexpectedArgsError = exports.RequiredArgsError = exports.InvalidArgsSpecError = exports.CLIParseError = exports.CLIError = void 0;
|
|
7
7
|
const chalk_1 = __importDefault(require("chalk"));
|
|
8
8
|
const cache_1 = __importDefault(require("../cache"));
|
|
9
9
|
const list_1 = require("../cli-ux/list");
|
|
@@ -95,13 +95,3 @@ class FailedFlagValidationError extends CLIParseError {
|
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
exports.FailedFlagValidationError = FailedFlagValidationError;
|
|
98
|
-
class FailedFlagParsingError extends CLIParseError {
|
|
99
|
-
constructor({ flag, message }) {
|
|
100
|
-
super({
|
|
101
|
-
exit: cache_1.default.getInstance().get('exitCodes')?.failedFlagParsing,
|
|
102
|
-
message: `Parsing --${flag} \n\t${message}`,
|
|
103
|
-
parse: {},
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
exports.FailedFlagParsingError = FailedFlagParsingError;
|
package/lib/parser/parse.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { OutputArgs, OutputFlags, ParserInput, ParserOutput } from '../interfaces/parser';
|
|
2
|
+
export declare const readStdin: () => Promise<null | string>;
|
|
2
3
|
export declare class Parser<T extends ParserInput, TFlags extends OutputFlags<T['flags']>, BFlags extends OutputFlags<T['flags']>, TArgs extends OutputArgs<T['args']>> {
|
|
3
4
|
private readonly input;
|
|
4
5
|
private readonly argv;
|
package/lib/parser/parse.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Parser = void 0;
|
|
6
|
+
exports.Parser = exports.readStdin = void 0;
|
|
4
7
|
/* eslint-disable no-await-in-loop */
|
|
5
8
|
const node_readline_1 = require("node:readline");
|
|
9
|
+
const cache_1 = __importDefault(require("../cache"));
|
|
6
10
|
const util_1 = require("../util/util");
|
|
7
11
|
const errors_1 = require("./errors");
|
|
8
12
|
let debug;
|
|
@@ -54,6 +58,7 @@ const readStdin = async () => {
|
|
|
54
58
|
}, { once: true });
|
|
55
59
|
});
|
|
56
60
|
};
|
|
61
|
+
exports.readStdin = readStdin;
|
|
57
62
|
function isNegativeNumber(input) {
|
|
58
63
|
return /^-\d/g.test(input);
|
|
59
64
|
}
|
|
@@ -80,14 +85,14 @@ class Parser {
|
|
|
80
85
|
}
|
|
81
86
|
async parse() {
|
|
82
87
|
this._debugInput();
|
|
83
|
-
const parseFlag = (arg) => {
|
|
88
|
+
const parseFlag = async (arg) => {
|
|
84
89
|
const { isLong, name } = this.findFlag(arg);
|
|
85
90
|
if (!name) {
|
|
86
91
|
const i = arg.indexOf('=');
|
|
87
92
|
if (i !== -1) {
|
|
88
93
|
const sliced = arg.slice(i + 1);
|
|
89
94
|
this.argv.unshift(sliced);
|
|
90
|
-
const equalsParsed = parseFlag(arg.slice(0, i));
|
|
95
|
+
const equalsParsed = await parseFlag(arg.slice(0, i));
|
|
91
96
|
if (!equalsParsed) {
|
|
92
97
|
this.argv.shift();
|
|
93
98
|
}
|
|
@@ -101,11 +106,17 @@ class Parser {
|
|
|
101
106
|
throw new errors_1.CLIError(`Flag --${name} can only be specified once`);
|
|
102
107
|
}
|
|
103
108
|
this.currentFlag = flag;
|
|
104
|
-
|
|
109
|
+
let input = isLong || arg.length < 3 ? this.argv.shift() : arg.slice(arg[2] === '=' ? 3 : 2);
|
|
105
110
|
// if the value ends up being one of the command's flags, the user didn't provide an input
|
|
106
111
|
if (typeof input !== 'string' || this.findFlag(input).name) {
|
|
107
112
|
throw new errors_1.CLIError(`Flag --${name} expects a value`);
|
|
108
113
|
}
|
|
114
|
+
if (flag.allowStdin && input === '-') {
|
|
115
|
+
const stdin = await (0, exports.readStdin)();
|
|
116
|
+
if (stdin) {
|
|
117
|
+
input = stdin.trim();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
109
120
|
this.raw.push({ flag: flag.name, input, type: 'flag' });
|
|
110
121
|
}
|
|
111
122
|
else {
|
|
@@ -129,7 +140,7 @@ class Parser {
|
|
|
129
140
|
parsingFlags = false;
|
|
130
141
|
continue;
|
|
131
142
|
}
|
|
132
|
-
if (parseFlag(input)) {
|
|
143
|
+
if (await parseFlag(input)) {
|
|
133
144
|
continue;
|
|
134
145
|
}
|
|
135
146
|
if (input === '--') {
|
|
@@ -183,7 +194,7 @@ class Parser {
|
|
|
183
194
|
args[token.arg] = parsed;
|
|
184
195
|
}
|
|
185
196
|
else if (!arg.ignoreStdin && !stdinRead) {
|
|
186
|
-
let stdin = await readStdin();
|
|
197
|
+
let stdin = await (0, exports.readStdin)();
|
|
187
198
|
if (stdin) {
|
|
188
199
|
stdin = stdin.trim();
|
|
189
200
|
const parsed = await arg.parse(stdin, ctx, arg);
|
|
@@ -257,7 +268,10 @@ class Parser {
|
|
|
257
268
|
return await flag.parse(input, ctx, flag);
|
|
258
269
|
}
|
|
259
270
|
catch (error) {
|
|
260
|
-
|
|
271
|
+
error.message = `Parsing --${flag.name} \n\t${error.message}\nSee more help with --help`;
|
|
272
|
+
if (cache_1.default.getInstance().get('exitCodes')?.failedFlagParsing)
|
|
273
|
+
error.oclif = { exit: cache_1.default.getInstance().get('exitCodes')?.failedFlagParsing };
|
|
274
|
+
throw error;
|
|
261
275
|
}
|
|
262
276
|
};
|
|
263
277
|
/* Could add a valueFunction (if there is a value/env/default) and could metadata.
|