
























@@ -143,7 +143,9 @@ export function stringFlag(flag, key, options = {}) {
143143return null;
144144}
145145return {
146+ flag,
146147nextIndex: option.nextIndex,
148+repeatable: false,
147149apply(target) {
148150target[key] = option.value;
149151},
@@ -161,7 +163,9 @@ export function stringListFlag(flag, key, options = {}) {
161163return null;
162164}
163165return {
166+ flag,
164167nextIndex: option.nextIndex,
168+repeatable: true,
165169apply(target) {
166170target[key] ??= [];
167171target[key].push(option.value);
@@ -171,15 +175,17 @@ export function stringListFlag(flag, key, options = {}) {
171175};
172176}
173177174-function createAssignedValueFlag(consumeOption) {
178+function createAssignedValueFlag(flag, consumeOption) {
175179return {
176180consume(argv, index, args) {
177181const option = consumeOption(argv, index, args);
178182if (!option) {
179183return null;
180184}
181185return {
186+ flag,
182187nextIndex: option.nextIndex,
188+repeatable: false,
183189apply(target) {
184190target[option.key] = option.value;
185191},
@@ -190,15 +196,15 @@ function createAssignedValueFlag(consumeOption) {
190196191197/** Create a flag spec that parses and assigns a safe integer value. */
192198export function intFlag(flag, key, options) {
193-return createAssignedValueFlag((argv, index) => {
199+return createAssignedValueFlag(flag, (argv, index) => {
194200const option = consumeIntFlag(argv, index, flag, options);
195201return option ? { ...option, key } : null;
196202});
197203}
198204199205/** Create a flag spec that parses and assigns a finite floating-point value. */
200206export function floatFlag(flag, key, options) {
201-return createAssignedValueFlag((argv, index) => {
207+return createAssignedValueFlag(flag, (argv, index) => {
202208const option = consumeFloatFlag(argv, index, flag, options);
203209return option ? { ...option, key } : null;
204210});
@@ -212,7 +218,9 @@ export function booleanFlag(flag, key, value = true) {
212218return null;
213219}
214220return {
221+ flag,
215222nextIndex: index,
223+repeatable: false,
216224apply(target) {
217225target[key] = value;
218226},
@@ -224,6 +232,7 @@ export function booleanFlag(flag, key, value = true) {
224232/** Apply flag specs to argv and return the mutated parsed args object. */
225233export function parseFlagArgs(argv, args, specs, options = {}) {
226234const ignoreDoubleDash = options.ignoreDoubleDash ?? true;
235+const seenFlags = new Set();
227236for (let i = 0; i < argv.length; i += 1) {
228237const arg = argv[i];
229238if (arg === "--" && ignoreDoubleDash) {
@@ -235,6 +244,15 @@ export function parseFlagArgs(argv, args, specs, options = {}) {
235244if (!option) {
236245continue;
237246}
247+if (typeof option.flag !== "string" || !option.flag) {
248+throw new Error("parseFlagArgs specs must declare a flag for consumed options");
249+}
250+if (option.repeatable !== true) {
251+if (seenFlags.has(option.flag)) {
252+throw new Error(`${option.flag} was provided more than once`);
253+}
254+seenFlags.add(option.flag);
255+}
238256option.apply(args);
239257i = option.nextIndex;
240258handled = true;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。