@optique/core 1.0.0-dev.1663 → 1.0.0-dev.1667

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.
@@ -158,7 +158,11 @@ function unwrapNestedAnnotationViews(value, seen = /* @__PURE__ */ new WeakMap()
158
158
  changed$1 = true;
159
159
  }
160
160
  }
161
- return changed$1 ? clone$1 : source;
161
+ if (!changed$1) {
162
+ seen.set(source, source);
163
+ return source;
164
+ }
165
+ return clone$1;
162
166
  }
163
167
  const proto = Object.getPrototypeOf(source);
164
168
  if (proto !== Object.prototype && proto !== null) return source;
@@ -480,6 +484,26 @@ function generateNoMatchError(context) {
480
484
  else if (hasArguments && hasCommands && !hasOptions) return message`No matching command or argument found.`;
481
485
  else return message`No matching option, command, or argument found.`;
482
486
  }
487
+ function normalizeExclusiveState(state) {
488
+ if (!Array.isArray(state) || state.length !== 2 || typeof state[0] !== "number") return void 0;
489
+ return state;
490
+ }
491
+ function annotateExclusiveParserResult(parentState, parser, result) {
492
+ if (!result.success) return result;
493
+ const annotatedState = getAnnotatedChildState(parentState, result.next.state, parser);
494
+ if (annotatedState === result.next.state) return result;
495
+ return {
496
+ ...result,
497
+ next: {
498
+ ...result.next,
499
+ state: annotatedState
500
+ }
501
+ };
502
+ }
503
+ function createExclusiveState(parentState, index, parser, result) {
504
+ const annotatedResult = annotateExclusiveParserResult(parentState, parser, result);
505
+ return annotateFreshArray(parentState, [index, annotatedResult]);
506
+ }
483
507
  /**
484
508
  * Creates a complete() method shared by or() and longestMatch().
485
509
  * @internal
@@ -487,11 +511,12 @@ function generateNoMatchError(context) {
487
511
  function createExclusiveComplete(parsers, options, noMatchContext, mode) {
488
512
  const syncParsers = parsers;
489
513
  return (state, exec) => {
490
- if (state == null) return {
514
+ const activeState = normalizeExclusiveState(state);
515
+ if (activeState == null) return {
491
516
  success: false,
492
517
  error: getNoMatchError(options, noMatchContext)
493
518
  };
494
- const [i, result] = state;
519
+ const [i, result] = activeState;
495
520
  if (!result.success) return {
496
521
  success: false,
497
522
  error: result.error
@@ -511,32 +536,35 @@ function createExclusiveSuggest(parsers, mode) {
511
536
  return (context, prefix) => {
512
537
  return dispatchIterableByMode(mode, function* () {
513
538
  const suggestions = [];
514
- if (context.state == null) for (let i = 0; i < syncParsers.length; i++) {
539
+ const activeState = normalizeExclusiveState(context.state);
540
+ if (activeState == null) for (let i = 0; i < syncParsers.length; i++) {
515
541
  const parser = syncParsers[i];
516
- const parserSuggestions = parser.suggest(withChildContext(context, i, parser.initialState), prefix);
542
+ const parserSuggestions = parser.suggest(withChildContext(context, i, parser.initialState, parser), prefix);
517
543
  suggestions.push(...parserSuggestions);
518
544
  }
519
545
  else {
520
- const [index, parserResult] = context.state;
546
+ const [index, parserResult] = activeState;
521
547
  if (parserResult.success) {
522
- const parserSuggestions = syncParsers[index].suggest(withChildContext(context, index, parserResult.next.state), prefix);
548
+ const parser = syncParsers[index];
549
+ const parserSuggestions = parser.suggest(withChildContext(context, index, parserResult.next.state, parser), prefix);
523
550
  suggestions.push(...parserSuggestions);
524
551
  }
525
552
  }
526
553
  yield* deduplicateSuggestions(suggestions);
527
554
  }, async function* () {
528
555
  const suggestions = [];
529
- if (context.state == null) for (let i = 0; i < parsers.length; i++) {
556
+ const activeState = normalizeExclusiveState(context.state);
557
+ if (activeState == null) for (let i = 0; i < parsers.length; i++) {
530
558
  const parser = parsers[i];
531
- const parserSuggestions = parser.suggest(withChildContext(context, i, parser.initialState), prefix);
559
+ const parserSuggestions = parser.suggest(withChildContext(context, i, parser.initialState, parser), prefix);
532
560
  if (parser.$mode === "async") for await (const s of parserSuggestions) suggestions.push(s);
533
561
  else suggestions.push(...parserSuggestions);
534
562
  }
535
563
  else {
536
- const [index, parserResult] = context.state;
564
+ const [index, parserResult] = activeState;
537
565
  if (parserResult.success) {
538
566
  const parser = parsers[index];
539
- const parserSuggestions = parser.suggest(withChildContext(context, index, parserResult.next.state), prefix);
567
+ const parserSuggestions = parser.suggest(withChildContext(context, index, parserResult.next.state, parser), prefix);
540
568
  if (parser.$mode === "async") for await (const s of parserSuggestions) suggestions.push(s);
541
569
  else suggestions.push(...parserSuggestions);
542
570
  }
@@ -546,8 +574,9 @@ function createExclusiveSuggest(parsers, mode) {
546
574
  };
547
575
  }
548
576
  function getExclusiveSuggestRuntimeNodes(parsers, state, path) {
549
- if (!Array.isArray(state) || state.length !== 2 || typeof state[0] !== "number") return [];
550
- const [index, parserResult] = state;
577
+ const activeState = normalizeExclusiveState(state);
578
+ if (activeState == null) return [];
579
+ const [index, parserResult] = activeState;
551
580
  if (!parserResult?.success || index < 0 || index >= parsers.length) return [];
552
581
  const parser = parsers[index];
553
582
  return getParserSuggestRuntimeNodes(parser, parserResult.next.state, [...path, index]);
@@ -610,34 +639,32 @@ function or(...args) {
610
639
  });
611
640
  const parseSync = (context) => {
612
641
  let error = getInitialError(context);
642
+ const activeState = normalizeExclusiveState(context.state);
613
643
  const orderedParsers = syncParsers.map((p, i) => [p, i]);
614
- orderedParsers.sort(([_, a], [__, b]) => context.state?.[0] === a ? -1 : context.state?.[0] === b ? 1 : a - b);
644
+ orderedParsers.sort(([_, a], [__, b]) => activeState?.[0] === a ? -1 : activeState?.[0] === b ? 1 : a - b);
615
645
  for (const [parser, i] of orderedParsers) {
616
- const result = parser.parse(withChildContext(context, i, context.state == null || context.state[0] !== i || !context.state[1].success ? parser.initialState : context.state[1].next.state));
646
+ const result = parser.parse(withChildContext(context, i, activeState == null || activeState[0] !== i || !activeState[1].success ? parser.initialState : activeState[1].next.state, parser));
617
647
  if (result.success && result.consumed.length > 0) {
618
- if (context.state?.[0] !== i && context.state?.[1].success) {
619
- const previouslyConsumed = context.state[1].consumed;
648
+ if (activeState?.[0] !== i && activeState?.[1].success) {
649
+ const previouslyConsumed = activeState[1].consumed;
620
650
  const checkResult = parser.parse({
621
- ...withChildContext(context, i, parser.initialState),
651
+ ...withChildContext(context, i, parser.initialState, parser),
622
652
  buffer: previouslyConsumed
623
653
  });
624
654
  const canConsumeShared = checkResult.success && checkResult.consumed.length === previouslyConsumed.length && checkResult.consumed.every((c, idx) => c === previouslyConsumed[idx]);
625
655
  if (!canConsumeShared) return {
626
656
  success: false,
627
657
  consumed: context.buffer.length - result.next.buffer.length,
628
- error: message`${values(context.state[1].consumed)} and ${values(result.consumed)} cannot be used together.`
658
+ error: message`${values(activeState[1].consumed)} and ${values(result.consumed)} cannot be used together.`
629
659
  };
630
660
  const replayExec = mergeChildExec(context.exec, checkResult.next.exec);
631
- const replayedResult = parser.parse({
632
- ...withChildContext({
633
- ...context,
634
- ...replayExec != null ? {
635
- exec: replayExec,
636
- dependencyRegistry: replayExec.dependencyRegistry
637
- } : {}
638
- }, i, checkResult.next.state),
639
- state: checkResult.next.state
640
- });
661
+ const replayedResult = parser.parse(withChildContext({
662
+ ...context,
663
+ ...replayExec != null ? {
664
+ exec: replayExec,
665
+ dependencyRegistry: replayExec.dependencyRegistry
666
+ } : {}
667
+ }, i, checkResult.next.state, parser));
641
668
  if (!replayedResult.success) return replayedResult;
642
669
  const mergedExec$1 = mergeChildExec(replayExec, replayedResult.next.exec);
643
670
  return {
@@ -646,10 +673,10 @@ function or(...args) {
646
673
  ...context,
647
674
  buffer: replayedResult.next.buffer,
648
675
  optionsTerminated: replayedResult.next.optionsTerminated,
649
- state: [i, {
676
+ state: createExclusiveState(context.state, i, parser, {
650
677
  ...replayedResult,
651
678
  consumed: [...previouslyConsumed, ...replayedResult.consumed]
652
- }],
679
+ }),
653
680
  ...mergedExec$1 != null ? {
654
681
  exec: mergedExec$1,
655
682
  dependencyRegistry: mergedExec$1.dependencyRegistry
@@ -665,7 +692,7 @@ function or(...args) {
665
692
  ...context,
666
693
  buffer: result.next.buffer,
667
694
  optionsTerminated: result.next.optionsTerminated,
668
- state: [i, result],
695
+ state: createExclusiveState(context.state, i, parser, result),
669
696
  ...mergedExec != null ? {
670
697
  exec: mergedExec,
671
698
  dependencyRegistry: mergedExec.dependencyRegistry
@@ -682,16 +709,17 @@ function or(...args) {
682
709
  };
683
710
  const parseAsync = async (context) => {
684
711
  let error = getInitialError(context);
712
+ const activeState = normalizeExclusiveState(context.state);
685
713
  const orderedParsers = parsers.map((p, i) => [p, i]);
686
- orderedParsers.sort(([_, a], [__, b]) => context.state?.[0] === a ? -1 : context.state?.[0] === b ? 1 : a - b);
714
+ orderedParsers.sort(([_, a], [__, b]) => activeState?.[0] === a ? -1 : activeState?.[0] === b ? 1 : a - b);
687
715
  for (const [parser, i] of orderedParsers) {
688
- const resultOrPromise = parser.parse(withChildContext(context, i, context.state == null || context.state[0] !== i || !context.state[1].success ? parser.initialState : context.state[1].next.state));
716
+ const resultOrPromise = parser.parse(withChildContext(context, i, activeState == null || activeState[0] !== i || !activeState[1].success ? parser.initialState : activeState[1].next.state, parser));
689
717
  const result = await resultOrPromise;
690
718
  if (result.success && result.consumed.length > 0) {
691
- if (context.state?.[0] !== i && context.state?.[1].success) {
692
- const previouslyConsumed = context.state[1].consumed;
719
+ if (activeState?.[0] !== i && activeState?.[1].success) {
720
+ const previouslyConsumed = activeState[1].consumed;
693
721
  const checkResultOrPromise = parser.parse({
694
- ...withChildContext(context, i, parser.initialState),
722
+ ...withChildContext(context, i, parser.initialState, parser),
695
723
  buffer: previouslyConsumed
696
724
  });
697
725
  const checkResult = await checkResultOrPromise;
@@ -699,16 +727,16 @@ function or(...args) {
699
727
  if (!canConsumeShared) return {
700
728
  success: false,
701
729
  consumed: context.buffer.length - result.next.buffer.length,
702
- error: message`${values(context.state[1].consumed)} and ${values(result.consumed)} cannot be used together.`
730
+ error: message`${values(activeState[1].consumed)} and ${values(result.consumed)} cannot be used together.`
703
731
  };
704
732
  const replayExec = mergeChildExec(context.exec, checkResult.next.exec);
705
- const replayedResultOrPromise = parser.parse({ ...withChildContext({
733
+ const replayedResultOrPromise = parser.parse(withChildContext({
706
734
  ...context,
707
735
  ...replayExec != null ? {
708
736
  exec: replayExec,
709
737
  dependencyRegistry: replayExec.dependencyRegistry
710
738
  } : {}
711
- }, i, checkResult.next.state) });
739
+ }, i, checkResult.next.state, parser));
712
740
  const replayedResult = await replayedResultOrPromise;
713
741
  if (!replayedResult.success) return replayedResult;
714
742
  const mergedExec$1 = mergeChildExec(replayExec, replayedResult.next.exec);
@@ -718,10 +746,10 @@ function or(...args) {
718
746
  ...context,
719
747
  buffer: replayedResult.next.buffer,
720
748
  optionsTerminated: replayedResult.next.optionsTerminated,
721
- state: [i, {
749
+ state: createExclusiveState(context.state, i, parser, {
722
750
  ...replayedResult,
723
751
  consumed: [...previouslyConsumed, ...replayedResult.consumed]
724
- }],
752
+ }),
725
753
  ...mergedExec$1 != null ? {
726
754
  exec: mergedExec$1,
727
755
  dependencyRegistry: mergedExec$1.dependencyRegistry
@@ -737,7 +765,7 @@ function or(...args) {
737
765
  ...context,
738
766
  buffer: result.next.buffer,
739
767
  optionsTerminated: result.next.optionsTerminated,
740
- state: [i, result],
768
+ state: createExclusiveState(context.state, i, parser, result),
741
769
  ...mergedExec != null ? {
742
770
  exec: mergedExec,
743
771
  dependencyRegistry: mergedExec.dependencyRegistry
@@ -801,6 +829,7 @@ function or(...args) {
801
829
  };
802
830
  const singleDependencyMetadata = composeExclusiveDependencyMetadata(parsers);
803
831
  if (singleDependencyMetadata != null) singleResult.dependencyMetadata = singleDependencyMetadata;
832
+ defineInheritedAnnotationParser(singleResult);
804
833
  return singleResult;
805
834
  }
806
835
  /**
@@ -833,13 +862,15 @@ function longestMatch(...args) {
833
862
  const parseSync = (context) => {
834
863
  let bestMatch = null;
835
864
  let error = getInitialError(context);
865
+ const activeState = normalizeExclusiveState(context.state);
836
866
  for (let i = 0; i < syncParsers.length; i++) {
837
867
  const parser = syncParsers[i];
838
- const result = parser.parse(withChildContext(context, i, context.state == null || context.state[0] !== i || !context.state[1].success ? parser.initialState : context.state[1].next.state));
868
+ const result = parser.parse(withChildContext(context, i, activeState == null || activeState[0] !== i || !activeState[1].success ? parser.initialState : activeState[1].next.state, parser));
839
869
  if (result.success) {
840
870
  const consumed = context.buffer.length - result.next.buffer.length;
841
871
  if (bestMatch === null || consumed > bestMatch.consumed) bestMatch = {
842
872
  index: i,
873
+ parser,
843
874
  result,
844
875
  consumed
845
876
  };
@@ -853,7 +884,7 @@ function longestMatch(...args) {
853
884
  ...context,
854
885
  buffer: bestMatch.result.next.buffer,
855
886
  optionsTerminated: bestMatch.result.next.optionsTerminated,
856
- state: [bestMatch.index, bestMatch.result],
887
+ state: createExclusiveState(context.state, bestMatch.index, bestMatch.parser, bestMatch.result),
857
888
  ...mergedExec != null ? {
858
889
  exec: mergedExec,
859
890
  dependencyRegistry: mergedExec.dependencyRegistry
@@ -870,14 +901,16 @@ function longestMatch(...args) {
870
901
  const parseAsync = async (context) => {
871
902
  let bestMatch = null;
872
903
  let error = getInitialError(context);
904
+ const activeState = normalizeExclusiveState(context.state);
873
905
  for (let i = 0; i < parsers.length; i++) {
874
906
  const parser = parsers[i];
875
- const resultOrPromise = parser.parse(withChildContext(context, i, context.state == null || context.state[0] !== i || !context.state[1].success ? parser.initialState : context.state[1].next.state));
907
+ const resultOrPromise = parser.parse(withChildContext(context, i, activeState == null || activeState[0] !== i || !activeState[1].success ? parser.initialState : activeState[1].next.state, parser));
876
908
  const result = await resultOrPromise;
877
909
  if (result.success) {
878
910
  const consumed = context.buffer.length - result.next.buffer.length;
879
911
  if (bestMatch === null || consumed > bestMatch.consumed) bestMatch = {
880
912
  index: i,
913
+ parser,
881
914
  result,
882
915
  consumed
883
916
  };
@@ -891,7 +924,7 @@ function longestMatch(...args) {
891
924
  ...context,
892
925
  buffer: bestMatch.result.next.buffer,
893
926
  optionsTerminated: bestMatch.result.next.optionsTerminated,
894
- state: [bestMatch.index, bestMatch.result],
927
+ state: createExclusiveState(context.state, bestMatch.index, bestMatch.parser, bestMatch.result),
895
928
  ...mergedExec != null ? {
896
929
  exec: mergedExec,
897
930
  dependencyRegistry: mergedExec.dependencyRegistry
@@ -961,6 +994,7 @@ function longestMatch(...args) {
961
994
  };
962
995
  const multiDependencyMetadata = composeExclusiveDependencyMetadata(parsers);
963
996
  if (multiDependencyMetadata != null) multiResult.dependencyMetadata = multiDependencyMetadata;
997
+ defineInheritedAnnotationParser(multiResult);
964
998
  return multiResult;
965
999
  }
966
1000
  /**
@@ -986,15 +1020,15 @@ function* suggestObjectSync(context, prefix, parserPairs) {
986
1020
  if (context.buffer.length > 0) {
987
1021
  const lastToken = context.buffer[context.buffer.length - 1];
988
1022
  for (const [field, parser] of parserPairs) if (isOptionRequiringValue(parser.usage, lastToken)) {
989
- const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
990
- yield* parser.suggest(withChildContext(contextWithRegistry, field, fieldState), prefix);
1023
+ const annotatedFieldState = getAnnotatedFieldState(context.state, field, parser);
1024
+ yield* parser.suggest(withChildContext(contextWithRegistry, field, annotatedFieldState, parser), prefix);
991
1025
  return;
992
1026
  }
993
1027
  }
994
1028
  const suggestions = [];
995
1029
  for (const [field, parser] of parserPairs) {
996
- const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
997
- const fieldSuggestions = parser.suggest(withChildContext(contextWithRegistry, field, fieldState), prefix);
1030
+ const annotatedFieldState = getAnnotatedFieldState(context.state, field, parser);
1031
+ const fieldSuggestions = parser.suggest(withChildContext(contextWithRegistry, field, annotatedFieldState, parser), prefix);
998
1032
  suggestions.push(...fieldSuggestions);
999
1033
  }
1000
1034
  yield* deduplicateSuggestions(suggestions);
@@ -1022,16 +1056,16 @@ async function* suggestObjectAsync(context, prefix, parserPairs) {
1022
1056
  if (context.buffer.length > 0) {
1023
1057
  const lastToken = context.buffer[context.buffer.length - 1];
1024
1058
  for (const [field, parser] of parserPairs) if (isOptionRequiringValue(parser.usage, lastToken)) {
1025
- const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
1026
- const suggestions$1 = parser.suggest(withChildContext(contextWithRegistry, field, fieldState), prefix);
1059
+ const annotatedFieldState = getAnnotatedFieldState(context.state, field, parser);
1060
+ const suggestions$1 = parser.suggest(withChildContext(contextWithRegistry, field, annotatedFieldState, parser), prefix);
1027
1061
  for await (const s of suggestions$1) yield s;
1028
1062
  return;
1029
1063
  }
1030
1064
  }
1031
1065
  const suggestions = [];
1032
1066
  for (const [field, parser] of parserPairs) {
1033
- const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
1034
- const fieldSuggestions = parser.suggest(withChildContext(contextWithRegistry, field, fieldState), prefix);
1067
+ const annotatedFieldState = getAnnotatedFieldState(context.state, field, parser);
1068
+ const fieldSuggestions = parser.suggest(withChildContext(contextWithRegistry, field, annotatedFieldState, parser), prefix);
1035
1069
  for await (const s of fieldSuggestions) suggestions.push(s);
1036
1070
  }
1037
1071
  yield* deduplicateSuggestions(suggestions);
@@ -1378,7 +1412,7 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1378
1412
  madeProgress = false;
1379
1413
  const getFieldState = createFieldStateGetter(currentContext.state, getObjectParseChildState);
1380
1414
  for (const [field, parser] of parserPairs) {
1381
- const result = parser.parse(withChildContext(currentContext, field, getFieldState(field, parser)));
1415
+ const result = parser.parse(withChildContext(currentContext, field, getFieldState(field, parser), parser));
1382
1416
  if (result.success && result.consumed.length > 0) {
1383
1417
  const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
1384
1418
  currentContext = {
@@ -1439,7 +1473,7 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1439
1473
  madeProgress = false;
1440
1474
  const getFieldState = createFieldStateGetter(currentContext.state, getObjectParseChildState);
1441
1475
  for (const [field, parser] of parserPairs) {
1442
- const resultOrPromise = parser.parse(withChildContext(currentContext, field, getFieldState(field, parser)));
1476
+ const resultOrPromise = parser.parse(withChildContext(currentContext, field, getFieldState(field, parser), parser));
1443
1477
  const result = await resultOrPromise;
1444
1478
  if (result.success && result.consumed.length > 0) {
1445
1479
  const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
@@ -1506,6 +1540,10 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1506
1540
  parse(context) {
1507
1541
  return dispatchByMode(combinedMode, () => parseSync(context), () => parseAsync(context));
1508
1542
  },
1543
+ getSuggestRuntimeNodes(state, path) {
1544
+ const stateRecord = state != null && typeof state === "object" ? state : objectParser.initialState;
1545
+ return buildSuggestRuntimeNodesFromPairs(parserPairs, stateRecord, path);
1546
+ },
1509
1547
  complete(state, exec) {
1510
1548
  return dispatchByMode(combinedMode, () => {
1511
1549
  const runtime = exec?.dependencyRuntime ?? createDependencyRuntimeContext(exec?.dependencyRegistry);
@@ -1749,7 +1787,7 @@ async function* suggestTupleAsync(context, prefix, parsers) {
1749
1787
  state: createAnnotatedArrayStateRecord(stateArray)
1750
1788
  }, buildIndexedParserPairs(parsers), runtime.registry, advancedContext.exec);
1751
1789
  }
1752
- markFailedTupleSuggestSources(parsers, stateArray, advanced.failedParserIndexes, runtime, advancedContext.exec?.path);
1790
+ await markFailedTupleSuggestSourcesAsync(parsers, stateArray, advanced.failedParserIndexes, runtime, advancedContext.exec?.path);
1753
1791
  const contextWithRegistry = {
1754
1792
  ...advancedContext,
1755
1793
  dependencyRegistry: runtime.registry,
@@ -1903,18 +1941,36 @@ async function advanceTupleSuggestContextAsync(context, parsers) {
1903
1941
  function markFailedTupleSuggestSources(parsers, stateArray, failedParserIndexes, runtime, parentPath) {
1904
1942
  if (failedParserIndexes.length < 1) return;
1905
1943
  const prefix = parentPath ?? [];
1906
- const failedSourceIds = /* @__PURE__ */ new Set();
1907
1944
  for (const index of failedParserIndexes) {
1908
1945
  const parser = parsers[index];
1909
1946
  if (parser == null) continue;
1910
1947
  const parserState = stateArray && Array.isArray(stateArray) ? stateArray[index] : parser.initialState;
1911
1948
  const nodes = getParserSuggestRuntimeNodes(parser, getAnnotatedChildState(stateArray, parserState, parser), [...prefix, index]);
1949
+ if (nodes.length < 1) continue;
1950
+ const failedRuntime = createDependencyRuntimeContext();
1951
+ collectExplicitSourceValues(nodes, failedRuntime);
1912
1952
  for (const node of nodes) {
1913
1953
  const sourceId = node.parser.dependencyMetadata?.source?.sourceId;
1914
- if (sourceId != null) failedSourceIds.add(sourceId);
1954
+ if (sourceId != null && failedRuntime.isSourceFailed(sourceId)) runtime.markSourceFailed(sourceId);
1955
+ }
1956
+ }
1957
+ }
1958
+ async function markFailedTupleSuggestSourcesAsync(parsers, stateArray, failedParserIndexes, runtime, parentPath) {
1959
+ if (failedParserIndexes.length < 1) return;
1960
+ const prefix = parentPath ?? [];
1961
+ for (const index of failedParserIndexes) {
1962
+ const parser = parsers[index];
1963
+ if (parser == null) continue;
1964
+ const parserState = stateArray && Array.isArray(stateArray) ? stateArray[index] : parser.initialState;
1965
+ const nodes = getParserSuggestRuntimeNodes(parser, getAnnotatedChildState(stateArray, parserState, parser), [...prefix, index]);
1966
+ if (nodes.length < 1) continue;
1967
+ const failedRuntime = createDependencyRuntimeContext();
1968
+ await collectExplicitSourceValuesAsync(nodes, failedRuntime);
1969
+ for (const node of nodes) {
1970
+ const sourceId = node.parser.dependencyMetadata?.source?.sourceId;
1971
+ if (sourceId != null && failedRuntime.isSourceFailed(sourceId)) runtime.markSourceFailed(sourceId);
1915
1972
  }
1916
1973
  }
1917
- for (const sourceId of failedSourceIds) runtime.markSourceFailed(sourceId);
1918
1974
  }
