@optique/core 0.10.0-dev.291 → 0.10.0-dev.293

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,4 +1,5 @@
1
1
  const require_message = require('./message.cjs');
2
+ const require_dependency = require('./dependency.cjs');
2
3
  const require_usage = require('./usage.cjs');
3
4
  const require_suggestion = require('./suggestion.cjs');
4
5
 
@@ -531,6 +532,72 @@ async function* suggestObjectAsync(context, prefix, parserPairs) {
531
532
  }
532
533
  yield* require_suggestion.deduplicateSuggestions(suggestions);
533
534
  }
535
+ /**
536
+ * Resolves deferred parse states in an object's field states.
537
+ * This function builds a dependency registry from DependencySourceState fields
538
+ * and re-parses DeferredParseState fields using the actual dependency values.
539
+ *
540
+ * @param fieldStates A record of field names to their state values
541
+ * @returns The field states with deferred states resolved to their actual values
542
+ * @internal
543
+ */
544
+ function resolveDeferredParseStates(fieldStates) {
545
+ const registry = new require_dependency.DependencyRegistry();
546
+ for (const key of Reflect.ownKeys(fieldStates)) {
547
+ const fieldState = fieldStates[key];
548
+ if (require_dependency.isDependencySourceState(fieldState)) {
549
+ const depId = fieldState[require_dependency.DependencyId];
550
+ const result = fieldState.result;
551
+ if (result.success) registry.set(depId, result.value);
552
+ }
553
+ }
554
+ const resolvedStates = { ...fieldStates };
555
+ for (const key of Reflect.ownKeys(fieldStates)) {
556
+ const fieldState = fieldStates[key];
557
+ if (require_dependency.isDeferredParseState(fieldState)) {
558
+ const deferredState = fieldState;
559
+ const depId = deferredState.dependencyId;
560
+ if (registry.has(depId)) {
561
+ const dependencyValue = registry.get(depId);
562
+ const parser = deferredState.parser;
563
+ const reParseResult = parser[require_dependency.ParseWithDependency](deferredState.rawInput, dependencyValue);
564
+ if (reParseResult instanceof Promise) resolvedStates[key] = deferredState.preliminaryResult;
565
+ else resolvedStates[key] = reParseResult;
566
+ } else resolvedStates[key] = deferredState.preliminaryResult;
567
+ }
568
+ }
569
+ return resolvedStates;
570
+ }
571
+ /**
572
+ * Async version of resolveDeferredParseStates for async parsers.
573
+ * @internal
574
+ */
575
+ async function resolveDeferredParseStatesAsync(fieldStates) {
576
+ const registry = new require_dependency.DependencyRegistry();
577
+ for (const key of Reflect.ownKeys(fieldStates)) {
578
+ const fieldState = fieldStates[key];
579
+ if (require_dependency.isDependencySourceState(fieldState)) {
580
+ const depId = fieldState[require_dependency.DependencyId];
581
+ const result = fieldState.result;
582
+ if (result.success) registry.set(depId, result.value);
583
+ }
584
+ }
585
+ const resolvedStates = { ...fieldStates };
586
+ for (const key of Reflect.ownKeys(fieldStates)) {
587
+ const fieldState = fieldStates[key];
588
+ if (require_dependency.isDeferredParseState(fieldState)) {
589
+ const deferredState = fieldState;
590
+ const depId = deferredState.dependencyId;
591
+ if (registry.has(depId)) {
592
+ const dependencyValue = registry.get(depId);
593
+ const parser = deferredState.parser;
594
+ const reParseResult = parser[require_dependency.ParseWithDependency](deferredState.rawInput, dependencyValue);
595
+ resolvedStates[key] = await Promise.resolve(reParseResult);
596
+ } else resolvedStates[key] = deferredState.preliminaryResult;
597
+ }
598
+ }
599
+ return resolvedStates;
600
+ }
534
601
  function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
535
602
  const label = typeof labelOrParsers === "string" ? labelOrParsers : void 0;
536
603
  let parsers;
@@ -689,10 +756,11 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
689
756
  return parseSync(context);
690
757
  },
