@optique/core 1.0.0-dev.1616 → 1.0.0-dev.1658

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.
@@ -35,14 +35,21 @@ const defaultValues = Symbol.for("@optique/core/dependency/defaultValues");
35
35
  /**
36
36
  * A unique symbol used to store the single default value thunk on derived
37
37
  * parsers created by {@link DependencySource.derive}. Unlike
38
- * {@link defaultValues} (which `createDeferredParseState` reads eagerly),
39
- * this symbol is only read by the dependency-metadata bridge so that
38
+ * {@link defaultValues} (which `createDeferredParseState` only falls back to
39
+ * when no parse-time snapshot is available), this symbol is only read by the
40
+ * dependency-metadata bridge so that
40
41
  * single-source defaults are accessible without double evaluation.
41
42
  * @internal
42
- * @since 1.0.0
43
43
  */
44
44
  const singleDefaultValue = Symbol.for("@optique/core/dependency/singleDefaultValue");
45
45
  /**
46
+ * A unique symbol used to store the snapshotted default dependency values on
47
+ * a parse result produced by a derived parser's default path.
48
+ *
49
+ * @internal
50
+ */
51
+ const defaultDependencyValueSnapshot = Symbol.for("@optique/core/dependency/defaultDependencyValueSnapshot");
52
+ /**
46
53
  * A unique symbol used to access the parseWithDependency method on derived parsers.
47
54
  * @since 0.10.0
48
55
  */
@@ -228,6 +235,52 @@ function normalizeWithDerivedParser(value, getParser) {
228
235
  }
229
236
  return value;
230
237
  }