1919
1975
  function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1920
1976
  const label = typeof labelOrParsers === "string" ? labelOrParsers : void 0;
@@ -2313,7 +2369,7 @@ function merge(...args) {
2313
2369
  for (let i = 0; i < syncParsers.length; i++) {
2314
2370
  const parser = syncParsers[i];
2315
2371
  const parserState = extractParserState(parser, currentContext, i);
2316
- const result = parser.parse(withChildContext(currentContext, i, parserState));
2372
+ const result = parser.parse(withChildContext(currentContext, i, parserState, parser));
2317
2373
  if (result.success) {
2318
2374
  const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
2319
2375
  const newState = mergeResultState(parser, currentContext, parserState, result, i);
@@ -2358,7 +2414,7 @@ function merge(...args) {
2358
2414
  for (let i = 0; i < parsers.length; i++) {
2359
2415
  const parser = parsers[i];
2360
2416
  const parserState = extractParserState(parser, currentContext, i);
2361
- const resultOrPromise = parser.parse(withChildContext(currentContext, i, parserState));
2417
+ const resultOrPromise = parser.parse(withChildContext(currentContext, i, parserState, parser));
2362
2418
  const result = await resultOrPromise;
2363
2419
  if (result.success) {
2364
2420
  const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
@@ -2607,7 +2663,7 @@ function merge(...args) {
2607
2663
  for (let i = 0; i < parsers.length; i++) {
2608
2664
  const parser = parsers[i];
2609
2665
  const parserState = extractState(parser, i);
2610
- const childContext = withChildContext(contextWithRegistry$1, i, parserState);
2666
+ const childContext = withChildContext(contextWithRegistry$1, i, parserState, parser);
2611
2667
  const excludedSourceFields = perChildExcludedSourceFields$1[i];
2612
2668
  const contextForChild = excludedSourceFields == null ? childContext : (() => {
2613
2669
  const childRuntime = createDependencyRuntimeContext(runtime$1.registry.clone());
@@ -2648,7 +2704,7 @@ function merge(...args) {
2648
2704
  for (let i = 0; i < syncParsers.length; i++) {
2649
2705
  const parser = syncParsers[i];
2650
2706
  const parserState = extractState(parser, i);
2651
- const childContext = withChildContext(contextWithRegistry, i, parserState);
2707
+ const childContext = withChildContext(contextWithRegistry, i, parserState, parser);
2652
2708
  const excludedSourceFields = perChildExcludedSourceFields[i];
2653
2709
  const contextForChild = excludedSourceFields == null ? childContext : (() => {
2654
2710
  const childRuntime = createDependencyRuntimeContext(runtime.registry.clone());
@@ -3441,7 +3497,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
3441
3497
  ...branchResult.next,
3442
3498
  state: {
3443
3499
  ...state,
3444
- branchState: branchResult.next.state
3500
+ branchState: getAnnotatedChildState(state, branchResult.next.state, branchParser)
3445
3501
  },
3446
3502
  ...mergedExec != null ? {
3447
3503
  exec: mergedExec,
@@ -3485,7 +3541,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
3485
3541
  kind: "branch",
3486
3542
  key: value
3487
3543
  },
3488
- branchState: branchParseResult.next.state
3544
+ branchState: getAnnotatedChildState(state, branchParseResult.next.state, branchParser)
3489
3545
  },
3490
3546
  ...mergedExec != null ? {
3491
3547
  exec: mergedExec,
@@ -3506,7 +3562,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
3506
3562
  kind: "branch",
3507
3563
  key: value
3508
3564
  },
3509
- branchState: branchParser.initialState
3565
+ branchState: getAnnotatedChildState(state, branchParser.initialState, branchParser)
3510
3566
  },
3511
3567
  ...discriminatorExec != null ? {
3512
3568
  exec: discriminatorExec,
@@ -3529,7 +3585,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
3529
3585
  state: {
3530
3586
  ...state,
3531
3587
  selectedBranch: { kind: "default" },
3532
- branchState: defaultResult.next.state
3588
+ branchState: getAnnotatedChildState(state, defaultResult.next.state, syncDefaultBranch)
3533
3589
  },
3534
3590
  ...mergedExec != null ? {
3535
3591
  exec: mergedExec,
@@ -3559,7 +3615,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
3559
3615
  ...branchResult.next,
3560
3616
  state: {
3561
3617
  ...state,
3562
- branchState: branchResult.next.state
3618
+ branchState: getAnnotatedChildState(state, branchResult.next.state, branchParser)
3563
3619
  },
3564
3620
  ...mergedExec != null ? {
3565
3621
  exec: mergedExec,
@@ -3603,7 +3659,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
3603
3659
  kind: "branch",
3604
3660
  key: value
3605
3661
  },
3606
- branchState: branchParseResult.next.state
3662
+ branchState: getAnnotatedChildState(state, branchParseResult.next.state, branchParser)
3607
3663
  },
3608
3664
  ...mergedExec != null ? {
3609
3665
  exec: mergedExec,
@@ -3624,7 +3680,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
3624
3680
  kind: "branch",
3625
3681
  key: value
3626
3682
  },
3627
- branchState: branchParser.initialState
3683
+ branchState: getAnnotatedChildState(state, branchParser.initialState, branchParser)
3628
3684
  },
3629
3685
  ...discriminatorExec != null ? {
3630
3686
  exec: discriminatorExec,
@@ -3647,7 +3703,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
3647
3703
  state: {
3648
3704
  ...state,
3649
3705
  selectedBranch: { kind: "default" },
3650
- branchState: defaultResult.next.state
3706
+ branchState: getAnnotatedChildState(state, defaultResult.next.state, defaultBranch)
3651
3707
  },
3652
3708
  ...mergedExec != null ? {
3653
3709
  exec: mergedExec,
@@ -3670,7 +3726,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
3670
3726
  const syncBranches = branches;
3671
3727
  if (state.selectedBranch === void 0) {
3672
3728
  if (syncDefaultBranch !== void 0) {
3673
- const branchState = state.branchState ?? syncDefaultBranch.initialState;
3729
+ const branchState = getAnnotatedChildState(state, state.branchState ?? syncDefaultBranch.initialState, syncDefaultBranch);
3674
3730
  const defaultResult = unwrapCompleteResult(syncDefaultBranch.complete(branchState, withChildExecPath(exec, "_branch")));
3675
3731
  if (!defaultResult.success) return defaultResult;
3676
3732
  return {
@@ -3690,12 +3746,12 @@ function conditional(discriminator, branches, defaultBranch, options) {
3690
3746
  const branchParser = state.selectedBranch.kind === "default" ? syncDefaultBranch : syncBranches[state.selectedBranch.key];
3691
3747
  const combinedState = {
3692
3748
  _discriminator: state.discriminatorState,
3693
- _branch: state.branchState
3749
+ _branch: getAnnotatedChildState(state, state.branchState, branchParser)
3694
3750
  };
3695
3751
  const runtime = createDependencyRuntimeContext(exec?.dependencyRegistry?.clone());
3696
3752
  collectExplicitSourceValues(buildRuntimeNodesFromPairs([["_discriminator", discriminator], ["_branch", branchParser]], combinedState, exec?.path), runtime);
3697
3753
  collectSourcesFromState(combinedState, runtime);
3698
- const resolvedBranchState = resolveStateWithRuntime(state.branchState, runtime);
3754
+ const resolvedBranchState = getAnnotatedChildState(state, resolveStateWithRuntime(state.branchState, runtime), branchParser);
3699
3755
  const completionExec = {
3700
3756
  ...exec ?? {
3701
3757
  usage: branchParser.usage,
@@ -3733,7 +3789,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
3733
3789
  const completeAsync = async (state, exec) => {
3734
3790
  if (state.selectedBranch === void 0) {
3735
3791
  if (defaultBranch !== void 0) {
3736
- const branchState = state.branchState ?? defaultBranch.initialState;
3792
+ const branchState = getAnnotatedChildState(state, state.branchState ?? defaultBranch.initialState, defaultBranch);
3737
3793
  const defaultResult = unwrapCompleteResult(await defaultBranch.complete(branchState, withChildExecPath(exec, "_branch")));
3738
3794
  if (!defaultResult.success) return defaultResult;
3739
3795
  return {
@@ -3753,12 +3809,12 @@ function conditional(discriminator, branches, defaultBranch, options) {
3753
3809
  const branchParser = state.selectedBranch.kind === "default" ? defaultBranch : branches[state.selectedBranch.key];
3754
3810
  const combinedState = {
3755
3811
  _discriminator: state.discriminatorState,
3756
- _branch: state.branchState
3812
+ _branch: getAnnotatedChildState(state, state.branchState, branchParser)
3757
3813
  };
3758
3814
  const runtime = createDependencyRuntimeContext(exec?.dependencyRegistry?.clone());
3759
3815
  await collectExplicitSourceValuesAsync(buildRuntimeNodesFromPairs([["_discriminator", discriminator], ["_branch", branchParser]], combinedState, exec?.path), runtime);
3760
3816
  collectSourcesFromState(combinedState, runtime);
3761
- const resolvedBranchState = await resolveStateWithRuntimeAsync(state.branchState, runtime);
3817
+ const resolvedBranchState = getAnnotatedChildState(state, await resolveStateWithRuntimeAsync(state.branchState, runtime), branchParser);
3762
3818
  const completionExec = {
3763
3819
  ...exec ?? {
3764
3820
  usage: branchParser.usage,
@@ -3800,14 +3856,12 @@ function conditional(discriminator, branches, defaultBranch, options) {
3800
3856
  const syncDefaultBranch = defaultBranch;
3801
3857
  if (state.selectedBranch === void 0) {
3802
3858
  const runtime = createDependencyRuntimeContext(context.dependencyRegistry?.clone());
3803
- collectExplicitSourceValues(buildRuntimeNodesFromPairs(syncDefaultBranch == null ? [["_discriminator", discriminator]] : [["_discriminator", discriminator], ["_branch", syncDefaultBranch]], {
3859
+ const defaultCombinedState = {
3804
3860
  _discriminator: state.discriminatorState,
3805
- _branch: state.branchState
3806
- }, context.exec?.path), runtime);
3807
- collectSourcesFromState({
3808
- _discriminator: state.discriminatorState,
3809
- _branch: state.branchState
3810
- }, runtime);
3861
+ _branch: syncDefaultBranch == null ? state.branchState : getAnnotatedChildState(state, state.branchState, syncDefaultBranch)
3862
+ };
3863
+ collectExplicitSourceValues(buildRuntimeNodesFromPairs(syncDefaultBranch == null ? [["_discriminator", discriminator]] : [["_discriminator", discriminator], ["_branch", syncDefaultBranch]], defaultCombinedState, context.exec?.path), runtime);
3864
+ collectSourcesFromState(defaultCombinedState, runtime);
3811
3865
  const suggestContext = {
3812
3866
  ...context,
3813
3867
  dependencyRegistry: runtime.registry,
@@ -3818,13 +3872,13 @@ function conditional(discriminator, branches, defaultBranch, options) {
3818
3872
  } } : {}
3819
3873
  };
3820
3874
  yield* syncDiscriminator.suggest(withChildContext(suggestContext, "_discriminator", state.discriminatorState), prefix);
3821
- if (syncDefaultBranch !== void 0) yield* syncDefaultBranch.suggest(withChildContext(suggestContext, "_branch", state.branchState ?? syncDefaultBranch.initialState), prefix);
3875
+ if (syncDefaultBranch !== void 0) yield* syncDefaultBranch.suggest(withChildContext(suggestContext, "_branch", state.branchState ?? syncDefaultBranch.initialState, syncDefaultBranch), prefix);
3822
3876
  } else {
3823
3877
  const branchParser = state.selectedBranch.kind === "default" ? syncDefaultBranch : syncBranches[state.selectedBranch.key];
3824
3878
  const runtime = createDependencyRuntimeContext(context.dependencyRegistry?.clone());
3825
3879
  const combinedState = {
3826
3880
  _discriminator: state.discriminatorState,
3827
- _branch: state.branchState
3881
+ _branch: getAnnotatedChildState(state, state.branchState, branchParser)
3828
3882
  };
3829
3883
  collectExplicitSourceValues(buildRuntimeNodesFromPairs([["_discriminator", discriminator], ["_branch", branchParser]], combinedState, context.exec?.path), runtime);
3830
3884
  collectSourcesFromState(combinedState, runtime);
@@ -3837,21 +3891,19 @@ function conditional(discriminator, branches, defaultBranch, options) {
3837
3891
  dependencyRegistry: runtime.registry
3838
3892
  } } : {}
3839
3893
  };
3840
- yield* branchParser.suggest(withChildContext(suggestContext, "_branch", state.branchState), prefix);
3894
+ yield* branchParser.suggest(withChildContext(suggestContext, "_branch", state.branchState, branchParser), prefix);
3841
3895
  }
3842
3896
  }
3843
3897
  async function* suggestAsync(context, prefix) {
3844
3898
  const state = context.state ?? initialState;
3845
3899
  if (state.selectedBranch === void 0) {
3846
3900
  const runtime = createDependencyRuntimeContext(context.dependencyRegistry?.clone());
3847
- await collectExplicitSourceValuesAsync(buildRuntimeNodesFromPairs(defaultBranch == null ? [["_discriminator", discriminator]] : [["_discriminator", discriminator], ["_branch", defaultBranch]], {
3901
+ const defaultCombinedState = {
3848
3902
  _discriminator: state.discriminatorState,
3849
- _branch: state.branchState
3850
- }, context.exec?.path), runtime);
3851
- collectSourcesFromState({
3852
- _discriminator: state.discriminatorState,
3853
- _branch: state.branchState
3854
- }, runtime);
3903
+ _branch: defaultBranch == null ? state.branchState : getAnnotatedChildState(state, state.branchState, defaultBranch)
3904
+ };
3905
+ await collectExplicitSourceValuesAsync(buildRuntimeNodesFromPairs(defaultBranch == null ? [["_discriminator", discriminator]] : [["_discriminator", discriminator], ["_branch", defaultBranch]], defaultCombinedState, context.exec?.path), runtime);
3906
+ collectSourcesFromState(defaultCombinedState, runtime);
3855
3907
  const suggestContext = {
3856
3908
  ...context,
3857
3909
  dependencyRegistry: runtime.registry,
@@ -3862,13 +3914,13 @@ function conditional(discriminator, branches, defaultBranch, options) {
3862
3914
  } } : {}
3863
3915
  };
3864
3916
  yield* discriminator.suggest(withChildContext(suggestContext, "_discriminator", state.discriminatorState), prefix);
3865
- if (defaultBranch !== void 0) yield* defaultBranch.suggest(withChildContext(suggestContext, "_branch", state.branchState ?? defaultBranch.initialState), prefix);
3917
+ if (defaultBranch !== void 0) yield* defaultBranch.suggest(withChildContext(suggestContext, "_branch", state.branchState ?? defaultBranch.initialState, defaultBranch), prefix);
3866
3918
  } else {
3867
3919
  const branchParser = state.selectedBranch.kind === "default" ? defaultBranch : branches[state.selectedBranch.key];
3868
3920
  const runtime = createDependencyRuntimeContext(context.dependencyRegistry?.clone());
3869
3921
  const combinedState = {
3870
3922
  _discriminator: state.discriminatorState,
3871
- _branch: state.branchState
3923
+ _branch: getAnnotatedChildState(state, state.branchState, branchParser)
3872
3924
  };
3873
3925
  await collectExplicitSourceValuesAsync(buildRuntimeNodesFromPairs([["_discriminator", discriminator], ["_branch", branchParser]], combinedState, context.exec?.path), runtime);
3874
3926
  collectSourcesFromState(combinedState, runtime);
@@ -3881,7 +3933,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
3881
3933
  dependencyRegistry: runtime.registry
3882
3934
  } } : {}
3883
3935
  };
3884
- yield* branchParser.suggest(withChildContext(suggestContext, "_branch", state.branchState), prefix);
3936
+ yield* branchParser.suggest(withChildContext(suggestContext, "_branch", state.branchState, branchParser), prefix);
3885
3937
  }
3886
3938
  }
3887
3939
  const conditionalParser = {