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

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.
@@ -553,10 +553,16 @@ function resolveDeferredInState(state, runtime, visited = /* @__PURE__ */ new We
553
553
  }
554
554
  if (require_dependency.isDeferredParseState(state)) return resolveSingleDeferred(state, runtime);
555
555
  if (require_dependency.isDependencySourceState(state)) return state;
556
- if (Array.isArray(state)) return state.map((item) => resolveDeferredInState(item, runtime, visited));
556
+ if (Array.isArray(state)) {
557
+ const resolved = state.map((item) => resolveDeferredInState(item, runtime, visited));
558
+ return resolved.every((item, index) => item === state[index]) ? state : resolved;
559
+ }
557
560
  if (isPlainObject(state)) {
561
+ const keys = Reflect.ownKeys(state);
562
+ const resolvedEntries = keys.map((key) => [key, resolveDeferredInState(state[key], runtime, visited)]);
563
+ if (resolvedEntries.every(([key, value]) => value === state[key])) return state;
558
564
  const resolved = Object.create(Object.getPrototypeOf(state));
559
- for (const key of Reflect.ownKeys(state)) resolved[key] = resolveDeferredInState(state[key], runtime, visited);
565
+ for (const [key, value] of resolvedEntries) resolved[key] = value;
560
566
  return resolved;
561
567
  }
562
568
  return state;
@@ -595,13 +601,18 @@ async function resolveDeferredInStateAsync(state, runtime, visited = /* @__PURE_
595
601
  return Promise.resolve(deferred.parser[require_dependency.parseWithDependency](deferred.rawInput, depValue));
596
602
  }
597
603
  if (require_dependency.isDependencySourceState(state)) return state;
598
- if (Array.isArray(state)) return Promise.all(state.map((item) => resolveDeferredInStateAsync(item, runtime, visited)));
604
+ if (Array.isArray(state)) {
605
+ const resolved = await Promise.all(state.map((item) => resolveDeferredInStateAsync(item, runtime, visited)));
606
+ return resolved.every((item, index) => item === state[index]) ? state : resolved;
607
+ }
599
608
  if (isPlainObject(state)) {
600
- const resolved = Object.create(Object.getPrototypeOf(state));
601
609
  const keys = Reflect.ownKeys(state);
602
- await Promise.all(keys.map(async (key) => {
603
- resolved[key] = await resolveDeferredInStateAsync(state[key], runtime, visited);
610
+ const resolvedEntries = await Promise.all(keys.map(async (key) => {
611
+ return [key, await resolveDeferredInStateAsync(state[key], runtime, visited)];
604
612
  }));
613
+ if (resolvedEntries.every(([key, value]) => value === state[key])) return state;
614
+ const resolved = Object.create(Object.getPrototypeOf(state));
615
+ for (const [key, value] of resolvedEntries) resolved[key] = value;
605
616
  return resolved;
606
617
  }
607
618
  return state;
@@ -553,10 +553,16 @@ function resolveDeferredInState(state, runtime, visited = /* @__PURE__ */ new We
553
553
  }
554
554
  if (isDeferredParseState(state)) return resolveSingleDeferred(state, runtime);
555
555
  if (isDependencySourceState(state)) return state;
556
- if (Array.isArray(state)) return state.map((item) => resolveDeferredInState(item, runtime, visited));
556
+ if (Array.isArray(state)) {
557
+ const resolved = state.map((item) => resolveDeferredInState(item, runtime, visited));
558
+ return resolved.every((item, index) => item === state[index]) ? state : resolved;
559
+ }
557
560
  if (isPlainObject(state)) {
561
+ const keys = Reflect.ownKeys(state);
562
+ const resolvedEntries = keys.map((key) => [key, resolveDeferredInState(state[key], runtime, visited)]);
563
+ if (resolvedEntries.every(([key, value]) => value === state[key])) return state;
558
564
  const resolved = Object.create(Object.getPrototypeOf(state));
559
- for (const key of Reflect.ownKeys(state)) resolved[key] = resolveDeferredInState(state[key], runtime, visited);
565
+ for (const [key, value] of resolvedEntries) resolved[key] = value;
560
566
  return resolved;
561
567
  }
562
568
  return state;