691
758
  complete(state) {
759
+ const resolvedState = isAsync ? state : resolveDeferredParseStates(state);
692
760
  if (!isAsync) {
693
761
  const result = {};
694
762
  for (const field of parserKeys) {
695
- const valueResult = parsers[field].complete(state[field]);
763
+ const valueResult = parsers[field].complete(resolvedState[field]);
696
764
  if (valueResult.success) result[field] = valueResult.value;
697
765
  else return {
698
766
  success: false,
@@ -705,9 +773,10 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
705
773
  };
706
774
  }
707
775
  return (async () => {
776
+ const resolvedState$1 = await resolveDeferredParseStatesAsync(state);
708
777
  const result = {};
709
778
  for (const field of parserKeys) {
710
- const valueResult = await parsers[field].complete(state[field]);
779
+ const valueResult = await parsers[field].complete(resolvedState$1[field]);
711
780
  if (valueResult.success) result[field] = valueResult.value;
712
781
  else return {
713
782
  success: false,
@@ -1,4 +1,5 @@
1
1
  import { message, optionName, values } from "./message.js";
2
+ import { DependencyId, DependencyRegistry, ParseWithDependency, isDeferredParseState, isDependencySourceState } from "./dependency.js";
2
3
  import { extractArgumentMetavars, extractCommandNames, extractOptionNames } from "./usage.js";
3
4
  import { createErrorWithSuggestions, deduplicateSuggestions } from "./suggestion.js";
4
5
 
@@ -531,6 +532,72 @@ async function* suggestObjectAsync(context, prefix, parserPairs) {
531
532
  }
532
533
  yield* deduplicateSuggestions(suggestions);
533
534
  }
535
+ /**
536
+ * Resolves deferred parse states in an object's field states.
537
+ * This function builds a dependency registry from DependencySourceState fields
538
+ * and re-parses DeferredParseState fields using the actual dependency values.
539
+ *
540
+ * @param fieldStates A record of field names to their state values
541
+ * @returns The field states with deferred states resolved to their actual values
542
+ * @internal
543
+ */
544
+ function resolveDeferredParseStates(fieldStates) {
545
+ const registry = new DependencyRegistry();
546
+ for (const key of Reflect.ownKeys(fieldStates)) {
547
+ const fieldState = fieldStates[key];
548
+ if (isDependencySourceState(fieldState)) {
549
+ const depId = fieldState[DependencyId];
550
+ const result = fieldState.result;
551
+ if (result.success) registry.set(depId, result.value);
552
+ }
553
+ }
554
+ const resolvedStates = { ...fieldStates };
555
+ for (const key of Reflect.ownKeys(fieldStates)) {
556
+ const fieldState = fieldStates[key];
557
+ if (isDeferredParseState(fieldState)) {
558
+ const deferredState = fieldState;
559
+ const depId = deferredState.dependencyId;
560
+ if (registry.has(depId)) {
561
+ const dependencyValue = registry.get(depId);
562
+ const parser = deferredState.parser;
563
+ const reParseResult = parser[ParseWithDependency](deferredState.rawInput, dependencyValue);
564
+ if (reParseResult instanceof Promise) resolvedStates[key] = deferredState.preliminaryResult;
565
+ else resolvedStates[key] = reParseResult;
566
+ } else resolvedStates[key] = deferredState.preliminaryResult;
567
+ }
568
+ }
569
+ return resolvedStates;
570
+ }
571
+ /**
572
+ * Async version of resolveDeferredParseStates for async parsers.
573
+ * @internal
574
+ */
575
+ async function resolveDeferredParseStatesAsync(fieldStates) {
576
+ const registry = new DependencyRegistry();
577
+ for (const key of Reflect.ownKeys(fieldStates)) {
578
+ const fieldState = fieldStates[key];
579
+ if (isDependencySourceState(fieldState)) {
580
+ const depId = fieldState[DependencyId];
581
+ const result = fieldState.result;
582
+ if (result.success) registry.set(depId, result.value);
583
+ }
584
+ }
585
+ const resolvedStates = { ...fieldStates };
586
+ for (const key of Reflect.ownKeys(fieldStates)) {
587
+ const fieldState = fieldStates[key];
588
+ if (isDeferredParseState(fieldState)) {
589
+ const deferredState = fieldState;
590
+ const depId = deferredState.dependencyId;
591
+ if (registry.has(depId)) {
592
+ const dependencyValue = registry.get(depId);
593
+ const parser = deferredState.parser;
594
+ const reParseResult = parser[ParseWithDependency](deferredState.rawInput, dependencyValue);
595
+ resolvedStates[key] = await Promise.resolve(reParseResult);
596
+ } else resolvedStates[key] = deferredState.preliminaryResult;
597
+ }
598
+ }
599
+ return resolvedStates;
600
+ }
534
601
  function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
535
602
  const label = typeof labelOrParsers === "string" ? labelOrParsers : void 0;
536
603
  let parsers;
@@ -689,10 +756,11 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
689
756
  return parseSync(context);
690
757
  },
691
758
  complete(state) {
759
+ const resolvedState = isAsync ? state : resolveDeferredParseStates(state);
692
760
  if (!isAsync) {
693
761
  const result = {};
694
762
  for (const field of parserKeys) {
695
- const valueResult = parsers[field].complete(state[field]);
763
+ const valueResult = parsers[field].complete(resolvedState[field]);
696
764
  if (valueResult.success) result[field] = valueResult.value;
697
765
  else return {
698
766
  success: false,
@@ -705,9 +773,10 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
705
773
  };
706
774
  }
707
775
  return (async () => {
776
+ const resolvedState$1 = await resolveDeferredParseStatesAsync(state);
708
777
  const result = {};
709
778
  for (const field of parserKeys) {
710
- const valueResult = await parsers[field].complete(state[field]);
779
+ const valueResult = await parsers[field].complete(resolvedState$1[field]);
711
780
  if (valueResult.success) result[field] = valueResult.value;
712
781
  else return {
713
782
  success: false,