@@ -220,23 +220,35 @@ function readOptionalNonNegativeIntEnv(name) {
|
220 | 220 | } |
221 | 221 | |
222 | 222 | function parsePositiveInt(raw, label) { |
223 | | -const value = Number(raw); |
224 | | -if (!Number.isInteger(value) || value < 1) { |
| 223 | +const text = String(raw).trim(); |
| 224 | +if (!/^\d+$/u.test(text)) { |
| 225 | +throw new Error(`${label} must be a positive integer`); |
| 226 | +} |
| 227 | +const value = Number(text); |
| 228 | +if (!Number.isSafeInteger(value) || value < 1) { |
225 | 229 | throw new Error(`${label} must be a positive integer`); |
226 | 230 | } |
227 | 231 | return value; |
228 | 232 | } |
229 | 233 | |
230 | 234 | function parseNonNegativeInt(raw, label) { |
231 | | -const value = Number(raw); |
232 | | -if (!Number.isInteger(value) || value < 0) { |
| 235 | +const text = String(raw).trim(); |
| 236 | +if (!/^\d+$/u.test(text)) { |
| 237 | +throw new Error(`${label} must be a non-negative integer`); |
| 238 | +} |
| 239 | +const value = Number(text); |
| 240 | +if (!Number.isSafeInteger(value) || value < 0) { |
233 | 241 | throw new Error(`${label} must be a non-negative integer`); |
234 | 242 | } |
235 | 243 | return value; |
236 | 244 | } |
237 | 245 | |
238 | 246 | function parsePositiveNumber(raw, label) { |
239 | | -const value = Number(raw); |
| 247 | +const text = String(raw).trim(); |
| 248 | +if (!/^(?:\d+(?:\.\d+)?|\.\d+)$/u.test(text)) { |
| 249 | +throw new Error(`${label} must be a positive number`); |
| 250 | +} |
| 251 | +const value = Number(text); |
240 | 252 | if (!Number.isFinite(value) || value <= 0) { |
241 | 253 | throw new Error(`${label} must be a positive number`); |
242 | 254 | } |
|