@@ -595,13 +601,18 @@ async function resolveDeferredInStateAsync(state, runtime, visited = /* @__PURE_
595
601
  return Promise.resolve(deferred.parser[parseWithDependency](deferred.rawInput, depValue));
596
602
  }
597
603
  if (isDependencySourceState(state)) return state;
598
- if (Array.isArray(state)) return Promise.all(state.map((item) => resolveDeferredInStateAsync(item, runtime, visited)));
604
+ if (Array.isArray(state)) {
605
+ const resolved = await Promise.all(state.map((item) => resolveDeferredInStateAsync(item, runtime, visited)));
606
+ return resolved.every((item, index) => item === state[index]) ? state : resolved;
607
+ }
599
608
  if (isPlainObject(state)) {
600
- const resolved = Object.create(Object.getPrototypeOf(state));
601
609
  const keys = Reflect.ownKeys(state);
602
- await Promise.all(keys.map(async (key) => {
603
- resolved[key] = await resolveDeferredInStateAsync(state[key], runtime, visited);
610
+ const resolvedEntries = await Promise.all(keys.map(async (key) => {
611
+ return [key, await resolveDeferredInStateAsync(state[key], runtime, visited)];
604
612
  }));
613
+ if (resolvedEntries.every(([key, value]) => value === state[key])) return state;
614
+ const resolved = Object.create(Object.getPrototypeOf(state));
615
+ for (const [key, value] of resolvedEntries) resolved[key] = value;
605
616
  return resolved;
606
617
  }
607
618
  return state;
package/dist/index.cjs CHANGED
@@ -17,6 +17,7 @@ exports.DuplicateOptionError = require_constructs.DuplicateOptionError;
17
17
  exports.RunParserError = require_facade.RunParserError;
18
18
  exports.WithDefaultError = require_modifiers.WithDefaultError;
19
19
  exports.annotationKey = require_annotations.annotationKey;
20
+ exports.annotationWrapperRequiresSourceBindingKey = require_parser.annotationWrapperRequiresSourceBindingKey;
20
21
  exports.argument = require_primitives.argument;
21
22
  exports.bash = require_completion.bash;
22
23
  exports.checkBooleanOption = require_valueparser.checkBooleanOption;
@@ -28,6 +29,7 @@ exports.cloneUsage = require_usage.cloneUsage;
28
29
  exports.cloneUsageTerm = require_usage.cloneUsageTerm;
29
30
  exports.command = require_primitives.command;
30
31
  exports.commandLine = require_message.commandLine;
32
+ exports.composeWrappedSourceMetadata = require_parser.composeWrappedSourceMetadata;
31
33
  exports.concat = require_constructs.concat;
32
34
  exports.conditional = require_constructs.conditional;
33
35
  exports.constant = require_primitives.constant;
@@ -40,6 +42,8 @@ exports.deduplicateDocFragments = require_doc.deduplicateDocFragments;
40
42
  exports.defaultDependencyValueSnapshot = require_dependency.defaultDependencyValueSnapshot;
41
43
  exports.defaultValues = require_dependency.defaultValues;
42
44
  exports.deferredParseMarker = require_dependency.deferredParseMarker;
45
+ exports.defineInheritedAnnotationParser = require_parser.defineInheritedAnnotationParser;
46
+ exports.defineSourceBindingOnlyAnnotationCompletionParser = require_parser.defineSourceBindingOnlyAnnotationCompletionParser;
43
47
  exports.dependency = require_dependency.dependency;
44
48
  exports.dependencyId = require_dependency.dependencyId;
45
49
  exports.dependencyIds = require_dependency.dependencyIds;
@@ -68,6 +72,7 @@ exports.formatUsage = require_usage.formatUsage;
68
72
  exports.formatUsageTerm = require_usage.formatUsageTerm;
69
73
  exports.getAnnotations = require_annotations.getAnnotations;
70
74
  exports.getDefaultValuesFunction = require_dependency.getDefaultValuesFunction;
75
+ exports.getDelegatingSuggestRuntimeNodes = require_parser.getDelegatingSuggestRuntimeNodes;
71
76
  exports.getDependencyIds = require_dependency.getDependencyIds;
72
77
  exports.getDocPage = require_parser.getDocPage;
73
78
  exports.getDocPageAsync = require_parser.getDocPageAsync;
@@ -76,6 +81,7 @@ exports.getParserSuggestRuntimeNodes = require_parser.getParserSuggestRuntimeNod
76
81
  exports.getSnapshottedDefaultDependencyValues = require_dependency.getSnapshottedDefaultDependencyValues;
77
82
  exports.group = require_constructs.group;
78
83
  exports.hostname = require_valueparser.hostname;
84
+ exports.inheritParentAnnotationsKey = require_parser.inheritParentAnnotationsKey;
79
85
  exports.integer = require_valueparser.integer;
80
86
  exports.ip = require_valueparser.ip;
81
87
  exports.ipv4 = require_valueparser.ipv4;
package/dist/index.d.cts CHANGED
@@ -7,9 +7,9 @@ import { ChoiceOptions, ChoiceOptionsBase, ChoiceOptionsNumber, ChoiceOptionsStr
7
7
  import { ConditionalErrorOptions, ConditionalOptions, DuplicateOptionError, GroupOptions, LongestMatchErrorOptions, LongestMatchOptions, MergeOptions, NoMatchContext, ObjectErrorOptions, ObjectOptions, OrErrorOptions, OrOptions, TupleOptions, concat, conditional, group, longestMatch, merge, object, or, tuple } from "./constructs.cjs";
8
8
  import { MultipleErrorOptions, MultipleOptions, WithDefaultError, WithDefaultOptions, map, multiple, nonEmpty, optional, withDefault } from "./modifiers.cjs";
9
9
  import { ArgumentErrorOptions, ArgumentOptions, CommandErrorOptions, CommandOptions, FlagErrorOptions, FlagOptions, OptionErrorOptions, OptionOptions, OptionState, PassThroughFormat, PassThroughOptions, argument, command, constant, fail, flag, option, passThrough } from "./primitives.cjs";
10
- import { CombineModes, DocState, ExecutionContext, ExecutionPhase, InferMode, InferValue, Mode, ModeIterable, ModeValue, ParseFrame, Parser, ParserContext, ParserResult, Result, Suggestion, createParserContext, getDocPage, getDocPageAsync, getDocPageSync, getParserSuggestRuntimeNodes, parse, parseAsync, parseSync, suggest, suggestAsync, suggestSync, unmatchedNonCliDependencySourceStateMarker } from "./parser.cjs";
10
+ import { CombineModes, DocState, ExecutionContext, ExecutionPhase, InferMode, InferValue, Mode, ModeIterable, ModeValue, ParseFrame, Parser, ParserContext, ParserResult, Result, Suggestion, annotationWrapperRequiresSourceBindingKey, composeWrappedSourceMetadata, createParserContext, defineInheritedAnnotationParser, defineSourceBindingOnlyAnnotationCompletionParser, getDelegatingSuggestRuntimeNodes, getDocPage, getDocPageAsync, getDocPageSync, getParserSuggestRuntimeNodes, inheritParentAnnotationsKey, parse, parseAsync, parseSync, suggest, suggestAsync, suggestSync, unmatchedNonCliDependencySourceStateMarker } from "./parser.cjs";
11
11
  import { ShellCompletion, bash, fish, nu, pwsh, zsh } from "./completion.cjs";
12
12
  import { ParserValuePlaceholder, SourceContext } from "./context.cjs";
13
13
  import { AnyDependencySource, CombineMode, CombinedDependencyMode, DeferredParseState, DependencyError, DependencyMode, DependencyRegistry, DependencySource, DependencySourceState, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, PendingDependencySourceState, ResolvedDependency, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, defaultDependencyValueSnapshot, defaultValues, deferredParseMarker, dependency, dependencyId, dependencyIds, dependencySourceMarker, dependencySourceStateMarker, deriveFrom, deriveFromAsync, deriveFromSync, derivedValueParserMarker, formatDependencyError, getDefaultValuesFunction, getDependencyIds, getSnapshottedDefaultDependencyValues, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource, parseWithDependency, pendingDependencySourceStateMarker, singleDefaultValue, snapshotDefaultDependencyValues, suggestWithDependency, transformsDependencyValue, transformsDependencyValueMarker, wrappedDependencySourceMarker } from "./dependency.cjs";
14
14
  import { CommandSubConfig, ContextOptionsParam, ExtractRequiredOptions, OptionSubConfig, RunOptions, RunParserError, RunWithOptions, SubstituteParserValue, runParser, runParserAsync, runParserSync, runWith, runWithAsync, runWithSync } from "./facade.cjs";
15
- export { type Annotations, AnyDependencySource, ArgumentErrorOptions, ArgumentOptions, ChoiceOptions, ChoiceOptionsBase, ChoiceOptionsNumber, ChoiceOptionsString, CidrOptions, CidrValue, CombineMode, CombineModes, CombinedDependencyMode, CommandErrorOptions, CommandOptions, CommandSubConfig, ConditionalErrorOptions, ConditionalOptions, ContextOptionsParam, DeferredMap, DeferredParseState, DependencyError, DependencyMode, DependencyRegistry, DependencySource, DependencySourceState, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, DocEntry, DocFragment, DocFragments, DocPage, DocPageFormatOptions, DocSection, DocState, DomainOptions, DuplicateOptionError, EmailOptions, ExecutionContext, ExecutionPhase, ExtractRequiredOptions, FlagErrorOptions, FlagOptions, FloatOptions, GroupOptions, HiddenVisibility, HostnameOptions, InferMode, InferValue, IntegerOptionsBigInt, IntegerOptionsNumber, IpOptions, Ipv4Options, Ipv6Options, LocaleOptions, LongestMatchErrorOptions, LongestMatchOptions, MacAddressOptions, MergeOptions, type Message, type MessageFormatOptions, type MessageTerm, Mode, ModeIterable, ModeValue, MultipleErrorOptions, MultipleOptions, NoMatchContext, NonEmptyString, ObjectErrorOptions, ObjectOptions, OptionErrorOptions, OptionName, OptionOptions, OptionState, OptionSubConfig, OrErrorOptions, OrOptions, ParseFrame, type ParseOptions, Parser, ParserContext, ParserResult, ParserValuePlaceholder, PassThroughFormat, PassThroughOptions, PendingDependencySourceState, PortOptionsBigInt, PortOptionsNumber, PortRangeOptionsBigInt, PortRangeOptionsNumber, PortRangeValueBigInt, PortRangeValueNumber, ResolvedDependency, Result, RunOptions, RunParserError, RunWithOptions, ShellCompletion, ShowChoicesOptions, ShowDefaultOptions, SocketAddressOptions, SocketAddressValue, SourceContext, StringOptions, SubstituteParserValue, Suggestion, TupleOptions, UrlOptions, Usage, UsageFormatOptions, UsageTerm, UsageTermFormatOptions, Uuid, UuidOptions, ValueParser, ValueParserResult, type ValueSetOptions, WithDefaultError, WithDefaultOptions, annotationKey, argument, bash, checkBooleanOption, checkEnumOption, choice, cidr, cloneDocEntry, cloneUsage, cloneUsageTerm, command, commandLine, concat, conditional, constant, createDeferredParseState, createDependencySourceState, createParserContext, createPendingDependencySourceState, deduplicateDocEntries, deduplicateDocFragments, defaultDependencyValueSnapshot, defaultValues, deferredParseMarker, dependency, dependencyId, dependencyIds, dependencySourceMarker, dependencySourceStateMarker, deriveFrom, deriveFromAsync, deriveFromSync, derivedValueParserMarker, domain, email, ensureNonEmptyString, envVar, extractArgumentMetavars, extractCommandNames, extractLiteralValues, extractOptionNames, fail, fish, flag, float, formatDependencyError, formatDocPage, formatMessage, formatUsage, formatUsageTerm, getAnnotations, getDefaultValuesFunction, getDependencyIds, getDocPage, getDocPageAsync, getDocPageSync, getParserSuggestRuntimeNodes, getSnapshottedDefaultDependencyValues, group, hostname, integer, ip, ipv4, ipv6, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isDocEntryHidden, isDocHidden, isNonEmptyString, isPendingDependencySourceState, isSuggestionHidden, isUsageHidden, isValueParser, isWrappedDependencySource, lineBreak, link, locale, longestMatch, macAddress, map, merge, mergeHidden, message, metavar, multiple, nonEmpty, normalizeUsage, nu, object, option, optionName, optionNames, optional, or, parse, parseAsync, parseSync, parseWithDependency, passThrough, pendingDependencySourceStateMarker, port, portRange, pwsh, runParser, runParserAsync, runParserSync, runWith, runWithAsync, runWithSync, singleDefaultValue, snapshotDefaultDependencyValues, socketAddress, string, suggest, suggestAsync, suggestSync, suggestWithDependency, text, transformsDependencyValue, transformsDependencyValueMarker, tuple, unmatchedNonCliDependencySourceStateMarker, url, uuid, value, valueSet, values, withDefault, wrappedDependencySourceMarker, zsh };
15
+ export { type Annotations, AnyDependencySource, ArgumentErrorOptions, ArgumentOptions, ChoiceOptions, ChoiceOptionsBase, ChoiceOptionsNumber, ChoiceOptionsString, CidrOptions, CidrValue, CombineMode, CombineModes, CombinedDependencyMode, CommandErrorOptions, CommandOptions, CommandSubConfig, ConditionalErrorOptions, ConditionalOptions, ContextOptionsParam, DeferredMap, DeferredParseState, DependencyError, DependencyMode, DependencyRegistry, DependencySource, DependencySourceState, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, DocEntry, DocFragment, DocFragments, DocPage, DocPageFormatOptions, DocSection, DocState, DomainOptions, DuplicateOptionError, EmailOptions, ExecutionContext, ExecutionPhase, ExtractRequiredOptions, FlagErrorOptions, FlagOptions, FloatOptions, GroupOptions, HiddenVisibility, HostnameOptions, InferMode, InferValue, IntegerOptionsBigInt, IntegerOptionsNumber, IpOptions, Ipv4Options, Ipv6Options, LocaleOptions, LongestMatchErrorOptions, LongestMatchOptions, MacAddressOptions, MergeOptions, type Message, type MessageFormatOptions, type MessageTerm, Mode, ModeIterable, ModeValue, MultipleErrorOptions, MultipleOptions, NoMatchContext, NonEmptyString, ObjectErrorOptions, ObjectOptions, OptionErrorOptions, OptionName, OptionOptions, OptionState, OptionSubConfig, OrErrorOptions, OrOptions, ParseFrame, type ParseOptions, Parser, ParserContext, ParserResult, ParserValuePlaceholder, PassThroughFormat, PassThroughOptions, PendingDependencySourceState, PortOptionsBigInt, PortOptionsNumber, PortRangeOptionsBigInt, PortRangeOptionsNumber, PortRangeValueBigInt, PortRangeValueNumber, ResolvedDependency, Result, RunOptions, RunParserError, RunWithOptions, ShellCompletion, ShowChoicesOptions, ShowDefaultOptions, SocketAddressOptions, SocketAddressValue, SourceContext, StringOptions, SubstituteParserValue, Suggestion, TupleOptions, UrlOptions, Usage, UsageFormatOptions, UsageTerm, UsageTermFormatOptions, Uuid, UuidOptions, ValueParser, ValueParserResult, type ValueSetOptions, WithDefaultError, WithDefaultOptions, annotationKey, annotationWrapperRequiresSourceBindingKey, argument, bash, checkBooleanOption, checkEnumOption, choice, cidr, cloneDocEntry, cloneUsage, cloneUsageTerm, command, commandLine, composeWrappedSourceMetadata, concat, conditional, constant, createDeferredParseState, createDependencySourceState, createParserContext, createPendingDependencySourceState, deduplicateDocEntries, deduplicateDocFragments, defaultDependencyValueSnapshot, defaultValues, deferredParseMarker, defineInheritedAnnotationParser, defineSourceBindingOnlyAnnotationCompletionParser, dependency, dependencyId, dependencyIds, dependencySourceMarker, dependencySourceStateMarker, deriveFrom, deriveFromAsync, deriveFromSync, derivedValueParserMarker, domain, email, ensureNonEmptyString, envVar, extractArgumentMetavars, extractCommandNames, extractLiteralValues, extractOptionNames, fail, fish, flag, float, formatDependencyError, formatDocPage, formatMessage, formatUsage, formatUsageTerm, getAnnotations, getDefaultValuesFunction, getDelegatingSuggestRuntimeNodes, getDependencyIds, getDocPage, getDocPageAsync, getDocPageSync, getParserSuggestRuntimeNodes, getSnapshottedDefaultDependencyValues, group, hostname, inheritParentAnnotationsKey, integer, ip, ipv4, ipv6, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isDocEntryHidden, isDocHidden, isNonEmptyString, isPendingDependencySourceState, isSuggestionHidden, isUsageHidden, isValueParser, isWrappedDependencySource, lineBreak, link, locale, longestMatch, macAddress, map, merge, mergeHidden, message, metavar, multiple, nonEmpty, normalizeUsage, nu, object, option, optionName, optionNames, optional, or, parse, parseAsync, parseSync, parseWithDependency, passThrough, pendingDependencySourceStateMarker, port, portRange, pwsh, runParser, runParserAsync, runParserSync, runWith, runWithAsync, runWithSync, singleDefaultValue, snapshotDefaultDependencyValues, socketAddress, string, suggest, suggestAsync, suggestSync, suggestWithDependency, text, transformsDependencyValue, transformsDependencyValueMarker, tuple, unmatchedNonCliDependencySourceStateMarker, url, uuid, value, valueSet, values, withDefault, wrappedDependencySourceMarker, zsh };
package/dist/index.d.ts CHANGED
@@ -7,9 +7,9 @@ import { ChoiceOptions, ChoiceOptionsBase, ChoiceOptionsNumber, ChoiceOptionsStr
7
7
  import { ConditionalErrorOptions, ConditionalOptions, DuplicateOptionError, GroupOptions, LongestMatchErrorOptions, LongestMatchOptions, MergeOptions, NoMatchContext, ObjectErrorOptions, ObjectOptions, OrErrorOptions, OrOptions, TupleOptions, concat, conditional, group, longestMatch, merge, object, or, tuple } from "./constructs.js";
8
8
  import { MultipleErrorOptions, MultipleOptions, WithDefaultError, WithDefaultOptions, map, multiple, nonEmpty, optional, withDefault } from "./modifiers.js";
9
9
  import { ArgumentErrorOptions, ArgumentOptions, CommandErrorOptions, CommandOptions, FlagErrorOptions, FlagOptions, OptionErrorOptions, OptionOptions, OptionState, PassThroughFormat, PassThroughOptions, argument, command, constant, fail, flag, option, passThrough } from "./primitives.js";
10
- import { CombineModes, DocState, ExecutionContext, ExecutionPhase, InferMode, InferValue, Mode, ModeIterable, ModeValue, ParseFrame, Parser, ParserContext, ParserResult, Result, Suggestion, createParserContext, getDocPage, getDocPageAsync, getDocPageSync, getParserSuggestRuntimeNodes, parse, parseAsync, parseSync, suggest, suggestAsync, suggestSync, unmatchedNonCliDependencySourceStateMarker } from "./parser.js";
10
+ import { CombineModes, DocState, ExecutionContext, ExecutionPhase, InferMode, InferValue, Mode, ModeIterable, ModeValue, ParseFrame, Parser, ParserContext, ParserResult, Result, Suggestion, annotationWrapperRequiresSourceBindingKey, composeWrappedSourceMetadata, createParserContext, defineInheritedAnnotationParser, defineSourceBindingOnlyAnnotationCompletionParser, getDelegatingSuggestRuntimeNodes, getDocPage, getDocPageAsync, getDocPageSync, getParserSuggestRuntimeNodes, inheritParentAnnotationsKey, parse, parseAsync, parseSync, suggest, suggestAsync, suggestSync, unmatchedNonCliDependencySourceStateMarker } from "./parser.js";
11
11
  import { ShellCompletion, bash, fish, nu, pwsh, zsh } from "./completion.js";
12
12
  import { ParserValuePlaceholder, SourceContext } from "./context.js";
13
13
  import { AnyDependencySource, CombineMode, CombinedDependencyMode, DeferredParseState, DependencyError, DependencyMode, DependencyRegistry, DependencySource, DependencySourceState, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, PendingDependencySourceState, ResolvedDependency, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, defaultDependencyValueSnapshot, defaultValues, deferredParseMarker, dependency, dependencyId, dependencyIds, dependencySourceMarker, dependencySourceStateMarker, deriveFrom, deriveFromAsync, deriveFromSync, derivedValueParserMarker, formatDependencyError, getDefaultValuesFunction, getDependencyIds, getSnapshottedDefaultDependencyValues, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource, parseWithDependency, pendingDependencySourceStateMarker, singleDefaultValue, snapshotDefaultDependencyValues, suggestWithDependency, transformsDependencyValue, transformsDependencyValueMarker, wrappedDependencySourceMarker } from "./dependency.js";
14
14
  import { CommandSubConfig, ContextOptionsParam, ExtractRequiredOptions, OptionSubConfig, RunOptions, RunParserError, RunWithOptions, SubstituteParserValue, runParser, runParserAsync, runParserSync, runWith, runWithAsync, runWithSync } from "./facade.js";
15
- export { type Annotations, AnyDependencySource, ArgumentErrorOptions, ArgumentOptions, ChoiceOptions, ChoiceOptionsBase, ChoiceOptionsNumber, ChoiceOptionsString, CidrOptions, CidrValue, CombineMode, CombineModes, CombinedDependencyMode, CommandErrorOptions, CommandOptions, CommandSubConfig, ConditionalErrorOptions, ConditionalOptions, ContextOptionsParam, DeferredMap, DeferredParseState, DependencyError, DependencyMode, DependencyRegistry, DependencySource, DependencySourceState, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, DocEntry, DocFragment, DocFragments, DocPage, DocPageFormatOptions, DocSection, DocState, DomainOptions, DuplicateOptionError, EmailOptions, ExecutionContext, ExecutionPhase, ExtractRequiredOptions, FlagErrorOptions, FlagOptions, FloatOptions, GroupOptions, HiddenVisibility, HostnameOptions, InferMode, InferValue, IntegerOptionsBigInt, IntegerOptionsNumber, IpOptions, Ipv4Options, Ipv6Options, LocaleOptions, LongestMatchErrorOptions, LongestMatchOptions, MacAddressOptions, MergeOptions, type Message, type MessageFormatOptions, type MessageTerm, Mode, ModeIterable, ModeValue, MultipleErrorOptions, MultipleOptions, NoMatchContext, NonEmptyString, ObjectErrorOptions, ObjectOptions, OptionErrorOptions, OptionName, OptionOptions, OptionState, OptionSubConfig, OrErrorOptions, OrOptions, ParseFrame, type ParseOptions, Parser, ParserContext, ParserResult, ParserValuePlaceholder, PassThroughFormat, PassThroughOptions, PendingDependencySourceState, PortOptionsBigInt, PortOptionsNumber, PortRangeOptionsBigInt, PortRangeOptionsNumber, PortRangeValueBigInt, PortRangeValueNumber, ResolvedDependency, Result, RunOptions, RunParserError, RunWithOptions, ShellCompletion, ShowChoicesOptions, ShowDefaultOptions, SocketAddressOptions, SocketAddressValue, SourceContext, StringOptions, SubstituteParserValue, Suggestion, TupleOptions, UrlOptions, Usage, UsageFormatOptions, UsageTerm, UsageTermFormatOptions, Uuid, UuidOptions, ValueParser, ValueParserResult, type ValueSetOptions, WithDefaultError, WithDefaultOptions, annotationKey, argument, bash, checkBooleanOption, checkEnumOption, choice, cidr, cloneDocEntry, cloneUsage, cloneUsageTerm, command, commandLine, concat, conditional, constant, createDeferredParseState, createDependencySourceState, createParserContext, createPendingDependencySourceState, deduplicateDocEntries, deduplicateDocFragments, defaultDependencyValueSnapshot, defaultValues, deferredParseMarker, dependency, dependencyId, dependencyIds, dependencySourceMarker, dependencySourceStateMarker, deriveFrom, deriveFromAsync, deriveFromSync, derivedValueParserMarker, domain, email, ensureNonEmptyString, envVar, extractArgumentMetavars, extractCommandNames, extractLiteralValues, extractOptionNames, fail, fish, flag, float, formatDependencyError, formatDocPage, formatMessage, formatUsage, formatUsageTerm, getAnnotations, getDefaultValuesFunction, getDependencyIds, getDocPage, getDocPageAsync, getDocPageSync, getParserSuggestRuntimeNodes, getSnapshottedDefaultDependencyValues, group, hostname, integer, ip, ipv4, ipv6, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isDocEntryHidden, isDocHidden, isNonEmptyString, isPendingDependencySourceState, isSuggestionHidden, isUsageHidden, isValueParser, isWrappedDependencySource, lineBreak, link, locale, longestMatch, macAddress, map, merge, mergeHidden, message, metavar, multiple, nonEmpty, normalizeUsage, nu, object, option, optionName, optionNames, optional, or, parse, parseAsync, parseSync, parseWithDependency, passThrough, pendingDependencySourceStateMarker, port, portRange, pwsh, runParser, runParserAsync, runParserSync, runWith, runWithAsync, runWithSync, singleDefaultValue, snapshotDefaultDependencyValues, socketAddress, string, suggest, suggestAsync, suggestSync, suggestWithDependency, text, transformsDependencyValue, transformsDependencyValueMarker, tuple, unmatchedNonCliDependencySourceStateMarker, url, uuid, value, valueSet, values, withDefault, wrappedDependencySourceMarker, zsh };
15
+ export { type Annotations, AnyDependencySource, ArgumentErrorOptions, ArgumentOptions, ChoiceOptions, ChoiceOptionsBase, ChoiceOptionsNumber, ChoiceOptionsString, CidrOptions, CidrValue, CombineMode, CombineModes, CombinedDependencyMode, CommandErrorOptions, CommandOptions, CommandSubConfig, ConditionalErrorOptions, ConditionalOptions, ContextOptionsParam, DeferredMap, DeferredParseState, DependencyError, DependencyMode, DependencyRegistry, DependencySource, DependencySourceState, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, DocEntry, DocFragment, DocFragments, DocPage, DocPageFormatOptions, DocSection, DocState, DomainOptions, DuplicateOptionError, EmailOptions, ExecutionContext, ExecutionPhase, ExtractRequiredOptions, FlagErrorOptions, FlagOptions, FloatOptions, GroupOptions, HiddenVisibility, HostnameOptions, InferMode, InferValue, IntegerOptionsBigInt, IntegerOptionsNumber, IpOptions, Ipv4Options, Ipv6Options, LocaleOptions, LongestMatchErrorOptions, LongestMatchOptions, MacAddressOptions, MergeOptions, type Message, type MessageFormatOptions, type MessageTerm, Mode, ModeIterable, ModeValue, MultipleErrorOptions, MultipleOptions, NoMatchContext, NonEmptyString, ObjectErrorOptions, ObjectOptions, OptionErrorOptions, OptionName, OptionOptions, OptionState, OptionSubConfig, OrErrorOptions, OrOptions, ParseFrame, type ParseOptions, Parser, ParserContext, ParserResult, ParserValuePlaceholder, PassThroughFormat, PassThroughOptions, PendingDependencySourceState, PortOptionsBigInt, PortOptionsNumber, PortRangeOptionsBigInt, PortRangeOptionsNumber, PortRangeValueBigInt, PortRangeValueNumber, ResolvedDependency, Result, RunOptions, RunParserError, RunWithOptions, ShellCompletion, ShowChoicesOptions, ShowDefaultOptions, SocketAddressOptions, SocketAddressValue, SourceContext, StringOptions, SubstituteParserValue, Suggestion, TupleOptions, UrlOptions, Usage, UsageFormatOptions, UsageTerm, UsageTermFormatOptions, Uuid, UuidOptions, ValueParser, ValueParserResult, type ValueSetOptions, WithDefaultError, WithDefaultOptions, annotationKey, annotationWrapperRequiresSourceBindingKey, argument, bash, checkBooleanOption, checkEnumOption, choice, cidr, cloneDocEntry, cloneUsage, cloneUsageTerm, command, commandLine, composeWrappedSourceMetadata, concat, conditional, constant, createDeferredParseState, createDependencySourceState, createParserContext, createPendingDependencySourceState, deduplicateDocEntries, deduplicateDocFragments, defaultDependencyValueSnapshot, defaultValues, deferredParseMarker, defineInheritedAnnotationParser, defineSourceBindingOnlyAnnotationCompletionParser, dependency, dependencyId, dependencyIds, dependencySourceMarker, dependencySourceStateMarker, deriveFrom, deriveFromAsync, deriveFromSync, derivedValueParserMarker, domain, email, ensureNonEmptyString, envVar, extractArgumentMetavars, extractCommandNames, extractLiteralValues, extractOptionNames, fail, fish, flag, float, formatDependencyError, formatDocPage, formatMessage, formatUsage, formatUsageTerm, getAnnotations, getDefaultValuesFunction, getDelegatingSuggestRuntimeNodes, getDependencyIds, getDocPage, getDocPageAsync, getDocPageSync, getParserSuggestRuntimeNodes, getSnapshottedDefaultDependencyValues, group, hostname, inheritParentAnnotationsKey, integer, ip, ipv4, ipv6, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isDocEntryHidden, isDocHidden, isNonEmptyString, isPendingDependencySourceState, isSuggestionHidden, isUsageHidden, isValueParser, isWrappedDependencySource, lineBreak, link, locale, longestMatch, macAddress, map, merge, mergeHidden, message, metavar, multiple, nonEmpty, normalizeUsage, nu, object, option, optionName, optionNames, optional, or, parse, parseAsync, parseSync, parseWithDependency, passThrough, pendingDependencySourceStateMarker, port, portRange, pwsh, runParser, runParserAsync, runParserSync, runWith, runWithAsync, runWithSync, singleDefaultValue, snapshotDefaultDependencyValues, socketAddress, string, suggest, suggestAsync, suggestSync, suggestWithDependency, text, transformsDependencyValue, transformsDependencyValueMarker, tuple, unmatchedNonCliDependencySourceStateMarker, url, uuid, value, valueSet, values, withDefault, wrappedDependencySourceMarker, zsh };
package/dist/index.js CHANGED
@@ -8,8 +8,8 @@ import { WithDefaultError, map, multiple, nonEmpty, optional, withDefault } from
8
8
  import { ensureNonEmptyString, isNonEmptyString } from "./nonempty.js";
9
9
  import { checkBooleanOption, checkEnumOption, choice, cidr, domain, email, float, hostname, integer, ip, ipv4, ipv6, isValueParser, locale, macAddress, port, portRange, socketAddress, string, url, uuid } from "./valueparser.js";
10
10
  import { argument, command, constant, fail, flag, option, passThrough } from "./primitives.js";
11
- import { createParserContext, getDocPage, getDocPageAsync, getDocPageSync, getParserSuggestRuntimeNodes, parse, parseAsync, parseSync, suggest, suggestAsync, suggestSync, unmatchedNonCliDependencySourceStateMarker } from "./parser.js";
11
+ import { annotationWrapperRequiresSourceBindingKey, composeWrappedSourceMetadata, createParserContext, defineInheritedAnnotationParser, defineSourceBindingOnlyAnnotationCompletionParser, getDelegatingSuggestRuntimeNodes, getDocPage, getDocPageAsync, getDocPageSync, getParserSuggestRuntimeNodes, inheritParentAnnotationsKey, parse, parseAsync, parseSync, suggest, suggestAsync, suggestSync, unmatchedNonCliDependencySourceStateMarker } from "./parser.js";
12
12
  import { DuplicateOptionError, concat, conditional, group, longestMatch, merge, object, or, tuple } from "./constructs.js";
13
13
  import { RunParserError, runParser, runParserAsync, runParserSync, runWith, runWithAsync, runWithSync } from "./facade.js";
14
14
 
15
- export { DependencyRegistry, DuplicateOptionError, RunParserError, WithDefaultError, annotationKey, argument, bash, checkBooleanOption, checkEnumOption, choice, cidr, cloneDocEntry, cloneUsage, cloneUsageTerm, command, commandLine, concat, conditional, constant, createDeferredParseState, createDependencySourceState, createParserContext, createPendingDependencySourceState, deduplicateDocEntries, deduplicateDocFragments, defaultDependencyValueSnapshot, defaultValues, deferredParseMarker, dependency, dependencyId, dependencyIds, dependencySourceMarker, dependencySourceStateMarker, deriveFrom, deriveFromAsync, deriveFromSync, derivedValueParserMarker, domain, email, ensureNonEmptyString, envVar, extractArgumentMetavars, extractCommandNames, extractLiteralValues, extractOptionNames, fail, fish, flag, float, formatDependencyError, formatDocPage, formatMessage, formatUsage, formatUsageTerm, getAnnotations, getDefaultValuesFunction, getDependencyIds, getDocPage, getDocPageAsync, getDocPageSync, getParserSuggestRuntimeNodes, getSnapshottedDefaultDependencyValues, group, hostname, integer, ip, ipv4, ipv6, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isDocEntryHidden, isDocHidden, isNonEmptyString, isPendingDependencySourceState, isSuggestionHidden, isUsageHidden, isValueParser, isWrappedDependencySource, lineBreak, link, locale, longestMatch, macAddress, map, merge, mergeHidden, message, metavar, multiple, nonEmpty, normalizeUsage, nu, object, option, optionName, optionNames, optional, or, parse, parseAsync, parseSync, parseWithDependency, passThrough, pendingDependencySourceStateMarker, port, portRange, pwsh, runParser, runParserAsync, runParserSync, runWith, runWithAsync, runWithSync, singleDefaultValue, snapshotDefaultDependencyValues, socketAddress, string, suggest, suggestAsync, suggestSync, suggestWithDependency, text, transformsDependencyValue, transformsDependencyValueMarker, tuple, unmatchedNonCliDependencySourceStateMarker, url, uuid, value, valueSet, values, withDefault, wrappedDependencySourceMarker, zsh };
15
+ export { DependencyRegistry, DuplicateOptionError, RunParserError, WithDefaultError, annotationKey, annotationWrapperRequiresSourceBindingKey, argument, bash, checkBooleanOption, checkEnumOption, choice, cidr, cloneDocEntry, cloneUsage, cloneUsageTerm, command, commandLine, composeWrappedSourceMetadata, concat, conditional, constant, createDeferredParseState, createDependencySourceState, createParserContext, createPendingDependencySourceState, deduplicateDocEntries, deduplicateDocFragments, defaultDependencyValueSnapshot, defaultValues, deferredParseMarker, defineInheritedAnnotationParser, defineSourceBindingOnlyAnnotationCompletionParser, dependency, dependencyId, dependencyIds, dependencySourceMarker, dependencySourceStateMarker, deriveFrom, deriveFromAsync, deriveFromSync, derivedValueParserMarker, domain, email, ensureNonEmptyString, envVar, extractArgumentMetavars, extractCommandNames, extractLiteralValues, extractOptionNames, fail, fish, flag, float, formatDependencyError, formatDocPage, formatMessage, formatUsage, formatUsageTerm, getAnnotations, getDefaultValuesFunction, getDelegatingSuggestRuntimeNodes, getDependencyIds, getDocPage, getDocPageAsync, getDocPageSync, getParserSuggestRuntimeNodes, getSnapshottedDefaultDependencyValues, group, hostname, inheritParentAnnotationsKey, integer, ip, ipv4, ipv6, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isDocEntryHidden, isDocHidden, isNonEmptyString, isPendingDependencySourceState, isSuggestionHidden, isUsageHidden, isValueParser, isWrappedDependencySource, lineBreak, link, locale, longestMatch, macAddress, map, merge, mergeHidden, message, metavar, multiple, nonEmpty, normalizeUsage, nu, object, option, optionName, optionNames, optional, or, parse, parseAsync, parseSync, parseWithDependency, passThrough, pendingDependencySourceStateMarker, port, portRange, pwsh, runParser, runParserAsync, runParserSync, runWith, runWithAsync, runWithSync, singleDefaultValue, snapshotDefaultDependencyValues, socketAddress, string, suggest, suggestAsync, suggestSync, suggestWithDependency, text, transformsDependencyValue, transformsDependencyValueMarker, tuple, unmatchedNonCliDependencySourceStateMarker, url, uuid, value, valueSet, values, withDefault, wrappedDependencySourceMarker, zsh };
@@ -2,6 +2,7 @@ const require_annotations = require('./annotations.cjs');
2
2
  const require_message = require('./message.cjs');
3
3
  const require_mode_dispatch = require('./mode-dispatch.cjs');
4
4
  const require_dependency_metadata = require('./dependency-metadata.cjs');
5
+ const require_parser = require('./parser.cjs');
5
6
 
6
7
  //#region src/modifiers.ts
7
8
  function withChildExecPath(exec, segment) {
@@ -148,15 +149,23 @@ function processOptionalStyleResult(result, innerState, context) {
148
149
  *
149
150
  * @internal
150
151
  */
151
- function adaptShouldDeferCompletion(innerCheck) {
152
+ function adaptShouldDeferCompletion(innerCheck, parser) {
152
153
  return (state, exec) => {
153
- if (Array.isArray(state)) return innerCheck(normalizeOptionalLikeInnerState(state, state[0]), exec);
154
- if (state != null && typeof state === "object") return innerCheck(state, exec);
154
+ if (Array.isArray(state) || state != null && typeof state === "object") return innerCheck(normalizeOptionalLikeInnerState(state, parser.initialState, parser), exec);
155
155
  return false;
156
156
  };
157
157
  }
158
- function normalizeOptionalLikeInnerState(state, initialState) {
158
+ function isAnnotationOnlyObjectState(state) {
159
+ if (state == null || typeof state !== "object" || Array.isArray(state) || require_annotations.isInjectedAnnotationWrapper(state)) return false;
160
+ const keys = Reflect.ownKeys(state);
161
+ return require_annotations.getAnnotations(state) != null && keys.length === 1 && keys[0] === require_annotations.annotationKey;
162
+ }
163
+ function normalizeOptionalLikeInnerState(state, initialState, parser) {
159
164
  if (Array.isArray(state)) return require_annotations.getAnnotations(state) != null && state[0] != null && typeof state[0] === "object" ? require_annotations.inheritAnnotations(state, state[0]) : state[0];
165
+ if (isAnnotationOnlyObjectState(state)) {
166
+ if (parser != null && (parser.dependencyMetadata?.source != null || typeof parser.shouldDeferCompletion === "function")) return require_annotations.inheritAnnotations(state, initialState);
167
+ return initialState;
168
+ }
160
169
  if (state != null && typeof state === "object") return state;
161
170
  return initialState;
162
171
  }
@@ -175,14 +184,14 @@ function normalizeOptionalLikeInnerState(state, initialState) {
175
184
  function optional(parser) {
176
185
  const syncParser = parser;
177
186
  function* suggestSync(context, prefix) {
178
- const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState);
187
+ const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState, parser);
179
188
  yield* syncParser.suggest({
180
189
  ...context,
181
190
  state: innerState
182
191
  }, prefix);
183
192
  }
184
193
  async function* suggestAsync(context, prefix) {
185
- const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState);
194
+ const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState, parser);
186
195
  const suggestions = parser.suggest({
187
196
  ...context,
188
197
  state: innerState
@@ -202,14 +211,14 @@ function optional(parser) {
202
211
  leadingNames: parser.leadingNames,
203
212
  acceptingAnyToken: false,
204
213
  initialState: void 0,
205
- ...typeof parser.shouldDeferCompletion === "function" ? { shouldDeferCompletion: adaptShouldDeferCompletion(parser.shouldDeferCompletion.bind(parser)) } : {},
214
+ ...typeof parser.shouldDeferCompletion === "function" ? { shouldDeferCompletion: adaptShouldDeferCompletion(parser.shouldDeferCompletion.bind(parser), parser) } : {},
206
215
  getSuggestRuntimeNodes(state, path) {
207
216
  if (optionalParser.dependencyMetadata?.source != null) return [{
208
217
  path,
209
218
  parser: optionalParser,
210
219
  state
211
220
  }];
212
- const innerState = normalizeOptionalLikeInnerState(state, parser.initialState);
221
+ const innerState = normalizeOptionalLikeInnerState(state, parser.initialState, parser);
213
222
  return parser.getSuggestRuntimeNodes?.(innerState, path) ?? (parser.dependencyMetadata?.source != null ? [{
214
223
  path,
215
224
  parser,
@@ -223,7 +232,7 @@ function optional(parser) {
223
232
  if (!Array.isArray(state)) {
224
233
  if (typeof parser.shouldDeferCompletion === "function" && state != null && typeof state === "object") {
225
234
  const innerComplete = () => {
226
- const innerState = normalizeOptionalLikeInnerState(state, parser.initialState);
235
+ const innerState = normalizeOptionalLikeInnerState(state, parser.initialState, parser);
227
236
  const innerResult = require_mode_dispatch.dispatchByMode(parser.$mode, () => syncParser.complete(innerState, exec), async () => await parser.complete(innerState, exec));
228
237
  return require_mode_dispatch.mapModeValue(parser.$mode, innerResult, (result) => result.success ? result : {
229
238
  success: true,
@@ -234,7 +243,7 @@ function optional(parser) {
234
243
  }
235
244
  const sourceMetadata = parser.dependencyMetadata?.source;
236
245
  if (sourceMetadata?.preservesSourceValue !== false && sourceMetadata?.getMissingSourceValue != null) {
237
- const delegatedState = normalizeOptionalLikeInnerState(state, parser.initialState);
246
+ const delegatedState = normalizeOptionalLikeInnerState(state, parser.initialState, parser);
238
247
  return require_mode_dispatch.dispatchByMode(parser.$mode, () => syncParser.complete(delegatedState, exec), async () => await parser.complete(delegatedState, exec));
239
248
  }
240
249
  return {
@@ -242,7 +251,7 @@ function optional(parser) {
242
251
  value: void 0
243
252
  };
244
253
  }
245
- const innerElement = normalizeOptionalLikeInnerState(state, parser.initialState);
254
+ const innerElement = normalizeOptionalLikeInnerState(state, parser.initialState, parser);
246
255
  return require_mode_dispatch.dispatchByMode(parser.$mode, () => syncParser.complete(innerElement, exec), async () => await parser.complete(innerElement, exec));
247
256
  },
248
257
  suggest(context, prefix) {
@@ -271,6 +280,8 @@ function optional(parser) {
271
280
  const composed = require_dependency_metadata.composeDependencyMetadata(parser.dependencyMetadata, "optional");
272
281
  if (composed != null) optionalParser.dependencyMetadata = composed;
273
282
  }
283
+ require_parser.defineInheritedAnnotationParser(optionalParser);
284
+ require_parser.defineSourceBindingOnlyAnnotationCompletionParser(optionalParser);
274
285
  return optionalParser;
275
286
  }
276
287
  /**
@@ -320,14 +331,14 @@ function withDefault(parser, defaultValue, options) {
320
331
  }
321
332
  };
322
333
  function* suggestSync(context, prefix) {
323
- const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState);
334
+ const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState, parser);
324
335
  yield* syncParser.suggest({
325
336
  ...context,
326
337
  state: innerState
327
338
  }, prefix);
328
339
  }
329
340
  async function* suggestAsync(context, prefix) {
330
- const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState);
341
+ const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState, parser);
331
342
  const suggestions = parser.suggest({
332
343
  ...context,
333
344
  state: innerState
@@ -346,14 +357,14 @@ function withDefault(parser, defaultValue, options) {
346
357
  leadingNames: parser.leadingNames,
347
358
  acceptingAnyToken: false,
348
359
  initialState: void 0,
349
- ...typeof parser.shouldDeferCompletion === "function" ? { shouldDeferCompletion: adaptShouldDeferCompletion(parser.shouldDeferCompletion.bind(parser)) } : {},
360
+ ...typeof parser.shouldDeferCompletion === "function" ? { shouldDeferCompletion: adaptShouldDeferCompletion(parser.shouldDeferCompletion.bind(parser), parser) } : {},
350
361
  getSuggestRuntimeNodes(state, path) {
351
362
  if (withDefaultParser.dependencyMetadata?.source != null) return [{
352
363
  path,
353
364
  parser: withDefaultParser,
354
365
  state
355
366
  }];
356
- const innerState = normalizeOptionalLikeInnerState(state, parser.initialState);
367
+ const innerState = normalizeOptionalLikeInnerState(state, parser.initialState, parser);
357
368
  return parser.getSuggestRuntimeNodes?.(innerState, path) ?? (parser.dependencyMetadata?.source != null ? [{
358
369
  path,
359
370
  parser,
@@ -373,7 +384,7 @@ function withDefault(parser, defaultValue, options) {
373
384
  }
374
385
  if (!Array.isArray(state)) {
375
386
  if (typeof parser.shouldDeferCompletion === "function" && state != null && typeof state === "object") {
376
- const innerState = normalizeOptionalLikeInnerState(state, parser.initialState);
387
+ const innerState = normalizeOptionalLikeInnerState(state, parser.initialState, parser);
377
388
  const innerResult = require_mode_dispatch.dispatchByMode(parser.$mode, () => syncParser.complete(innerState, exec), async () => await parser.complete(innerState, exec));
378
389
  return innerResult;
379
390
  }
@@ -390,7 +401,7 @@ function withDefault(parser, defaultValue, options) {
390
401
  };
391
402
  }
392
403
  }
393
- const innerElement = normalizeOptionalLikeInnerState(state, parser.initialState);
404
+ const innerElement = normalizeOptionalLikeInnerState(state, parser.initialState, parser);
394
405
  return require_mode_dispatch.dispatchByMode(parser.$mode, () => syncParser.complete(innerElement, exec), async () => await parser.complete(innerElement, exec));
395
406
  },
396
407
  suggest(context, prefix) {
@@ -465,6 +476,8 @@ function withDefault(parser, defaultValue, options) {
465
476
  } });
466
477
  if (composed != null) withDefaultParser.dependencyMetadata = composed;
467
478
  }
479
+ require_parser.defineInheritedAnnotationParser(withDefaultParser);
480
+ require_parser.defineSourceBindingOnlyAnnotationCompletionParser(withDefaultParser);
468
481
  return withDefaultParser;
469
482
  }
470
483
  /**
package/dist/modifiers.js CHANGED
@@ -1,7 +1,8 @@
1
- import { annotateFreshArray, getAnnotations, inheritAnnotations, isInjectedAnnotationWrapper, unwrapInjectedAnnotationWrapper } from "./annotations.js";
1
+ import { annotateFreshArray, annotationKey, getAnnotations, inheritAnnotations, isInjectedAnnotationWrapper, unwrapInjectedAnnotationWrapper } from "./annotations.js";
2
2
  import { formatMessage, message, text } from "./message.js";
3
3
  import { dispatchByMode, dispatchIterableByMode, mapModeValue } from "./mode-dispatch.js";
4
4
  import { composeDependencyMetadata } from "./dependency-metadata.js";
5
+ import { defineInheritedAnnotationParser, defineSourceBindingOnlyAnnotationCompletionParser } from "./parser.js";
5
6
 
6
7
  //#region src/modifiers.ts
7
8
  function withChildExecPath(exec, segment) {
@@ -148,15 +149,23 @@ function processOptionalStyleResult(result, innerState, context) {
148
149
  *
149
150
  * @internal
150
151
  */
151
- function adaptShouldDeferCompletion(innerCheck) {
152
+ function adaptShouldDeferCompletion(innerCheck, parser) {
152
153
  return (state, exec) => {
153
- if (Array.isArray(state)) return innerCheck(normalizeOptionalLikeInnerState(state, state[0]), exec);
154
- if (state != null && typeof state === "object") return innerCheck(state, exec);
154
+ if (Array.isArray(state) || state != null && typeof state === "object") return innerCheck(normalizeOptionalLikeInnerState(state, parser.initialState, parser), exec);
155
155
  return false;
156
156
  };
157
157
  }
158
- function normalizeOptionalLikeInnerState(state, initialState) {
158
+ function isAnnotationOnlyObjectState(state) {
159
+ if (state == null || typeof state !== "object" || Array.isArray(state) || isInjectedAnnotationWrapper(state)) return false;
160
+ const keys = Reflect.ownKeys(state);
161
+ return getAnnotations(state) != null && keys.length === 1 && keys[0] === annotationKey;
162
+ }
163
+ function normalizeOptionalLikeInnerState(state, initialState, parser) {
159
164
  if (Array.isArray(state)) return getAnnotations(state) != null && state[0] != null && typeof state[0] === "object" ? inheritAnnotations(state, state[0]) : state[0];
165
+ if (isAnnotationOnlyObjectState(state)) {
166
+ if (parser != null && (parser.dependencyMetadata?.source != null || typeof parser.shouldDeferCompletion === "function")) return inheritAnnotations(state, initialState);
167
+ return initialState;
168
+ }
160
169
  if (state != null && typeof state === "object") return state;
161
170
  return initialState;
162
171
  }
@@ -175,14 +184,14 @@ function normalizeOptionalLikeInnerState(state, initialState) {
175
184
  function optional(parser) {
176
185
  const syncParser = parser;
177
186
  function* suggestSync(context, prefix) {
178
- const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState);
187
+ const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState, parser);
179
188
  yield* syncParser.suggest({
180
189
  ...context,
181
190
  state: innerState
182
191
  }, prefix);
183
192
  }
184
193
  async function* suggestAsync(context, prefix) {
185
- const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState);
194
+ const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState, parser);
186
195
  const suggestions = parser.suggest({
187
196
  ...context,
188
197
  state: innerState
@@ -202,14 +211,14 @@ function optional(parser) {
202
211
  leadingNames: parser.leadingNames,
203
212
  acceptingAnyToken: false,
204
213
  initialState: void 0,
205
- ...typeof parser.shouldDeferCompletion === "function" ? { shouldDeferCompletion: adaptShouldDeferCompletion(parser.shouldDeferCompletion.bind(parser)) } : {},
214
+ ...typeof parser.shouldDeferCompletion === "function" ? { shouldDeferCompletion: adaptShouldDeferCompletion(parser.shouldDeferCompletion.bind(parser), parser) } : {},
206
215
  getSuggestRuntimeNodes(state, path) {
207
216
  if (optionalParser.dependencyMetadata?.source != null) return [{
208
217
  path,
209
218
  parser: optionalParser,
210
219
  state
211
220
  }];
212
- const innerState = normalizeOptionalLikeInnerState(state, parser.initialState);
221
+ const innerState = normalizeOptionalLikeInnerState(state, parser.initialState, parser);
213
222
  return parser.getSuggestRuntimeNodes?.(innerState, path) ?? (parser.dependencyMetadata?.source != null ? [{
214
223
  path,
215
224
  parser,
@@ -223,7 +232,7 @@ function optional(parser) {
223
232
  if (!Array.isArray(state)) {
224
233
  if (typeof parser.shouldDeferCompletion === "function" && state != null && typeof state === "object") {
225
234
  const innerComplete = () => {
226
- const innerState = normalizeOptionalLikeInnerState(state, parser.initialState);
235
+ const innerState = normalizeOptionalLikeInnerState(state, parser.initialState, parser);
227
236
  const innerResult = dispatchByMode(parser.$mode, () => syncParser.complete(innerState, exec), async () => await parser.complete(innerState, exec));
228
237
  return mapModeValue(parser.$mode, innerResult, (result) => result.success ? result : {
229
238
  success: true,
@@ -234,7 +243,7 @@ function optional(parser) {
234
243
  }
235
244
  const sourceMetadata = parser.dependencyMetadata?.source;
236
245
  if (sourceMetadata?.preservesSourceValue !== false && sourceMetadata?.getMissingSourceValue != null) {
237
- const delegatedState = normalizeOptionalLikeInnerState(state, parser.initialState);
246
+ const delegatedState = normalizeOptionalLikeInnerState(state, parser.initialState, parser);
238
247
  return dispatchByMode(parser.$mode, () => syncParser.complete(delegatedState, exec), async () => await parser.complete(delegatedState, exec));
239
248
  }
240
249
  return {
@@ -242,7 +251,7 @@ function optional(parser) {
242
251
  value: void 0
243
252
  };
244
253
  }
245
- const innerElement = normalizeOptionalLikeInnerState(state, parser.initialState);
254
+ const innerElement = normalizeOptionalLikeInnerState(state, parser.initialState, parser);
246
255
  return dispatchByMode(parser.$mode, () => syncParser.complete(innerElement, exec), async () => await parser.complete(innerElement, exec));
247
256
  },
248
257
  suggest(context, prefix) {
@@ -271,6 +280,8 @@ function optional(parser) {
271
280
  const composed = composeDependencyMetadata(parser.dependencyMetadata, "optional");
272
281
  if (composed != null) optionalParser.dependencyMetadata = composed;
273
282
  }
283
+ defineInheritedAnnotationParser(optionalParser);
284
+ defineSourceBindingOnlyAnnotationCompletionParser(optionalParser);
274
285
  return optionalParser;
275
286
  }
276
287
  /**
@@ -320,14 +331,14 @@ function withDefault(parser, defaultValue, options) {
320
331
  }
321
332
  };
322
333
  function* suggestSync(context, prefix) {
323
- const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState);
334
+ const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState, parser);
324
335
  yield* syncParser.suggest({
325
336
  ...context,
326
337
  state: innerState
327
338
  }, prefix);
328
339
  }
329
340
  async function* suggestAsync(context, prefix) {
330
- const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState);
341
+ const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState, parser);
331
342
  const suggestions = parser.suggest({
332
343
  ...context,
333
344
  state: innerState
@@ -346,14 +357,14 @@ function withDefault(parser, defaultValue, options) {
346
357
  leadingNames: parser.leadingNames,
347
358
  acceptingAnyToken: false,
348
359
  initialState: void 0,
349
- ...typeof parser.shouldDeferCompletion === "function" ? { shouldDeferCompletion: adaptShouldDeferCompletion(parser.shouldDeferCompletion.bind(parser)) } : {},
360
+ ...typeof parser.shouldDeferCompletion === "function" ? { shouldDeferCompletion: adaptShouldDeferCompletion(parser.shouldDeferCompletion.bind(parser), parser) } : {},
350
361
  getSuggestRuntimeNodes(state, path) {
351
362
  if (withDefaultParser.dependencyMetadata?.source != null) return [{
352
363
  path,
353
364
  parser: withDefaultParser,
354
365
  state
355
366
  }];
356
- const innerState = normalizeOptionalLikeInnerState(state, parser.initialState);
367
+ const innerState = normalizeOptionalLikeInnerState(state, parser.initialState, parser);
357
368
  return parser.getSuggestRuntimeNodes?.(innerState, path) ?? (parser.dependencyMetadata?.source != null ? [{
358
369
  path,
359
370
  parser,
@@ -373,7 +384,7 @@ function withDefault(parser, defaultValue, options) {
373
384
  }
374
385
  if (!Array.isArray(state)) {
375
386
  if (typeof parser.shouldDeferCompletion === "function" && state != null && typeof state === "object") {
376
- const innerState = normalizeOptionalLikeInnerState(state, parser.initialState);
387
+ const innerState = normalizeOptionalLikeInnerState(state, parser.initialState, parser);
377
388
  const innerResult = dispatchByMode(parser.$mode, () => syncParser.complete(innerState, exec), async () => await parser.complete(innerState, exec));
378
389
  return innerResult;
379
390
  }
@@ -390,7 +401,7 @@ function withDefault(parser, defaultValue, options) {
390
401
  };
391
402
  }
392
403
  }
393
- const innerElement = normalizeOptionalLikeInnerState(state, parser.initialState);
404
+ const innerElement = normalizeOptionalLikeInnerState(state, parser.initialState, parser);
394
405
  return dispatchByMode(parser.$mode, () => syncParser.complete(innerElement, exec), async () => await parser.complete(innerElement, exec));
395
406
  },
396
407
  suggest(context, prefix) {
@@ -465,6 +476,8 @@ function withDefault(parser, defaultValue, options) {
465
476
  } });
466
477
  if (composed != null) withDefaultParser.dependencyMetadata = composed;
467
478
  }
479
+ defineInheritedAnnotationParser(withDefaultParser);
480
+ defineSourceBindingOnlyAnnotationCompletionParser(withDefaultParser);
468
481
  return withDefaultParser;
469
482
  }
470
483
  /**