@optique/core 1.0.0-dev.1611 → 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.
@@ -1,13 +1,14 @@
1
1
  const require_annotations = require('./annotations.cjs');
2
2
  const require_message = require('./message.cjs');
3
3
  const require_dependency = require('./dependency.cjs');
4
- const require_dependency_runtime = require('./dependency-runtime.cjs');
5
- const require_mode_dispatch = require('./mode-dispatch.cjs');
6
4
  const require_validate = require('./validate.cjs');
7
5
  const require_usage = require('./usage.cjs');
8
6
  const require_doc = require('./doc.cjs');
7
+ const require_mode_dispatch = require('./mode-dispatch.cjs');
9
8
  const require_suggestion = require('./suggestion.cjs');
10
9
  const require_usage_internals = require('./usage-internals.cjs');
10
+ const require_parser = require('./parser.cjs');
11
+ const require_dependency_runtime = require('./dependency-runtime.cjs');
11
12
 
12
13
  //#region src/constructs.ts
13
14
  /**
@@ -15,6 +16,59 @@ const require_usage_internals = require('./usage-internals.cjs');
15
16
  * do not match any specific name at the first buffer position.
16
17
  */
17
18
  const EMPTY_LEADING_NAMES = /* @__PURE__ */ new Set();
19
+ function isNonCliBoundSourceState(state, parser) {
20
+ return parser[require_parser.unmatchedNonCliDependencySourceStateMarker] === true && state != null && typeof state === "object" && Object.hasOwn(state, "hasCliValue") && state.hasCliValue === false;
21
+ }
22
+ function withChildExecPath(exec, segment) {
23
+ if (exec == null) return void 0;
24
+ return {
25
+ ...exec,
26
+ path: [...exec.path ?? [], segment]
27
+ };
28
+ }
29
+ function mergeChildExec(parent, child) {
30
+ if (parent == null) return child;
31
+ if (child == null) return parent;
32
+ return {
33
+ ...parent,
34
+ trace: child.trace ?? parent.trace,
35
+ dependencyRuntime: child.dependencyRuntime ?? parent.dependencyRuntime,
36
+ dependencyRegistry: child.dependencyRegistry ?? parent.dependencyRegistry,
37
+ preCompletedByParser: child.preCompletedByParser ?? parent.preCompletedByParser,
38
+ excludedSourceFields: child.excludedSourceFields ?? parent.excludedSourceFields
39
+ };
40
+ }
41
+ function withChildContext(context, segment, state, usage) {
42
+ const exec = withChildExecPath(context.exec, segment);
43
+ const dependencyRegistry = context.dependencyRegistry ?? exec?.dependencyRegistry;
44
+ return {
45
+ ...context,
46
+ state,
47
+ ...usage != null ? { usage } : {},
48
+ ...exec != null ? {
49
+ exec: dependencyRegistry === exec.dependencyRegistry ? exec : {
50
+ ...exec,
51
+ dependencyRegistry
52
+ },
53
+ dependencyRegistry
54
+ } : {}
55
+ };
56
+ }
57
+ function isUnmatchedDependencyState(state, parser) {
58
+ if (state === void 0) return true;
59
+ if (Array.isArray(state) && state.length === 1 && require_dependency.isPendingDependencySourceState(state[0])) return true;
60
+ if (require_dependency.isPendingDependencySourceState(state)) return true;
61
+ if (isNonCliBoundSourceState(state, parser)) return true;
62
+ return state === parser.initialState;
63
+ }
64
+ function filterPreCompletedRuntimeNodes(nodes, preCompletedKeys) {
65
+ if (preCompletedKeys.size < 1) return nodes;
66
+ return nodes.filter((node) => {
67
+ const segment = node.path.at(-1);
68
+ if (typeof segment === "number") return !preCompletedKeys.has(String(segment));
69
+ return segment == null || !preCompletedKeys.has(segment);
70
+ });
71
+ }
18
72
  /**
19
73
  * Computes the union of `leadingNames` from all given parsers.
20
74
  * Used for alternative combinators (`or()`, `longestMatch()`) where all
@@ -93,8 +147,12 @@ function prepareStateForCompletion(fieldState, parser) {
93
147
  */
94
148
  function getAnnotatedFieldState(parentState, field, parser) {
95
149
  const sourceState = parentState != null && typeof parentState === "object" && field in parentState ? parentState[field] : parser.initialState;
96
- if (sourceState == null || typeof sourceState !== "object") return sourceState;
97
150
  const annotations = require_annotations.getAnnotations(parentState);
151
+ if (sourceState == null) {
152
+ if (annotations !== void 0 && Reflect.get(parser, inheritParentAnnotationsKey) === true) return require_annotations.injectAnnotations({}, annotations);
153
+ return sourceState;
154
+ }
155
+ if (typeof sourceState !== "object") return sourceState;
98
156
  if (annotations === void 0 || require_annotations.getAnnotations(sourceState) === annotations) return sourceState;
99
157
  return Reflect.get(parser, inheritParentAnnotationsKey) === true ? require_annotations.injectAnnotations(sourceState, annotations) : require_annotations.inheritAnnotations(parentState, sourceState);
100
158
  }
@@ -304,8 +362,8 @@ function createExclusiveComplete(parsers, options, noMatchContext, mode) {
304
362
  success: false,
305
363
  error: result.error
306
364
  };
