@optique/core 0.10.0-dev.296 → 0.10.0-dev.298

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.
@@ -538,12 +538,18 @@ function longestMatch(...args) {
538
538
  * @internal
539
539
  */
540
540
  function* suggestObjectSync(context, prefix, parserPairs) {
541
+ const registry = context.dependencyRegistry instanceof require_dependency.DependencyRegistry ? context.dependencyRegistry : new require_dependency.DependencyRegistry();
542
+ if (context.state && typeof context.state === "object") collectDependencies(context.state, registry);
543
+ const contextWithRegistry = {
544
+ ...context,
545
+ dependencyRegistry: registry
546
+ };
541
547
  if (context.buffer.length > 0) {
542
548
  const lastToken = context.buffer[context.buffer.length - 1];
543
549
  for (const [field, parser] of parserPairs) if (isOptionRequiringValue(parser.usage, lastToken)) {
544
550
  const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
545
551
  yield* parser.suggest({
546
- ...context,
552
+ ...contextWithRegistry,
547
553
  state: fieldState
548
554
  }, prefix);
549
555
  return;
@@ -553,7 +559,7 @@ function* suggestObjectSync(context, prefix, parserPairs) {
553
559
  for (const [field, parser] of parserPairs) {
554
560
  const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
555
561
  const fieldSuggestions = parser.suggest({
556
- ...context,
562
+ ...contextWithRegistry,
557
563
  state: fieldState
558
564
  }, prefix);
559
565
  suggestions.push(...fieldSuggestions);
@@ -565,12 +571,18 @@ function* suggestObjectSync(context, prefix, parserPairs) {
565
571
  * @internal
566
572
  */
567
573
  async function* suggestObjectAsync(context, prefix, parserPairs) {
574
+ const registry = context.dependencyRegistry instanceof require_dependency.DependencyRegistry ? context.dependencyRegistry : new require_dependency.DependencyRegistry();
575
+ if (context.state && typeof context.state === "object") collectDependencies(context.state, registry);
576
+ const contextWithRegistry = {
577
+ ...context,
578
+ dependencyRegistry: registry
579
+ };
568
580
  if (context.buffer.length > 0) {
569
581
  const lastToken = context.buffer[context.buffer.length - 1];
570
582
  for (const [field, parser] of parserPairs) if (isOptionRequiringValue(parser.usage, lastToken)) {
571
583
  const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
572
584
  const suggestions$1 = parser.suggest({
573
- ...context,
585
+ ...contextWithRegistry,
574
586
  state: fieldState
575
587
  }, prefix);
576
588
  for await (const s of suggestions$1) yield s;
@@ -581,7 +593,7 @@ async function* suggestObjectAsync(context, prefix, parserPairs) {
581
593
  for (const [field, parser] of parserPairs) {
582
594
  const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
583
595
  const fieldSuggestions = parser.suggest({
584
- ...context,
596
+ ...contextWithRegistry,
585
597
  state: fieldState
586
598
  }, prefix);
587
599
  for await (const s of fieldSuggestions) suggestions.push(s);
@@ -647,19 +659,17 @@ function resolveDeferred(state, registry) {
647
659
  const parser = deferredState.parser;
648
660
  const depIds = deferredState.dependencyIds;
649
661
  if (depIds && depIds.length > 0) {
662
+ const defaults = deferredState.defaultValues;
650
663
  const dependencyValues = [];
651
- let allDepsAvailable = true;
652
- for (const depId$1 of depIds) if (registry.has(depId$1)) dependencyValues.push(registry.get(depId$1));
653
- else {
654
- allDepsAvailable = false;
655
- break;
664
+ for (let i = 0; i < depIds.length; i++) {
665
+ const depId$1 = depIds[i];
666
+ if (registry.has(depId$1)) dependencyValues.push(registry.get(depId$1));
667
+ else if (defaults && i < defaults.length) dependencyValues.push(defaults[i]);
668
+ else return deferredState.preliminaryResult;
656
669
  }
657
- if (allDepsAvailable) {
658
- const reParseResult = parser[require_dependency.ParseWithDependency](deferredState.rawInput, dependencyValues);
659
- if (reParseResult instanceof Promise) return deferredState.preliminaryResult;
660
- return reParseResult;
661
- }
662
- return deferredState.preliminaryResult;
670
+ const reParseResult = parser[require_dependency.ParseWithDependency](deferredState.rawInput, dependencyValues);
671
+ if (reParseResult instanceof Promise) return deferredState.preliminaryResult;
672
+ return reParseResult;
663
673
  }
664
674
  const depId = deferredState.dependencyId;
665
675
  if (registry.has(depId)) {
@@ -704,18 +714,16 @@ async function resolveDeferredAsync(state, registry) {
704
714
  const parser = deferredState.parser;
705
715
  const depIds = deferredState.dependencyIds;
706
716
  if (depIds && depIds.length > 0) {
717
+ const defaults = deferredState.defaultValues;
707
718
  const dependencyValues = [];
708
- let allDepsAvailable = true;
709
- for (const depId$1 of depIds) if (registry.has(depId$1)) dependencyValues.push(registry.get(depId$1));
710
- else {
711
- allDepsAvailable = false;
712
- break;
713
- }
714
- if (allDepsAvailable) {
715
- const reParseResult = parser[require_dependency.ParseWithDependency](deferredState.rawInput, dependencyValues);
716
- return Promise.resolve(reParseResult);
719
+ for (let i = 0; i < depIds.length; i++) {
720
+ const depId$1 = depIds[i];
721
+ if (registry.has(depId$1)) dependencyValues.push(registry.get(depId$1));
722
+ else if (defaults && i < defaults.length) dependencyValues.push(defaults[i]);
723
+ else return deferredState.preliminaryResult;
717
724
  }
718
- return deferredState.preliminaryResult;
725
+ const reParseResult = parser[require_dependency.ParseWithDependency](deferredState.rawInput, dependencyValues);
726
+ return Promise.resolve(reParseResult);
719
727
  }
720
728
  const depId = deferredState.dependencyId;
721
729
  if (registry.has(depId)) {
@@ -2230,6 +2238,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
2230
2238
  };
2231
2239
  };
2232
2240
  const completeSync = (state) => {
2241
+ const syncDiscriminator = discriminator;
2233
2242
  const syncDefaultBranch = defaultBranch;
2234
2243
  const syncBranches = branches;
2235
2244
  if (state.selectedBranch === void 0) {
@@ -2248,7 +2257,14 @@ function conditional(discriminator, branches, defaultBranch, options) {
2248
2257
  };
2249
2258
  }
2250
2259
  const branchParser = state.selectedBranch.kind === "default" ? syncDefaultBranch : syncBranches[state.selectedBranch.key];
2251
- const branchResult = branchParser.complete(state.branchState);
2260
+ const discriminatorCompleteResult = syncDiscriminator.complete(state.discriminatorState);
2261
+ const combinedState = {
2262
+ _discriminator: state.discriminatorState,
2263
+ _branch: state.branchState
2264
+ };
2265
+ const resolvedCombinedState = resolveDeferredParseStates(combinedState);
2266
+ const resolvedBranchState = resolvedCombinedState._branch;
2267
+ const branchResult = branchParser.complete(resolvedBranchState);
2252
2268
  if (!branchResult.success) {
2253
2269
  if (state.discriminatorValue !== void 0 && options?.errors?.branchError) return {
2254
2270
  success: false,
@@ -2256,7 +2272,11 @@ function conditional(discriminator, branches, defaultBranch, options) {
2256
2272
  };
2257
2273
  return branchResult;
2258
2274
  }
2259
- const discriminatorValue = state.selectedBranch.kind === "default" ? void 0 : state.selectedBranch.key;
2275
+ let discriminatorValue;
2276
+ if (state.selectedBranch.kind === "default") discriminatorValue = void 0;
2277
+ else if (require_dependency.isDependencySourceState(discriminatorCompleteResult)) discriminatorValue = discriminatorCompleteResult.result.success ? discriminatorCompleteResult.result.value : state.selectedBranch.key;
2278
+ else if (discriminatorCompleteResult.success) discriminatorValue = discriminatorCompleteResult.value;
2279
+ else discriminatorValue = state.selectedBranch.key;
2260
2280
  return {
2261
2281
  success: true,
2262
2282
  value: [discriminatorValue, branchResult.value]
@@ -2279,7 +2299,14 @@ function conditional(discriminator, branches, defaultBranch, options) {
2279
2299
  };
2280
2300
  }
2281
2301
  const branchParser = state.selectedBranch.kind === "default" ? defaultBranch : branches[state.selectedBranch.key];
2282
- const branchResult = await branchParser.complete(state.branchState);
2302
+ const discriminatorCompleteResult = await discriminator.complete(state.discriminatorState);
2303
+ const combinedState = {
2304
+ _discriminator: state.discriminatorState,
2305
+ _branch: state.branchState
2306
+ };
2307
+ const resolvedCombinedState = await resolveDeferredParseStatesAsync(combinedState);
2308
+ const resolvedBranchState = resolvedCombinedState._branch;
2309
+ const branchResult = await branchParser.complete(resolvedBranchState);
2283
2310
  if (!branchResult.success) {
2284
2311
  if (state.discriminatorValue !== void 0 && options?.errors?.branchError) return {
2285
2312
  success: false,
@@ -2287,7 +2314,11 @@ function conditional(discriminator, branches, defaultBranch, options) {
2287
2314
  };
2288
2315
  return branchResult;
2289
2316
  }
2290
- const discriminatorValue = state.selectedBranch.kind === "default" ? void 0 : state.selectedBranch.key;
2317
+ let discriminatorValue;
2318
+ if (state.selectedBranch.kind === "default") discriminatorValue = void 0;
2319
+ else if (require_dependency.isDependencySourceState(discriminatorCompleteResult)) discriminatorValue = discriminatorCompleteResult.result.success ? discriminatorCompleteResult.result.value : state.selectedBranch.key;
2320
+ else if (discriminatorCompleteResult.success) discriminatorValue = discriminatorCompleteResult.value;
2321
+ else discriminatorValue = state.selectedBranch.key;
2291
2322
  return {
2292
2323
  success: true,
2293
2324
  value: [discriminatorValue, branchResult.value]
@@ -538,12 +538,18 @@ function longestMatch(...args) {
538
538
  * @internal
539
539
  */
540
540
  function* suggestObjectSync(context, prefix, parserPairs) {
541
+ const registry = context.dependencyRegistry instanceof DependencyRegistry ? context.dependencyRegistry : new DependencyRegistry();
542
+ if (context.state && typeof context.state === "object") collectDependencies(context.state, registry);
543
+ const contextWithRegistry = {
544
+ ...context,
545
+ dependencyRegistry: registry
546
+ };
541
547
  if (context.buffer.length > 0) {
542
548
  const lastToken = context.buffer[context.buffer.length - 1];
543
549
  for (const [field, parser] of parserPairs) if (isOptionRequiringValue(parser.usage, lastToken)) {
544
550
  const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
545
551
  yield* parser.suggest({
546
- ...context,
552
+ ...contextWithRegistry,
547
553
  state: fieldState
548
554
  }, prefix);
549
555
  return;
@@ -553,7 +559,7 @@ function* suggestObjectSync(context, prefix, parserPairs) {
553
559
  for (const [field, parser] of parserPairs) {
554
560
  const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
555
561
  const fieldSuggestions = parser.suggest({
556
- ...context,
562
+ ...contextWithRegistry,
557
563
  state: fieldState
558
564
  }, prefix);
559
565
  suggestions.push(...fieldSuggestions);
@@ -565,12 +571,18 @@ function* suggestObjectSync(context, prefix, parserPairs) {
565
571
  * @internal
566
572
  */
567
573
  async function* suggestObjectAsync(context, prefix, parserPairs) {
574
+ const registry = context.dependencyRegistry instanceof DependencyRegistry ? context.dependencyRegistry : new DependencyRegistry();
575
+ if (context.state && typeof context.state === "object") collectDependencies(context.state, registry);
576
+ const contextWithRegistry = {
577
+ ...context,
578
+ dependencyRegistry: registry
579
+ };
568
580
  if (context.buffer.length > 0) {
569
581
  const lastToken = context.buffer[context.buffer.length - 1];
570
582
  for (const [field, parser] of parserPairs) if (isOptionRequiringValue(parser.usage, lastToken)) {
571
583
  const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
572
584
  const suggestions$1 = parser.suggest({
573
- ...context,
585
+ ...contextWithRegistry,
574
586
  state: fieldState
575
587
  }, prefix);
576
588
  for await (const s of suggestions$1) yield s;
@@ -581,7 +593,7 @@ async function* suggestObjectAsync(context, prefix, parserPairs) {
581
593
  for (const [field, parser] of parserPairs) {
582
594
  const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
583
595
  const fieldSuggestions = parser.suggest({
584
- ...context,
596
+ ...contextWithRegistry,
585
597
  state: fieldState
586
598
  }, prefix);
587
599
  for await (const s of fieldSuggestions) suggestions.push(s);
@@ -647,19 +659,17 @@ function resolveDeferred(state, registry) {
647
659
  const parser = deferredState.parser;
648
660
  const depIds = deferredState.dependencyIds;
649
661
  if (depIds && depIds.length > 0) {
662
+ const defaults = deferredState.defaultValues;
650
663
  const dependencyValues = [];
651
- let allDepsAvailable = true;
652
- for (const depId$1 of depIds) if (registry.has(depId$1)) dependencyValues.push(registry.get(depId$1));
653
- else {
654
- allDepsAvailable = false;
655
- break;
664
+ for (let i = 0; i < depIds.length; i++) {
665
+ const depId$1 = depIds[i];
666
+ if (registry.has(depId$1)) dependencyValues.push(registry.get(depId$1));
667
+ else if (defaults && i < defaults.length) dependencyValues.push(defaults[i]);
668
+ else return deferredState.preliminaryResult;
656
669
  }
657
- if (allDepsAvailable) {
658
- const reParseResult = parser[ParseWithDependency](deferredState.rawInput, dependencyValues);
659
- if (reParseResult instanceof Promise) return deferredState.preliminaryResult;
660
- return reParseResult;
661
- }
662
- return deferredState.preliminaryResult;
670
+ const reParseResult = parser[ParseWithDependency](deferredState.rawInput, dependencyValues);
671
+ if (reParseResult instanceof Promise) return deferredState.preliminaryResult;
672
+ return reParseResult;
663
673
  }
664
674
  const depId = deferredState.dependencyId;
665
675
  if (registry.has(depId)) {
@@ -704,18 +714,16 @@ async function resolveDeferredAsync(state, registry) {
704
714
  const parser = deferredState.parser;
705
715
  const depIds = deferredState.dependencyIds;
706
716
  if (depIds && depIds.length > 0) {
717
+ const defaults = deferredState.defaultValues;
707
718
  const dependencyValues = [];
708
- let allDepsAvailable = true;
709
- for (const depId$1 of depIds) if (registry.has(depId$1)) dependencyValues.push(registry.get(depId$1));
710
- else {
711
- allDepsAvailable = false;
712
- break;
713
- }
714
- if (allDepsAvailable) {
715
- const reParseResult = parser[ParseWithDependency](deferredState.rawInput, dependencyValues);
716
- return Promise.resolve(reParseResult);
719
+ for (let i = 0; i < depIds.length; i++) {
720
+ const depId$1 = depIds[i];
721
+ if (registry.has(depId$1)) dependencyValues.push(registry.get(depId$1));
722
+ else if (defaults && i < defaults.length) dependencyValues.push(defaults[i]);
723
+ else return deferredState.preliminaryResult;
717
724
  }
718
- return deferredState.preliminaryResult;
725
+ const reParseResult = parser[ParseWithDependency](deferredState.rawInput, dependencyValues);
726
+ return Promise.resolve(reParseResult);
719
727
  }
720
728
  const depId = deferredState.dependencyId;
721
729
  if (registry.has(depId)) {
@@ -2230,6 +2238,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
2230
2238
  };
2231
2239
  };
2232
2240
  const completeSync = (state) => {
2241
+ const syncDiscriminator = discriminator;
2233
2242
  const syncDefaultBranch = defaultBranch;
2234
2243
  const syncBranches = branches;
2235
2244
  if (state.selectedBranch === void 0) {
@@ -2248,7 +2257,14 @@ function conditional(discriminator, branches, defaultBranch, options) {
2248
2257
  };
2249
2258
  }
2250
2259
  const branchParser = state.selectedBranch.kind === "default" ? syncDefaultBranch : syncBranches[state.selectedBranch.key];
2251
- const branchResult = branchParser.complete(state.branchState);
2260
+ const discriminatorCompleteResult = syncDiscriminator.complete(state.discriminatorState);
2261
+ const combinedState = {
2262
+ _discriminator: state.discriminatorState,
2263
+ _branch: state.branchState
2264
+ };
2265
+ const resolvedCombinedState = resolveDeferredParseStates(combinedState);
2266
+ const resolvedBranchState = resolvedCombinedState._branch;
2267
+ const branchResult = branchParser.complete(resolvedBranchState);
2252
2268
  if (!branchResult.success) {
2253
2269
  if (state.discriminatorValue !== void 0 && options?.errors?.branchError) return {
2254
2270
  success: false,
@@ -2256,7 +2272,11 @@ function conditional(discriminator, branches, defaultBranch, options) {
2256
2272
  };
2257
2273
  return branchResult;
2258
2274
  }
2259
- const discriminatorValue = state.selectedBranch.kind === "default" ? void 0 : state.selectedBranch.key;
2275
+ let discriminatorValue;
2276
+ if (state.selectedBranch.kind === "default") discriminatorValue = void 0;
2277
+ else if (isDependencySourceState(discriminatorCompleteResult)) discriminatorValue = discriminatorCompleteResult.result.success ? discriminatorCompleteResult.result.value : state.selectedBranch.key;
2278
+ else if (discriminatorCompleteResult.success) discriminatorValue = discriminatorCompleteResult.value;
2279
+ else discriminatorValue = state.selectedBranch.key;
2260
2280
  return {
2261
2281
  success: true,
2262
2282
  value: [discriminatorValue, branchResult.value]
@@ -2279,7 +2299,14 @@ function conditional(discriminator, branches, defaultBranch, options) {
2279
2299
  };
2280
2300
  }
2281
2301
  const branchParser = state.selectedBranch.kind === "default" ? defaultBranch : branches[state.selectedBranch.key];
2282
- const branchResult = await branchParser.complete(state.branchState);
2302
+ const discriminatorCompleteResult = await discriminator.complete(state.discriminatorState);
2303
+ const combinedState = {
2304
+ _discriminator: state.discriminatorState,
2305
+ _branch: state.branchState
2306
+ };
2307
+ const resolvedCombinedState = await resolveDeferredParseStatesAsync(combinedState);
2308
+ const resolvedBranchState = resolvedCombinedState._branch;
2309
+ const branchResult = await branchParser.complete(resolvedBranchState);
2283
2310
  if (!branchResult.success) {
2284
2311
  if (state.discriminatorValue !== void 0 && options?.errors?.branchError) return {
2285
2312
  success: false,
@@ -2287,7 +2314,11 @@ function conditional(discriminator, branches, defaultBranch, options) {
2287
2314
  };
2288
2315
  return branchResult;
2289
2316
  }
2290
- const discriminatorValue = state.selectedBranch.kind === "default" ? void 0 : state.selectedBranch.key;
2317
+ let discriminatorValue;
2318
+ if (state.selectedBranch.kind === "default") discriminatorValue = void 0;
2319
+ else if (isDependencySourceState(discriminatorCompleteResult)) discriminatorValue = discriminatorCompleteResult.result.success ? discriminatorCompleteResult.result.value : state.selectedBranch.key;
2320
+ else if (discriminatorCompleteResult.success) discriminatorValue = discriminatorCompleteResult.value;
2321
+ else discriminatorValue = state.selectedBranch.key;
2291
2322
  return {
2292
2323
  success: true,
2293
2324
  value: [discriminatorValue, branchResult.value]
@@ -27,11 +27,23 @@ const DependencyId = Symbol.for("@optique/core/dependency/DependencyId");
27
27
  */
28
28
  const DependencyIds = Symbol.for("@optique/core/dependency/DependencyIds");
29
29
  /**
30
+ * A unique symbol used to store the default values function on derived parsers.
31
+ * This is used during partial dependency resolution to fill in missing values.
32
+ * @since 0.10.0
33
+ */
34
+ const DefaultValues = Symbol.for("@optique/core/dependency/DefaultValues");
35
+ /**
30
36
  * A unique symbol used to access the parseWithDependency method on derived parsers.
31
37
  * @since 0.10.0
32
38
  */
33
39
  const ParseWithDependency = Symbol.for("@optique/core/dependency/ParseWithDependency");
34
40
  /**
41
+ * A unique symbol used to access the suggestWithDependency method on derived parsers.
42
+ * This method generates suggestions using the provided dependency values instead of defaults.
43
+ * @since 0.10.0
44
+ */
45
+ const SuggestWithDependency = Symbol.for("@optique/core/dependency/SuggestWithDependency");
46
+ /**
35
47
  * Creates a dependency source from a {@link ValueParser}.
36
48
  *
37
49
  * A dependency source wraps an existing value parser and enables creating
@@ -195,6 +207,7 @@ function createSyncDerivedFromParser(sourceId, options) {
195
207
  [DerivedValueParserMarker]: true,
196
208
  [DependencyId]: sourceId,
197
209
  [DependencyIds]: allDependencyIds,
210
+ [DefaultValues]: options.defaultValues,
198
211
  parse(input) {
199
212
  const sourceValues = options.defaultValues();
200
213
  const derivedParser = options.factory(...sourceValues);
@@ -222,6 +235,16 @@ function createSyncDerivedFromParser(sourceId, options) {
222
235
  const sourceValues = options.defaultValues();
223
236
  const derivedParser = options.factory(...sourceValues);
224
237
  if (derivedParser.suggest) yield* derivedParser.suggest(prefix);
238
+ },
239
+ *[SuggestWithDependency](prefix, dependencyValue) {
240
+ let derivedParser;
241
+ try {
242
+ derivedParser = options.factory(...dependencyValue);
243
+ } catch {
244
+ const sourceValues = options.defaultValues();
245
+ derivedParser = options.factory(...sourceValues);
246
+ }
247
+ if (derivedParser.suggest) yield* derivedParser.suggest(prefix);
225
248
  }
226
249
  };
227
250
  }
@@ -237,6 +260,7 @@ function createAsyncDerivedFromParserFromAsyncFactory(sourceId, options) {
237
260
  [DerivedValueParserMarker]: true,
238
261
  [DependencyId]: sourceId,
239
262
  [DependencyIds]: allDependencyIds,
263
+ [DefaultValues]: options.defaultValues,
240
264
  parse(input) {
241
265
  const sourceValues = options.defaultValues();
242
266
  const derivedParser = options.factory(...sourceValues);
@@ -264,6 +288,16 @@ function createAsyncDerivedFromParserFromAsyncFactory(sourceId, options) {
264
288
  const sourceValues = options.defaultValues();
265
289
  const derivedParser = options.factory(...sourceValues);
266
290
  if (derivedParser.suggest) for await (const suggestion of derivedParser.suggest(prefix)) yield suggestion;
291
+ },
292
+ async *[SuggestWithDependency](prefix, dependencyValue) {
293
+ let derivedParser;
294
+ try {
295
+ derivedParser = options.factory(...dependencyValue);
296
+ } catch {
297
+ const sourceValues = options.defaultValues();
298
+ derivedParser = options.factory(...sourceValues);
299
+ }
300
+ if (derivedParser.suggest) for await (const suggestion of derivedParser.suggest(prefix)) yield suggestion;
267
301
  }
268
302
  };
269
303
  }
@@ -279,6 +313,7 @@ function createAsyncDerivedFromParserFromSyncFactory(sourceId, options) {
279
313
  [DerivedValueParserMarker]: true,
280
314
  [DependencyId]: sourceId,
281
315
  [DependencyIds]: allDependencyIds,
316
+ [DefaultValues]: options.defaultValues,
282
317
  parse(input) {
283
318
  const sourceValues = options.defaultValues();
284
319
  const derivedParser = options.factory(...sourceValues);
@@ -306,6 +341,16 @@ function createAsyncDerivedFromParserFromSyncFactory(sourceId, options) {
306
341
  const sourceValues = options.defaultValues();
307
342
  const derivedParser = options.factory(...sourceValues);
308
343
  if (derivedParser.suggest) yield* derivedParser.suggest(prefix);
344
+ },
345
+ *[SuggestWithDependency](prefix, dependencyValue) {
346
+ let derivedParser;
347
+ try {
348
+ derivedParser = options.factory(...dependencyValue);
349
+ } catch {
350
+ const sourceValues = options.defaultValues();
351
+ derivedParser = options.factory(...sourceValues);
352
+ }
353
+ if (derivedParser.suggest) yield* derivedParser.suggest(prefix);
309
354
  }
310
355
  };
311
356
  }
@@ -360,6 +405,15 @@ function createSyncDerivedParser(sourceId, options) {
360
405
  const sourceValue = options.defaultValue();
361
406
  const derivedParser = options.factory(sourceValue);
362
407
  if (derivedParser.suggest) yield* derivedParser.suggest(prefix);
408
+ },
409
+ *[SuggestWithDependency](prefix, dependencyValue) {
410
+ let derivedParser;
411
+ try {
412
+ derivedParser = options.factory(dependencyValue);
413
+ } catch {
414
+ derivedParser = options.factory(options.defaultValue());
415
+ }
416
+ if (derivedParser.suggest) yield* derivedParser.suggest(prefix);
363
417
  }
364
418
  };
365
419
  }
@@ -400,6 +454,15 @@ function createAsyncDerivedParserFromAsyncFactory(sourceId, options) {
400
454
  const sourceValue = options.defaultValue();
401
455
  const derivedParser = options.factory(sourceValue);
402
456
  if (derivedParser.suggest) for await (const suggestion of derivedParser.suggest(prefix)) yield suggestion;
457
+ },
458
+ async *[SuggestWithDependency](prefix, dependencyValue) {
459
+ let derivedParser;
460
+ try {
461
+ derivedParser = options.factory(dependencyValue);
462
+ } catch {
463
+ derivedParser = options.factory(options.defaultValue());
464
+ }
465
+ if (derivedParser.suggest) for await (const suggestion of derivedParser.suggest(prefix)) yield suggestion;
403
466
  }
404
467
  };
405
468
  }
@@ -440,6 +503,15 @@ function createAsyncDerivedParserFromSyncFactory(sourceId, options) {
440
503
  const sourceValue = options.defaultValue();
441
504
  const derivedParser = options.factory(sourceValue);
442
505
  if (derivedParser.suggest) yield* derivedParser.suggest(prefix);
506
+ },
507
+ *[SuggestWithDependency](prefix, dependencyValue) {
508
+ let derivedParser;
509
+ try {
510
+ derivedParser = options.factory(dependencyValue);
511
+ } catch {
512
+ derivedParser = options.factory(options.defaultValue());
513
+ }
514
+ if (derivedParser.suggest) yield* derivedParser.suggest(prefix);
443
515
  }
444
516
  };
445
517
  }
@@ -471,12 +543,15 @@ function isDeferredParseState(value) {
471
543
  */
472
544
  function createDeferredParseState(rawInput, parser, preliminaryResult) {
473
545
  const multipleIds = DependencyIds in parser ? parser[DependencyIds] : void 0;
546
+ const defaultValuesFn = DefaultValues in parser ? parser[DefaultValues] : void 0;
547
+ const defaultVals = defaultValuesFn ? defaultValuesFn() : void 0;
474
548
  return {
475
549
  [DeferredParseMarker]: true,
476
550
  rawInput,
477
551
  parser,
478
552
  dependencyId: parser[DependencyId],
479
553
  dependencyIds: multipleIds,
554
+ defaultValues: defaultVals,
480
555
  preliminaryResult
481
556
  };
482
557
  }
@@ -644,6 +719,7 @@ function formatDependencyError(error) {
644
719
  }
645
720
 
646
721
  //#endregion
722
+ exports.DefaultValues = DefaultValues;
647
723
  exports.DeferredParseMarker = DeferredParseMarker;
648
724
  exports.DependencyId = DependencyId;
649
725
  exports.DependencyIds = DependencyIds;
@@ -653,6 +729,7 @@ exports.DependencySourceStateMarker = DependencySourceStateMarker;
653
729
  exports.DerivedValueParserMarker = DerivedValueParserMarker;
654
730
  exports.ParseWithDependency = ParseWithDependency;
655
731
  exports.PendingDependencySourceStateMarker = PendingDependencySourceStateMarker;
732
+ exports.SuggestWithDependency = SuggestWithDependency;
656
733
  exports.TransformsDependencyValueMarker = TransformsDependencyValueMarker;
657
734
  exports.WrappedDependencySourceMarker = WrappedDependencySourceMarker;
658
735
  exports.createDeferredParseState = createDeferredParseState;
@@ -1,7 +1,7 @@
1
1
  import { NonEmptyString } from "./nonempty.cjs";
2
2
  import { Message } from "./message.cjs";
3
3
  import { ValueParser, ValueParserResult } from "./valueparser.cjs";
4
- import { Mode } from "./parser.cjs";
4
+ import { Mode, Suggestion } from "./parser.cjs";
5
5
 
6
6
  //#region src/dependency.d.ts
7
7
 
@@ -30,11 +30,23 @@ declare const DependencyId: unique symbol;
30
30
  * @since 0.10.0
31
31
  */
32
32
  declare const DependencyIds: unique symbol;
33
+ /**
34
+ * A unique symbol used to store the default values function on derived parsers.
35
+ * This is used during partial dependency resolution to fill in missing values.
36
+ * @since 0.10.0
37
+ */
38
+ declare const DefaultValues: unique symbol;
33
39
  /**
34
40
  * A unique symbol used to access the parseWithDependency method on derived parsers.
35
41
  * @since 0.10.0
36
42
  */
37
43
  declare const ParseWithDependency: unique symbol;
44
+ /**
45
+ * A unique symbol used to access the suggestWithDependency method on derived parsers.
46
+ * This method generates suggestions using the provided dependency values instead of defaults.
47
+ * @since 0.10.0
48
+ */
49
+ declare const SuggestWithDependency: unique symbol;
38
50
  /**
39
51
  * Combines two modes into a single mode.
40
52
  * If either mode is async, the result is async.
@@ -327,6 +339,12 @@ interface DerivedValueParser<M extends Mode = "sync", T = unknown, S = unknown>
327
339
  * @internal
328
340
  */
329
341
  readonly [DependencyIds]?: readonly symbol[];
342
+ /**
343
+ * The default values function for this parser's dependencies.
344
+ * Used during partial dependency resolution to fill in missing values.
345
+ * @internal
346
+ */
347
+ readonly [DefaultValues]?: () => readonly unknown[];
330
348
  /**
331
349
  * Parses the input using the actual dependency value instead of the default.
332
350
  * This method is used during dependency resolution in `complete()`.
@@ -337,6 +355,16 @@ interface DerivedValueParser<M extends Mode = "sync", T = unknown, S = unknown>
337
355
  * @internal
338
356
  */
339
357
  readonly [ParseWithDependency]: (input: string, dependencyValue: S) => ValueParserResult<T> | Promise<ValueParserResult<T>>;
358
+ /**
359
+ * Generates suggestions using the provided dependency value instead of the default.
360
+ * This method is used during shell completion when dependency sources have been parsed.
361
+ *
362
+ * @param prefix The input prefix to filter suggestions.
363
+ * @param dependencyValue The resolved dependency value.
364
+ * @returns An iterable of suggestions.
365
+ * @internal
366
+ */
367
+ readonly [SuggestWithDependency]?: (prefix: string, dependencyValue: S) => Iterable<Suggestion> | AsyncIterable<Suggestion>;
340
368
  }
341
369
  /**
342
370
  * Creates a dependency source from a {@link ValueParser}.
@@ -484,6 +512,12 @@ interface DeferredParseState<T = unknown> {
484
512
  * If present, this is used instead of `dependencyId`.
485
513
  */
486
514
  readonly dependencyIds?: readonly symbol[];
515
+ /**
516
+ * The default values to use for dependencies that are not provided.
517
+ * For multi-dependency parsers, this is a tuple of default values in order.
518
+ * For single-dependency parsers, this is the single default value.
519
+ */
520
+ readonly defaultValues?: readonly unknown[];
487
521
  /**
488
522
  * The preliminary parse result using the default dependency value.
489
523
  * This is used as a fallback if dependency resolution is not needed
@@ -713,4 +747,4 @@ type DependencyError = {
713
747
  */
714
748
  declare function formatDependencyError(error: DependencyError): Message;
715
749
  //#endregion
716
- export { AnyDependencySource, CombineMode, CombinedDependencyMode, DeferredParseMarker, DeferredParseState, DependencyError, DependencyId, DependencyIds, DependencyMode, DependencyRegistry, DependencySource, DependencySourceMarker, DependencySourceState, DependencySourceStateMarker, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, DerivedValueParserMarker, ParseWithDependency, PendingDependencySourceState, PendingDependencySourceStateMarker, ResolvedDependency, TransformsDependencyValueMarker, WrappedDependencySourceMarker, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, formatDependencyError, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource, transformsDependencyValue };
750
+ export { AnyDependencySource, CombineMode, CombinedDependencyMode, DefaultValues, DeferredParseMarker, DeferredParseState, DependencyError, DependencyId, DependencyIds, DependencyMode, DependencyRegistry, DependencySource, DependencySourceMarker, DependencySourceState, DependencySourceStateMarker, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, DerivedValueParserMarker, ParseWithDependency, PendingDependencySourceState, PendingDependencySourceStateMarker, ResolvedDependency, SuggestWithDependency, TransformsDependencyValueMarker, WrappedDependencySourceMarker, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, formatDependencyError, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource, transformsDependencyValue };