@optique/core 1.0.0-dev.701 → 1.0.0-dev.717

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.
@@ -86,7 +86,7 @@ function dependency(parser) {
86
86
  return createSyncDerivedParser(id, options);
87
87
  },
88
88
  deriveAsync(options) {
89
- return createDerivedValueParser(id, parser, options);
89
+ return createAsyncDerivedParserFromAsyncFactory(id, options);
90
90
  }
91
91
  };
92
92
  return result;
@@ -212,8 +212,17 @@ function createSyncDerivedFromParser(sourceId, options) {
212
212
  [dependencyIds]: alldependencyIds,
213
213
  [defaultValues]: options.defaultValues,
214
214
  parse(input) {
215
- const sourceValues = options.defaultValues();
216
- const derivedParser = options.factory(...sourceValues);
215
+ let derivedParser;
216
+ try {
217
+ const sourceValues = options.defaultValues();
218
+ derivedParser = options.factory(...sourceValues);
219
+ } catch (e) {
220
+ const msg = e instanceof Error ? e.message : String(e);
221
+ return {
222
+ success: false,
223
+ error: require_message.message`Derived parser error: ${msg}`
224
+ };
225
+ }
217
226
  if (isAsyncModeParser(derivedParser)) return {
218
227
  success: false,
219
228
  error: require_message.message`Factory returned an async parser where a sync parser is required.`
@@ -277,9 +286,18 @@ function createAsyncDerivedFromParserFromAsyncFactory(sourceId, options) {
277
286
  [dependencyIds]: alldependencyIds,
278
287
  [defaultValues]: options.defaultValues,
279
288
  parse(input) {
280
- const sourceValues = options.defaultValues();
281
- const derivedParser = options.factory(...sourceValues);
282
- return derivedParser.parse(input);
289
+ let derivedParser;
290
+ try {
291
+ const sourceValues = options.defaultValues();
292
+ derivedParser = options.factory(...sourceValues);
293
+ } catch (e) {
294
+ const msg = e instanceof Error ? e.message : String(e);
295
+ return Promise.resolve({
296
+ success: false,
297
+ error: require_message.message`Derived parser error: ${msg}`
298
+ });
299
+ }
300
+ return Promise.resolve(derivedParser.parse(input));
283
301
  },
284
302
  [parseWithDependency](input, dependencyValue) {
285
303
  let derivedParser;
@@ -292,7 +310,7 @@ function createAsyncDerivedFromParserFromAsyncFactory(sourceId, options) {
292
310
  error: require_message.message`Factory error: ${msg}`
293
311
  });
294
312
  }
295
- return derivedParser.parse(input);
313
+ return Promise.resolve(derivedParser.parse(input));
296
314
  },
297
315
  format(value) {
298
316
  const sourceValues = options.defaultValues();
@@ -334,8 +352,17 @@ function createAsyncDerivedFromParserFromSyncFactory(sourceId, options) {
334
352
  [dependencyIds]: alldependencyIds,
335
353
  [defaultValues]: options.defaultValues,
336
354
  parse(input) {
337
- const sourceValues = options.defaultValues();
338
- const derivedParser = options.factory(...sourceValues);
355
+ let derivedParser;
356
+ try {
357
+ const sourceValues = options.defaultValues();
358
+ derivedParser = options.factory(...sourceValues);
359
+ } catch (e) {
360
+ const msg = e instanceof Error ? e.message : String(e);
361
+ return Promise.resolve({
362
+ success: false,
363
+ error: require_message.message`Derived parser error: ${msg}`
364
+ });
365
+ }
339
366
  return Promise.resolve(derivedParser.parse(input));
340
367
  },
341
368
  [parseWithDependency](input, dependencyValue) {
@@ -402,8 +429,17 @@ function createSyncDerivedParser(sourceId, options) {
402
429
  [derivedValueParserMarker]: true,
403
430
  [dependencyId]: sourceId,
404
431
  parse(input) {
405
- const sourceValue = options.defaultValue();
406
- const derivedParser = options.factory(sourceValue);
432
+ let derivedParser;
433
+ try {
434
+ const sourceValue = options.defaultValue();
435
+ derivedParser = options.factory(sourceValue);
436
+ } catch (e) {
437
+ const msg = e instanceof Error ? e.message : String(e);
438
+ return {
439
+ success: false,
440
+ error: require_message.message`Derived parser error: ${msg}`
441
+ };
442
+ }
407
443
  if (isAsyncModeParser(derivedParser)) return {
408
444
  success: false,
409
445
  error: require_message.message`Factory returned an async parser where a sync parser is required.`
@@ -463,9 +499,18 @@ function createAsyncDerivedParserFromAsyncFactory(sourceId, options) {
463
499
  [derivedValueParserMarker]: true,
464
500
  [dependencyId]: sourceId,
465
501
  parse(input) {
466
- const sourceValue = options.defaultValue();
467
- const derivedParser = options.factory(sourceValue);
468
- return derivedParser.parse(input);
502
+ let derivedParser;
503
+ try {
504
+ const sourceValue = options.defaultValue();
505
+ derivedParser = options.factory(sourceValue);
506
+ } catch (e) {
507
+ const msg = e instanceof Error ? e.message : String(e);
508
+ return Promise.resolve({
509
+ success: false,
510
+ error: require_message.message`Derived parser error: ${msg}`
511
+ });
512
+ }
513
+ return Promise.resolve(derivedParser.parse(input));
469
514
  },
470
515
  [parseWithDependency](input, dependencyValue) {
471
516
  let derivedParser;
@@ -478,7 +523,7 @@ function createAsyncDerivedParserFromAsyncFactory(sourceId, options) {
478
523
  error: require_message.message`Factory error: ${msg}`
479
524
  });
480
525
  }
481
- return derivedParser.parse(input);
526
+ return Promise.resolve(derivedParser.parse(input));
482
527
  },
483
528
  format(value) {
484
529
  const sourceValue = options.defaultValue();
@@ -516,8 +561,17 @@ function createAsyncDerivedParserFromSyncFactory(sourceId, options) {
516
561
  [derivedValueParserMarker]: true,
517
562
  [dependencyId]: sourceId,
518
563
  parse(input) {
519
- const sourceValue = options.defaultValue();
520
- const derivedParser = options.factory(sourceValue);
564
+ let derivedParser;
565
+ try {
566
+ const sourceValue = options.defaultValue();
567
+ derivedParser = options.factory(sourceValue);
568
+ } catch (e) {
569
+ const msg = e instanceof Error ? e.message : String(e);
570
+ return Promise.resolve({
571
+ success: false,
572
+ error: require_message.message`Derived parser error: ${msg}`
573
+ });
574
+ }
521
575
  return Promise.resolve(derivedParser.parse(input));
522
576
  },
523
577
  [parseWithDependency](input, dependencyValue) {
@@ -86,7 +86,7 @@ function dependency(parser) {
86
86
  return createSyncDerivedParser(id, options);
87
87
  },
88
88
  deriveAsync(options) {
89
- return createDerivedValueParser(id, parser, options);
89
+ return createAsyncDerivedParserFromAsyncFactory(id, options);
90
90
  }
91
91
  };
92
92
  return result;
@@ -212,8 +212,17 @@ function createSyncDerivedFromParser(sourceId, options) {
212
212
  [dependencyIds]: alldependencyIds,
213
213
  [defaultValues]: options.defaultValues,
214
214
  parse(input) {
215
- const sourceValues = options.defaultValues();
216
- const derivedParser = options.factory(...sourceValues);
215
+ let derivedParser;
216
+ try {
217
+ const sourceValues = options.defaultValues();
218
+ derivedParser = options.factory(...sourceValues);
219
+ } catch (e) {
220
+ const msg = e instanceof Error ? e.message : String(e);
221
+ return {
222
+ success: false,
223
+ error: message`Derived parser error: ${msg}`
224
+ };
225
+ }
217
226
  if (isAsyncModeParser(derivedParser)) return {
218
227
  success: false,
219
228
  error: message`Factory returned an async parser where a sync parser is required.`
@@ -277,9 +286,18 @@ function createAsyncDerivedFromParserFromAsyncFactory(sourceId, options) {
277
286
  [dependencyIds]: alldependencyIds,
278
287
  [defaultValues]: options.defaultValues,
279
288
  parse(input) {
280
- const sourceValues = options.defaultValues();
281
- const derivedParser = options.factory(...sourceValues);
282
- return derivedParser.parse(input);
289
+ let derivedParser;
290
+ try {
291
+ const sourceValues = options.defaultValues();
292
+ derivedParser = options.factory(...sourceValues);
293
+ } catch (e) {
294
+ const msg = e instanceof Error ? e.message : String(e);
295
+ return Promise.resolve({
296
+ success: false,
297
+ error: message`Derived parser error: ${msg}`
298
+ });
299
+ }
300
+ return Promise.resolve(derivedParser.parse(input));
283
301
  },
284
302
  [parseWithDependency](input, dependencyValue) {
285
303
  let derivedParser;
@@ -292,7 +310,7 @@ function createAsyncDerivedFromParserFromAsyncFactory(sourceId, options) {
292
310
  error: message`Factory error: ${msg}`
293
311
  });
294
312
  }
295
- return derivedParser.parse(input);
313
+ return Promise.resolve(derivedParser.parse(input));
296
314
  },
297
315
  format(value) {
298
316
  const sourceValues = options.defaultValues();
@@ -334,8 +352,17 @@ function createAsyncDerivedFromParserFromSyncFactory(sourceId, options) {
334
352
  [dependencyIds]: alldependencyIds,
335
353
  [defaultValues]: options.defaultValues,
336
354
  parse(input) {
337
- const sourceValues = options.defaultValues();
338
- const derivedParser = options.factory(...sourceValues);
355
+ let derivedParser;
356
+ try {
357
+ const sourceValues = options.defaultValues();
358
+ derivedParser = options.factory(...sourceValues);
359
+ } catch (e) {
360
+ const msg = e instanceof Error ? e.message : String(e);
361
+ return Promise.resolve({
362
+ success: false,
363
+ error: message`Derived parser error: ${msg}`
364
+ });
365
+ }
339
366
  return Promise.resolve(derivedParser.parse(input));
340
367
  },
341
368
  [parseWithDependency](input, dependencyValue) {
@@ -402,8 +429,17 @@ function createSyncDerivedParser(sourceId, options) {
402
429
  [derivedValueParserMarker]: true,
403
430
  [dependencyId]: sourceId,
404
431
  parse(input) {
405
- const sourceValue = options.defaultValue();
406
- const derivedParser = options.factory(sourceValue);
432
+ let derivedParser;
433
+ try {
434
+ const sourceValue = options.defaultValue();
435
+ derivedParser = options.factory(sourceValue);
436
+ } catch (e) {
437
+ const msg = e instanceof Error ? e.message : String(e);
438
+ return {
439
+ success: false,
440
+ error: message`Derived parser error: ${msg}`
441
+ };
442
+ }
407
443
  if (isAsyncModeParser(derivedParser)) return {
408
444
  success: false,
409
445
  error: message`Factory returned an async parser where a sync parser is required.`
@@ -463,9 +499,18 @@ function createAsyncDerivedParserFromAsyncFactory(sourceId, options) {
463
499
  [derivedValueParserMarker]: true,
464
500
  [dependencyId]: sourceId,
465
501
  parse(input) {
466
- const sourceValue = options.defaultValue();
467
- const derivedParser = options.factory(sourceValue);
468
- return derivedParser.parse(input);
502
+ let derivedParser;
503
+ try {
504
+ const sourceValue = options.defaultValue();
505
+ derivedParser = options.factory(sourceValue);
506
+ } catch (e) {
507
+ const msg = e instanceof Error ? e.message : String(e);
508
+ return Promise.resolve({
509
+ success: false,
510
+ error: message`Derived parser error: ${msg}`
511
+ });
512
+ }
513
+ return Promise.resolve(derivedParser.parse(input));
469
514
  },
470
515
  [parseWithDependency](input, dependencyValue) {
471
516
  let derivedParser;
@@ -478,7 +523,7 @@ function createAsyncDerivedParserFromAsyncFactory(sourceId, options) {
478
523
  error: message`Factory error: ${msg}`
479
524
  });
480
525
  }
481
- return derivedParser.parse(input);
526
+ return Promise.resolve(derivedParser.parse(input));
482
527
  },
483
528
  format(value) {
484
529
  const sourceValue = options.defaultValue();
@@ -516,8 +561,17 @@ function createAsyncDerivedParserFromSyncFactory(sourceId, options) {
516
561
  [derivedValueParserMarker]: true,
517
562
  [dependencyId]: sourceId,
518
563
  parse(input) {
519
- const sourceValue = options.defaultValue();
520
- const derivedParser = options.factory(sourceValue);
564
+ let derivedParser;
565
+ try {
566
+ const sourceValue = options.defaultValue();
567
+ derivedParser = options.factory(sourceValue);
568
+ } catch (e) {
569
+ const msg = e instanceof Error ? e.message : String(e);
570
+ return Promise.resolve({
571
+ success: false,
572
+ error: message`Derived parser error: ${msg}`
573
+ });
574
+ }
521
575
  return Promise.resolve(derivedParser.parse(input));
522
576
  },
523
577
  [parseWithDependency](input, dependencyValue) {
@@ -308,6 +308,15 @@ function integer(options) {
308
308
  }
309
309
  const metavar = options?.metavar ?? "INTEGER";
310
310
  require_nonempty.ensureNonEmptyString(metavar);
311
+ const maxSafe = BigInt(Number.MAX_SAFE_INTEGER);
312
+ const minSafe = BigInt(Number.MIN_SAFE_INTEGER);
313
+ const unsafeIntegerError = options?.errors?.unsafeInteger;
314
+ function makeUnsafeIntegerError(input) {
315
+ return {
316
+ success: false,
317
+ error: unsafeIntegerError ? typeof unsafeIntegerError === "function" ? unsafeIntegerError(input) : unsafeIntegerError : require_message.message`Expected a safe integer between ${require_message.text(Number.MIN_SAFE_INTEGER.toLocaleString("en"))} and ${require_message.text(Number.MAX_SAFE_INTEGER.toLocaleString("en"))}, but got ${input}. Use type: "bigint" for large values.`
318
+ };
319
+ }
311
320
  return {
312
321
  $mode: "sync",
313
322
  metavar,
@@ -316,7 +325,14 @@ function integer(options) {
316
325
  success: false,
317
326
  error: options?.errors?.invalidInteger ? typeof options.errors.invalidInteger === "function" ? options.errors.invalidInteger(input) : options.errors.invalidInteger : require_message.message`Expected a valid integer, but got ${input}.`
318
327
  };
319
- const value = Number.parseInt(input);
328
+ let n;
329
+ try {
330
+ n = BigInt(input);
331
+ } catch {
332
+ return makeUnsafeIntegerError(input);
333
+ }
334
+ if (n > maxSafe || n < minSafe) return makeUnsafeIntegerError(input);
335
+ const value = Number(input);
320
336
  if (options?.min != null && value < options.min) return {
321
337
  success: false,
322
338
  error: options.errors?.belowMinimum ? typeof options.errors.belowMinimum === "function" ? options.errors.belowMinimum(value, options.min) : options.errors.belowMinimum : require_message.message`Expected a value greater than or equal to ${require_message.text(options.min.toLocaleString("en"))}, but got ${input}.`
@@ -279,6 +279,13 @@ interface IntegerOptionsNumber {
279
279
  * @since 0.5.0
280
280
  */
281
281
  invalidInteger?: Message | ((input: string) => Message);
282
+ /**
283
+ * Custom error message when integer is outside the safe integer range
284
+ * (`Number.MIN_SAFE_INTEGER` to `Number.MAX_SAFE_INTEGER`).
285
+ * Can be a static message or a function that receives the input string.
286
+ * @since 1.0.0
287
+ */
288
+ unsafeInteger?: Message | ((input: string) => Message);
282
289
  /**
283
290
  * Custom error message when integer is below minimum value.
284
291
  * Can be a static message or a function that receives the value and minimum.
@@ -279,6 +279,13 @@ interface IntegerOptionsNumber {
279
279
  * @since 0.5.0
280
280
  */
281
281
  invalidInteger?: Message | ((input: string) => Message);
282
+ /**
283
+ * Custom error message when integer is outside the safe integer range
284
+ * (`Number.MIN_SAFE_INTEGER` to `Number.MAX_SAFE_INTEGER`).
285
+ * Can be a static message or a function that receives the input string.
286
+ * @since 1.0.0
287
+ */
288
+ unsafeInteger?: Message | ((input: string) => Message);
282
289
  /**
283
290
  * Custom error message when integer is below minimum value.
284
291
  * Can be a static message or a function that receives the value and minimum.
@@ -308,6 +308,15 @@ function integer(options) {
308
308
  }
309
309
  const metavar = options?.metavar ?? "INTEGER";
310
310
  ensureNonEmptyString(metavar);
311
+ const maxSafe = BigInt(Number.MAX_SAFE_INTEGER);
312
+ const minSafe = BigInt(Number.MIN_SAFE_INTEGER);
313
+ const unsafeIntegerError = options?.errors?.unsafeInteger;
314
+ function makeUnsafeIntegerError(input) {
315
+ return {
316
+ success: false,
317
+ error: unsafeIntegerError ? typeof unsafeIntegerError === "function" ? unsafeIntegerError(input) : unsafeIntegerError : message`Expected a safe integer between ${text(Number.MIN_SAFE_INTEGER.toLocaleString("en"))} and ${text(Number.MAX_SAFE_INTEGER.toLocaleString("en"))}, but got ${input}. Use type: "bigint" for large values.`
318
+ };
319
+ }
311
320
  return {
312
321
  $mode: "sync",
313
322
  metavar,
@@ -316,7 +325,14 @@ function integer(options) {
316
325
  success: false,
317
326
  error: options?.errors?.invalidInteger ? typeof options.errors.invalidInteger === "function" ? options.errors.invalidInteger(input) : options.errors.invalidInteger : message`Expected a valid integer, but got ${input}.`
318
327
  };
319
- const value = Number.parseInt(input);
328
+ let n;
329
+ try {
330
+ n = BigInt(input);
331
+ } catch {
332
+ return makeUnsafeIntegerError(input);
333
+ }
334
+ if (n > maxSafe || n < minSafe) return makeUnsafeIntegerError(input);
335
+ const value = Number(input);
320
336
  if (options?.min != null && value < options.min) return {
321
337
  success: false,
322
338
  error: options.errors?.belowMinimum ? typeof options.errors.belowMinimum === "function" ? options.errors.belowMinimum(value, options.min) : options.errors.belowMinimum : message`Expected a value greater than or equal to ${text(options.min.toLocaleString("en"))}, but got ${input}.`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optique/core",
3
- "version": "1.0.0-dev.701+138e5e73",
3
+ "version": "1.0.0-dev.717+e59d286e",
4
4
  "description": "Type-safe combinatorial command-line interface parser",
5
5
  "keywords": [
6
6
  "CLI",