@optique/core 1.0.0-dev.679 → 1.0.0-dev.688

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.
@@ -612,6 +612,7 @@ function longestMatch(...args) {
612
612
  function* suggestObjectSync(context, prefix, parserPairs) {
613
613
  const registry = context.dependencyRegistry ? context.dependencyRegistry.clone() : new require_dependency.DependencyRegistry();
614
614
  if (context.state && typeof context.state === "object") collectDependencies(context.state, registry);
615
+ completeDependencySourceDefaults(context, parserPairs, registry);
615
616
  const contextWithRegistry = {
616
617
  ...context,
617
618
  dependencyRegistry: registry
@@ -645,6 +646,7 @@ function* suggestObjectSync(context, prefix, parserPairs) {
645
646
  async function* suggestObjectAsync(context, prefix, parserPairs) {
646
647
  const registry = context.dependencyRegistry ? context.dependencyRegistry.clone() : new require_dependency.DependencyRegistry();
647
648
  if (context.state && typeof context.state === "object") collectDependencies(context.state, registry);
649
+ await completeDependencySourceDefaultsAsync(context, parserPairs, registry);
648
650
  const contextWithRegistry = {
649
651
  ...context,
650
652
  dependencyRegistry: registry
@@ -673,6 +675,59 @@ async function* suggestObjectAsync(context, prefix, parserPairs) {
673
675
  yield* require_suggestion.deduplicateSuggestions(suggestions);
674
676
  }
675
677
  /**
678
+ * Registers an already-resolved dependency source value in the registry
679
+ * if it is a successful {@link DependencySourceState}.
680
+ *
681
+ * @internal
682
+ */
683
+ function registerCompletedDependency(completed, registry) {
684
+ if (require_dependency.isDependencySourceState(completed) && completed.result.success && !registry.has(completed[require_dependency.dependencyId])) registry.set(completed[require_dependency.dependencyId], completed.result.value);
685
+ }
686
+ /**
687
+ * Yields `(parser, state)` pairs for dependency source parsers whose field
688
+ * state is unpopulated, so callers can invoke `complete()` on them.
689
+ *
690
+ * @see https://github.com/dahlia/optique/issues/186
691
+ * @internal
692
+ */
693
+ function* pendingDependencyDefaults(context, parserPairs) {
694
+ for (const [field, fieldParser] of parserPairs) {
695
+ const fieldState = context.state != null && typeof context.state === "object" && field in context.state ? context.state[field] : void 0;
696
+ if (fieldState != null) continue;
697
+ if (require_dependency.isPendingDependencySourceState(fieldParser.initialState)) yield {
698
+ parser: fieldParser,
699
+ state: fieldParser.initialState
700
+ };
701
+ else if (require_dependency.isWrappedDependencySource(fieldParser)) yield {
702
+ parser: fieldParser,
703
+ state: [fieldParser[require_dependency.wrappedDependencySourceMarker]]
704
+ };
705
+ }
706
+ }
707
+ /**
708
+ * Pre-completes dependency source parsers wrapped in `withDefault()` whose
709
+ * field state is unpopulated, so that their default values are registered
710
+ * in the dependency registry. This mirrors Phase 1 of parse-time dependency
711
+ * resolution and ensures `suggest()` sees the same defaults as `parse()`.
712
+ *
713
+ * @see https://github.com/dahlia/optique/issues/186
714
+ * @internal
715
+ */
716
+ function completeDependencySourceDefaults(context, parserPairs, registry) {
717
+ for (const { parser, state } of pendingDependencyDefaults(context, parserPairs)) registerCompletedDependency(parser.complete(state), registry);
718
+ }
719
+ /**
720
+ * Async version of {@link completeDependencySourceDefaults} that awaits
721
+ * `complete()` results. Async parsers with `transformsDependencyValue`
722
+ * return a `Promise` from `complete()`, which the sync version cannot handle.
723
+ *
724
+ * @see https://github.com/dahlia/optique/issues/186
725
+ * @internal
726
+ */
727
+ async function completeDependencySourceDefaultsAsync(context, parserPairs, registry) {
728
+ for (const { parser, state } of pendingDependencyDefaults(context, parserPairs)) registerCompletedDependency(await parser.complete(state), registry);
729
+ }
730
+ /**
676
731
  * Recursively collects dependency values from DependencySourceState objects
677
732
  * found anywhere in the state tree.
678
733
  * @internal
@@ -612,6 +612,7 @@ function longestMatch(...args) {
612
612
  function* suggestObjectSync(context, prefix, parserPairs) {
613
613
  const registry = context.dependencyRegistry ? context.dependencyRegistry.clone() : new DependencyRegistry();
614
614
  if (context.state && typeof context.state === "object") collectDependencies(context.state, registry);
615
+ completeDependencySourceDefaults(context, parserPairs, registry);
615
616
  const contextWithRegistry = {
616
617
  ...context,
617
618
  dependencyRegistry: registry
@@ -645,6 +646,7 @@ function* suggestObjectSync(context, prefix, parserPairs) {
645
646
  async function* suggestObjectAsync(context, prefix, parserPairs) {
646
647
  const registry = context.dependencyRegistry ? context.dependencyRegistry.clone() : new DependencyRegistry();
647
648
  if (context.state && typeof context.state === "object") collectDependencies(context.state, registry);
649
+ await completeDependencySourceDefaultsAsync(context, parserPairs, registry);
648
650
  const contextWithRegistry = {
649
651
  ...context,
650
652
  dependencyRegistry: registry
@@ -673,6 +675,59 @@ async function* suggestObjectAsync(context, prefix, parserPairs) {
673
675
  yield* deduplicateSuggestions(suggestions);
674
676
  }
675
677
  /**
678
+ * Registers an already-resolved dependency source value in the registry
679
+ * if it is a successful {@link DependencySourceState}.
680
+ *
681
+ * @internal
682
+ */
683
+ function registerCompletedDependency(completed, registry) {
684
+ if (isDependencySourceState(completed) && completed.result.success && !registry.has(completed[dependencyId])) registry.set(completed[dependencyId], completed.result.value);
685
+ }
686
+ /**
687
+ * Yields `(parser, state)` pairs for dependency source parsers whose field
688
+ * state is unpopulated, so callers can invoke `complete()` on them.
689
+ *
690
+ * @see https://github.com/dahlia/optique/issues/186
691
+ * @internal
692
+ */
693
+ function* pendingDependencyDefaults(context, parserPairs) {
694
+ for (const [field, fieldParser] of parserPairs) {
695
+ const fieldState = context.state != null && typeof context.state === "object" && field in context.state ? context.state[field] : void 0;
696
+ if (fieldState != null) continue;
697
+ if (isPendingDependencySourceState(fieldParser.initialState)) yield {
698
+ parser: fieldParser,
699
+ state: fieldParser.initialState
700
+ };
701
+ else if (isWrappedDependencySource(fieldParser)) yield {
702
+ parser: fieldParser,
703
+ state: [fieldParser[wrappedDependencySourceMarker]]
704
+ };
705
+ }
706
+ }
707
+ /**
708
+ * Pre-completes dependency source parsers wrapped in `withDefault()` whose
709
+ * field state is unpopulated, so that their default values are registered
710
+ * in the dependency registry. This mirrors Phase 1 of parse-time dependency
711
+ * resolution and ensures `suggest()` sees the same defaults as `parse()`.
712
+ *
713
+ * @see https://github.com/dahlia/optique/issues/186
714
+ * @internal
715
+ */
716
+ function completeDependencySourceDefaults(context, parserPairs, registry) {
717
+ for (const { parser, state } of pendingDependencyDefaults(context, parserPairs)) registerCompletedDependency(parser.complete(state), registry);
718
+ }
719
+ /**
720
+ * Async version of {@link completeDependencySourceDefaults} that awaits
721
+ * `complete()` results. Async parsers with `transformsDependencyValue`
722
+ * return a `Promise` from `complete()`, which the sync version cannot handle.
723
+ *
724
+ * @see https://github.com/dahlia/optique/issues/186
725
+ * @internal
726
+ */
727
+ async function completeDependencySourceDefaultsAsync(context, parserPairs, registry) {
728
+ for (const { parser, state } of pendingDependencyDefaults(context, parserPairs)) registerCompletedDependency(await parser.complete(state), registry);
729
+ }
730
+ /**
676
731
  * Recursively collects dependency values from DependencySourceState objects
677
732
  * found anywhere in the state tree.
678
733
  * @internal
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optique/core",
3
- "version": "1.0.0-dev.679+b8bf2b3d",
3
+ "version": "1.0.0-dev.688+29c3a506",
4
4
  "description": "Type-safe combinatorial command-line interface parser",
5
5
  "keywords": [
6
6
  "CLI",