238
+ /**
239
+ * Attaches a default dependency snapshot to a derived parser's parse result.
240
+ *
241
+ * @param result The parse result to annotate.
242
+ * @param values The dependency values used for the default-path parse.
243
+ * @returns A cloned parse result with an internal snapshot attached.
244
+ * @internal
245
+ */
246
+ function snapshotDefaultDependencyValues(result, values) {
247
+ const snapshot = getSnapshottedDefaultDependencyValues(result) ?? values;
248
+ return attachDefaultDependencySnapshot(result, snapshot);
249
+ }
250
+ function attachDefaultDependencySnapshot(result, values) {
251
+ const annotated = Object.create(Object.getPrototypeOf(result), Object.getOwnPropertyDescriptors(result));
252
+ Object.defineProperty(annotated, defaultDependencyValueSnapshot, {
253
+ value: [...values],
254
+ configurable: true,
255
+ enumerable: false
256
+ });
257
+ return annotated;
258
+ }
259
+ /**
260
+ * Reads the snapshotted default dependency values from a parse result.
261
+ *
262
+ * @param result The parse result to inspect.
263
+ * @returns The snapshotted dependency values, if present.
264
+ * @internal
265
+ */
266
+ function getSnapshottedDefaultDependencyValues(result) {
267
+ return result[defaultDependencyValueSnapshot];
268
+ }
269
+ async function parseDerivedResultAsync(parser, input) {
270
+ return await parser.parse(input);
271
+ }
272
+ function parseDerivedResultSync(parser, input) {
273
+ const result = parser.parse(input);
274
+ if (isPromiseLike(result)) throw new TypeError("Sync derived parser parse() returned a promise-like result. Use an async derived parser instead.");
275
+ return result;
276
+ }
277
+ function isPromiseLike(value) {
278
+ return value != null && (typeof value === "object" || typeof value === "function") && "then" in value && typeof value.then === "function";
279
+ }
280
+ async function parseDerivedResultWithSnapshotAsync(parser, input, sourceValues) {
281
+ const snapshot = [...sourceValues];
282
+ return attachDefaultDependencySnapshot(await parseDerivedResultAsync(parser, input), snapshot);
283
+ }
231
284
  function createSyncDerivedFromParser(sourceId, options) {
232
285
  const alldependencyIds = options.dependencies.map((dep) => dep[dependencyId]);
233
286
  return {
@@ -246,21 +299,27 @@ function createSyncDerivedFromParser(sourceId, options) {
246
299
  [defaultValues]: options.defaultValues,
247
300
  parse(input) {
248
301
  let derivedParser;
302
+ let sourceValues;
249
303
  try {
250
- const sourceValues = options.defaultValues();
304
+ sourceValues = options.defaultValues();
251
305
  derivedParser = options.factory(...sourceValues);
252
306
  } catch (e) {
253
307
  const msg = e instanceof Error ? e.message : String(e);
254
- return {
308
+ const failure = {
255
309
  success: false,
256
310
  error: require_message.message`Derived parser error: ${msg}`
257
311
  };
312
+ return sourceValues == null ? failure : snapshotDefaultDependencyValues(failure, sourceValues);
258
313
  }
259
- if (isAsyncModeParser(derivedParser)) return {
260
- success: false,
261
- error: require_message.message`Factory returned an async parser where a sync parser is required.`
262
- };
263
- return derivedParser.parse(input);
314
+ if (isAsyncModeParser(derivedParser)) {
315
+ const failure = {
316
+ success: false,
317
+ error: require_message.message`Factory returned an async parser where a sync parser is required.`
318
+ };
319
+ return sourceValues == null ? failure : snapshotDefaultDependencyValues(failure, sourceValues);
320
+ }
321
+ const snapshot = [...sourceValues];
322
+ return attachDefaultDependencySnapshot(parseDerivedResultSync(derivedParser, input), snapshot);
264
323
  },
265
324
  [parseWithDependency](input, dependencyValue) {
266
325
  let derivedParser;
@@ -273,11 +332,14 @@ function createSyncDerivedFromParser(sourceId, options) {
273
332
  error: require_message.message`Factory error: ${msg}`
274
333
  };
275
334
  }
276
- if (isAsyncModeParser(derivedParser)) return {
277
- success: false,
278
- error: require_message.message`Factory returned an async parser where a sync parser is required.`
279
- };
280
- return derivedParser.parse(input);
335
+ if (isAsyncModeParser(derivedParser)) {
336
+ const failure = {
337
+ success: false,
338
+ error: require_message.message`Factory returned an async parser where a sync parser is required.`
339
+ };
340
+ return failure;
341
+ }
342
+ return parseDerivedResultSync(derivedParser, input);
281
343
  },
282
344
  format(value) {
283
345
  let derivedParser;
@@ -340,32 +402,34 @@ function createAsyncDerivedFromParserFromAsyncFactory(sourceId, options) {
340
402
  [dependencyId]: sourceId,
341
403
  [dependencyIds]: alldependencyIds,
342
404
  [defaultValues]: options.defaultValues,
343
- parse(input) {
405
+ async parse(input) {
344
406
  let derivedParser;
407
+ let sourceValues;
345
408
  try {
346
- const sourceValues = options.defaultValues();
409
+ sourceValues = options.defaultValues();
347
410
  derivedParser = options.factory(...sourceValues);
348
411
  } catch (e) {
349
412
  const msg = e instanceof Error ? e.message : String(e);
350
- return Promise.resolve({
413
+ const failure = {
351
414
  success: false,
352
415
  error: require_message.message`Derived parser error: ${msg}`
353
- });
416
+ };
417
+ return sourceValues == null ? failure : snapshotDefaultDependencyValues(failure, sourceValues);
354
418
  }
355
- return Promise.resolve(derivedParser.parse(input));
419
+ return await parseDerivedResultWithSnapshotAsync(derivedParser, input, sourceValues);
356
420
  },
357
- [parseWithDependency](input, dependencyValue) {
421
+ async [parseWithDependency](input, dependencyValue) {
358
422
  let derivedParser;
359
423
  try {
360
424
  derivedParser = options.factory(...dependencyValue);
361
425
  } catch (e) {
362
426
  const msg = e instanceof Error ? e.message : String(e);
363
- return Promise.resolve({
427
+ return {
364
428
  success: false,
365
429
  error: require_message.message`Factory error: ${msg}`
366
- });
430
+ };
367
431
  }
368
- return Promise.resolve(derivedParser.parse(input));
432
+ return await parseDerivedResultAsync(derivedParser, input);
369
433
  },
370
434
  format(value) {
371
435
  let derivedParser;
@@ -426,32 +490,34 @@ function createAsyncDerivedFromParserFromSyncFactory(sourceId, options) {
426
490
  [dependencyId]: sourceId,
427
491
  [dependencyIds]: alldependencyIds,
428
492
  [defaultValues]: options.defaultValues,
429
- parse(input) {
493
+ async parse(input) {
430
494
  let derivedParser;
495
+ let sourceValues;
431
496
  try {
432
- const sourceValues = options.defaultValues();
497
+ sourceValues = options.defaultValues();
433
498
  derivedParser = options.factory(...sourceValues);
434
499
  } catch (e) {
435
500
  const msg = e instanceof Error ? e.message : String(e);
436
- return Promise.resolve({
501
+ const failure = {
437
502
  success: false,
438
503
  error: require_message.message`Derived parser error: ${msg}`
439
- });
504
+ };
505
+ return sourceValues == null ? failure : snapshotDefaultDependencyValues(failure, sourceValues);
440
506
  }
441
- return Promise.resolve(derivedParser.parse(input));
507
+ return await parseDerivedResultWithSnapshotAsync(derivedParser, input, sourceValues);
442
508
  },
443
- [parseWithDependency](input, dependencyValue) {
509
+ async [parseWithDependency](input, dependencyValue) {
444
510
  let derivedParser;
445
511
  try {
446
512
  derivedParser = options.factory(...dependencyValue);
447
513
  } catch (e) {
448
514
  const msg = e instanceof Error ? e.message : String(e);
449
- return Promise.resolve({
515
+ return {
450
516
  success: false,
451
517
  error: require_message.message`Factory error: ${msg}`
452
- });
518
+ };
453
519
  }
454
- return Promise.resolve(derivedParser.parse(input));
520
+ return await parseDerivedResultAsync(derivedParser, input);
455
521
  },
456
522
  format(value) {
457
523
  let derivedParser;
@@ -517,21 +583,28 @@ function createSyncDerivedParser(sourceId, options) {
517
583
  [singleDefaultValue]: options.defaultValue,
518
584
  parse(input) {
519
585
  let derivedParser;
586
+ let hasSourceValue = false;
587
+ let sourceValue;
520
588
  try {
521
- const sourceValue = options.defaultValue();
589
+ sourceValue = options.defaultValue();
590
+ hasSourceValue = true;
522
591
  derivedParser = options.factory(sourceValue);
523
592
  } catch (e) {
524
593
  const msg = e instanceof Error ? e.message : String(e);
525
- return {
594
+ const failure = {
526
595
  success: false,
527
596
  error: require_message.message`Derived parser error: ${msg}`
528
597
  };
598
+ return hasSourceValue ? snapshotDefaultDependencyValues(failure, [sourceValue]) : failure;
529
599
  }
530
- if (isAsyncModeParser(derivedParser)) return {
531
- success: false,
532
- error: require_message.message`Factory returned an async parser where a sync parser is required.`
533
- };
534
- return derivedParser.parse(input);
600
+ if (isAsyncModeParser(derivedParser)) {
601
+ const failure = {
602
+ success: false,
603
+ error: require_message.message`Factory returned an async parser where a sync parser is required.`
604
+ };
605
+ return hasSourceValue ? snapshotDefaultDependencyValues(failure, [sourceValue]) : failure;
606
+ }
607
+ return attachDefaultDependencySnapshot(parseDerivedResultSync(derivedParser, input), [sourceValue]);
535
608
  },
536
609
  [parseWithDependency](input, dependencyValue) {
537
610
  let derivedParser;
@@ -548,7 +621,7 @@ function createSyncDerivedParser(sourceId, options) {
548
621
  success: false,
549
622
  error: require_message.message`Factory returned an async parser where a sync parser is required.`
550
623
  };
551
- return derivedParser.parse(input);
624
+ return parseDerivedResultSync(derivedParser, input);
552
625
  },
553
626
  format(value) {
554
627
  let derivedParser;
@@ -608,32 +681,36 @@ function createAsyncDerivedParserFromAsyncFactory(sourceId, options) {
608
681
  [derivedValueParserMarker]: true,
609
682
  [dependencyId]: sourceId,
610
683
  [singleDefaultValue]: options.defaultValue,
611
- parse(input) {
684
+ async parse(input) {
612
685
  let derivedParser;
686
+ let hasSourceValue = false;
687
+ let sourceValue;
613
688
  try {
614
- const sourceValue = options.defaultValue();
689
+ sourceValue = options.defaultValue();
690
+ hasSourceValue = true;
615
691
  derivedParser = options.factory(sourceValue);
616
692
  } catch (e) {
617
693
  const msg = e instanceof Error ? e.message : String(e);
618
- return Promise.resolve({
694
+ const failure = {
619
695
  success: false,
620
696
  error: require_message.message`Derived parser error: ${msg}`
621
- });
697
+ };
698
+ return hasSourceValue ? snapshotDefaultDependencyValues(failure, [sourceValue]) : failure;
622
699
  }
623
- return Promise.resolve(derivedParser.parse(input));
700
+ return await parseDerivedResultWithSnapshotAsync(derivedParser, input, [sourceValue]);
624
701
  },
625
- [parseWithDependency](input, dependencyValue) {
702
+ async [parseWithDependency](input, dependencyValue) {
626
703
  let derivedParser;
627
704
  try {
628
705
  derivedParser = options.factory(dependencyValue);
629
706
  } catch (e) {
630
707
  const msg = e instanceof Error ? e.message : String(e);
631
- return Promise.resolve({
708
+ return {
632
709
  success: false,
633
710
  error: require_message.message`Factory error: ${msg}`
634
- });
711
+ };
635
712
  }
636
- return Promise.resolve(derivedParser.parse(input));
713
+ return await parseDerivedResultAsync(derivedParser, input);
637
714
  },
638
715
  format(value) {
639
716
  let derivedParser;
@@ -688,32 +765,36 @@ function createAsyncDerivedParserFromSyncFactory(sourceId, options) {
688
765
  [derivedValueParserMarker]: true,
689
766
  [dependencyId]: sourceId,
690
767
  [singleDefaultValue]: options.defaultValue,
691
- parse(input) {
768
+ async parse(input) {
692
769
  let derivedParser;
770
+ let hasSourceValue = false;
771
+ let sourceValue;
693
772
  try {
694
- const sourceValue = options.defaultValue();
773
+ sourceValue = options.defaultValue();
774
+ hasSourceValue = true;
695
775
  derivedParser = options.factory(sourceValue);
696
776
  } catch (e) {
697
777
  const msg = e instanceof Error ? e.message : String(e);
698
- return Promise.resolve({
778
+ const failure = {
699
779
  success: false,
700
780
  error: require_message.message`Derived parser error: ${msg}`
701
- });
781
+ };
782
+ return hasSourceValue ? snapshotDefaultDependencyValues(failure, [sourceValue]) : failure;
702
783
  }
703
- return Promise.resolve(derivedParser.parse(input));
784
+ return await parseDerivedResultWithSnapshotAsync(derivedParser, input, [sourceValue]);
704
785
  },
705
- [parseWithDependency](input, dependencyValue) {
786
+ async [parseWithDependency](input, dependencyValue) {
706
787
  let derivedParser;
707
788
  try {
708
789
  derivedParser = options.factory(dependencyValue);
709
790
  } catch (e) {
710
791
  const msg = e instanceof Error ? e.message : String(e);
711
- return Promise.resolve({
792
+ return {
712
793
  success: false,
713
794
  error: require_message.message`Factory error: ${msg}`
714
- });
795
+ };
715
796
  }
716
- return Promise.resolve(derivedParser.parse(input));
797
+ return await parseDerivedResultAsync(derivedParser, input);
717
798
  },
718
799
  format(value) {
719
800
  let derivedParser;
@@ -784,9 +865,12 @@ function getDependencyIds(parser) {
784
865
  return [parser[dependencyId]];
785
866
  }
786
867
  /**
787
- * Gets the default values function from a derived parser, if present.
788
- * This function is available on parsers created with `deriveFrom` that
789
- * specify default values for their dependencies.
868
+ * Gets the default values function from a multi-source derived parser, if
869
+ * present.
870
+ *
871
+ * Single-source `derive()` defaults must stay lazy during suggestion-time
872
+ * replay so missing dependencies do not eagerly evaluate side-effectful
873
+ * `defaultValue()` thunks.
790
874
  *
791
875
  * @param parser The derived value parser to get the default values function from.
792
876
  * @returns The default values function, or undefined if not available.
@@ -794,7 +878,7 @@ function getDependencyIds(parser) {
794
878
  * @since 0.10.0
795
879
  */
796
880
  function getDefaultValuesFunction(parser) {
797
- if (defaultValues in parser) return parser[defaultValues];
881
+ if (Object.hasOwn(parser, defaultValues)) return parser[defaultValues];
798
882
  return void 0;
799
883
  }
800
884
  /**
@@ -810,8 +894,14 @@ function getDefaultValuesFunction(parser) {
810
894
  */
811
895
  function createDeferredParseState(rawInput, parser, preliminaryResult) {
812
896
  const multipleIds = dependencyIds in parser ? parser[dependencyIds] : void 0;
813
- const defaultValuesFn = defaultValues in parser ? parser[defaultValues] : void 0;
814
- const defaultVals = defaultValuesFn ? defaultValuesFn() : void 0;
897
+ const defaultValuesFn = getDefaultValuesFunction(parser);
898
+ let defaultVals = getSnapshottedDefaultDependencyValues(preliminaryResult);
899
+ if (defaultVals != null) defaultVals = [...defaultVals];
900
+ if (defaultVals == null && defaultValuesFn != null) try {
901
+ defaultVals = [...defaultValuesFn()];
902
+ } catch {
903
+ defaultVals = void 0;
904
+ }
815
905
  return {
816
906
  [deferredParseMarker]: true,
817
907
  rawInput,
@@ -990,6 +1080,7 @@ exports.DependencyRegistry = DependencyRegistry;
990
1080
  exports.createDeferredParseState = createDeferredParseState;
991
1081
  exports.createDependencySourceState = createDependencySourceState;
992
1082
  exports.createPendingDependencySourceState = createPendingDependencySourceState;
1083
+ exports.defaultDependencyValueSnapshot = defaultDependencyValueSnapshot;
993
1084
  exports.defaultValues = defaultValues;
994
1085
  exports.deferredParseMarker = deferredParseMarker;
995
1086
  exports.dependency = dependency;
@@ -1004,6 +1095,7 @@ exports.derivedValueParserMarker = derivedValueParserMarker;
1004
1095
  exports.formatDependencyError = formatDependencyError;
1005
1096
  exports.getDefaultValuesFunction = getDefaultValuesFunction;
1006
1097
  exports.getDependencyIds = getDependencyIds;
1098
+ exports.getSnapshottedDefaultDependencyValues = getSnapshottedDefaultDependencyValues;
1007
1099
  exports.isDeferredParseState = isDeferredParseState;
1008
1100
  exports.isDependencySource = isDependencySource;
1009
1101
  exports.isDependencySourceState = isDependencySourceState;
@@ -1013,6 +1105,7 @@ exports.isWrappedDependencySource = isWrappedDependencySource;
1013
1105
  exports.parseWithDependency = parseWithDependency;
1014
1106
  exports.pendingDependencySourceStateMarker = pendingDependencySourceStateMarker;
1015
1107
  exports.singleDefaultValue = singleDefaultValue;
1108
+ exports.snapshotDefaultDependencyValues = snapshotDefaultDependencyValues;
1016
1109
  exports.suggestWithDependency = suggestWithDependency;
1017
1110
  exports.transformsDependencyValue = transformsDependencyValue;
1018
1111
  exports.transformsDependencyValueMarker = transformsDependencyValueMarker;
@@ -40,13 +40,20 @@ declare const defaultValues: unique symbol;
40
40
  /**
41
41
  * A unique symbol used to store the single default value thunk on derived
42
42
  * parsers created by {@link DependencySource.derive}. Unlike
43
- * {@link defaultValues} (which `createDeferredParseState` reads eagerly),
44
- * this symbol is only read by the dependency-metadata bridge so that
43
+ * {@link defaultValues} (which `createDeferredParseState` only falls back to
44
+ * when no parse-time snapshot is available), this symbol is only read by the
45
+ * dependency-metadata bridge so that
45
46
  * single-source defaults are accessible without double evaluation.
46
47
  * @internal
47
- * @since 1.0.0
48
48
  */
49
49
  declare const singleDefaultValue: unique symbol;
50
+ /**
51
+ * A unique symbol used to store the snapshotted default dependency values on
52
+ * a parse result produced by a derived parser's default path.
53
+ *
54
+ * @internal
55
+ */
56
+ declare const defaultDependencyValueSnapshot: unique symbol;
50
57
  /**
51
58
  * A unique symbol used to access the parseWithDependency method on derived parsers.
52
59
  * @since 0.10.0
@@ -378,7 +385,6 @@ interface DerivedValueParser<M extends Mode = "sync", T = unknown, S = unknown>
378
385
  * Read by the dependency-metadata bridge; not consumed by
379
386
  * `createDeferredParseState()`.
380
387
  * @internal
381
- * @since 1.0.0
382
388
  */
383
389
  readonly [singleDefaultValue]?: () => S;
384
390
  /**
@@ -513,6 +519,23 @@ declare function deriveFromSync<Deps extends readonly AnyDependencySource[], T>(
513
519
  * @since 0.10.0
514
520
  */
515
521
  declare function deriveFromAsync<Deps extends readonly AnyDependencySource[], T>(options: DeriveFromAsyncOptions<Deps, T>): DerivedValueParser<"async", T, DependencyValues<Deps>>;
522
+ /**
523
+ * Attaches a default dependency snapshot to a derived parser's parse result.
524
+ *
525
+ * @param result The parse result to annotate.
526
+ * @param values The dependency values used for the default-path parse.
527
+ * @returns A cloned parse result with an internal snapshot attached.
528
+ * @internal
529
+ */
530
+ declare function snapshotDefaultDependencyValues<T>(result: ValueParserResult<T>, values: readonly unknown[]): ValueParserResult<T>;
531
+ /**
532
+ * Reads the snapshotted default dependency values from a parse result.
533
+ *
534
+ * @param result The parse result to inspect.
535
+ * @returns The snapshotted dependency values, if present.
536
+ * @internal
537
+ */
538
+ declare function getSnapshottedDefaultDependencyValues<T>(result: ValueParserResult<T>): readonly unknown[] | undefined;
516
539
  /**
517
540
  * A unique symbol used to identify deferred parse states.
518
541
  * @since 0.10.0
@@ -585,9 +608,12 @@ declare function isDeferredParseState<T>(value: unknown): value is DeferredParse
585
608
  */
586
609
  declare function getDependencyIds<M extends Mode, T, S>(parser: DerivedValueParser<M, T, S>): readonly symbol[];
587
610
  /**
588
- * Gets the default values function from a derived parser, if present.
589
- * This function is available on parsers created with `deriveFrom` that
590
- * specify default values for their dependencies.
611
+ * Gets the default values function from a multi-source derived parser, if
612
+ * present.
613
+ *
614
+ * Single-source `derive()` defaults must stay lazy during suggestion-time
615
+ * replay so missing dependencies do not eagerly evaluate side-effectful
616
+ * `defaultValue()` thunks.
591
617
  *
592
618
  * @param parser The derived value parser to get the default values function from.
593
619
  * @returns The default values function, or undefined if not available.
@@ -809,4 +835,4 @@ type DependencyError = {
809
835
  */
810
836
  declare function formatDependencyError(error: DependencyError): Message;
811
837
  //#endregion
812
- export { AnyDependencySource, CombineMode, CombinedDependencyMode, DeferredParseState, DependencyError, DependencyMode, DependencyRegistry, DependencySource, DependencySourceState, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, PendingDependencySourceState, ResolvedDependency, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, defaultValues, deferredParseMarker, dependency, dependencyId, dependencyIds, dependencySourceMarker, dependencySourceStateMarker, deriveFrom, deriveFromAsync, deriveFromSync, derivedValueParserMarker, formatDependencyError, getDefaultValuesFunction, getDependencyIds, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource, parseWithDependency, pendingDependencySourceStateMarker, singleDefaultValue, suggestWithDependency, transformsDependencyValue, transformsDependencyValueMarker, wrappedDependencySourceMarker };
838
+ export { AnyDependencySource, CombineMode, CombinedDependencyMode, DeferredParseState, DependencyError, DependencyMode, DependencyRegistry, DependencySource, DependencySourceState, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, PendingDependencySourceState, ResolvedDependency, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, defaultDependencyValueSnapshot, defaultValues, deferredParseMarker, dependency, dependencyId, dependencyIds, dependencySourceMarker, dependencySourceStateMarker, deriveFrom, deriveFromAsync, deriveFromSync, derivedValueParserMarker, formatDependencyError, getDefaultValuesFunction, getDependencyIds, getSnapshottedDefaultDependencyValues, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource, parseWithDependency, pendingDependencySourceStateMarker, singleDefaultValue, snapshotDefaultDependencyValues, suggestWithDependency, transformsDependencyValue, transformsDependencyValueMarker, wrappedDependencySourceMarker };
@@ -40,13 +40,20 @@ declare const defaultValues: unique symbol;
40
40
  /**
41
41
  * A unique symbol used to store the single default value thunk on derived
42
42
  * parsers created by {@link DependencySource.derive}. Unlike
43
- * {@link defaultValues} (which `createDeferredParseState` reads eagerly),
44
- * this symbol is only read by the dependency-metadata bridge so that
43
+ * {@link defaultValues} (which `createDeferredParseState` only falls back to
44
+ * when no parse-time snapshot is available), this symbol is only read by the
45
+ * dependency-metadata bridge so that
45
46
  * single-source defaults are accessible without double evaluation.
46
47
  * @internal
47
- * @since 1.0.0
48
48
  */
49
49
  declare const singleDefaultValue: unique symbol;
50
+ /**
51
+ * A unique symbol used to store the snapshotted default dependency values on
52
+ * a parse result produced by a derived parser's default path.
53
+ *
54
+ * @internal
55
+ */
56
+ declare const defaultDependencyValueSnapshot: unique symbol;
50
57
  /**
51
58
  * A unique symbol used to access the parseWithDependency method on derived parsers.
52
59
  * @since 0.10.0
@@ -378,7 +385,6 @@ interface DerivedValueParser<M extends Mode = "sync", T = unknown, S = unknown>
378
385
  * Read by the dependency-metadata bridge; not consumed by
379
386
  * `createDeferredParseState()`.
380
387
  * @internal
381
- * @since 1.0.0
382
388
  */
383
389
  readonly [singleDefaultValue]?: () => S;
384
390
  /**
@@ -513,6 +519,23 @@ declare function deriveFromSync<Deps extends readonly AnyDependencySource[], T>(
513
519
  * @since 0.10.0
514
520
  */
515
521
  declare function deriveFromAsync<Deps extends readonly AnyDependencySource[], T>(options: DeriveFromAsyncOptions<Deps, T>): DerivedValueParser<"async", T, DependencyValues<Deps>>;
522
+ /**
523
+ * Attaches a default dependency snapshot to a derived parser's parse result.
524
+ *
525
+ * @param result The parse result to annotate.
526
+ * @param values The dependency values used for the default-path parse.
527
+ * @returns A cloned parse result with an internal snapshot attached.
528
+ * @internal
529
+ */
530
+ declare function snapshotDefaultDependencyValues<T>(result: ValueParserResult<T>, values: readonly unknown[]): ValueParserResult<T>;
531
+ /**
532
+ * Reads the snapshotted default dependency values from a parse result.
533
+ *
534
+ * @param result The parse result to inspect.
535
+ * @returns The snapshotted dependency values, if present.
536
+ * @internal
537
+ */
538
+ declare function getSnapshottedDefaultDependencyValues<T>(result: ValueParserResult<T>): readonly unknown[] | undefined;
516
539
  /**
517
540
  * A unique symbol used to identify deferred parse states.
518
541
  * @since 0.10.0
@@ -585,9 +608,12 @@ declare function isDeferredParseState<T>(value: unknown): value is DeferredParse
585
608
  */
586
609
  declare function getDependencyIds<M extends Mode, T, S>(parser: DerivedValueParser<M, T, S>): readonly symbol[];
587
610
  /**
588
- * Gets the default values function from a derived parser, if present.
589
- * This function is available on parsers created with `deriveFrom` that
590
- * specify default values for their dependencies.
611
+ * Gets the default values function from a multi-source derived parser, if
612
+ * present.
613
+ *
614
+ * Single-source `derive()` defaults must stay lazy during suggestion-time
615
+ * replay so missing dependencies do not eagerly evaluate side-effectful
616
+ * `defaultValue()` thunks.
591
617
  *
592
618
  * @param parser The derived value parser to get the default values function from.
593
619
  * @returns The default values function, or undefined if not available.
@@ -809,4 +835,4 @@ type DependencyError = {
809
835
  */
810
836
  declare function formatDependencyError(error: DependencyError): Message;
811
837
  //#endregion
812
- export { AnyDependencySource, CombineMode, CombinedDependencyMode, DeferredParseState, DependencyError, DependencyMode, DependencyRegistry, DependencySource, DependencySourceState, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, PendingDependencySourceState, ResolvedDependency, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, defaultValues, deferredParseMarker, dependency, dependencyId, dependencyIds, dependencySourceMarker, dependencySourceStateMarker, deriveFrom, deriveFromAsync, deriveFromSync, derivedValueParserMarker, formatDependencyError, getDefaultValuesFunction, getDependencyIds, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource, parseWithDependency, pendingDependencySourceStateMarker, singleDefaultValue, suggestWithDependency, transformsDependencyValue, transformsDependencyValueMarker, wrappedDependencySourceMarker };
838
+ export { AnyDependencySource, CombineMode, CombinedDependencyMode, DeferredParseState, DependencyError, DependencyMode, DependencyRegistry, DependencySource, DependencySourceState, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, PendingDependencySourceState, ResolvedDependency, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, defaultDependencyValueSnapshot, defaultValues, deferredParseMarker, dependency, dependencyId, dependencyIds, dependencySourceMarker, dependencySourceStateMarker, deriveFrom, deriveFromAsync, deriveFromSync, derivedValueParserMarker, formatDependencyError, getDefaultValuesFunction, getDependencyIds, getSnapshottedDefaultDependencyValues, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource, parseWithDependency, pendingDependencySourceStateMarker, singleDefaultValue, snapshotDefaultDependencyValues, suggestWithDependency, transformsDependencyValue, transformsDependencyValueMarker, wrappedDependencySourceMarker };