




























@@ -20,46 +20,116 @@ export function readFlagValue(args, name) {
2020return undefined;
2121}
222223-function consumeStringFlag(argv, index, flag, currentValue) {
23+function consumeStringFlag(argv, index, flag) {
24+const inlineValue = readInlineFlagValue(argv[index], flag);
25+if (inlineValue !== null) {
26+if (!inlineValue) {
27+throw new Error(`${flag} requires a value`);
28+}
29+return {
30+nextIndex: index,
31+value: inlineValue,
32+};
33+}
2434if (argv[index] !== flag) {
2535return null;
2636}
37+const value = argv[index + 1];
38+if (!value || value.startsWith("--")) {
39+throw new Error(`${flag} requires a value`);
40+}
2741return {
2842nextIndex: index + 1,
29-value: argv[index + 1] ?? currentValue,
43+ value,
3044};
3145}
324633-function consumeIntFlag(argv, index, flag, currentValue, options = {}) {
34-if (argv[index] !== flag) {
47+function consumeIntFlag(argv, index, flag, options = {}) {
48+const raw = readFlagOptionValue(argv, index, flag);
49+if (!raw) {
3550return null;
3651}
37-const parsed = Number.parseInt(argv[index + 1] ?? "", 10);
52+const parsed = parseIntegerFlagValue(raw.value, flag);
3853const min = options.min ?? Number.NEGATIVE_INFINITY;
54+if (parsed < min) {
55+throw new Error(`${flag} must be at least ${min}`);
56+}
3957return {
40-nextIndex: index + 1,
41-value: Number.isFinite(parsed) && parsed >= min ? parsed : currentValue,
58+nextIndex: raw.nextIndex,
59+value: parsed,
4260};
4361}
446245-function consumeFloatFlag(argv, index, flag, currentValue, options = {}) {
46-if (argv[index] !== flag) {
63+function consumeFloatFlag(argv, index, flag, options = {}) {
64+const raw = readFlagOptionValue(argv, index, flag);
65+if (!raw) {
4766return null;
4867}
49-const parsed = Number.parseFloat(argv[index + 1] ?? "");
68+const parsed = parseFloatFlagValue(raw.value, flag);
5069const min = options.min ?? Number.NEGATIVE_INFINITY;
5170const includeMin = options.includeMin ?? true;
5271const isValid = Number.isFinite(parsed) && (includeMin ? parsed >= min : parsed > min);
72+if (!isValid) {
73+const comparator = includeMin ? "at least" : "greater than";
74+throw new Error(`${flag} must be ${comparator} ${min}`);
75+}
5376return {
54-nextIndex: index + 1,
55-value: isValid ? parsed : currentValue,
77+nextIndex: raw.nextIndex,
78+value: parsed,
5679};
5780}
588182+function readInlineFlagValue(arg, flag) {
83+const prefix = `${flag}=`;
84+return arg.startsWith(prefix) ? arg.slice(prefix.length) : null;
85+}
86+87+function readFlagOptionValue(argv, index, flag) {
88+const inlineValue = readInlineFlagValue(argv[index], flag);
89+if (inlineValue !== null) {
90+if (!inlineValue) {
91+throw new Error(`${flag} requires a value`);
92+}
93+return { nextIndex: index, value: inlineValue };
94+}
95+if (argv[index] !== flag) {
96+return null;
97+}
98+const value = argv[index + 1];
99+if (!value) {
100+throw new Error(`${flag} requires a value`);
101+}
102+return { nextIndex: index + 1, value };
103+}
104+105+function parseIntegerFlagValue(raw, flag) {
106+const text = String(raw).trim();
107+if (!/^-?\d+$/u.test(text)) {
108+throw new Error(`${flag} must be an integer`);
109+}
110+const parsed = Number(text);
111+if (!Number.isSafeInteger(parsed)) {
112+throw new Error(`${flag} must be a safe integer`);
113+}
114+return parsed;
115+}
116+117+function parseFloatFlagValue(raw, flag) {
118+const text = String(raw).trim();
119+if (!/^-?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(text)) {
120+throw new Error(`${flag} must be a number`);
121+}
122+const parsed = Number(text);
123+if (!Number.isFinite(parsed)) {
124+throw new Error(`${flag} must be a finite number`);
125+}
126+return parsed;
127+}
128+59129export function stringFlag(flag, key) {
60130return {
61-consume(argv, index, args) {
62-const option = consumeStringFlag(argv, index, flag, args[key]);
131+consume(argv, index) {
132+const option = consumeStringFlag(argv, index, flag);
63133if (!option) {
64134return null;
65135}
@@ -91,15 +161,15 @@ function createAssignedValueFlag(consumeOption) {
91161}
9216293163export function intFlag(flag, key, options) {
94-return createAssignedValueFlag((argv, index, args) => {
95-const option = consumeIntFlag(argv, index, flag, args[key], options);
164+return createAssignedValueFlag((argv, index) => {
165+const option = consumeIntFlag(argv, index, flag, options);
96166return option ? { ...option, key } : null;
97167});
98168}
99169100170export function floatFlag(flag, key, options) {
101-return createAssignedValueFlag((argv, index, args) => {
102-const option = consumeFloatFlag(argv, index, flag, args[key], options);
171+return createAssignedValueFlag((argv, index) => {
172+const option = consumeFloatFlag(argv, index, flag, options);
103173return option ? { ...option, key } : null;
104174});
105175}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。