307
- return require_mode_dispatch.dispatchByMode(mode, () => syncParsers[i].complete(result.next.state, exec), async () => {
308
- const completeResult = await parsers[i].complete(result.next.state, exec);
365
+ return require_mode_dispatch.dispatchByMode(mode, () => syncParsers[i].complete(result.next.state, withChildExecPath(exec, i)), async () => {
366
+ const completeResult = await parsers[i].complete(result.next.state, withChildExecPath(exec, i));
309
367
  return completeResult;
310
368
  });
311
369
  };
@@ -319,31 +377,24 @@ function createExclusiveSuggest(parsers, mode) {
319
377
  return (context, prefix) => {
320
378
  return require_mode_dispatch.dispatchIterableByMode(mode, function* () {
321
379
  const suggestions = [];
322
- if (context.state == null) for (const parser of syncParsers) {
323
- const parserSuggestions = parser.suggest({
324
- ...context,
325
- state: parser.initialState
326
- }, prefix);
380
+ if (context.state == null) for (let i = 0; i < syncParsers.length; i++) {
381
+ const parser = syncParsers[i];
382
+ const parserSuggestions = parser.suggest(withChildContext(context, i, parser.initialState), prefix);
327
383
  suggestions.push(...parserSuggestions);
328
384
  }
329
385
  else {
330
386
  const [index, parserResult] = context.state;
331
387
  if (parserResult.success) {
332
- const parserSuggestions = syncParsers[index].suggest({
333
- ...context,
334
- state: parserResult.next.state
335
- }, prefix);
388
+ const parserSuggestions = syncParsers[index].suggest(withChildContext(context, index, parserResult.next.state), prefix);
336
389
  suggestions.push(...parserSuggestions);
337
390
  }
338
391
  }
339
392
  yield* require_suggestion.deduplicateSuggestions(suggestions);
340
393
  }, async function* () {
341
394
  const suggestions = [];
342
- if (context.state == null) for (const parser of parsers) {
343
- const parserSuggestions = parser.suggest({
344
- ...context,
345
- state: parser.initialState
346
- }, prefix);
395
+ if (context.state == null) for (let i = 0; i < parsers.length; i++) {
396
+ const parser = parsers[i];
397
+ const parserSuggestions = parser.suggest(withChildContext(context, i, parser.initialState), prefix);
347
398
  if (parser.$mode === "async") for await (const s of parserSuggestions) suggestions.push(s);
348
399
  else suggestions.push(...parserSuggestions);
349
400
  }
@@ -351,10 +402,7 @@ function createExclusiveSuggest(parsers, mode) {
351
402
  const [index, parserResult] = context.state;
352
403
  if (parserResult.success) {
353
404
  const parser = parsers[index];
354
- const parserSuggestions = parser.suggest({
355
- ...context,
356
- state: parserResult.next.state
357
- }, prefix);
405
+ const parserSuggestions = parser.suggest(withChildContext(context, index, parserResult.next.state), prefix);
358
406
  if (parser.$mode === "async") for await (const s of parserSuggestions) suggestions.push(s);
359
407
  else suggestions.push(...parserSuggestions);
360
408
  }
@@ -363,6 +411,13 @@ function createExclusiveSuggest(parsers, mode) {
363
411
  });
364
412
  };
365
413
  }
414
+ function getExclusiveSuggestRuntimeNodes(parsers, state, path) {
415
+ if (!Array.isArray(state) || state.length !== 2 || typeof state[0] !== "number") return [];
416
+ const [index, parserResult] = state;
417
+ if (!parserResult?.success || index < 0 || index >= parsers.length) return [];
418
+ const parser = parsers[index];
419
+ return require_parser.getParserSuggestRuntimeNodes(parser, parserResult.next.state, [...path, index]);
420
+ }
366
421
  /**
367
422
  * Gets the no-match error, either from custom options or default.
368
423
  * Shared by or() and longestMatch().
@@ -372,6 +427,26 @@ function getNoMatchError(options, noMatchContext) {
372
427
  const customNoMatch = options?.errors?.noMatch;
373
428
  return customNoMatch ? typeof customNoMatch === "function" ? customNoMatch(noMatchContext) : customNoMatch : generateNoMatchError(noMatchContext);
374
429
  }
430
+ function composeExclusiveDependencyMetadata(parsers) {
431
+ const sourceBranches = parsers.filter((parser) => parser.dependencyMetadata?.source != null);
432
+ if (sourceBranches.length < 1) return void 0;
433
+ const sourceIds = new Set(sourceBranches.map((parser) => parser.dependencyMetadata.source.sourceId));
434
+ if (sourceIds.size !== 1) return void 0;
435
+ const sharedSource = sourceBranches[0].dependencyMetadata.source;
436
+ return { source: {
437
+ ...sharedSource,
438
+ getMissingSourceValue: void 0,
439
+ preservesSourceValue: sourceBranches.every((parser) => parser.dependencyMetadata?.source?.preservesSourceValue !== false),
440
+ extractSourceValue(state) {
441
+ if (!Array.isArray(state) || state.length !== 2 || typeof state[0] !== "number") return void 0;
442
+ const [index, parserResult] = state;
443
+ if (!parserResult?.success) return void 0;
444
+ const branchSource = parsers[index].dependencyMetadata?.source;
445
+ if (branchSource?.extractSourceValue == null) return void 0;
446
+ return branchSource.extractSourceValue(parserResult.next.state);
447
+ }
448
+ } };
449
+ }
375
450
  /**
376
451
  * @since 0.5.0
377
452
  */
@@ -404,17 +479,13 @@ function or(...args) {
404
479
  const orderedParsers = syncParsers.map((p, i) => [p, i]);
405
480
  orderedParsers.sort(([_, a], [__, b]) => context.state?.[0] === a ? -1 : context.state?.[0] === b ? 1 : a - b);
406
481
  for (const [parser, i] of orderedParsers) {
407
- const result = parser.parse({
408
- ...context,
409
- state: context.state == null || context.state[0] !== i || !context.state[1].success ? parser.initialState : context.state[1].next.state
410
- });
482
+ 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));
411
483
  if (result.success && result.consumed.length > 0) {
412
484
  if (context.state?.[0] !== i && context.state?.[1].success) {
413
485
  const previouslyConsumed = context.state[1].consumed;
414
486
  const checkResult = parser.parse({
415
- ...context,
416
- buffer: previouslyConsumed,
417
- state: parser.initialState
487
+ ...withChildContext(context, i, parser.initialState),
488
+ buffer: previouslyConsumed
418
489
  });
419
490
  const canConsumeShared = checkResult.success && checkResult.consumed.length === previouslyConsumed.length && checkResult.consumed.every((c, idx) => c === previouslyConsumed[idx]);
420
491
  if (!canConsumeShared) return {
@@ -422,11 +493,19 @@ function or(...args) {
422
493
  consumed: context.buffer.length - result.next.buffer.length,
423
494
  error: require_message.message`${require_message.values(context.state[1].consumed)} and ${require_message.values(result.consumed)} cannot be used together.`
424
495
  };
496
+ const replayExec = mergeChildExec(context.exec, checkResult.next.exec);
425
497
  const replayedResult = parser.parse({
426
- ...context,
498
+ ...withChildContext({
499
+ ...context,
500
+ ...replayExec != null ? {
501
+ exec: replayExec,
502
+ dependencyRegistry: replayExec.dependencyRegistry
503
+ } : {}
504
+ }, i, checkResult.next.state),
427
505
  state: checkResult.next.state
428
506
  });
429
507
  if (!replayedResult.success) return replayedResult;
508
+ const mergedExec$1 = mergeChildExec(replayExec, replayedResult.next.exec);
430
509
  return {
431
510
  success: true,
432
511
  next: {
@@ -436,18 +515,27 @@ function or(...args) {
436
515
  state: [i, {
437
516
  ...replayedResult,
438
517
  consumed: [...previouslyConsumed, ...replayedResult.consumed]
439
- }]
518
+ }],
519
+ ...mergedExec$1 != null ? {
520
+ exec: mergedExec$1,
521
+ dependencyRegistry: mergedExec$1.dependencyRegistry
522
+ } : {}
440
523
  },
441
524
  consumed: replayedResult.consumed
442
525
  };
443
526
  }
527
+ const mergedExec = mergeChildExec(context.exec, result.next.exec);
444
528
  return {
445
529
  success: true,
446
530
  next: {
447
531
  ...context,
448
532
  buffer: result.next.buffer,
449
533
  optionsTerminated: result.next.optionsTerminated,
450
- state: [i, result]
534
+ state: [i, result],
535
+ ...mergedExec != null ? {
536
+ exec: mergedExec,
537
+ dependencyRegistry: mergedExec.dependencyRegistry
538
+ } : {}
451
539
  },
452
540
  consumed: result.consumed
453
541
  };
@@ -463,18 +551,14 @@ function or(...args) {
463
551
  const orderedParsers = parsers.map((p, i) => [p, i]);
464
552
  orderedParsers.sort(([_, a], [__, b]) => context.state?.[0] === a ? -1 : context.state?.[0] === b ? 1 : a - b);
465
553
  for (const [parser, i] of orderedParsers) {
466
- const resultOrPromise = parser.parse({
467
- ...context,
468
- state: context.state == null || context.state[0] !== i || !context.state[1].success ? parser.initialState : context.state[1].next.state
469
- });
554
+ 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));
470
555
  const result = await resultOrPromise;
471
556
  if (result.success && result.consumed.length > 0) {
472
557
  if (context.state?.[0] !== i && context.state?.[1].success) {
473
558
  const previouslyConsumed = context.state[1].consumed;
474
559
  const checkResultOrPromise = parser.parse({
475
- ...context,
476
- buffer: previouslyConsumed,
477
- state: parser.initialState
560
+ ...withChildContext(context, i, parser.initialState),
561
+ buffer: previouslyConsumed
478
562
  });
479
563
  const checkResult = await checkResultOrPromise;
480
564
  const canConsumeShared = checkResult.success && checkResult.consumed.length === previouslyConsumed.length && checkResult.consumed.every((c, idx) => c === previouslyConsumed[idx]);
@@ -483,12 +567,17 @@ function or(...args) {
483
567
  consumed: context.buffer.length - result.next.buffer.length,
484
568
  error: require_message.message`${require_message.values(context.state[1].consumed)} and ${require_message.values(result.consumed)} cannot be used together.`
485
569
  };
486
- const replayedResultOrPromise = parser.parse({
570
+ const replayExec = mergeChildExec(context.exec, checkResult.next.exec);
571
+ const replayedResultOrPromise = parser.parse({ ...withChildContext({
487
572
  ...context,
488
- state: checkResult.next.state
489
- });
573
+ ...replayExec != null ? {
574
+ exec: replayExec,
575
+ dependencyRegistry: replayExec.dependencyRegistry
576
+ } : {}
577
+ }, i, checkResult.next.state) });
490
578
  const replayedResult = await replayedResultOrPromise;
491
579
  if (!replayedResult.success) return replayedResult;
580
+ const mergedExec$1 = mergeChildExec(replayExec, replayedResult.next.exec);
492
581
  return {
493
582
  success: true,
494
583
  next: {
@@ -498,18 +587,27 @@ function or(...args) {
498
587
  state: [i, {
499
588
  ...replayedResult,
500
589
  consumed: [...previouslyConsumed, ...replayedResult.consumed]
501
- }]
590
+ }],
591
+ ...mergedExec$1 != null ? {
592
+ exec: mergedExec$1,
593
+ dependencyRegistry: mergedExec$1.dependencyRegistry
594
+ } : {}
502
595
  },
503
596
  consumed: replayedResult.consumed
504
597
  };
505
598
  }
599
+ const mergedExec = mergeChildExec(context.exec, result.next.exec);
506
600
  return {
507
601
  success: true,
508
602
  next: {
509
603
  ...context,
510
604
  buffer: result.next.buffer,
511
605
  optionsTerminated: result.next.optionsTerminated,
512
- state: [i, result]
606
+ state: [i, result],
607
+ ...mergedExec != null ? {
608
+ exec: mergedExec,
609
+ dependencyRegistry: mergedExec.dependencyRegistry
610
+ } : {}
513
611
  },
514
612
  consumed: result.consumed
515
613
  };
@@ -536,6 +634,9 @@ function or(...args) {
536
634
  parse(context) {
537
635
  return require_mode_dispatch.dispatchByMode(combinedMode, () => parseSync(context), () => parseAsync(context));
538
636
  },
637
+ getSuggestRuntimeNodes(state, path) {
638
+ return getExclusiveSuggestRuntimeNodes(parsers, state, path);
639
+ },
539
640
  suggest: createExclusiveSuggest(parsers, combinedMode),
540
641
  getDocFragments(state, _defaultValue) {
541
642
  let brief;
@@ -564,6 +665,8 @@ function or(...args) {
564
665
  };
565
666
  }
566
667
  };
668
+ const singleDependencyMetadata = composeExclusiveDependencyMetadata(parsers);
669
+ if (singleDependencyMetadata != null) singleResult.dependencyMetadata = singleDependencyMetadata;
567
670
  return singleResult;
568
671
  }
569
672
  /**
@@ -598,10 +701,7 @@ function longestMatch(...args) {
598
701
  let error = getInitialError(context);
599
702
  for (let i = 0; i < syncParsers.length; i++) {
600
703
  const parser = syncParsers[i];
601
- const result = parser.parse({
602
- ...context,
603
- state: context.state == null || context.state[0] !== i || !context.state[1].success ? parser.initialState : context.state[1].next.state
604
- });
704
+ 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));
605
705
  if (result.success) {
606
706
  const consumed = context.buffer.length - result.next.buffer.length;
607
707
  if (bestMatch === null || consumed > bestMatch.consumed) bestMatch = {
@@ -611,16 +711,23 @@ function longestMatch(...args) {
611
711
  };
612
712
  } else if (error.consumed < result.consumed) error = result;
613
713
  }
614
- if (bestMatch && bestMatch.result.success) return {
615
- success: true,
616
- next: {
617
- ...context,
618
- buffer: bestMatch.result.next.buffer,
619
- optionsTerminated: bestMatch.result.next.optionsTerminated,
620
- state: [bestMatch.index, bestMatch.result]
621
- },
622
- consumed: bestMatch.result.consumed
623
- };
714
+ if (bestMatch && bestMatch.result.success) {
715
+ const mergedExec = mergeChildExec(context.exec, bestMatch.result.next.exec);
716
+ return {
717
+ success: true,
718
+ next: {
719
+ ...context,
720
+ buffer: bestMatch.result.next.buffer,
721
+ optionsTerminated: bestMatch.result.next.optionsTerminated,
722
+ state: [bestMatch.index, bestMatch.result],
723
+ ...mergedExec != null ? {
724
+ exec: mergedExec,
725
+ dependencyRegistry: mergedExec.dependencyRegistry
726
+ } : {}
727
+ },
728
+ consumed: bestMatch.result.consumed
729
+ };
730
+ }
624
731
  return {
625
732
  ...error,
626
733
  success: false
@@ -631,10 +738,7 @@ function longestMatch(...args) {
631
738
  let error = getInitialError(context);
632
739
  for (let i = 0; i < parsers.length; i++) {
633
740
  const parser = parsers[i];
634
- const resultOrPromise = parser.parse({
635
- ...context,
636
- state: context.state == null || context.state[0] !== i || !context.state[1].success ? parser.initialState : context.state[1].next.state
637
- });
741
+ 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));
638
742
  const result = await resultOrPromise;
639
743
  if (result.success) {
640
744
  const consumed = context.buffer.length - result.next.buffer.length;
@@ -645,16 +749,23 @@ function longestMatch(...args) {
645
749
  };
646
750
  } else if (error.consumed < result.consumed) error = result;
647
751
  }
648
- if (bestMatch && bestMatch.result.success) return {
649
- success: true,
650
- next: {
651
- ...context,
652
- buffer: bestMatch.result.next.buffer,
653
- optionsTerminated: bestMatch.result.next.optionsTerminated,
654
- state: [bestMatch.index, bestMatch.result]
655
- },
656
- consumed: bestMatch.result.consumed
657
- };
752
+ if (bestMatch && bestMatch.result.success) {
753
+ const mergedExec = mergeChildExec(context.exec, bestMatch.result.next.exec);
754
+ return {
755
+ success: true,
756
+ next: {
757
+ ...context,
758
+ buffer: bestMatch.result.next.buffer,
759
+ optionsTerminated: bestMatch.result.next.optionsTerminated,
760
+ state: [bestMatch.index, bestMatch.result],
761
+ ...mergedExec != null ? {
762
+ exec: mergedExec,
763
+ dependencyRegistry: mergedExec.dependencyRegistry
764
+ } : {}
765
+ },
766
+ consumed: bestMatch.result.consumed
767
+ };
768
+ }
658
769
  return {
659
770
  ...error,
660
771
  success: false
@@ -676,6 +787,9 @@ function longestMatch(...args) {
676
787
  parse(context) {
677
788
  return require_mode_dispatch.dispatchByMode(combinedMode, () => parseSync(context), () => parseAsync(context));
678
789
  },
790
+ getSuggestRuntimeNodes(state, path) {
791
+ return getExclusiveSuggestRuntimeNodes(parsers, state, path);
792
+ },
679
793
  suggest: createExclusiveSuggest(parsers, combinedMode),
680
794
  getDocFragments(state, _defaultValue) {
681
795
  let brief;
@@ -711,6 +825,8 @@ function longestMatch(...args) {
711
825
  };
712
826
  }
713
827
  };
828
+ const multiDependencyMetadata = composeExclusiveDependencyMetadata(parsers);
829
+ if (multiDependencyMetadata != null) multiResult.dependencyMetadata = multiDependencyMetadata;
714
830
  return multiResult;
715
831
  }
716
832
  /**
@@ -719,32 +835,32 @@ function longestMatch(...args) {
719
835
  */
720
836
  function* suggestObjectSync(context, prefix, parserPairs) {
721
837
  const runtime = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
722
- const nodes = require_dependency_runtime.buildRuntimeNodesFromPairs(parserPairs, context.state && typeof context.state === "object" ? context.state : {}, context.exec?.path);
838
+ const sourceParserPairs = filterExcludedFieldParsers(parserPairs, context.exec?.excludedSourceFields);
839
+ const nodes = require_dependency_runtime.buildRuntimeNodesFromPairs(sourceParserPairs, context.state && typeof context.state === "object" ? context.state : {}, context.exec?.path);
723
840
  require_dependency_runtime.collectExplicitSourceValues(nodes, runtime);
724
- if (context.state && typeof context.state === "object") require_dependency_runtime.collectSourcesFromState(context.state, runtime);
725
- completeDependencySourceDefaults(context, parserPairs, runtime.registry, context.exec);
841
+ if (context.state && typeof context.state === "object") require_dependency_runtime.collectSourcesFromState(context.state, runtime, /* @__PURE__ */ new WeakSet(), context.exec?.excludedSourceFields);
842
+ completeDependencySourceDefaults(context, sourceParserPairs, runtime.registry, context.exec);
726
843
  const contextWithRegistry = {
727
844
  ...context,
728
- dependencyRegistry: runtime.registry
845
+ dependencyRegistry: runtime.registry,
846
+ ...context.exec != null ? { exec: {
847
+ ...context.exec,
848
+ dependencyRuntime: runtime,
849
+ dependencyRegistry: runtime.registry
850
+ } } : {}
729
851
  };
730
852
  if (context.buffer.length > 0) {
731
853
  const lastToken = context.buffer[context.buffer.length - 1];
732
854
  for (const [field, parser] of parserPairs) if (isOptionRequiringValue(parser.usage, lastToken)) {
733
855
  const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
734
- yield* parser.suggest({
735
- ...contextWithRegistry,
736
- state: fieldState
737
- }, prefix);
856
+ yield* parser.suggest(withChildContext(contextWithRegistry, field, fieldState), prefix);
738
857
  return;
739
858
  }
740
859
  }
741
860
  const suggestions = [];
742
861
  for (const [field, parser] of parserPairs) {
743
862
  const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
744
- const fieldSuggestions = parser.suggest({
745
- ...contextWithRegistry,
746
- state: fieldState
747
- }, prefix);
863
+ const fieldSuggestions = parser.suggest(withChildContext(contextWithRegistry, field, fieldState), prefix);
748
864
  suggestions.push(...fieldSuggestions);
749
865
  }
750
866
  yield* require_suggestion.deduplicateSuggestions(suggestions);
@@ -755,22 +871,25 @@ function* suggestObjectSync(context, prefix, parserPairs) {
755
871
  */
756
872
  async function* suggestObjectAsync(context, prefix, parserPairs) {
757
873
  const runtime = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
758
- const nodes = require_dependency_runtime.buildRuntimeNodesFromPairs(parserPairs, context.state && typeof context.state === "object" ? context.state : {}, context.exec?.path);
759
- require_dependency_runtime.collectExplicitSourceValues(nodes, runtime);
760
- if (context.state && typeof context.state === "object") require_dependency_runtime.collectSourcesFromState(context.state, runtime);
761
- await completeDependencySourceDefaultsAsync(context, parserPairs, runtime.registry, context.exec);
874
+ const sourceParserPairs = filterExcludedFieldParsers(parserPairs, context.exec?.excludedSourceFields);
875
+ const nodes = require_dependency_runtime.buildRuntimeNodesFromPairs(sourceParserPairs, context.state && typeof context.state === "object" ? context.state : {}, context.exec?.path);
876
+ await require_dependency_runtime.collectExplicitSourceValuesAsync(nodes, runtime);
877
+ if (context.state && typeof context.state === "object") require_dependency_runtime.collectSourcesFromState(context.state, runtime, /* @__PURE__ */ new WeakSet(), context.exec?.excludedSourceFields);
878
+ await completeDependencySourceDefaultsAsync(context, sourceParserPairs, runtime.registry, context.exec);
762
879
  const contextWithRegistry = {
763
880
  ...context,
764
- dependencyRegistry: runtime.registry
881
+ dependencyRegistry: runtime.registry,
882
+ ...context.exec != null ? { exec: {
883
+ ...context.exec,
884
+ dependencyRuntime: runtime,
885
+ dependencyRegistry: runtime.registry
886
+ } } : {}
765
887
  };
766
888
  if (context.buffer.length > 0) {
767
889
  const lastToken = context.buffer[context.buffer.length - 1];
768
890
  for (const [field, parser] of parserPairs) if (isOptionRequiringValue(parser.usage, lastToken)) {
769
891
  const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
770
- const suggestions$1 = parser.suggest({
771
- ...contextWithRegistry,
772
- state: fieldState
773
- }, prefix);
892
+ const suggestions$1 = parser.suggest(withChildContext(contextWithRegistry, field, fieldState), prefix);
774
893
  for await (const s of suggestions$1) yield s;
775
894
  return;
776
895
  }
@@ -778,10 +897,7 @@ async function* suggestObjectAsync(context, prefix, parserPairs) {
778
897
  const suggestions = [];
779
898
  for (const [field, parser] of parserPairs) {
780
899
  const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
781
- const fieldSuggestions = parser.suggest({
782
- ...contextWithRegistry,
783
- state: fieldState
784
- }, prefix);
900
+ const fieldSuggestions = parser.suggest(withChildContext(contextWithRegistry, field, fieldState), prefix);
785
901
  for await (const s of fieldSuggestions) suggestions.push(s);
786
902
  }
787
903
  yield* require_suggestion.deduplicateSuggestions(suggestions);
@@ -805,6 +921,21 @@ function registerCompletedDependency(completed, registry) {
805
921
  function* pendingDependencyDefaults(context, parserPairs) {
806
922
  for (const [field, fieldParser] of parserPairs) {
807
923
  const fieldState = context.state != null && typeof context.state === "object" && field in context.state ? context.state[field] : void 0;
924
+ const annotatedFieldState = getAnnotatedFieldState(context.state, field, fieldParser);
925
+ if (fieldParser.dependencyMetadata?.source?.getMissingSourceValue != null && isUnmatchedDependencyState(fieldState, fieldParser)) {
926
+ yield {
927
+ parser: fieldParser,
928
+ state: annotatedFieldState
929
+ };
930
+ continue;
931
+ }
932
+ if (fieldParser.dependencyMetadata?.source != null && isUnmatchedDependencyState(fieldState, fieldParser) && (annotatedFieldState !== fieldState || isNonCliBoundSourceState(fieldState, fieldParser))) {
933
+ yield {
934
+ parser: fieldParser,
935
+ state: annotatedFieldState
936
+ };
937
+ continue;
938
+ }
808
939
  if (fieldState != null) {
809
940
  if (!Array.isArray(fieldState) && !require_dependency.isDependencySourceState(fieldState) && (require_dependency.isWrappedDependencySource(fieldParser) || require_dependency.isPendingDependencySourceState(fieldParser.initialState))) yield {
810
941
  parser: fieldParser,
@@ -851,9 +982,11 @@ function completeDependencySourceDefaults(context, parserPairs, registry, exec)
851
982
  */
852
983
  function wrapAsDependencySourceState(completed, parser) {
853
984
  if (require_dependency.isDependencySourceState(completed)) return completed;
854
- const hasDep = require_dependency.isWrappedDependencySource(parser) || require_dependency.isPendingDependencySourceState(parser.initialState);
985
+ const metadataSource = parser.dependencyMetadata?.source;
986
+ if (metadataSource?.preservesSourceValue === false) return void 0;
987
+ const hasDep = metadataSource != null || require_dependency.isWrappedDependencySource(parser) || require_dependency.isPendingDependencySourceState(parser.initialState);
855
988
  if (hasDep && typeof completed === "object" && completed !== null && "success" in completed && completed.success && "value" in completed && completed.value !== void 0) {
856
- const depId = require_dependency.isWrappedDependencySource(parser) ? parser[require_dependency.wrappedDependencySourceMarker][require_dependency.dependencyId] : parser.initialState[require_dependency.dependencyId];
989
+ const depId = metadataSource?.sourceId ?? (require_dependency.isWrappedDependencySource(parser) ? parser[require_dependency.wrappedDependencySourceMarker][require_dependency.dependencyId] : parser.initialState[require_dependency.dependencyId]);
857
990
  return require_dependency.createDependencySourceState(completed, depId);
858
991
  }
859
992
  return void 0;
@@ -909,6 +1042,20 @@ function collectChildFieldParsers(parsers) {
909
1042
  for (const parser of parsers) if (fieldParsersKey in parser) pairs.push(...parser[fieldParsersKey]);
910
1043
  return pairs;
911
1044
  }
1045
+ function filterDuplicateFieldParsers(pairs) {
1046
+ const counts = /* @__PURE__ */ new Map();
1047
+ for (const [field] of pairs) counts.set(field, (counts.get(field) ?? 0) + 1);
1048
+ return pairs.filter(([field]) => (counts.get(field) ?? 0) <= 1);
1049
+ }
1050
+ function collectDuplicateFieldNames(pairs) {
1051
+ const counts = /* @__PURE__ */ new Map();
1052
+ for (const [field] of pairs) counts.set(field, (counts.get(field) ?? 0) + 1);
1053
+ return new Set([...counts.entries()].filter(([, count]) => count > 1).map(([field]) => field));
1054
+ }
1055
+ function filterExcludedFieldParsers(pairs, excludedFields) {
1056
+ if (excludedFields == null || excludedFields.size < 1) return pairs;
1057
+ return pairs.filter(([field]) => !excludedFields.has(field));
1058
+ }
912
1059
  /**
913
1060
  * Pre-completes dependency source fields and registers their values in
914
1061
  * the given registry. Unlike `completeDependencySourceDefaults()` (used
@@ -935,22 +1082,37 @@ function preCompleteAndRegisterDependencies(state, fieldParserPairs, registry, e
935
1082
  continue;
936
1083
  }
937
1084
  const fieldState = state[field];
1085
+ const annotatedFieldState = getAnnotatedFieldState(state, field, fieldParser);
1086
+ if (fieldParser.dependencyMetadata?.source?.getMissingSourceValue != null && isUnmatchedDependencyState(fieldState, fieldParser)) {
1087
+ const completed = fieldParser.complete(annotatedFieldState, withChildExecPath(exec, field));
1088
+ preCompleted.set(field, completed);
1089
+ const depState = wrapAsDependencySourceState(completed, fieldParser);
1090
+ if (depState) registerCompletedDependency(depState, registry);
1091
+ continue;
1092
+ }
1093
+ if (fieldParser.dependencyMetadata?.source != null && isUnmatchedDependencyState(fieldState, fieldParser) && (annotatedFieldState !== fieldState || isNonCliBoundSourceState(fieldState, fieldParser))) {
1094
+ const completed = fieldParser.complete(annotatedFieldState, withChildExecPath(exec, field));
1095
+ preCompleted.set(field, completed);
1096
+ const depState = wrapAsDependencySourceState(completed, fieldParser);
1097
+ if (depState) registerCompletedDependency(depState, registry);
1098
+ continue;
1099
+ }
938
1100
  if (Array.isArray(fieldState) && fieldState.length === 1 && require_dependency.isPendingDependencySourceState(fieldState[0])) {
939
- const completed = fieldParser.complete(fieldState, exec);
1101
+ const completed = fieldParser.complete(fieldState, withChildExecPath(exec, field));
940
1102
  preCompleted.set(field, completed);
941
1103
  if (require_dependency.isDependencySourceState(completed)) registerCompletedDependency(completed, registry);
942
1104
  } else if (fieldState === void 0 && require_dependency.isPendingDependencySourceState(fieldParser.initialState)) {
943
- const completed = fieldParser.complete([fieldParser.initialState], exec);
1105
+ const completed = fieldParser.complete([fieldParser.initialState], withChildExecPath(exec, field));
944
1106
  preCompleted.set(field, completed);
945
1107
  if (require_dependency.isDependencySourceState(completed)) registerCompletedDependency(completed, registry);
946
1108
  } else if (fieldState === void 0 && require_dependency.isWrappedDependencySource(fieldParser)) {
947
1109
  const pendingState = fieldParser[require_dependency.wrappedDependencySourceMarker];
948
- const completed = fieldParser.complete([pendingState], exec);
1110
+ const completed = fieldParser.complete([pendingState], withChildExecPath(exec, field));
949
1111
  preCompleted.set(field, completed);
950
1112
  if (require_dependency.isDependencySourceState(completed)) registerCompletedDependency(completed, registry);
951
1113
  } else if (fieldState != null && !Array.isArray(fieldState) && !require_dependency.isDependencySourceState(fieldState) && (require_dependency.isWrappedDependencySource(fieldParser) || require_dependency.isPendingDependencySourceState(fieldParser.initialState))) {
952
- const annotatedFieldState = getAnnotatedFieldState(state, field, fieldParser);
953
- const completed = fieldParser.complete(annotatedFieldState, exec);
1114
+ const annotatedFieldState$1 = getAnnotatedFieldState(state, field, fieldParser);
1115
+ const completed = fieldParser.complete(annotatedFieldState$1, withChildExecPath(exec, field));
954
1116
  preCompleted.set(field, completed);
955
1117
  const depState = wrapAsDependencySourceState(completed, fieldParser);
956
1118
  if (depState) registerCompletedDependency(depState, registry);
@@ -973,22 +1135,37 @@ async function preCompleteAndRegisterDependenciesAsync(state, fieldParserPairs,
973
1135
  continue;
974
1136
  }
975
1137
  const fieldState = state[field];
1138
+ const annotatedFieldState = getAnnotatedFieldState(state, field, fieldParser);
1139
+ if (fieldParser.dependencyMetadata?.source?.getMissingSourceValue != null && isUnmatchedDependencyState(fieldState, fieldParser)) {
1140
+ const completed = await fieldParser.complete(annotatedFieldState, withChildExecPath(exec, field));
1141
+ preCompleted.set(field, completed);
1142
+ const depState = wrapAsDependencySourceState(completed, fieldParser);
1143
+ if (depState) registerCompletedDependency(depState, registry);
1144
+ continue;
1145
+ }
1146
+ if (fieldParser.dependencyMetadata?.source != null && isUnmatchedDependencyState(fieldState, fieldParser) && (annotatedFieldState !== fieldState || isNonCliBoundSourceState(fieldState, fieldParser))) {
1147
+ const completed = await fieldParser.complete(annotatedFieldState, withChildExecPath(exec, field));
1148
+ preCompleted.set(field, completed);
1149
+ const depState = wrapAsDependencySourceState(completed, fieldParser);
1150
+ if (depState) registerCompletedDependency(depState, registry);
1151
+ continue;
1152
+ }
976
1153
  if (Array.isArray(fieldState) && fieldState.length === 1 && require_dependency.isPendingDependencySourceState(fieldState[0])) {
977
- const completed = await fieldParser.complete(fieldState, exec);
1154
+ const completed = await fieldParser.complete(fieldState, withChildExecPath(exec, field));
978
1155
  preCompleted.set(field, completed);
979
1156
  if (require_dependency.isDependencySourceState(completed)) registerCompletedDependency(completed, registry);
980
1157
  } else if (fieldState === void 0 && require_dependency.isPendingDependencySourceState(fieldParser.initialState)) {
981
- const completed = await fieldParser.complete([fieldParser.initialState], exec);
1158
+ const completed = await fieldParser.complete([fieldParser.initialState], withChildExecPath(exec, field));
982
1159
  preCompleted.set(field, completed);
983
1160
  if (require_dependency.isDependencySourceState(completed)) registerCompletedDependency(completed, registry);
984
1161
  } else if (fieldState === void 0 && require_dependency.isWrappedDependencySource(fieldParser)) {
985
1162
  const pendingState = fieldParser[require_dependency.wrappedDependencySourceMarker];
986
- const completed = await fieldParser.complete([pendingState], exec);
1163
+ const completed = await fieldParser.complete([pendingState], withChildExecPath(exec, field));
987
1164
  preCompleted.set(field, completed);
988
1165
  if (require_dependency.isDependencySourceState(completed)) registerCompletedDependency(completed, registry);
989
1166
  } else if (fieldState != null && !Array.isArray(fieldState) && !require_dependency.isDependencySourceState(fieldState) && (require_dependency.isWrappedDependencySource(fieldParser) || require_dependency.isPendingDependencySourceState(fieldParser.initialState))) {
990
- const annotatedFieldState = getAnnotatedFieldState(state, field, fieldParser);
991
- const completed = await fieldParser.complete(annotatedFieldState, exec);
1167
+ const annotatedFieldState$1 = getAnnotatedFieldState(state, field, fieldParser);
1168
+ const completed = await fieldParser.complete(annotatedFieldState$1, withChildExecPath(exec, field));
992
1169
  preCompleted.set(field, completed);
993
1170
  const depState = wrapAsDependencySourceState(completed, fieldParser);
994
1171
  if (depState) registerCompletedDependency(depState, registry);
@@ -996,153 +1173,6 @@ async function preCompleteAndRegisterDependenciesAsync(state, fieldParserPairs,
996
1173
  }
997
1174
  return preCompleted;
998
1175
  }
999
- /**
1000
- * Recursively collects dependency values from DependencySourceState objects
1001
- * found anywhere in the state tree.
1002
- * @internal
1003
- */
1004
- function collectDependencies(state, registry, visited = /* @__PURE__ */ new WeakSet()) {
1005
- if (state === null || state === void 0) return;
1006
- if (typeof state === "object") {
1007
- if (visited.has(state)) return;
1008
- visited.add(state);
1009
- }
1010
- if (require_dependency.isDependencySourceState(state)) {
1011
- const depId = state[require_dependency.dependencyId];
1012
- const result = state.result;
1013
- if (result.success) registry.set(depId, result.value);
1014
- return;
1015
- }
1016
- if (Array.isArray(state)) {
1017
- for (const item of state) collectDependencies(item, registry, visited);
1018
- return;
1019
- }
1020
- if (typeof state === "object" && !require_dependency.isDeferredParseState(state)) for (const key of Reflect.ownKeys(state)) collectDependencies(state[key], registry, visited);
1021
- }
1022
- /**
1023
- * Checks if a value is a plain object (created with `{}` or `Object.create(null)`).
1024
- * Class instances like `Temporal.PlainDate`, `URL`, `Date`, etc. return false.
1025
- * This is used to determine whether to recursively traverse an object when
1026
- * resolving deferred parse states - we only want to traverse plain objects
1027
- * that are part of the parser state structure, not user values.
1028
- */
1029
- function isPlainObject(value) {
1030
- if (typeof value !== "object" || value === null) return false;
1031
- const proto = Object.getPrototypeOf(value);
1032
- return proto === Object.prototype || proto === null;
1033
- }
1034
- /**
1035
- * Collects dependency values for a DeferredParseState from the registry.
1036
- * Returns the collected values array, or null if any required dependency
1037
- * is missing (and no default is available).
1038
- */
1039
- function collectDependencyValues(deferredState, registry) {
1040
- const depIds = deferredState.dependencyIds;
1041
- if (depIds && depIds.length > 0) {
1042
- const defaults$1 = deferredState.defaultValues;
1043
- const dependencyValues = [];
1044
- for (let i = 0; i < depIds.length; i++) {
1045
- const depId$1 = depIds[i];
1046
- if (registry.has(depId$1)) dependencyValues.push(registry.get(depId$1));
1047
- else if (defaults$1 && i < defaults$1.length) dependencyValues.push(defaults$1[i]);
1048
- else return null;
1049
- }
1050
- return dependencyValues;
1051
- }
1052
- const depId = deferredState.dependencyId;
1053
- if (registry.has(depId)) return registry.get(depId);
1054
- const defaults = deferredState.defaultValues;
1055
- if (defaults && defaults.length > 0) return defaults[0];
1056
- return null;
1057
- }
1058
- /**
1059
- * Recursively resolves DeferredParseState objects found anywhere in the state tree.
1060
- * Returns the resolved state (sync version).
1061
- *
1062
- * Only traverses:
1063
- * - DeferredParseState (to resolve it)
1064
- * - DependencySourceState (skipped, kept as-is)
1065
- * - Arrays (to find nested deferred states)
1066
- * - Plain objects (to find nested deferred states in parser state structures)
1067
- *
1068
- * Does NOT traverse class instances (e.g., Temporal.PlainDate, URL) since these
1069
- * are user values that should be preserved as-is.
1070
- */
1071
- function resolveDeferred(state, registry, visited = /* @__PURE__ */ new WeakSet()) {
1072
- if (state === null || state === void 0) return state;
1073
- if (typeof state === "object") {
1074
- if (visited.has(state)) return state;
1075
- visited.add(state);
1076
- }
1077
- if (require_dependency.isDeferredParseState(state)) {
1078
- const deferredState = state;
1079
- const dependencyValue = collectDependencyValues(deferredState, registry);
1080
- if (dependencyValue === null) return deferredState.preliminaryResult;
1081
- const reParseResult = deferredState.parser[require_dependency.parseWithDependency](deferredState.rawInput, dependencyValue);
1082
- if (reParseResult instanceof Promise) return deferredState.preliminaryResult;
1083
- return reParseResult;
1084
- }
1085
- if (require_dependency.isDependencySourceState(state)) return state;
1086
- if (Array.isArray(state)) return state.map((item) => resolveDeferred(item, registry, visited));
1087
- if (isPlainObject(state)) {
1088
- const resolved = {};
1089
- for (const key of Reflect.ownKeys(state)) resolved[key] = resolveDeferred(state[key], registry, visited);
1090
- return resolved;
1091
- }
1092
- return state;
1093
- }
1094
- function resolveDeferredParseStates(fieldStates, initialRegistry) {
1095
- const registry = initialRegistry ?? new require_dependency.DependencyRegistry();
1096
- collectDependencies(fieldStates, registry);
1097
- return resolveDeferred(fieldStates, registry);
1098
- }
1099
- /**
1100
- * Recursively resolves DeferredParseState objects found anywhere in the state tree.
1101
- * Returns the resolved state (async version).
1102
- *
1103
- * Only traverses:
1104
- * - DeferredParseState (to resolve it)
1105
- * - DependencySourceState (skipped, kept as-is)
1106
- * - Arrays (to find nested deferred states)
1107
- * - Plain objects (to find nested deferred states in parser state structures)
1108
- *
1109
- * Does NOT traverse class instances (e.g., Temporal.PlainDate, URL) since these
1110
- * are user values that should be preserved as-is.
1111
- */
1112
- async function resolveDeferredAsync(state, registry, visited = /* @__PURE__ */ new WeakSet()) {
1113
- if (state === null || state === void 0) return state;
1114
- if (typeof state === "object") {
1115
- if (visited.has(state)) return state;
1116
- visited.add(state);
1117
- }
1118
- if (require_dependency.isDeferredParseState(state)) {
1119
- const deferredState = state;
1120
- const dependencyValue = collectDependencyValues(deferredState, registry);
1121
- if (dependencyValue === null) return deferredState.preliminaryResult;
1122
- const reParseResult = deferredState.parser[require_dependency.parseWithDependency](deferredState.rawInput, dependencyValue);
1123
- return Promise.resolve(reParseResult);
1124
- }
1125
- if (require_dependency.isDependencySourceState(state)) return state;
1126
- if (Array.isArray(state)) return Promise.all(state.map((item) => resolveDeferredAsync(item, registry, visited)));
1127
- if (isPlainObject(state)) {
1128
- const resolved = {};
1129
- const keys = Reflect.ownKeys(state);
1130
- await Promise.all(keys.map(async (key) => {
1131
- resolved[key] = await resolveDeferredAsync(state[key], registry, visited);
1132
- }));
1133
- return resolved;
1134
- }
1135
- return state;
1136
- }
1137
- /**
1138
- * Async version of resolveDeferredParseStates for async parsers.
1139
- * @internal
1140
- */
1141
- async function resolveDeferredParseStatesAsync(fieldStates, initialRegistry) {
1142
- const registry = initialRegistry ?? new require_dependency.DependencyRegistry();
1143
- collectDependencies(fieldStates, registry);
1144
- return await resolveDeferredAsync(fieldStates, registry);
1145
- }
1146
1176
  function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1147
1177
  const label = typeof labelOrParsers === "string" ? labelOrParsers : void 0;
1148
1178
  if (label != null) require_validate.validateLabel(label);
@@ -1174,11 +1204,20 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1174
1204
  })() : void 0;
1175
1205
  if (cache?.has(fieldKey)) return cache.get(fieldKey);
1176
1206
  const sourceState = parentState != null && typeof parentState === "object" && fieldKey in parentState ? parentState[fieldKey] : parser.initialState;
1177
- if (sourceState == null || typeof sourceState !== "object") {
1207
+ const annotations = require_annotations.getAnnotations(parentState);
1208
+ if (sourceState == null) {
1209
+ if (annotations !== void 0 && Reflect.get(parser, inheritParentAnnotationsKey) === true) {
1210
+ const inheritedState$1 = require_annotations.injectAnnotations({}, annotations);
1211
+ cache?.set(fieldKey, inheritedState$1);
1212
+ return inheritedState$1;
1213
+ }
1214
+ cache?.set(fieldKey, sourceState);
1215
+ return sourceState;
1216
+ }
1217
+ if (typeof sourceState !== "object") {
1178
1218
  cache?.set(fieldKey, sourceState);
1179
1219
  return sourceState;
1180
1220
  }
1181
- const annotations = require_annotations.getAnnotations(parentState);
1182
1221
  if (annotations === void 0 || require_annotations.getAnnotations(sourceState) === annotations) {
1183
1222
  cache?.set(fieldKey, sourceState);
1184
1223
  return sourceState;
@@ -1214,11 +1253,9 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1214
1253
  madeProgress = false;
1215
1254
  const getFieldState = createFieldStateGetter(currentContext.state);
1216
1255
  for (const [field, parser] of parserPairs) {
1217
- const result = parser.parse({
1218
- ...currentContext,
1219
- state: getFieldState(field, parser)
1220
- });
1256
+ const result = parser.parse(withChildContext(currentContext, field, getFieldState(field, parser)));
1221
1257
  if (result.success && result.consumed.length > 0) {
1258
+ const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
1222
1259
  currentContext = {
1223
1260
  ...currentContext,
1224
1261
  buffer: result.next.buffer,
@@ -1226,7 +1263,12 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1226
1263
  state: {
1227
1264
  ...currentContext.state,
1228
1265
  [field]: result.next.state
1229
- }
1266
+ },
1267
+ ...mergedExec != null ? {
1268
+ trace: mergedExec.trace,
1269
+ exec: mergedExec,
1270
+ dependencyRegistry: mergedExec.dependencyRegistry
1271
+ } : {}
1230
1272
  };
1231
1273
  allConsumed.push(...result.consumed);
1232
1274
  anySuccess = true;
@@ -1245,7 +1287,7 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1245
1287
  const getFieldState = createFieldStateGetter(context.state);
1246
1288
  for (const [field, parser] of parserPairs) {
1247
1289
  const fieldState = getFieldState(field, parser);
1248
- const completeResult = parser.complete(fieldState, context.exec);
1290
+ const completeResult = parser.complete(fieldState, withChildExecPath(context.exec, field));
1249
1291
  if (!completeResult.success) {
1250
1292
  allCanComplete = false;
1251
1293
  break;
@@ -1272,12 +1314,10 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1272
1314
  madeProgress = false;
1273
1315
  const getFieldState = createFieldStateGetter(currentContext.state);
1274
1316
  for (const [field, parser] of parserPairs) {
1275
- const resultOrPromise = parser.parse({
1276
- ...currentContext,
1277
- state: getFieldState(field, parser)
1278
- });
1317
+ const resultOrPromise = parser.parse(withChildContext(currentContext, field, getFieldState(field, parser)));
1279
1318
  const result = await resultOrPromise;
1280
1319
  if (result.success && result.consumed.length > 0) {
1320
+ const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
1281
1321
  currentContext = {
1282
1322
  ...currentContext,
1283
1323
  buffer: result.next.buffer,
@@ -1285,7 +1325,12 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1285
1325
  state: {
1286
1326
  ...currentContext.state,
1287
1327
  [field]: result.next.state
1288
- }
1328
+ },
1329
+ ...mergedExec != null ? {
1330
+ trace: mergedExec.trace,
1331
+ exec: mergedExec,
1332
+ dependencyRegistry: mergedExec.dependencyRegistry
1333
+ } : {}
1289
1334
  };
1290
1335
  allConsumed.push(...result.consumed);
1291
1336
  anySuccess = true;
@@ -1304,7 +1349,7 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1304
1349
  const getFieldState = createFieldStateGetter(context.state);
1305
1350
  for (const [field, parser] of parserPairs) {
1306
1351
  const fieldState = getFieldState(field, parser);
1307
- const completeResult = await parser.complete(fieldState, context.exec);
1352
+ const completeResult = await parser.complete(fieldState, withChildExecPath(context.exec, field));
1308
1353
  if (!completeResult.success) {
1309
1354
  allCanComplete = false;
1310
1355
  break;
@@ -1343,7 +1388,7 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1343
1388
  ...exec,
1344
1389
  dependencyRuntime: runtime
1345
1390
  };
1346
- const typedParserPairs = parserPairs;
1391
+ const typedParserPairs = filterExcludedFieldParsers(parserPairs, exec?.excludedSourceFields);
1347
1392
  const preCompleted = preCompleteAndRegisterDependencies(state, typedParserPairs, runtime.registry, childExec);
1348
1393
  const phase3Exec = {
1349
1394
  ...childExec,
@@ -1356,6 +1401,7 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1356
1401
  const fieldParser = parsers[field];
1357
1402
  annotatedState[fieldKey] = getFieldState(field, fieldParser);
1358
1403
  }
1404
+ require_dependency_runtime.collectExplicitSourceValues(filterPreCompletedRuntimeNodes(require_dependency_runtime.buildRuntimeNodesFromPairs(typedParserPairs, annotatedState, exec?.path), new Set(preCompleted.keys())), runtime);
1359
1405
  const resolvedFieldStates = require_dependency_runtime.resolveStateWithRuntime(annotatedState, runtime);
1360
1406
  const result = {};
1361
1407
  const deferredKeys = /* @__PURE__ */ new Map();
@@ -1368,7 +1414,7 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1368
1414
  if (preCompletedResult !== void 0) valueResult = unwrapCompleteResult(preCompletedResult);
1369
1415
  else {
1370
1416
  const fieldState = resolvedFieldStates[fieldKey];
1371
- valueResult = unwrapCompleteResult(fieldParser.complete(fieldState, phase3Exec));
1417
+ valueResult = unwrapCompleteResult(fieldParser.complete(fieldState, withChildExecPath(phase3Exec, fieldKey)));
1372
1418
  }
1373
1419
  if (valueResult.success) {
1374
1420
  result[fieldKey] = valueResult.value;
@@ -1395,7 +1441,7 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1395
1441
  ...exec,
1396
1442
  dependencyRuntime: runtime
1397
1443
  };
1398
- const asyncParserPairs = parserPairs;
1444
+ const asyncParserPairs = filterExcludedFieldParsers(parserPairs, exec?.excludedSourceFields);
1399
1445
  const preCompleted = await preCompleteAndRegisterDependenciesAsync(state, asyncParserPairs, runtime.registry, childExec);
1400
1446
  const phase3Exec = {
1401
1447
  ...childExec,
@@ -1408,20 +1454,12 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1408
1454
  const fieldParser = parsers[field];
1409
1455
  annotatedState[fieldKey] = getFieldState(field, fieldParser);
1410
1456
  }
1457
+ await require_dependency_runtime.collectExplicitSourceValuesAsync(filterPreCompletedRuntimeNodes(require_dependency_runtime.buildRuntimeNodesFromPairs(asyncParserPairs, annotatedState, exec?.path), new Set(preCompleted.keys())), runtime);
1411
1458
  const resolvedFieldStates = await require_dependency_runtime.resolveStateWithRuntimeAsync(annotatedState, runtime);
1412
1459
  const result = {};
1413
1460
  const deferredKeys = /* @__PURE__ */ new Map();
1414
1461
  let hasDeferred = false;
1415
- for (const field of parserKeys) {
1416
- const fieldKey = field;
1417
- const fieldParser = parsers[field];
1418
- let valueResult;
1419
- const preCompletedResult = preCompleted.get(fieldKey);
1420
- if (preCompletedResult !== void 0) valueResult = unwrapCompleteResult(preCompletedResult);
1421
- else {
1422
- const fieldState = resolvedFieldStates[fieldKey];
1423
- valueResult = unwrapCompleteResult(await fieldParser.complete(fieldState, phase3Exec));
1424
- }
1462
+ const applyValueResult = (fieldKey, valueResult) => {
1425
1463
  if (valueResult.success) {
1426
1464
  result[fieldKey] = valueResult.value;
1427
1465
  if (valueResult.deferred) if (valueResult.deferredKeys) deferredKeys.set(fieldKey, valueResult.deferredKeys);
@@ -1431,6 +1469,41 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1431
1469
  success: false,
1432
1470
  error: valueResult.error
1433
1471
  };
1472
+ return void 0;
1473
+ };
1474
+ const concurrentFields = [];
1475
+ const deferredFields = [];
1476
+ for (const field of parserKeys) {
1477
+ const fieldKey = field;
1478
+ const fieldParser = parsers[field];
1479
+ const preCompletedResult = preCompleted.get(fieldKey);
1480
+ if (preCompletedResult !== void 0) {
1481
+ const failure = applyValueResult(fieldKey, unwrapCompleteResult(preCompletedResult));
1482
+ if (failure != null) return failure;
1483
+ continue;
1484
+ }
1485
+ if (typeof fieldParser.shouldDeferCompletion === "function" && fieldParser.shouldDeferCompletion(resolvedFieldStates[fieldKey], withChildExecPath(phase3Exec, fieldKey)) === true) deferredFields.push(field);
1486
+ else concurrentFields.push(field);
1487
+ }
1488
+ const concurrentResults = await Promise.all(concurrentFields.map(async (field) => {
1489
+ const fieldKey = field;
1490
+ const fieldParser = parsers[field];
1491
+ const valueResult = unwrapCompleteResult(await fieldParser.complete(resolvedFieldStates[fieldKey], withChildExecPath(phase3Exec, fieldKey)));
1492
+ return {
1493
+ fieldKey,
1494
+ valueResult
1495
+ };
1496
+ }));
1497
+ for (const { fieldKey, valueResult } of concurrentResults) {
1498
+ const failure = applyValueResult(fieldKey, valueResult);
1499
+ if (failure != null) return failure;
1500
+ }
1501
+ for (const field of deferredFields) {
1502
+ const fieldKey = field;
1503
+ const fieldParser = parsers[field];
1504
+ const valueResult = unwrapCompleteResult(await fieldParser.complete(resolvedFieldStates[fieldKey], withChildExecPath(phase3Exec, fieldKey)));
1505
+ const failure = applyValueResult(fieldKey, valueResult);
1506
+ if (failure != null) return failure;
1434
1507
  }
1435
1508
  const isDeferred = deferredKeys.size > 0 || hasDeferred;
1436
1509
  return {
@@ -1503,13 +1576,19 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1503
1576
  function suggestTupleSync(context, prefix, parsers) {
1504
1577
  const suggestions = [];
1505
1578
  const stateArray = context.state;
1579
+ const runtime = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
1580
+ if (stateArray && Array.isArray(stateArray)) {
1581
+ require_dependency_runtime.collectExplicitSourceValues(require_dependency_runtime.buildRuntimeNodesFromArray(parsers, stateArray, context.exec?.path), runtime);
1582
+ require_dependency_runtime.collectSourcesFromState(stateArray, runtime);
1583
+ }
1584
+ const contextWithRegistry = {
1585
+ ...context,
1586
+ dependencyRegistry: runtime.registry
1587
+ };
1506
1588
  for (let i = 0; i < parsers.length; i++) {
1507
1589
  const parser = parsers[i];
1508
1590
  const parserState = stateArray && Array.isArray(stateArray) ? stateArray[i] : parser.initialState;
1509
- const parserSuggestions = parser.suggest({
1510
- ...context,
1511
- state: parserState
1512
- }, prefix);
1591
+ const parserSuggestions = parser.suggest(withChildContext(contextWithRegistry, i, parserState), prefix);
1513
1592
  suggestions.push(...parserSuggestions);
1514
1593
  }
1515
1594
  return require_suggestion.deduplicateSuggestions(suggestions);
@@ -1517,13 +1596,19 @@ function suggestTupleSync(context, prefix, parsers) {
1517
1596
  async function* suggestTupleAsync(context, prefix, parsers) {
1518
1597
  const suggestions = [];
1519
1598
  const stateArray = context.state;
1599
+ const runtime = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
1600
+ if (stateArray && Array.isArray(stateArray)) {
1601
+ await require_dependency_runtime.collectExplicitSourceValuesAsync(require_dependency_runtime.buildRuntimeNodesFromArray(parsers, stateArray, context.exec?.path), runtime);
1602
+ require_dependency_runtime.collectSourcesFromState(stateArray, runtime);
1603
+ }
1604
+ const contextWithRegistry = {
1605
+ ...context,
1606
+ dependencyRegistry: runtime.registry
1607
+ };
1520
1608
  for (let i = 0; i < parsers.length; i++) {
1521
1609
  const parser = parsers[i];
1522
1610
  const parserState = stateArray && Array.isArray(stateArray) ? stateArray[i] : parser.initialState;
1523
- const parserSuggestions = parser.suggest({
1524
- ...context,
1525
- state: parserState
1526
- }, prefix);
1611
+ const parserSuggestions = parser.suggest(withChildContext(contextWithRegistry, i, parserState), prefix);
1527
1612
  if (parser.$mode === "async") for await (const s of parserSuggestions) suggestions.push(s);
1528
1613
  else suggestions.push(...parserSuggestions);
1529
1614
  }
@@ -1557,17 +1642,19 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1557
1642
  const stateArray = currentContext.state;
1558
1643
  const remainingParsers = syncParsers.map((parser, index) => [parser, index]).filter(([_, index]) => !matchedParsers.has(index)).sort(([parserA], [parserB]) => parserB.priority - parserA.priority);
1559
1644
  for (const [parser, index] of remainingParsers) {
1560
- const result = parser.parse({
1561
- ...currentContext,
1562
- state: stateArray[index]
1563
- });
1645
+ const result = parser.parse(withChildContext(currentContext, index, stateArray[index]));
1564
1646
  if (result.success && result.consumed.length > 0) {
1565
1647
  const newStateArray = stateArray.map((s, idx) => idx === index ? result.next.state : s);
1648
+ const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
1566
1649
  currentContext = {
1567
1650
  ...currentContext,
1568
1651
  buffer: result.next.buffer,
1569
1652
  optionsTerminated: result.next.optionsTerminated,
1570
- state: newStateArray
1653
+ state: newStateArray,
1654
+ ...mergedExec != null ? {
1655
+ exec: mergedExec,
1656
+ dependencyRegistry: mergedExec.dependencyRegistry
1657
+ } : {}
1571
1658
  };
1572
1659
  allConsumed.push(...result.consumed);
1573
1660
  matchedParsers.add(index);
@@ -1576,15 +1663,17 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1576
1663
  } else if (!result.success && error.consumed < result.consumed) error = result;
1577
1664
  }
1578
1665
  if (!foundMatch) for (const [parser, index] of remainingParsers) {
1579
- const result = parser.parse({
1580
- ...currentContext,
1581
- state: stateArray[index]
1582
- });
1666
+ const result = parser.parse(withChildContext(currentContext, index, stateArray[index]));
1583
1667
  if (result.success && result.consumed.length < 1) {
1584
1668
  const newStateArray = stateArray.map((s, idx) => idx === index ? result.next.state : s);
1669
+ const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
1585
1670
  currentContext = {
1586
1671
  ...currentContext,
1587
- state: newStateArray
1672
+ state: newStateArray,
1673
+ ...mergedExec != null ? {
1674
+ exec: mergedExec,
1675
+ dependencyRegistry: mergedExec.dependencyRegistry
1676
+ } : {}
1588
1677
  };
1589
1678
  matchedParsers.add(index);
1590
1679
  foundMatch = true;
@@ -1619,18 +1708,20 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1619
1708
  const stateArray = currentContext.state;
1620
1709
  const remainingParsers = parsers.map((parser, index) => [parser, index]).filter(([_, index]) => !matchedParsers.has(index)).sort(([parserA], [parserB]) => parserB.priority - parserA.priority);
1621
1710
  for (const [parser, index] of remainingParsers) {
1622
- const resultOrPromise = parser.parse({
1623
- ...currentContext,
1624
- state: stateArray[index]
1625
- });
1711
+ const resultOrPromise = parser.parse(withChildContext(currentContext, index, stateArray[index]));
1626
1712
  const result = await resultOrPromise;
1627
1713
  if (result.success && result.consumed.length > 0) {
1628
1714
  const newStateArray = stateArray.map((s, idx) => idx === index ? result.next.state : s);
1715
+ const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
1629
1716
  currentContext = {
1630
1717
  ...currentContext,
1631
1718
  buffer: result.next.buffer,
1632
1719
  optionsTerminated: result.next.optionsTerminated,
1633
- state: newStateArray
1720
+ state: newStateArray,
1721
+ ...mergedExec != null ? {
1722
+ exec: mergedExec,
1723
+ dependencyRegistry: mergedExec.dependencyRegistry
1724
+ } : {}
1634
1725
  };
1635
1726
  allConsumed.push(...result.consumed);
1636
1727
  matchedParsers.add(index);
@@ -1639,16 +1730,18 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1639
1730
  } else if (!result.success && error.consumed < result.consumed) error = result;
1640
1731
  }
1641
1732
  if (!foundMatch) for (const [parser, index] of remainingParsers) {
1642
- const resultOrPromise = parser.parse({
1643
- ...currentContext,
1644
- state: stateArray[index]
1645
- });
1733
+ const resultOrPromise = parser.parse(withChildContext(currentContext, index, stateArray[index]));
1646
1734
  const result = await resultOrPromise;
1647
1735
  if (result.success && result.consumed.length < 1) {
1648
1736
  const newStateArray = stateArray.map((s, idx) => idx === index ? result.next.state : s);
1737
+ const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
1649
1738
  currentContext = {
1650
1739
  ...currentContext,
1651
- state: newStateArray
1740
+ state: newStateArray,
1741
+ ...mergedExec != null ? {
1742
+ exec: mergedExec,
1743
+ dependencyRegistry: mergedExec.dependencyRegistry
1744
+ } : {}
1652
1745
  };
1653
1746
  matchedParsers.add(index);
1654
1747
  foundMatch = true;
@@ -1674,6 +1767,7 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1674
1767
  $mode: combinedMode,
1675
1768
  $valueType: [],
1676
1769
  $stateType: [],
1770
+ [fieldParsersKey]: parsers.map((parser, index) => [String(index), parser]),
1677
1771
  usage: parsers.toSorted((a, b) => b.priority - a.priority).flatMap((p) => p.usage),
1678
1772
  leadingNames: sharedBufferLeadingNames(parsers),
1679
1773
  acceptingAnyToken: parsers.some((p) => p.acceptingAnyToken),
@@ -1693,6 +1787,7 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1693
1787
  const tuplePairs = syncParsers.map((p, i) => [String(i), p]);
1694
1788
  const tupleState = Object.fromEntries(stateArray.map((s, i) => [String(i), s]));
1695
1789
  const preCompleted = preCompleteAndRegisterDependencies(tupleState, tuplePairs, runtime.registry, childExec);
1790
+ require_dependency_runtime.collectExplicitSourceValues(filterPreCompletedRuntimeNodes(require_dependency_runtime.buildRuntimeNodesFromArray(syncParsers, stateArray, exec?.path), new Set(preCompleted.keys())), runtime);
1696
1791
  const phase3Exec = {
1697
1792
  ...childExec,
1698
1793
  preCompletedByParser: void 0
@@ -1708,7 +1803,7 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1708
1803
  if (preCompletedResult !== void 0) valueResult = unwrapCompleteResult(preCompletedResult);
1709
1804
  else {
1710
1805
  const elementState = prepareStateForCompletion(resolvedArray[i], elementParser);
1711
- valueResult = unwrapCompleteResult(elementParser.complete(elementState, phase3Exec));
1806
+ valueResult = unwrapCompleteResult(elementParser.complete(elementState, withChildExecPath(phase3Exec, i)));
1712
1807
  }
1713
1808
  if (valueResult.success) {
1714
1809
  result[i] = valueResult.value;
@@ -1739,6 +1834,7 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1739
1834
  const tuplePairs = parsers.map((p, i) => [String(i), p]);
1740
1835
  const tupleState = Object.fromEntries(stateArray.map((s, i) => [String(i), s]));
1741
1836
  const preCompleted = await preCompleteAndRegisterDependenciesAsync(tupleState, tuplePairs, runtime.registry, childExec);
1837
+ await require_dependency_runtime.collectExplicitSourceValuesAsync(filterPreCompletedRuntimeNodes(require_dependency_runtime.buildRuntimeNodesFromArray(parsers, stateArray, exec?.path), new Set(preCompleted.keys())), runtime);
1742
1838
  const phase3Exec = {
1743
1839
  ...childExec,
1744
1840
  preCompletedByParser: void 0
@@ -1754,7 +1850,7 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1754
1850
  if (preCompletedResult !== void 0) valueResult = unwrapCompleteResult(preCompletedResult);
1755
1851
  else {
1756
1852
  const elementState = prepareStateForCompletion(resolvedArray[i], elementParser);
1757
- valueResult = unwrapCompleteResult(await elementParser.complete(elementState, phase3Exec));
1853
+ valueResult = unwrapCompleteResult(await elementParser.complete(elementState, withChildExecPath(phase3Exec, i)));
1758
1854
  }
1759
1855
  if (valueResult.success) {
1760
1856
  result[i] = valueResult.value;
@@ -1857,18 +1953,25 @@ function merge(...args) {
1857
1953
  const syncSorted = syncWithIndex.toSorted(([a], [b]) => b.priority - a.priority);
1858
1954
  const syncParsers = syncSorted.map(([p]) => p);
1859
1955
  if (!options.allowDuplicates) checkDuplicateOptionNames(sorted.map(([parser, originalIndex]) => [String(originalIndex), parser.usage]));
1956
+ const mergedFieldParsers = collectChildFieldParsers(parsers);
1957
+ const duplicateOutputFieldNames = collectDuplicateFieldNames(mergedFieldParsers);
1958
+ const parserStateKey = (index) => `__parser_${index}`;
1959
+ const localObjectStateKey = (index) => `__merge_local_${index}`;
1960
+ const shouldPreserveLocalChildState = (parser) => parser.initialState != null && typeof parser.initialState === "object" && Object.keys(parser.initialState).some((field) => duplicateOutputFieldNames.has(field));
1860
1961
  const initialState = {};
1861
1962
  for (let i = 0; i < parsers.length; i++) {
1862
1963
  const parser = parsers[i];
1863
- if (parser.initialState === void 0) initialState[`__parser_${i}`] = void 0;
1964
+ if (parser.initialState === void 0) initialState[parserStateKey(i)] = void 0;
1864
1965
  else if (parser.initialState && typeof parser.initialState === "object") for (const field in parser.initialState) initialState[field] = parser.initialState[field];
1865
1966
  }
1866
1967
  const extractParserState = (parser, context, index) => {
1867
1968
  if (parser.initialState === void 0) {
1868
- const key = `__parser_${index}`;
1969
+ const key = parserStateKey(index);
1869
1970
  if (context.state && typeof context.state === "object" && key in context.state) return context.state[key];
1870
1971
  return void 0;
1871
1972
  } else if (parser.initialState && typeof parser.initialState === "object") {
1973
+ const localStateKey = localObjectStateKey(index);
1974
+ if (shouldPreserveLocalChildState(parser) && context.state && typeof context.state === "object" && localStateKey in context.state) return context.state[localStateKey];
1872
1975
  if (context.state && typeof context.state === "object") {
1873
1976
  const extractedState = {};
1874
1977
  for (const field in parser.initialState) extractedState[field] = field in context.state ? context.state[field] : parser.initialState[field];
@@ -1878,9 +1981,9 @@ function merge(...args) {
1878
1981
  }
1879
1982
  return parser.initialState;
1880
1983
  };
1881
- const mergeResultState = (parser, context, result, index) => {
1984
+ const mergeResultState = (parser, context, parserState, result, index) => {
1882
1985
  if (parser.initialState === void 0) {
1883
- const key = `__parser_${index}`;
1986
+ const key = parserStateKey(index);
1884
1987
  if (result.success) {
1885
1988
  if (result.consumed.length > 0 || result.next.state !== void 0) return {
1886
1989
  ...context.state,
@@ -1889,10 +1992,17 @@ function merge(...args) {
1889
1992
  }
1890
1993
  return { ...context.state };
1891
1994
  }
1892
- return result.success ? {
1995
+ if (!result.success) return { ...context.state };
1996
+ const mergedState = {
1893
1997
  ...context.state,
1894
1998
  ...result.next.state
1895
- } : { ...context.state };
1999
+ };
2000
+ if (!shouldPreserveLocalChildState(parser)) return mergedState;
2001
+ if (result.consumed.length === 0 && result.next.state === parserState) return mergedState;
2002
+ return {
2003
+ ...mergedState,
2004
+ [localObjectStateKey(index)]: result.next.state
2005
+ };
1896
2006
  };
1897
2007
  const parseSync = (context) => {
1898
2008
  let currentContext = context;
@@ -1900,17 +2010,19 @@ function merge(...args) {
1900
2010
  for (let i = 0; i < syncParsers.length; i++) {
1901
2011
  const parser = syncParsers[i];
1902
2012
  const parserState = extractParserState(parser, currentContext, i);
1903
- const result = parser.parse({
1904
- ...currentContext,
1905
- state: parserState
1906
- });
2013
+ const result = parser.parse(withChildContext(currentContext, i, parserState));
1907
2014
  if (result.success) {
1908
- const newState = mergeResultState(parser, currentContext, result, i);
2015
+ const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
2016
+ const newState = mergeResultState(parser, currentContext, parserState, result, i);
1909
2017
  const newContext = {
1910
2018
  ...currentContext,
1911
2019
  buffer: result.next.buffer,
1912
2020
  optionsTerminated: result.next.optionsTerminated,
1913
- state: newState
2021
+ state: newState,
2022
+ ...mergedExec != null ? {
2023
+ exec: mergedExec,
2024
+ dependencyRegistry: mergedExec.dependencyRegistry
2025
+ } : {}
1914
2026
  };
1915
2027
  if (result.consumed.length > 0) return {
1916
2028
  success: true,
@@ -1943,18 +2055,20 @@ function merge(...args) {
1943
2055
  for (let i = 0; i < parsers.length; i++) {
1944
2056
  const parser = parsers[i];
1945
2057
  const parserState = extractParserState(parser, currentContext, i);
1946
- const resultOrPromise = parser.parse({
1947
- ...currentContext,
1948
- state: parserState
1949
- });
2058
+ const resultOrPromise = parser.parse(withChildContext(currentContext, i, parserState));
1950
2059
  const result = await resultOrPromise;
1951
2060
  if (result.success) {
1952
- const newState = mergeResultState(parser, currentContext, result, i);
2061
+ const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
2062
+ const newState = mergeResultState(parser, currentContext, parserState, result, i);
1953
2063
  const newContext = {
1954
2064
  ...currentContext,
1955
2065
  buffer: result.next.buffer,
1956
2066
  optionsTerminated: result.next.optionsTerminated,
1957
- state: newState
2067
+ state: newState,
2068
+ ...mergedExec != null ? {
2069
+ exec: mergedExec,
2070
+ dependencyRegistry: mergedExec.dependencyRegistry
2071
+ } : {}
1958
2072
  };
1959
2073
  if (result.consumed.length > 0) return {
1960
2074
  success: true,
@@ -1981,7 +2095,6 @@ function merge(...args) {
1981
2095
  error: require_message.message`No matching option or argument found.`
1982
2096
  };
1983
2097
  };
1984
- const mergedFieldParsers = collectChildFieldParsers(parsers);
1985
2098
  const mergeParser = {
1986
2099
  $mode: combinedMode,
1987
2100
  $valueType: [],
@@ -1999,10 +2112,12 @@ function merge(...args) {
1999
2112
  complete(state, exec) {
2000
2113
  const extractCompleteState = (parser, resolvedState, index) => {
2001
2114
  if (parser.initialState === void 0) {
2002
- const key = `__parser_${index}`;
2115
+ const key = parserStateKey(index);
2003
2116
  if (resolvedState && typeof resolvedState === "object" && key in resolvedState) return resolvedState[key];
2004
2117
  return void 0;
2005
2118
  } else if (parser.initialState && typeof parser.initialState === "object") {
2119
+ const key = localObjectStateKey(index);
2120
+ if (shouldPreserveLocalChildState(parser) && resolvedState && typeof resolvedState === "object" && key in resolvedState) return resolvedState[key];
2006
2121
  if (resolvedState && typeof resolvedState === "object") {
2007
2122
  const extractedState = {};
2008
2123
  for (const field in parser.initialState) extractedState[field] = field in resolvedState ? resolvedState[field] : parser.initialState[field];
@@ -2020,14 +2135,25 @@ function merge(...args) {
2020
2135
  ...exec,
2021
2136
  dependencyRuntime: runtime
2022
2137
  };
2023
- const perChildCache = syncParsers.map((parser) => {
2138
+ const duplicateFieldNames = collectDuplicateFieldNames(mergedFieldParsers);
2139
+ const unambiguousFieldParsers = filterDuplicateFieldParsers(mergedFieldParsers);
2140
+ const perChildPhase1 = syncParsers.map((parser, i) => {
2024
2141
  if (fieldParsersKey in parser) {
2025
2142
  const pairs = parser[fieldParsersKey];
2026
- const preCompleted = preCompleteAndRegisterDependencies(state, pairs, runtime.registry, childExec);
2027
- return filterDuplicateKeys(preCompleted, pairs);
2143
+ const excludedSourceFields = new Set(pairs.map(([field]) => field).filter((field) => duplicateFieldNames.has(field)));
2144
+ const phase1Pairs = filterExcludedFieldParsers(pairs, excludedSourceFields);
2145
+ const preCompleted = preCompleteAndRegisterDependencies(state, phase1Pairs, runtime.registry, withChildExecPath(childExec, i));
2146
+ return {
2147
+ cache: filterDuplicateKeys(preCompleted, phase1Pairs),
2148
+ excludedSourceFields: excludedSourceFields.size > 0 ? excludedSourceFields : void 0
2149
+ };
2028
2150
  }
2029
- return void 0;
2151
+ return {
2152
+ cache: void 0,
2153
+ excludedSourceFields: void 0
2154
+ };
2030
2155
  });
2156
+ require_dependency_runtime.collectExplicitSourceValues(require_dependency_runtime.buildRuntimeNodesFromPairs(unambiguousFieldParsers, state, exec?.path), runtime);
2031
2157
  const resolvedState = require_dependency_runtime.resolveStateWithRuntime(state, runtime);
2032
2158
  const object$1 = {};
2033
2159
  const deferredKeys = /* @__PURE__ */ new Map();
@@ -2035,11 +2161,21 @@ function merge(...args) {
2035
2161
  for (let i = 0; i < syncParsers.length; i++) {
2036
2162
  const parser = syncParsers[i];
2037
2163
  const parserState = extractCompleteState(parser, resolvedState, i);
2038
- const cache = perChildCache[i];
2039
- const result = unwrapCompleteResult(parser.complete(parserState, {
2040
- ...childExec,
2164
+ const { cache, excludedSourceFields } = perChildPhase1[i];
2165
+ const childCompleteExec = withChildExecPath(childExec, i);
2166
+ const completeExec = excludedSourceFields == null ? {
2167
+ ...childCompleteExec,
2041
2168
  preCompletedByParser: cache
2042
- }));
2169
+ } : (() => {
2170
+ const childRuntime = require_dependency_runtime.createDependencyRuntimeContext(runtime.registry.clone());
2171
+ return {
2172
+ ...childCompleteExec,
2173
+ dependencyRuntime: childRuntime,
2174
+ dependencyRegistry: childRuntime.registry,
2175
+ preCompletedByParser: cache
2176
+ };
2177
+ })();
2178
+ const result = unwrapCompleteResult(parser.complete(parserState, completeExec));
2043
2179
  if (!result.success) return result;
2044
2180
  const resultValue = result.value;
2045
2181
  for (const field in resultValue) {
@@ -2065,12 +2201,26 @@ function merge(...args) {
2065
2201
  ...exec,
2066
2202
  dependencyRuntime: runtime
2067
2203
  };
2068
- const perChildCache = [];
2069
- for (const parser of parsers) if (fieldParsersKey in parser) {
2070
- const pairs = parser[fieldParsersKey];
2071
- const preCompleted = await preCompleteAndRegisterDependenciesAsync(state, pairs, runtime.registry, childExec);
2072
- perChildCache.push(filterDuplicateKeys(preCompleted, pairs));
2073
- } else perChildCache.push(void 0);
2204
+ const duplicateFieldNames = collectDuplicateFieldNames(mergedFieldParsers);
2205
+ const unambiguousFieldParsers = filterDuplicateFieldParsers(mergedFieldParsers);
2206
+ const perChildPhase1 = [];
2207
+ for (let i = 0; i < parsers.length; i++) {
2208
+ const parser = parsers[i];
2209
+ if (fieldParsersKey in parser) {
2210
+ const pairs = parser[fieldParsersKey];
2211
+ const excludedSourceFields = new Set(pairs.map(([field]) => field).filter((field) => duplicateFieldNames.has(field)));
2212
+ const phase1Pairs = filterExcludedFieldParsers(pairs, excludedSourceFields);
2213
+ const preCompleted = await preCompleteAndRegisterDependenciesAsync(state, phase1Pairs, runtime.registry, withChildExecPath(childExec, i));
2214
+ perChildPhase1.push({
2215
+ cache: filterDuplicateKeys(preCompleted, phase1Pairs),
2216
+ excludedSourceFields: excludedSourceFields.size > 0 ? excludedSourceFields : void 0
2217
+ });
2218
+ } else perChildPhase1.push({
2219
+ cache: void 0,
2220
+ excludedSourceFields: void 0
2221
+ });
2222
+ }
2223
+ await require_dependency_runtime.collectExplicitSourceValuesAsync(require_dependency_runtime.buildRuntimeNodesFromPairs(unambiguousFieldParsers, state, exec?.path), runtime);
2074
2224
  const resolvedState = await require_dependency_runtime.resolveStateWithRuntimeAsync(state, runtime);
2075
2225
  const object$1 = {};
2076
2226
  const deferredKeys = /* @__PURE__ */ new Map();
@@ -2078,11 +2228,21 @@ function merge(...args) {
2078
2228
  for (let i = 0; i < parsers.length; i++) {
2079
2229
  const parser = parsers[i];
2080
2230
  const parserState = extractCompleteState(parser, resolvedState, i);
2081
- const asyncCache = perChildCache[i];
2082
- const result = unwrapCompleteResult(await parser.complete(parserState, {
2083
- ...childExec,
2231
+ const { cache: asyncCache, excludedSourceFields } = perChildPhase1[i];
2232
+ const childCompleteExec = withChildExecPath(childExec, i);
2233
+ const completeExec = excludedSourceFields == null ? {
2234
+ ...childCompleteExec,
2084
2235
  preCompletedByParser: asyncCache
2085
- }));
2236
+ } : (() => {
2237
+ const childRuntime = require_dependency_runtime.createDependencyRuntimeContext(runtime.registry.clone());
2238
+ return {
2239
+ ...childCompleteExec,
2240
+ dependencyRuntime: childRuntime,
2241
+ dependencyRegistry: childRuntime.registry,
2242
+ preCompletedByParser: asyncCache
2243
+ };
2244
+ })();
2245
+ const result = unwrapCompleteResult(await parser.complete(parserState, completeExec));
2086
2246
  if (!result.success) return result;
2087
2247
  const resultValue = result.value;
2088
2248
  for (const field in resultValue) {
@@ -2107,10 +2267,12 @@ function merge(...args) {
2107
2267
  if (options.hidden === true) return require_mode_dispatch.dispatchIterableByMode(combinedMode, function* () {}, async function* () {});
2108
2268
  const extractState = (p, i) => {
2109
2269
  if (p.initialState === void 0) {
2110
- const key = `__parser_${i}`;
2270
+ const key = parserStateKey(i);
2111
2271
  if (context.state && typeof context.state === "object" && key in context.state) return context.state[key];
2112
2272
  return void 0;
2113
2273
  } else if (p.initialState && typeof p.initialState === "object") {
2274
+ const key = localObjectStateKey(i);
2275
+ if (shouldPreserveLocalChildState(p) && context.state && typeof context.state === "object" && key in context.state) return context.state[key];
2114
2276
  if (context.state && typeof context.state === "object") {
2115
2277
  const extractedState = {};
2116
2278
  for (const field in p.initialState) extractedState[field] = field in context.state ? context.state[field] : p.initialState[field];
@@ -2122,8 +2284,17 @@ function merge(...args) {
2122
2284
  };
2123
2285
  if (isAsync) return async function* () {
2124
2286
  const runtime$1 = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
2125
- const childFieldPairs$1 = collectChildFieldParsers(parsers);
2126
- if (context.state && typeof context.state === "object") require_dependency_runtime.collectSourcesFromState(context.state, runtime$1);
2287
+ const mergedPairs$1 = collectChildFieldParsers(parsers);
2288
+ const duplicateFieldNames$1 = collectDuplicateFieldNames(mergedPairs$1);
2289
+ const childFieldPairs$1 = filterDuplicateFieldParsers(mergedPairs$1);
2290
+ const perChildExcludedSourceFields$1 = parsers.map((parser) => {
2291
+ if (!(fieldParsersKey in parser)) return void 0;
2292
+ const pairs = parser[fieldParsersKey];
2293
+ const excludedSourceFields = new Set(pairs.map(([field]) => field).filter((field) => duplicateFieldNames$1.has(field)));
2294
+ return excludedSourceFields.size > 0 ? excludedSourceFields : void 0;
2295
+ });
2296
+ if (context.state && typeof context.state === "object") await require_dependency_runtime.collectExplicitSourceValuesAsync(require_dependency_runtime.buildRuntimeNodesFromPairs(childFieldPairs$1, context.state, context.exec?.path), runtime$1);
2297
+ if (context.state && typeof context.state === "object") require_dependency_runtime.collectSourcesFromState(context.state, runtime$1, /* @__PURE__ */ new WeakSet(), duplicateFieldNames$1);
2127
2298
  await completeDependencySourceDefaultsAsync(context, childFieldPairs$1, runtime$1.registry, context.exec);
2128
2299
  const contextWithRegistry$1 = {
2129
2300
  ...context,
@@ -2133,18 +2304,37 @@ function merge(...args) {
2133
2304
  for (let i = 0; i < parsers.length; i++) {
2134
2305
  const parser = parsers[i];
2135
2306
  const parserState = extractState(parser, i);
2136
- const parserSuggestions = parser.suggest({
2137
- ...contextWithRegistry$1,
2138
- state: parserState
2139
- }, prefix);
2307
+ const childContext = withChildContext(contextWithRegistry$1, i, parserState);
2308
+ const excludedSourceFields = perChildExcludedSourceFields$1[i];
2309
+ const contextForChild = excludedSourceFields == null ? childContext : (() => {
2310
+ const childRuntime = require_dependency_runtime.createDependencyRuntimeContext(runtime$1.registry.clone());
2311
+ return {
2312
+ ...childContext,
2313
+ dependencyRegistry: childRuntime.registry,
2314
+ exec: childContext.exec == null ? childContext.exec : {
2315
+ ...childContext.exec,
2316
+ dependencyRegistry: childRuntime.registry
2317
+ }
2318
+ };
2319
+ })();
2320
+ const parserSuggestions = parser.suggest(contextForChild, prefix);
2140
2321
  if (parser.$mode === "async") for await (const s of parserSuggestions) suggestions.push(s);
2141
2322
  else suggestions.push(...parserSuggestions);
2142
2323
  }
2143
2324
  yield* require_suggestion.deduplicateSuggestions(suggestions);
2144
2325
  }();
2145
2326
  const runtime = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
2146
- const childFieldPairs = collectChildFieldParsers(syncParsers);
2147
- if (context.state && typeof context.state === "object") require_dependency_runtime.collectSourcesFromState(context.state, runtime);
2327
+ const mergedPairs = collectChildFieldParsers(syncParsers);
2328
+ const duplicateFieldNames = collectDuplicateFieldNames(mergedPairs);
2329
+ const childFieldPairs = filterDuplicateFieldParsers(mergedPairs);
2330
+ const perChildExcludedSourceFields = syncParsers.map((parser) => {
2331
+ if (!(fieldParsersKey in parser)) return void 0;
2332
+ const pairs = parser[fieldParsersKey];
2333
+ const excludedSourceFields = new Set(pairs.map(([field]) => field).filter((field) => duplicateFieldNames.has(field)));
2334
+ return excludedSourceFields.size > 0 ? excludedSourceFields : void 0;
2335
+ });
2336
+ if (context.state && typeof context.state === "object") require_dependency_runtime.collectExplicitSourceValues(require_dependency_runtime.buildRuntimeNodesFromPairs(childFieldPairs, context.state, context.exec?.path), runtime);
2337
+ if (context.state && typeof context.state === "object") require_dependency_runtime.collectSourcesFromState(context.state, runtime, /* @__PURE__ */ new WeakSet(), duplicateFieldNames);
2148
2338
  completeDependencySourceDefaults(context, childFieldPairs, runtime.registry, context.exec);
2149
2339
  const contextWithRegistry = {
2150
2340
  ...context,
@@ -2155,10 +2345,20 @@ function merge(...args) {
2155
2345
  for (let i = 0; i < syncParsers.length; i++) {
2156
2346
  const parser = syncParsers[i];
2157
2347
  const parserState = extractState(parser, i);
2158
- const parserSuggestions = parser.suggest({
2159
- ...contextWithRegistry,
2160
- state: parserState
2161
- }, prefix);
2348
+ const childContext = withChildContext(contextWithRegistry, i, parserState);
2349
+ const excludedSourceFields = perChildExcludedSourceFields[i];
2350
+ const contextForChild = excludedSourceFields == null ? childContext : (() => {
2351
+ const childRuntime = require_dependency_runtime.createDependencyRuntimeContext(runtime.registry.clone());
2352
+ return {
2353
+ ...childContext,
2354
+ dependencyRegistry: childRuntime.registry,
2355
+ exec: childContext.exec == null ? childContext.exec : {
2356
+ ...childContext.exec,
2357
+ dependencyRegistry: childRuntime.registry
2358
+ }
2359
+ };
2360
+ })();
2361
+ const parserSuggestions = parser.suggest(contextForChild, prefix);
2162
2362
  suggestions.push(...parserSuggestions);
2163
2363
  }
2164
2364
  yield* require_suggestion.deduplicateSuggestions(suggestions);
@@ -2233,10 +2433,36 @@ function merge(...args) {
2233
2433
  * async branches of `concat().suggest()`.
2234
2434
  * @internal
2235
2435
  */
2236
- function buildSuggestRegistry(preParsedContext) {
2436
+ function buildSuggestRegistry(preParsedContext, parsers) {
2437
+ const stateArray = preParsedContext.state;
2438
+ const runtime = require_dependency_runtime.createDependencyRuntimeContext(preParsedContext.dependencyRegistry?.clone());
2439
+ if (stateArray && Array.isArray(stateArray)) {
2440
+ const nodes = require_dependency_runtime.buildRuntimeNodesFromArray(parsers, stateArray, preParsedContext.exec?.path);
2441
+ require_dependency_runtime.collectExplicitSourceValues(nodes, runtime);
2442
+ require_dependency_runtime.collectSourcesFromState(stateArray, runtime);
2443
+ require_dependency_runtime.fillMissingSourceDefaults(nodes, runtime);
2444
+ const prefix = preParsedContext.exec?.path ?? [];
2445
+ for (let i = 0; i < parsers.length; i++) seedSuggestRuntimeFromFieldParsers(parsers[i], stateArray[i], runtime, [...prefix, i]);
2446
+ }
2447
+ return {
2448
+ context: {
2449
+ ...preParsedContext,
2450
+ dependencyRegistry: runtime.registry
2451
+ },
2452
+ stateArray
2453
+ };
2454
+ }
2455
+ async function buildSuggestRegistryAsync(preParsedContext, parsers) {
2237
2456
  const stateArray = preParsedContext.state;
2238
2457
  const runtime = require_dependency_runtime.createDependencyRuntimeContext(preParsedContext.dependencyRegistry?.clone());
2239
- if (stateArray && Array.isArray(stateArray)) require_dependency_runtime.collectSourcesFromState(stateArray, runtime);
2458
+ if (stateArray && Array.isArray(stateArray)) {
2459
+ const nodes = require_dependency_runtime.buildRuntimeNodesFromArray(parsers, stateArray, preParsedContext.exec?.path);
2460
+ await require_dependency_runtime.collectExplicitSourceValuesAsync(nodes, runtime);
2461
+ require_dependency_runtime.collectSourcesFromState(stateArray, runtime);
2462
+ await require_dependency_runtime.fillMissingSourceDefaultsAsync(nodes, runtime);
2463
+ const prefix = preParsedContext.exec?.path ?? [];
2464
+ for (let i = 0; i < parsers.length; i++) await seedSuggestRuntimeFromFieldParsersAsync(parsers[i], stateArray[i], runtime, [...prefix, i]);
2465
+ }
2240
2466
  return {
2241
2467
  context: {
2242
2468
  ...preParsedContext,
@@ -2245,6 +2471,30 @@ function buildSuggestRegistry(preParsedContext) {
2245
2471
  stateArray
2246
2472
  };
2247
2473
  }
2474
+ function seedSuggestRuntimeFromFieldParsers(parser, state, runtime, parentPath) {
2475
+ if (!(fieldParsersKey in parser)) return;
2476
+ const rawPairs = parser[fieldParsersKey];
2477
+ const duplicateFieldNames = collectDuplicateFieldNames(rawPairs);
2478
+ const pairs = filterDuplicateFieldParsers(rawPairs);
2479
+ const stateRecord = state != null && typeof state === "object" ? state : {};
2480
+ const nodes = require_dependency_runtime.buildRuntimeNodesFromPairs(pairs, stateRecord, parentPath);
2481
+ require_dependency_runtime.collectExplicitSourceValues(nodes, runtime);
2482
+ require_dependency_runtime.collectSourcesFromState(state, runtime, /* @__PURE__ */ new WeakSet(), duplicateFieldNames);
2483
+ require_dependency_runtime.fillMissingSourceDefaults(nodes, runtime);
2484
+ for (const [field, childParser] of pairs) seedSuggestRuntimeFromFieldParsers(childParser, Object.hasOwn(stateRecord, field) ? stateRecord[field] : void 0, runtime, [...parentPath, field]);
2485
+ }
2486
+ async function seedSuggestRuntimeFromFieldParsersAsync(parser, state, runtime, parentPath) {
2487
+ if (!(fieldParsersKey in parser)) return;
2488
+ const rawPairs = parser[fieldParsersKey];
2489
+ const duplicateFieldNames = collectDuplicateFieldNames(rawPairs);
2490
+ const pairs = filterDuplicateFieldParsers(rawPairs);
2491
+ const stateRecord = state != null && typeof state === "object" ? state : {};
2492
+ const nodes = require_dependency_runtime.buildRuntimeNodesFromPairs(pairs, stateRecord, parentPath);
2493
+ await require_dependency_runtime.collectExplicitSourceValuesAsync(nodes, runtime);
2494
+ require_dependency_runtime.collectSourcesFromState(state, runtime, /* @__PURE__ */ new WeakSet(), duplicateFieldNames);
2495
+ await require_dependency_runtime.fillMissingSourceDefaultsAsync(nodes, runtime);
2496
+ for (const [field, childParser] of pairs) await seedSuggestRuntimeFromFieldParsersAsync(childParser, Object.hasOwn(stateRecord, field) ? stateRecord[field] : void 0, runtime, [...parentPath, field]);
2497
+ }
2248
2498
  /**
2249
2499
  * This helper replays child parsers in priority order (mirroring
2250
2500
  * `concat.parse()`) to accumulate dependency source values for suggestions.
@@ -2297,21 +2547,23 @@ function tryParseSuggestList(context, stateArray, parsers, matchedParsers, remai
2297
2547
  for (let ri = 0; ri < remaining.length; ri++) {
2298
2548
  const [parser, index] = remaining[ri];
2299
2549
  const parserState = index < stateArray.length ? stateArray[index] : parser.initialState;
2300
- const resultOrPromise = parser.parse({
2301
- ...context,
2302
- state: parserState
2303
- });
2550
+ const resultOrPromise = parser.parse(withChildContext(context, index, parserState));
2304
2551
  if (resultOrPromise != null && typeof resultOrPromise === "object" && "then" in resultOrPromise && typeof resultOrPromise.then === "function") {
2305
2552
  const tail = remaining.slice(ri + 1);
2306
2553
  return resultOrPromise.then((result$1) => {
2307
2554
  if (result$1.success && result$1.consumed.length > 0) {
2308
2555
  stateArray[index] = result$1.next.state;
2309
2556
  matchedParsers.add(index);
2557
+ const mergedExec = mergeChildExec(context.exec, result$1.next.exec);
2310
2558
  return preParseSuggestLoop({
2311
2559
  ...context,
2312
2560
  buffer: result$1.next.buffer,
2313
2561
  optionsTerminated: result$1.next.optionsTerminated,
2314
- state: stateArray
2562
+ state: stateArray,
2563
+ ...mergedExec != null ? {
2564
+ exec: mergedExec,
2565
+ dependencyRegistry: mergedExec.dependencyRegistry
2566
+ } : {}
2315
2567
  }, stateArray, parsers, matchedParsers);
2316
2568
  }
2317
2569
  const next = tryParseSuggestList(context, stateArray, parsers, matchedParsers, tail);
@@ -2329,11 +2581,16 @@ function tryParseSuggestList(context, stateArray, parsers, matchedParsers, remai
2329
2581
  if (result.success && result.consumed.length > 0) {
2330
2582
  stateArray[index] = result.next.state;
2331
2583
  matchedParsers.add(index);
2584
+ const mergedExec = mergeChildExec(context.exec, result.next.exec);
2332
2585
  return {
2333
2586
  ...context,
2334
2587
  buffer: result.next.buffer,
2335
2588
  optionsTerminated: result.next.optionsTerminated,
2336
- state: stateArray
2589
+ state: stateArray,
2590
+ ...mergedExec != null ? {
2591
+ exec: mergedExec,
2592
+ dependencyRegistry: mergedExec.dependencyRegistry
2593
+ } : {}
2337
2594
  };
2338
2595
  }
2339
2596
  }
@@ -2359,17 +2616,19 @@ function concat(...parsers) {
2359
2616
  const stateArray = currentContext.state;
2360
2617
  const remainingParsers = syncParsers.map((parser, index) => [parser, index]).filter(([_, index]) => !matchedParsers.has(index)).sort(([parserA], [parserB]) => parserB.priority - parserA.priority);
2361
2618
  for (const [parser, index] of remainingParsers) {
2362
- const result = parser.parse({
2363
- ...currentContext,
2364
- state: stateArray[index]
2365
- });
2619
+ const result = parser.parse(withChildContext(currentContext, index, stateArray[index]));
2366
2620
  if (result.success && result.consumed.length > 0) {
2367
2621
  const newStateArray = stateArray.map((s, idx) => idx === index ? result.next.state : s);
2622
+ const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
2368
2623
  currentContext = {
2369
2624
  ...currentContext,
2370
2625
  buffer: result.next.buffer,
2371
2626
  optionsTerminated: result.next.optionsTerminated,
2372
- state: newStateArray
2627
+ state: newStateArray,
2628
+ ...mergedExec != null ? {
2629
+ exec: mergedExec,
2630
+ dependencyRegistry: mergedExec.dependencyRegistry
2631
+ } : {}
2373
2632
  };
2374
2633
  allConsumed.push(...result.consumed);
2375
2634
  matchedParsers.add(index);
@@ -2378,15 +2637,17 @@ function concat(...parsers) {
2378
2637
  } else if (!result.success && error.consumed < result.consumed) error = result;
2379
2638
  }
2380
2639
  if (!foundMatch) for (const [parser, index] of remainingParsers) {
2381
- const result = parser.parse({
2382
- ...currentContext,
2383
- state: stateArray[index]
2384
- });
2640
+ const result = parser.parse(withChildContext(currentContext, index, stateArray[index]));
2385
2641
  if (result.success && result.consumed.length < 1) {
2386
2642
  const newStateArray = stateArray.map((s, idx) => idx === index ? result.next.state : s);
2643
+ const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
2387
2644
  currentContext = {
2388
2645
  ...currentContext,
2389
- state: newStateArray
2646
+ state: newStateArray,
2647
+ ...mergedExec != null ? {
2648
+ exec: mergedExec,
2649
+ dependencyRegistry: mergedExec.dependencyRegistry
2650
+ } : {}
2390
2651
  };
2391
2652
  matchedParsers.add(index);
2392
2653
  foundMatch = true;
@@ -2421,17 +2682,19 @@ function concat(...parsers) {
2421
2682
  const stateArray = currentContext.state;
2422
2683
  const remainingParsers = parsers.map((parser, index) => [parser, index]).filter(([_, index]) => !matchedParsers.has(index)).sort(([parserA], [parserB]) => parserB.priority - parserA.priority);
2423
2684
  for (const [parser, index] of remainingParsers) {
2424
- const result = await parser.parse({
2425
- ...currentContext,
2426
- state: stateArray[index]
2427
- });
2685
+ const result = await parser.parse(withChildContext(currentContext, index, stateArray[index]));
2428
2686
  if (result.success && result.consumed.length > 0) {
2429
2687
  const newStateArray = stateArray.map((s, idx) => idx === index ? result.next.state : s);
2688
+ const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
2430
2689
  currentContext = {
2431
2690
  ...currentContext,
2432
2691
  buffer: result.next.buffer,
2433
2692
  optionsTerminated: result.next.optionsTerminated,
2434
- state: newStateArray
2693
+ state: newStateArray,
2694
+ ...mergedExec != null ? {
2695
+ exec: mergedExec,
2696
+ dependencyRegistry: mergedExec.dependencyRegistry
2697
+ } : {}
2435
2698
  };
2436
2699
  allConsumed.push(...result.consumed);
2437
2700
  matchedParsers.add(index);
@@ -2440,15 +2703,17 @@ function concat(...parsers) {
2440
2703
  } else if (!result.success && error.consumed < result.consumed) error = result;
2441
2704
  }
2442
2705
  if (!foundMatch) for (const [parser, index] of remainingParsers) {
2443
- const result = await parser.parse({
2444
- ...currentContext,
2445
- state: stateArray[index]
2446
- });
2706
+ const result = await parser.parse(withChildContext(currentContext, index, stateArray[index]));
2447
2707
  if (result.success && result.consumed.length < 1) {
2448
2708
  const newStateArray = stateArray.map((s, idx) => idx === index ? result.next.state : s);
2709
+ const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
2449
2710
  currentContext = {
2450
2711
  ...currentContext,
2451
- state: newStateArray
2712
+ state: newStateArray,
2713
+ ...mergedExec != null ? {
2714
+ exec: mergedExec,
2715
+ dependencyRegistry: mergedExec.dependencyRegistry
2716
+ } : {}
2452
2717
  };
2453
2718
  matchedParsers.add(index);
2454
2719
  foundMatch = true;
@@ -2485,7 +2750,7 @@ function concat(...parsers) {
2485
2750
  for (let i = 0; i < syncParsers.length; i++) {
2486
2751
  const parser = syncParsers[i];
2487
2752
  const parserState = prepareStateForCompletion(resolvedArray[i], parser);
2488
- const result = unwrapCompleteResult(parser.complete(parserState, childExec));
2753
+ const result = unwrapCompleteResult(parser.complete(parserState, withChildExecPath(childExec, i)));
2489
2754
  if (!result.success) return result;
2490
2755
  const baseIndex = results.length;
2491
2756
  if (Array.isArray(result.value)) {
@@ -2528,7 +2793,7 @@ function concat(...parsers) {
2528
2793
  for (let i = 0; i < parsers.length; i++) {
2529
2794
  const parser = parsers[i];
2530
2795
  const parserState = prepareStateForCompletion(resolvedArray[i], parser);
2531
- const result = unwrapCompleteResult(await parser.complete(parserState, childExec));
2796
+ const result = unwrapCompleteResult(await parser.complete(parserState, withChildExecPath(childExec, i)));
2532
2797
  if (!result.success) return result;
2533
2798
  const baseIndex = results.length;
2534
2799
  if (Array.isArray(result.value)) {
@@ -2576,31 +2841,25 @@ function concat(...parsers) {
2576
2841
  suggest(context, prefix) {
2577
2842
  if (isAsync) return async function* () {
2578
2843
  const preParsedContext$1 = await preParseSuggestContextAsync(context, parsers);
2579
- const { context: contextWithRegistry$1, stateArray: stateArray$1 } = buildSuggestRegistry(preParsedContext$1);
2844
+ const { context: contextWithRegistry$1, stateArray: stateArray$1 } = await buildSuggestRegistryAsync(preParsedContext$1, parsers);
2580
2845
  const suggestions = [];
2581
2846
  for (let i = 0; i < parsers.length; i++) {
2582
2847
  const parser = parsers[i];
2583
2848
  const parserState = stateArray$1 && Array.isArray(stateArray$1) ? stateArray$1[i] : parser.initialState;
2584
- const parserSuggestions = parser.suggest({
2585
- ...contextWithRegistry$1,
2586
- state: parserState
2587
- }, prefix);
2849
+ const parserSuggestions = parser.suggest(withChildContext(contextWithRegistry$1, i, parserState), prefix);
2588
2850
  if (parser.$mode === "async") for await (const s of parserSuggestions) suggestions.push(s);
2589
2851
  else suggestions.push(...parserSuggestions);
2590
2852
  }
2591
2853
  yield* require_suggestion.deduplicateSuggestions(suggestions);
2592
2854
  }();
2593
2855
  const preParsedContext = preParseSuggestContext(context, syncParsers);
2594
- const { context: contextWithRegistry, stateArray } = buildSuggestRegistry(preParsedContext);
2856
+ const { context: contextWithRegistry, stateArray } = buildSuggestRegistry(preParsedContext, syncParsers);
2595
2857
  return function* () {
2596
2858
  const suggestions = [];
2597
2859
  for (let i = 0; i < syncParsers.length; i++) {
2598
2860
  const parser = syncParsers[i];
2599
2861
  const parserState = stateArray && Array.isArray(stateArray) ? stateArray[i] : parser.initialState;
2600
- const parserSuggestions = parser.suggest({
2601
- ...contextWithRegistry,
2602
- state: parserState
2603
- }, prefix);
2862
+ const parserSuggestions = parser.suggest(withChildContext(contextWithRegistry, i, parserState), prefix);
2604
2863
  suggestions.push(...parserSuggestions);
2605
2864
  }
2606
2865
  yield* require_suggestion.deduplicateSuggestions(suggestions);
@@ -2646,6 +2905,13 @@ function group(label, parser, options = {}) {
2646
2905
  initialState: parser.initialState,
2647
2906
  ...fieldParsersKey in parser ? { [fieldParsersKey]: parser[fieldParsersKey] } : {},
2648
2907
  ...typeof parser.shouldDeferCompletion === "function" ? { shouldDeferCompletion: parser.shouldDeferCompletion.bind(parser) } : {},
2908
+ getSuggestRuntimeNodes(state, path) {
2909
+ return parser.getSuggestRuntimeNodes?.(state, path) ?? (parser.dependencyMetadata?.source != null ? [{
2910
+ path,
2911
+ parser,
2912
+ state
2913
+ }] : []);
2914
+ },
2649
2915
  parse: (context) => parser.parse(context),
2650
2916
  complete: (state, exec) => parser.complete(state, exec),
2651
2917
  suggest: (context, prefix) => {
@@ -2788,57 +3054,69 @@ function conditional(discriminator, branches, defaultBranch, options) {
2788
3054
  const syncDefaultBranch = defaultBranch;
2789
3055
  if (state.selectedBranch !== void 0) {
2790
3056
  const branchParser = state.selectedBranch.kind === "default" ? syncDefaultBranch : syncBranches[state.selectedBranch.key];
2791
- const branchResult = branchParser.parse({
2792
- ...context,
2793
- state: state.branchState,
2794
- usage: branchParser.usage
2795
- });
2796
- if (branchResult.success) return {
2797
- success: true,
2798
- next: {
2799
- ...branchResult.next,
2800
- state: {
2801
- ...state,
2802
- branchState: branchResult.next.state
2803
- }
2804
- },
2805
- consumed: branchResult.consumed
2806
- };
3057
+ const branchResult = branchParser.parse(withChildContext(context, "_branch", state.branchState, branchParser.usage));
3058
+ if (branchResult.success) {
3059
+ const mergedExec = mergeChildExec(context.exec, branchResult.next.exec);
3060
+ return {
3061
+ success: true,
3062
+ next: {
3063
+ ...branchResult.next,
3064
+ state: {
3065
+ ...state,
3066
+ branchState: branchResult.next.state
3067
+ },
3068
+ ...mergedExec != null ? {
3069
+ exec: mergedExec,
3070
+ dependencyRegistry: mergedExec.dependencyRegistry
3071
+ } : {}
3072
+ },
3073
+ consumed: branchResult.consumed
3074
+ };
3075
+ }
2807
3076
  return branchResult;
2808
3077
  }
2809
- const discriminatorResult = syncDiscriminator.parse({
2810
- ...context,
2811
- state: state.discriminatorState
2812
- });
3078
+ const discriminatorResult = syncDiscriminator.parse({ ...withChildContext(context, "_discriminator", state.discriminatorState) });
2813
3079
  if (discriminatorResult.success && discriminatorResult.consumed.length > 0) {
2814
- const completionResult = syncDiscriminator.complete(discriminatorResult.next.state, context.exec);
3080
+ const completionResult = syncDiscriminator.complete(discriminatorResult.next.state, withChildExecPath(context.exec, "_discriminator"));
2815
3081
  if (completionResult.success) {
2816
3082
  const value = completionResult.value;
2817
3083
  const branchParser = syncBranches[value];
2818
3084
  if (branchParser) {
3085
+ const discriminatorExec = mergeChildExec(context.exec, discriminatorResult.next.exec);
2819
3086
  const branchParseResult = branchParser.parse({
2820
- ...context,
3087
+ ...withChildContext({
3088
+ ...context,
3089
+ ...discriminatorExec != null ? {
3090
+ exec: discriminatorExec,
3091
+ dependencyRegistry: discriminatorExec.dependencyRegistry
3092
+ } : {}
3093
+ }, "_branch", branchParser.initialState, branchParser.usage),
2821
3094
  buffer: discriminatorResult.next.buffer,
2822
- optionsTerminated: discriminatorResult.next.optionsTerminated,
2823
- state: branchParser.initialState,
2824
- usage: branchParser.usage
3095
+ optionsTerminated: discriminatorResult.next.optionsTerminated
2825
3096
  });
2826
- if (branchParseResult.success) return {
2827
- success: true,
2828
- next: {
2829
- ...branchParseResult.next,
2830
- state: {
2831
- discriminatorState: discriminatorResult.next.state,
2832
- discriminatorValue: value,
2833
- selectedBranch: {
2834
- kind: "branch",
2835
- key: value
3097
+ if (branchParseResult.success) {
3098
+ const mergedExec = mergeChildExec(discriminatorExec, branchParseResult.next.exec);
3099
+ return {
3100
+ success: true,
3101
+ next: {
3102
+ ...branchParseResult.next,
3103
+ state: {
3104
+ discriminatorState: discriminatorResult.next.state,
3105
+ discriminatorValue: value,
3106
+ selectedBranch: {
3107
+ kind: "branch",
3108
+ key: value
3109
+ },
3110
+ branchState: branchParseResult.next.state
2836
3111
  },
2837
- branchState: branchParseResult.next.state
2838
- }
2839
- },
2840
- consumed: [...discriminatorResult.consumed, ...branchParseResult.consumed]
2841
- };
3112
+ ...mergedExec != null ? {
3113
+ exec: mergedExec,
3114
+ dependencyRegistry: mergedExec.dependencyRegistry
3115
+ } : {}
3116
+ },
3117
+ consumed: [...discriminatorResult.consumed, ...branchParseResult.consumed]
3118
+ };
3119
+ }
2842
3120
  return {
2843
3121
  success: true,
2844
3122
  next: {
@@ -2851,7 +3129,11 @@ function conditional(discriminator, branches, defaultBranch, options) {
2851
3129
  key: value
2852
3130
  },
2853
3131
  branchState: branchParser.initialState
2854
- }
3132
+ },
3133
+ ...discriminatorExec != null ? {
3134
+ exec: discriminatorExec,
3135
+ dependencyRegistry: discriminatorExec.dependencyRegistry
3136
+ } : {}
2855
3137
  },
2856
3138
  consumed: discriminatorResult.consumed
2857
3139
  };
@@ -2859,23 +3141,26 @@ function conditional(discriminator, branches, defaultBranch, options) {
2859
3141
  }
2860
3142
  }
2861
3143
  if (syncDefaultBranch !== void 0) {
2862
- const defaultResult = syncDefaultBranch.parse({
2863
- ...context,
2864
- state: state.branchState ?? syncDefaultBranch.initialState,
2865
- usage: syncDefaultBranch.usage
2866
- });
2867
- if (defaultResult.success && defaultResult.consumed.length > 0) return {
2868
- success: true,
2869
- next: {
2870
- ...defaultResult.next,
2871
- state: {
2872
- ...state,
2873
- selectedBranch: { kind: "default" },
2874
- branchState: defaultResult.next.state
2875
- }
2876
- },
2877
- consumed: defaultResult.consumed
2878
- };
3144
+ const defaultResult = syncDefaultBranch.parse(withChildContext(context, "_branch", state.branchState ?? syncDefaultBranch.initialState, syncDefaultBranch.usage));
3145
+ if (defaultResult.success && defaultResult.consumed.length > 0) {
3146
+ const mergedExec = mergeChildExec(context.exec, defaultResult.next.exec);
3147
+ return {
3148
+ success: true,
3149
+ next: {
3150
+ ...defaultResult.next,
3151
+ state: {
3152
+ ...state,
3153
+ selectedBranch: { kind: "default" },
3154
+ branchState: defaultResult.next.state
3155
+ },
3156
+ ...mergedExec != null ? {
3157
+ exec: mergedExec,
3158
+ dependencyRegistry: mergedExec.dependencyRegistry
3159
+ } : {}
3160
+ },
3161
+ consumed: defaultResult.consumed
3162
+ };
3163
+ }
2879
3164
  }
2880
3165
  return {
2881
3166
  success: false,
@@ -2887,57 +3172,69 @@ function conditional(discriminator, branches, defaultBranch, options) {
2887
3172
  const state = context.state ?? initialState;
2888
3173
  if (state.selectedBranch !== void 0) {
2889
3174
  const branchParser = state.selectedBranch.kind === "default" ? defaultBranch : branches[state.selectedBranch.key];
2890
- const branchResult = await branchParser.parse({
2891
- ...context,
2892
- state: state.branchState,
2893
- usage: branchParser.usage
2894
- });
2895
- if (branchResult.success) return {
2896
- success: true,
2897
- next: {
2898
- ...branchResult.next,
2899
- state: {
2900
- ...state,
2901
- branchState: branchResult.next.state
2902
- }
2903
- },
2904
- consumed: branchResult.consumed
2905
- };
3175
+ const branchResult = await branchParser.parse(withChildContext(context, "_branch", state.branchState, branchParser.usage));
3176
+ if (branchResult.success) {
3177
+ const mergedExec = mergeChildExec(context.exec, branchResult.next.exec);
3178
+ return {
3179
+ success: true,
3180
+ next: {
3181
+ ...branchResult.next,
3182
+ state: {
3183
+ ...state,
3184
+ branchState: branchResult.next.state
3185
+ },
3186
+ ...mergedExec != null ? {
3187
+ exec: mergedExec,
3188
+ dependencyRegistry: mergedExec.dependencyRegistry
3189
+ } : {}
3190
+ },
3191
+ consumed: branchResult.consumed
3192
+ };
3193
+ }
2906
3194
  return branchResult;
2907
3195
  }
2908
- const discriminatorResult = await discriminator.parse({
2909
- ...context,
2910
- state: state.discriminatorState
2911
- });
3196
+ const discriminatorResult = await discriminator.parse({ ...withChildContext(context, "_discriminator", state.discriminatorState) });
2912
3197
  if (discriminatorResult.success && discriminatorResult.consumed.length > 0) {
2913
- const completionResult = await discriminator.complete(discriminatorResult.next.state, context.exec);
3198
+ const completionResult = await discriminator.complete(discriminatorResult.next.state, withChildExecPath(context.exec, "_discriminator"));
2914
3199
  if (completionResult.success) {
2915
3200
  const value = completionResult.value;
2916
3201
  const branchParser = branches[value];
2917
3202
  if (branchParser) {
3203
+ const discriminatorExec = mergeChildExec(context.exec, discriminatorResult.next.exec);
2918
3204
  const branchParseResult = await branchParser.parse({
2919
- ...context,
3205
+ ...withChildContext({
3206
+ ...context,
3207
+ ...discriminatorExec != null ? {
3208
+ exec: discriminatorExec,
3209
+ dependencyRegistry: discriminatorExec.dependencyRegistry
3210
+ } : {}
3211
+ }, "_branch", branchParser.initialState, branchParser.usage),
2920
3212
  buffer: discriminatorResult.next.buffer,
2921
- optionsTerminated: discriminatorResult.next.optionsTerminated,
2922
- state: branchParser.initialState,
2923
- usage: branchParser.usage
3213
+ optionsTerminated: discriminatorResult.next.optionsTerminated
2924
3214
  });
2925
- if (branchParseResult.success) return {
2926
- success: true,
2927
- next: {
2928
- ...branchParseResult.next,
2929
- state: {
2930
- discriminatorState: discriminatorResult.next.state,
2931
- discriminatorValue: value,
2932
- selectedBranch: {
2933
- kind: "branch",
2934
- key: value
3215
+ if (branchParseResult.success) {
3216
+ const mergedExec = mergeChildExec(discriminatorExec, branchParseResult.next.exec);
3217
+ return {
3218
+ success: true,
3219
+ next: {
3220
+ ...branchParseResult.next,
3221
+ state: {
3222
+ discriminatorState: discriminatorResult.next.state,
3223
+ discriminatorValue: value,
3224
+ selectedBranch: {
3225
+ kind: "branch",
3226
+ key: value
3227
+ },
3228
+ branchState: branchParseResult.next.state
2935
3229
  },
2936
- branchState: branchParseResult.next.state
2937
- }
2938
- },
2939
- consumed: [...discriminatorResult.consumed, ...branchParseResult.consumed]
2940
- };
3230
+ ...mergedExec != null ? {
3231
+ exec: mergedExec,
3232
+ dependencyRegistry: mergedExec.dependencyRegistry
3233
+ } : {}
3234
+ },
3235
+ consumed: [...discriminatorResult.consumed, ...branchParseResult.consumed]
3236
+ };
3237
+ }
2941
3238
  return {
2942
3239
  success: true,
2943
3240
  next: {
@@ -2950,7 +3247,11 @@ function conditional(discriminator, branches, defaultBranch, options) {
2950
3247
  key: value
2951
3248
  },
2952
3249
  branchState: branchParser.initialState
2953
- }
3250
+ },
3251
+ ...discriminatorExec != null ? {
3252
+ exec: discriminatorExec,
3253
+ dependencyRegistry: discriminatorExec.dependencyRegistry
3254
+ } : {}
2954
3255
  },
2955
3256
  consumed: discriminatorResult.consumed
2956
3257
  };
@@ -2958,23 +3259,26 @@ function conditional(discriminator, branches, defaultBranch, options) {
2958
3259
  }
2959
3260
  }
2960
3261
  if (defaultBranch !== void 0) {
2961
- const defaultResult = await defaultBranch.parse({
2962
- ...context,
2963
- state: state.branchState ?? defaultBranch.initialState,
2964
- usage: defaultBranch.usage
2965
- });
2966
- if (defaultResult.success && defaultResult.consumed.length > 0) return {
2967
- success: true,
2968
- next: {
2969
- ...defaultResult.next,
2970
- state: {
2971
- ...state,
2972
- selectedBranch: { kind: "default" },
2973
- branchState: defaultResult.next.state
2974
- }
2975
- },
2976
- consumed: defaultResult.consumed
2977
- };
3262
+ const defaultResult = await defaultBranch.parse(withChildContext(context, "_branch", state.branchState ?? defaultBranch.initialState, defaultBranch.usage));
3263
+ if (defaultResult.success && defaultResult.consumed.length > 0) {
3264
+ const mergedExec = mergeChildExec(context.exec, defaultResult.next.exec);
3265
+ return {
3266
+ success: true,
3267
+ next: {
3268
+ ...defaultResult.next,
3269
+ state: {
3270
+ ...state,
3271
+ selectedBranch: { kind: "default" },
3272
+ branchState: defaultResult.next.state
3273
+ },
3274
+ ...mergedExec != null ? {
3275
+ exec: mergedExec,
3276
+ dependencyRegistry: mergedExec.dependencyRegistry
3277
+ } : {}
3278
+ },
3279
+ consumed: defaultResult.consumed
3280
+ };
3281
+ }
2978
3282
  }
2979
3283
  return {
2980
3284
  success: false,
@@ -2989,7 +3293,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
2989
3293
  if (state.selectedBranch === void 0) {
2990
3294
  if (syncDefaultBranch !== void 0) {
2991
3295
  const branchState = state.branchState ?? syncDefaultBranch.initialState;
2992
- const defaultResult = syncDefaultBranch.complete(branchState, exec);
3296
+ const defaultResult = syncDefaultBranch.complete(branchState, withChildExecPath(exec, "_branch"));
2993
3297
  if (!defaultResult.success) return defaultResult;
2994
3298
  return {
2995
3299
  success: true,
@@ -3006,14 +3310,26 @@ function conditional(discriminator, branches, defaultBranch, options) {
3006
3310
  };
3007
3311
  }
3008
3312
  const branchParser = state.selectedBranch.kind === "default" ? syncDefaultBranch : syncBranches[state.selectedBranch.key];
3009
- const discriminatorCompleteResult = syncDiscriminator.complete(state.discriminatorState, exec);
3010
3313
  const combinedState = {
3011
3314
  _discriminator: state.discriminatorState,
3012
3315
  _branch: state.branchState
3013
3316
  };
3014
- const resolvedCombinedState = resolveDeferredParseStates(combinedState);
3015
- const resolvedBranchState = resolvedCombinedState._branch;
3016
- const branchResult = branchParser.complete(resolvedBranchState, exec);
3317
+ const runtime = require_dependency_runtime.createDependencyRuntimeContext(exec?.dependencyRegistry?.clone());
3318
+ require_dependency_runtime.collectExplicitSourceValues(require_dependency_runtime.buildRuntimeNodesFromPairs([["_discriminator", discriminator], ["_branch", branchParser]], combinedState, exec?.path), runtime);
3319
+ require_dependency_runtime.collectSourcesFromState(combinedState, runtime);
3320
+ const resolvedBranchState = require_dependency_runtime.resolveStateWithRuntime(state.branchState, runtime);
3321
+ const completionExec = {
3322
+ ...exec ?? {
3323
+ usage: branchParser.usage,
3324
+ path: [],
3325
+ trace: void 0
3326
+ },
3327
+ phase: "complete",
3328
+ dependencyRuntime: runtime,
3329
+ dependencyRegistry: runtime.registry
3330
+ };
3331
+ const discriminatorCompleteResult = state.selectedBranch.kind === "default" ? void 0 : syncDiscriminator.complete(state.discriminatorState, withChildExecPath(completionExec, "_discriminator"));
3332
+ const branchResult = branchParser.complete(resolvedBranchState, withChildExecPath(completionExec, "_branch"));
3017
3333
  if (!branchResult.success) {
3018
3334
  if (state.discriminatorValue !== void 0 && options?.errors?.branchError) return {
3019
3335
  success: false,
@@ -3023,9 +3339,10 @@ function conditional(discriminator, branches, defaultBranch, options) {
3023
3339
  }
3024
3340
  let discriminatorValue;
3025
3341
  if (state.selectedBranch.kind === "default") discriminatorValue = void 0;
3026
- else if (require_dependency.isDependencySourceState(discriminatorCompleteResult)) discriminatorValue = discriminatorCompleteResult.result.success ? discriminatorCompleteResult.result.value : state.selectedBranch.key;
3027
- else if (discriminatorCompleteResult.success) discriminatorValue = discriminatorCompleteResult.value;
3028
- else discriminatorValue = state.selectedBranch.key;
3342
+ else {
3343
+ const completedDiscriminator = unwrapCompleteResult(discriminatorCompleteResult);
3344
+ discriminatorValue = completedDiscriminator.success ? completedDiscriminator.value : state.selectedBranch.key;
3345
+ }
3029
3346
  return {
3030
3347
  success: true,
3031
3348
  value: [discriminatorValue, branchResult.value],
@@ -3039,7 +3356,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
3039
3356
  if (state.selectedBranch === void 0) {
3040
3357
  if (defaultBranch !== void 0) {
3041
3358
  const branchState = state.branchState ?? defaultBranch.initialState;
3042
- const defaultResult = await defaultBranch.complete(branchState, exec);
3359
+ const defaultResult = await defaultBranch.complete(branchState, withChildExecPath(exec, "_branch"));
3043
3360
  if (!defaultResult.success) return defaultResult;
3044
3361
  return {
3045
3362
  success: true,
@@ -3056,14 +3373,26 @@ function conditional(discriminator, branches, defaultBranch, options) {
3056
3373
  };
3057
3374
  }
3058
3375
  const branchParser = state.selectedBranch.kind === "default" ? defaultBranch : branches[state.selectedBranch.key];
3059
- const discriminatorCompleteResult = await discriminator.complete(state.discriminatorState, exec);
3060
3376
  const combinedState = {
3061
3377
  _discriminator: state.discriminatorState,
3062
3378
  _branch: state.branchState
3063
3379
  };
3064
- const resolvedCombinedState = await resolveDeferredParseStatesAsync(combinedState);
3065
- const resolvedBranchState = resolvedCombinedState._branch;
3066
- const branchResult = await branchParser.complete(resolvedBranchState, exec);
3380
+ const runtime = require_dependency_runtime.createDependencyRuntimeContext(exec?.dependencyRegistry?.clone());
3381
+ await require_dependency_runtime.collectExplicitSourceValuesAsync(require_dependency_runtime.buildRuntimeNodesFromPairs([["_discriminator", discriminator], ["_branch", branchParser]], combinedState, exec?.path), runtime);
3382
+ require_dependency_runtime.collectSourcesFromState(combinedState, runtime);
3383
+ const resolvedBranchState = await require_dependency_runtime.resolveStateWithRuntimeAsync(state.branchState, runtime);
3384
+ const completionExec = {
3385
+ ...exec ?? {
3386
+ usage: branchParser.usage,
3387
+ path: [],
3388
+ trace: void 0
3389
+ },
3390
+ phase: "complete",
3391
+ dependencyRuntime: runtime,
3392
+ dependencyRegistry: runtime.registry
3393
+ };
3394
+ const discriminatorCompleteResult = state.selectedBranch.kind === "default" ? void 0 : await discriminator.complete(state.discriminatorState, withChildExecPath(completionExec, "_discriminator"));
3395
+ const branchResult = await branchParser.complete(resolvedBranchState, withChildExecPath(completionExec, "_branch"));
3067
3396
  if (!branchResult.success) {
3068
3397
  if (state.discriminatorValue !== void 0 && options?.errors?.branchError) return {
3069
3398
  success: false,
@@ -3073,9 +3402,10 @@ function conditional(discriminator, branches, defaultBranch, options) {
3073
3402
  }
3074
3403
  let discriminatorValue;
3075
3404
  if (state.selectedBranch.kind === "default") discriminatorValue = void 0;
3076
- else if (require_dependency.isDependencySourceState(discriminatorCompleteResult)) discriminatorValue = discriminatorCompleteResult.result.success ? discriminatorCompleteResult.result.value : state.selectedBranch.key;
3077
- else if (discriminatorCompleteResult.success) discriminatorValue = discriminatorCompleteResult.value;
3078
- else discriminatorValue = state.selectedBranch.key;
3405
+ else {
3406
+ const completedDiscriminator = unwrapCompleteResult(discriminatorCompleteResult);
3407
+ discriminatorValue = completedDiscriminator.success ? completedDiscriminator.value : state.selectedBranch.key;
3408
+ }
3079
3409
  return {
3080
3410
  success: true,
3081
3411
  value: [discriminatorValue, branchResult.value],
@@ -3091,39 +3421,89 @@ function conditional(discriminator, branches, defaultBranch, options) {
3091
3421
  const syncBranches = branches;
3092
3422
  const syncDefaultBranch = defaultBranch;
3093
3423
  if (state.selectedBranch === void 0) {
3094
- yield* syncDiscriminator.suggest({
3095
- ...context,
3096
- state: state.discriminatorState
3097
- }, prefix);
3098
- if (syncDefaultBranch !== void 0) yield* syncDefaultBranch.suggest({
3424
+ const runtime = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
3425
+ require_dependency_runtime.collectExplicitSourceValues(require_dependency_runtime.buildRuntimeNodesFromPairs(syncDefaultBranch == null ? [["_discriminator", discriminator]] : [["_discriminator", discriminator], ["_branch", syncDefaultBranch]], {
3426
+ _discriminator: state.discriminatorState,
3427
+ _branch: state.branchState
3428
+ }, context.exec?.path), runtime);
3429
+ require_dependency_runtime.collectSourcesFromState({
3430
+ _discriminator: state.discriminatorState,
3431
+ _branch: state.branchState
3432
+ }, runtime);
3433
+ const suggestContext = {
3099
3434
  ...context,
3100
- state: state.branchState ?? syncDefaultBranch.initialState
3101
- }, prefix);
3435
+ dependencyRegistry: runtime.registry,
3436
+ ...context.exec != null ? { exec: {
3437
+ ...context.exec,
3438
+ dependencyRuntime: runtime,
3439
+ dependencyRegistry: runtime.registry
3440
+ } } : {}
3441
+ };
3442
+ yield* syncDiscriminator.suggest(withChildContext(suggestContext, "_discriminator", state.discriminatorState), prefix);
3443
+ if (syncDefaultBranch !== void 0) yield* syncDefaultBranch.suggest(withChildContext(suggestContext, "_branch", state.branchState ?? syncDefaultBranch.initialState), prefix);
3102
3444
  } else {
3103
3445
  const branchParser = state.selectedBranch.kind === "default" ? syncDefaultBranch : syncBranches[state.selectedBranch.key];
3104
- yield* branchParser.suggest({
3446
+ const runtime = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
3447
+ const combinedState = {
3448
+ _discriminator: state.discriminatorState,
3449
+ _branch: state.branchState
3450
+ };
3451
+ require_dependency_runtime.collectExplicitSourceValues(require_dependency_runtime.buildRuntimeNodesFromPairs([["_discriminator", discriminator], ["_branch", branchParser]], combinedState, context.exec?.path), runtime);
3452
+ require_dependency_runtime.collectSourcesFromState(combinedState, runtime);
3453
+ const suggestContext = {
3105
3454
  ...context,
3106
- state: state.branchState
3107
- }, prefix);
3455
+ dependencyRegistry: runtime.registry,
3456
+ ...context.exec != null ? { exec: {
3457
+ ...context.exec,
3458
+ dependencyRuntime: runtime,
3459
+ dependencyRegistry: runtime.registry
3460
+ } } : {}
3461
+ };
3462
+ yield* branchParser.suggest(withChildContext(suggestContext, "_branch", state.branchState), prefix);
3108
3463
  }
3109
3464
  }
3110
3465
  async function* suggestAsync(context, prefix) {
3111
3466
  const state = context.state ?? initialState;
3112
3467
  if (state.selectedBranch === void 0) {
3113
- yield* discriminator.suggest({
3114
- ...context,
3115
- state: state.discriminatorState
3116
- }, prefix);
3117
- if (defaultBranch !== void 0) yield* defaultBranch.suggest({
3468
+ const runtime = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
3469
+ await require_dependency_runtime.collectExplicitSourceValuesAsync(require_dependency_runtime.buildRuntimeNodesFromPairs(defaultBranch == null ? [["_discriminator", discriminator]] : [["_discriminator", discriminator], ["_branch", defaultBranch]], {
3470
+ _discriminator: state.discriminatorState,
3471
+ _branch: state.branchState
3472
+ }, context.exec?.path), runtime);
3473
+ require_dependency_runtime.collectSourcesFromState({
3474
+ _discriminator: state.discriminatorState,
3475
+ _branch: state.branchState
3476
+ }, runtime);
3477
+ const suggestContext = {
3118
3478
  ...context,
3119
- state: state.branchState ?? defaultBranch.initialState
3120
- }, prefix);
3479
+ dependencyRegistry: runtime.registry,
3480
+ ...context.exec != null ? { exec: {
3481
+ ...context.exec,
3482
+ dependencyRuntime: runtime,
3483
+ dependencyRegistry: runtime.registry
3484
+ } } : {}
3485
+ };
3486
+ yield* discriminator.suggest(withChildContext(suggestContext, "_discriminator", state.discriminatorState), prefix);
3487
+ if (defaultBranch !== void 0) yield* defaultBranch.suggest(withChildContext(suggestContext, "_branch", state.branchState ?? defaultBranch.initialState), prefix);
3121
3488
  } else {
3122
3489
  const branchParser = state.selectedBranch.kind === "default" ? defaultBranch : branches[state.selectedBranch.key];
3123
- yield* branchParser.suggest({
3490
+ const runtime = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
3491
+ const combinedState = {
3492
+ _discriminator: state.discriminatorState,
3493
+ _branch: state.branchState
3494
+ };
3495
+ await require_dependency_runtime.collectExplicitSourceValuesAsync(require_dependency_runtime.buildRuntimeNodesFromPairs([["_discriminator", discriminator], ["_branch", branchParser]], combinedState, context.exec?.path), runtime);
3496
+ require_dependency_runtime.collectSourcesFromState(combinedState, runtime);
3497
+ const suggestContext = {
3124
3498
  ...context,
3125
- state: state.branchState
3126
- }, prefix);
3499
+ dependencyRegistry: runtime.registry,
3500
+ ...context.exec != null ? { exec: {
3501
+ ...context.exec,
3502
+ dependencyRuntime: runtime,
3503
+ dependencyRegistry: runtime.registry
3504
+ } } : {}
3505
+ };
3506
+ yield* branchParser.suggest(withChildContext(suggestContext, "_branch", state.branchState), prefix);
3127
3507
  }
3128
3508
  }
3129
3509
  return {