@optique/core 1.0.16-dev.2947 → 1.0.16-dev.2983

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,6 @@
1
1
  const require_annotations = require('./internal/annotations.cjs');
2
2
  const require_message = require('./message.cjs');
3
+ const require_command_usage = require('./internal/command-usage.cjs');
3
4
  const require_command_doc_metadata = require('./internal/command-doc-metadata.cjs');
4
5
  const require_passthrough = require('./internal/passthrough.cjs');
5
6
  const require_validate = require('./validate.cjs');
@@ -382,10 +383,10 @@ function applyHiddenToUsageTerm(term, hidden) {
382
383
  type: "exclusive",
383
384
  terms: term.terms.map((u) => applyHiddenToUsage(u, hidden))
384
385
  };
385
- if (term.type === "argument" || term.type === "option" || term.type === "command" || term.type === "passthrough") return {
386
+ if (term.type === "argument" || term.type === "option" || term.type === "command" || term.type === "passthrough") return require_command_usage.copyCommandUsageId(term, {
386
387
  ...term,
387
388
  hidden: require_usage.mergeHidden(term.hidden, hidden)
388
- };
389
+ });
389
390
  return term;
390
391
  }
391
392
  function applyHiddenToUsage(usage, hidden) {
@@ -1252,6 +1253,7 @@ function or(...args) {
1252
1253
  success: false
1253
1254
  };
1254
1255
  };
1256
+ const commandUsageScopes = parsers.map(() => /* @__PURE__ */ new WeakMap());
1255
1257
  const singleResult = {
1256
1258
  mode: combinedMode,
1257
1259
  $valueType: [],
@@ -1259,7 +1261,7 @@ function or(...args) {
1259
1261
  priority: Math.max(...parsers.map((p) => p.priority)),
1260
1262
  usage: [{
1261
1263
  type: "exclusive",
1262
- terms: parsers.map((p) => p.usage)
1264
+ terms: parsers.map((p, i) => require_command_usage.scopeCommandUsage(p.usage, commandUsageScopes[i]))
1263
1265
  }],
1264
1266
  leadingNames: unionLeadingNames(parsers),
1265
1267
  acceptingAnyToken: parsers.some((p) => p.acceptingAnyToken),
@@ -1289,7 +1291,7 @@ function or(...args) {
1289
1291
  state: parserResult.next.state
1290
1292
  } : { kind: "unavailable" };
1291
1293
  const docFragments = parsers[index].getDocFragments(innerState, void 0);
1292
- commandMetadata = require_command_doc_metadata.getCommandDocMetadata(docFragments);
1294
+ commandMetadata = require_command_doc_metadata.scopeCommandDocMetadata(require_command_doc_metadata.getCommandDocMetadata(docFragments), commandUsageScopes[index]);
1293
1295
  brief = docFragments.brief;
1294
1296
  description = docFragments.description;
1295
1297
  footer = docFragments.footer;
@@ -1480,6 +1482,7 @@ function longestMatch(...args) {
1480
1482
  success: false
1481
1483
  };
1482
1484
  };
1485
+ const commandUsageScopes = parsers.map(() => /* @__PURE__ */ new WeakMap());
1483
1486
  const multiResult = {
1484
1487
  mode: combinedMode,
1485
1488
  $valueType: [],
@@ -1487,7 +1490,7 @@ function longestMatch(...args) {
1487
1490
  priority: Math.max(...parsers.map((p) => p.priority)),
1488
1491
  usage: [{
1489
1492
  type: "exclusive",
1490
- terms: parsers.map((p) => p.usage)
1493
+ terms: parsers.map((p, i) => require_command_usage.scopeCommandUsage(p.usage, commandUsageScopes[i]))
1491
1494
  }],
1492
1495
  leadingNames: unionLeadingNames(parsers),
1493
1496
  acceptingAnyToken: parsers.some((p) => p.acceptingAnyToken),
@@ -1520,7 +1523,7 @@ function longestMatch(...args) {
1520
1523
  kind: "available",
1521
1524
  state: result.next.state
1522
1525
  });
1523
- commandMetadata = require_command_doc_metadata.getCommandDocMetadata(docResult);
1526
+ commandMetadata = require_command_doc_metadata.scopeCommandDocMetadata(require_command_doc_metadata.getCommandDocMetadata(docResult), commandUsageScopes[i]);
1524
1527
  brief = docResult.brief;
1525
1528
  description = docResult.description;
1526
1529
  footer = docResult.footer;
@@ -2231,13 +2234,14 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
2231
2234
  success: false
2232
2235
  };
2233
2236
  };
2237
+ const commandUsageScopes = new Map(parserPairs.map(([field]) => [field, /* @__PURE__ */ new WeakMap()]));
2234
2238
  const objectParser = {
2235
2239
  mode: combinedMode,
2236
2240
  $valueType: [],
2237
2241
  $stateType: [],
2238
2242
  [fieldParsersKey]: parserPairs,
2239
2243
  priority: Math.max(...parserKeys.map((k) => parsers[k].priority)),
2240
- usage: applyHiddenToUsage(parserPairs.flatMap(([_, p]) => p.usage), options.hidden),
2244
+ usage: applyHiddenToUsage(parserPairs.flatMap(([field, p]) => require_command_usage.scopeCommandUsage(p.usage, commandUsageScopes.get(field))), options.hidden),
2241
2245
  leadingNames: sharedBufferLeadingNames(parserPairs.map(([_, p]) => p)),
2242
2246
  acceptingAnyToken: parserPairs.some(([_, p]) => p.acceptingAnyToken),
2243
2247
  get initialState() {
@@ -2489,7 +2493,7 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
2489
2493
  state: state.state[field]
2490
2494
  };
2491
2495
  const docs = p.getDocFragments(fieldState, defaultValue?.[field]);
2492
- commandMetadata = require_command_doc_metadata.collectCommandDocMetadata(commandMetadata, docs);
2496
+ commandMetadata = require_command_doc_metadata.collectCommandDocMetadata(commandMetadata, docs, false, commandUsageScopes.get(field));
2493
2497
  return docs.fragments;
2494
2498
  });
2495
2499
  const hiddenAwareFragments = applyHiddenToDocFragments(fragments, options.hidden);
@@ -2946,12 +2950,16 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
2946
2950
  consumed: allConsumed
2947
2951
  };
2948
2952
  };
2953
+ const commandUsageScopes = parsers.map(() => /* @__PURE__ */ new WeakMap());
2949
2954
  const tupleParser = {
2950
2955
  mode: combinedMode,
2951
2956
  $valueType: [],
2952
2957
  $stateType: [],
2953
2958
  [fieldParsersKey]: parsers.map((parser, index) => [String(index), parser]),
2954
- usage: parsers.toSorted((a, b) => b.priority - a.priority).flatMap((p) => p.usage),
2959
+ usage: parsers.map((p, i) => ({
2960
+ p,
2961
+ i
2962
+ })).toSorted((a, b) => b.p.priority - a.p.priority).flatMap(({ p, i }) => require_command_usage.scopeCommandUsage(p.usage, commandUsageScopes[i])),
2955
2963
  leadingNames: sharedBufferLeadingNames(parsers),
2956
2964
  acceptingAnyToken: parsers.some((p) => p.acceptingAnyToken),
2957
2965
  priority: parsers.length > 0 ? Math.max(...parsers.map((p) => p.priority)) : 0,
@@ -3144,7 +3152,7 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
3144
3152
  state: state.state[i]
3145
3153
  };
3146
3154
  const docs = p.getDocFragments(indexState, defaultValue?.[i]);
3147
- commandMetadata = require_command_doc_metadata.collectCommandDocMetadata(commandMetadata, docs);
3155
+ commandMetadata = require_command_doc_metadata.collectCommandDocMetadata(commandMetadata, docs, false, commandUsageScopes[i]);
3148
3156
  return docs.fragments;
3149
3157
  });
3150
3158
  const entries = fragments.filter((d) => d.type === "entry");
@@ -3638,13 +3646,14 @@ function merge(...args) {
3638
3646
  consumed: allConsumed
3639
3647
  };
3640
3648
  };
3649
+ const commandUsageScopes = parsers.map(() => /* @__PURE__ */ new WeakMap());
3641
3650
  const mergeParser = {
3642
3651
  mode: combinedMode,
3643
3652
  $valueType: [],
3644
3653
  $stateType: [],
3645
3654
  [fieldParsersKey]: mergedFieldParsers,
3646
3655
  priority: Math.max(...mergeParseLanes.map((lane) => lane.priority)),
3647
- usage: applyHiddenToUsage(parsers.flatMap((p) => p.usage), options.hidden),
3656
+ usage: applyHiddenToUsage(parsers.flatMap((p, i) => require_command_usage.scopeCommandUsage(p.usage, commandUsageScopes[i])), options.hidden),
3648
3657
  leadingNames: sharedBufferLeadingNames(mergeParseLanes),
3649
3658
  acceptingAnyToken: mergeParseLanes.some((lane) => lane.acceptingAnyToken),
3650
3659
  initialState,
@@ -4073,7 +4082,7 @@ function merge(...args) {
4073
4082
  state: state.state
4074
4083
  };
4075
4084
  const docFragments = p.getDocFragments(parserState, void 0);
4076
- commandMetadata = require_command_doc_metadata.collectCommandDocMetadata(commandMetadata, docFragments, true);
4085
+ commandMetadata = require_command_doc_metadata.collectCommandDocMetadata(commandMetadata, docFragments, true, commandUsageScopes[i]);
4077
4086
  brief ??= docFragments.brief;
4078
4087
  description ??= docFragments.description;
4079
4088
  footer ??= docFragments.footer;
@@ -4610,12 +4619,13 @@ function concat(...parsers) {
4610
4619
  } : {}
4611
4620
  };
4612
4621
  };
4622
+ const commandUsageScopes = parsers.map(() => /* @__PURE__ */ new WeakMap());
4613
4623
  const concatParser = {
4614
4624
  mode: combinedMode,
4615
4625
  $valueType: [],
4616
4626
  $stateType: [],
4617
4627
  priority: parsers.length > 0 ? Math.max(...parsers.map((p) => p.priority)) : 0,
4618
- usage: parsers.flatMap((p) => p.usage),
4628
+ usage: parsers.flatMap((p, i) => require_command_usage.scopeCommandUsage(p.usage, commandUsageScopes[i])),
4619
4629
  leadingNames: sharedBufferLeadingNames(parsers),
4620
4630
  acceptingAnyToken: parsers.some((p) => p.acceptingAnyToken),
4621
4631
  initialState,
@@ -4733,7 +4743,7 @@ function concat(...parsers) {
4733
4743
  state: state.state[index]
4734
4744
  };
4735
4745
  const docs = p.getDocFragments(indexState, void 0);
4736
- commandMetadata = require_command_doc_metadata.collectCommandDocMetadata(commandMetadata, docs);
4746
+ commandMetadata = require_command_doc_metadata.collectCommandDocMetadata(commandMetadata, docs, false, commandUsageScopes[index]);
4737
4747
  return docs.fragments;
4738
4748
  });
4739
4749
  const entries = fragments.filter((f) => f.type === "entry");
@@ -4944,8 +4954,12 @@ function conditional(discriminator, branches, defaultBranch, options) {
4944
4954
  else result.push(term);
4945
4955
  return result;
4946
4956
  }
4947
- const branchUsages = branchParsers.map(([key, p]) => [...appendLiteralToUsage(discriminator.usage, key), ...p.usage]);
4948
- if (defaultBranch) branchUsages.push(defaultBranch.usage);
4957
+ const discriminatorUsageScope = /* @__PURE__ */ new WeakMap();
4958
+ const branchUsageScope = /* @__PURE__ */ new WeakMap();
4959
+ const commandUsageScopes = new Map(branchParsers.map(([key]) => [key, /* @__PURE__ */ new WeakMap()]));
4960
+ const defaultUsageScope = /* @__PURE__ */ new WeakMap();
4961
+ const branchUsages = branchParsers.map(([key, p]) => require_command_usage.scopeCommandUsage([...appendLiteralToUsage(require_command_usage.scopeCommandUsage(discriminator.usage, discriminatorUsageScope), key), ...require_command_usage.scopeCommandUsage(p.usage, branchUsageScope)], commandUsageScopes.get(key)));
4962
+ if (defaultBranch) branchUsages.push(require_command_usage.scopeCommandUsage(defaultBranch.usage, defaultUsageScope));
4949
4963
  const usage = branchUsages.length > 1 ? [{
4950
4964
  type: "exclusive",
4951
4965
  terms: branchUsages
@@ -5795,7 +5809,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
5795
5809
  if (isAsync) return suggestAsync(context, prefix);
5796
5810
  return suggestSync(context, prefix);
5797
5811
  },
5798
- getDocFragments(_state, _defaultValue) {
5812
+ getDocFragments(state, _defaultValue) {
5799
5813
  const fragments = [];
5800
5814
  const discriminatorFragments = discriminator.getDocFragments({ kind: "unavailable" }, void 0);
5801
5815
  fragments.push(...discriminatorFragments.fragments);
@@ -5819,7 +5833,27 @@ function conditional(discriminator, branches, defaultBranch, options) {
5819
5833
  entries
5820
5834
  });
5821
5835
  }
5822
- return { fragments };
5836
+ let selected = require_command_doc_metadata.getSelectedCommandUsage(void 0);
5837
+ if (state.kind === "available" && state.state.selectedBranch != null) {
5838
+ const selection = state.state.selectedBranch;
5839
+ const branch = selection.kind === "default" ? defaultBranch : branches[selection.key];
5840
+ if (branch != null) {
5841
+ const docs = branch.getDocFragments({
5842
+ kind: "available",
5843
+ state: require_annotation_state.getWrappedChildState(state.state, state.state.branchState, branch)
5844
+ }, void 0);
5845
+ if (selection.kind === "default") selected = require_command_doc_metadata.getSelectedCommandUsage(require_command_doc_metadata.scopeCommandDocMetadata(require_command_doc_metadata.getCommandDocMetadata(docs), defaultUsageScope));
5846
+ else {
5847
+ const discriminatorDocs = discriminator.getDocFragments({
5848
+ kind: "available",
5849
+ state: require_annotation_state.getWrappedChildState(state.state, state.state.discriminatorState, discriminator)
5850
+ }, void 0);
5851
+ const metadata = require_command_doc_metadata.collectCommandDocMetadata(require_command_doc_metadata.scopeCommandDocMetadata(require_command_doc_metadata.getCommandDocMetadata(discriminatorDocs), discriminatorUsageScope), docs, false, branchUsageScope);
5852
+ selected = require_command_doc_metadata.getSelectedCommandUsage(require_command_doc_metadata.scopeCommandDocMetadata(metadata, commandUsageScopes.get(selection.key)));
5853
+ }
5854
+ }
5855
+ }
5856
+ return require_command_doc_metadata.withCommandDocMetadata({ fragments }, require_command_doc_metadata.withSelectedCommandUsage({}, selected));
5823
5857
  }
5824
5858
  };
5825
5859
  require_parser.defineInheritedAnnotationParser(conditionalParser);
@@ -1,6 +1,7 @@
1
1
  import { annotateFreshArray, getAnnotations, inheritAnnotations } from "./internal/annotations.js";
2
2
  import { message, optionName, text, values } from "./message.js";
3
- import { collectCommandDocMetadata, getCommandDocMetadata, withCommandDocMetadata } from "./internal/command-doc-metadata.js";
3
+ import { copyCommandUsageId, scopeCommandUsage } from "./internal/command-usage.js";
4
+ import { collectCommandDocMetadata, getCommandDocMetadata, getSelectedCommandUsage, scopeCommandDocMetadata, withCommandDocMetadata, withSelectedCommandUsage } from "./internal/command-doc-metadata.js";
4
5
  import { combineOptionMatches, combinePassThroughPriorities, defineOptionMatch, definePassThroughPriority, delegateKnownCompletion, getKnownCompletion, getOptionMatch, getPassThroughFailureHint, getPassThroughPriority, hasPassThroughUsage, matchesOptionToken, retainConsumingFailure, retainConsumingFailureHint, withPassThroughFailure } from "./internal/passthrough.js";
5
6
  import { validateLabel } from "./validate.js";
6
7
  import { extractArgumentMetavars, extractCommandNames, extractOptionNames, isDocHidden, mergeHidden } from "./usage.js";
@@ -382,10 +383,10 @@ function applyHiddenToUsageTerm(term, hidden) {
382
383
  type: "exclusive",
383
384
  terms: term.terms.map((u) => applyHiddenToUsage(u, hidden))
384
385
  };
385
- if (term.type === "argument" || term.type === "option" || term.type === "command" || term.type === "passthrough") return {
386
+ if (term.type === "argument" || term.type === "option" || term.type === "command" || term.type === "passthrough") return copyCommandUsageId(term, {
386
387
  ...term,
387
388
  hidden: mergeHidden(term.hidden, hidden)
388
- };
389
+ });
389
390
  return term;
390
391
  }
391
392
  function applyHiddenToUsage(usage, hidden) {
@@ -1252,6 +1253,7 @@ function or(...args) {
1252
1253
  success: false
1253
1254
  };
1254
1255
  };
1256
+ const commandUsageScopes = parsers.map(() => /* @__PURE__ */ new WeakMap());
1255
1257
  const singleResult = {
1256
1258
  mode: combinedMode,
1257
1259
  $valueType: [],
@@ -1259,7 +1261,7 @@ function or(...args) {
1259
1261
  priority: Math.max(...parsers.map((p) => p.priority)),
1260
1262
  usage: [{
1261
1263
  type: "exclusive",
1262
- terms: parsers.map((p) => p.usage)
1264
+ terms: parsers.map((p, i) => scopeCommandUsage(p.usage, commandUsageScopes[i]))
1263
1265
  }],
1264
1266
  leadingNames: unionLeadingNames(parsers),
1265
1267
  acceptingAnyToken: parsers.some((p) => p.acceptingAnyToken),
@@ -1289,7 +1291,7 @@ function or(...args) {
1289
1291
  state: parserResult.next.state
1290
1292
  } : { kind: "unavailable" };
1291
1293
  const docFragments = parsers[index].getDocFragments(innerState, void 0);
1292
- commandMetadata = getCommandDocMetadata(docFragments);
1294
+ commandMetadata = scopeCommandDocMetadata(getCommandDocMetadata(docFragments), commandUsageScopes[index]);
1293
1295
  brief = docFragments.brief;
1294
1296
  description = docFragments.description;
1295
1297
  footer = docFragments.footer;
@@ -1480,6 +1482,7 @@ function longestMatch(...args) {
1480
1482
  success: false
1481
1483
  };
1482
1484
  };
1485
+ const commandUsageScopes = parsers.map(() => /* @__PURE__ */ new WeakMap());
1483
1486
  const multiResult = {
1484
1487
  mode: combinedMode,
1485
1488
  $valueType: [],
@@ -1487,7 +1490,7 @@ function longestMatch(...args) {
1487
1490
  priority: Math.max(...parsers.map((p) => p.priority)),
1488
1491
  usage: [{
1489
1492
  type: "exclusive",
1490
- terms: parsers.map((p) => p.usage)
1493
+ terms: parsers.map((p, i) => scopeCommandUsage(p.usage, commandUsageScopes[i]))
1491
1494
  }],
1492
1495
  leadingNames: unionLeadingNames(parsers),
1493
1496
  acceptingAnyToken: parsers.some((p) => p.acceptingAnyToken),
@@ -1520,7 +1523,7 @@ function longestMatch(...args) {
1520
1523
  kind: "available",
1521
1524
  state: result.next.state
1522
1525
  });
1523
- commandMetadata = getCommandDocMetadata(docResult);
1526
+ commandMetadata = scopeCommandDocMetadata(getCommandDocMetadata(docResult), commandUsageScopes[i]);
1524
1527
  brief = docResult.brief;
1525
1528
  description = docResult.description;
1526
1529
  footer = docResult.footer;
@@ -2231,13 +2234,14 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
2231
2234
  success: false
2232
2235
  };
2233
2236
  };
2237
+ const commandUsageScopes = new Map(parserPairs.map(([field]) => [field, /* @__PURE__ */ new WeakMap()]));
2234
2238
  const objectParser = {
2235
2239
  mode: combinedMode,
2236
2240
  $valueType: [],
2237
2241
  $stateType: [],
2238
2242
  [fieldParsersKey]: parserPairs,
2239
2243
  priority: Math.max(...parserKeys.map((k) => parsers[k].priority)),
2240
- usage: applyHiddenToUsage(parserPairs.flatMap(([_, p]) => p.usage), options.hidden),
2244
+ usage: applyHiddenToUsage(parserPairs.flatMap(([field, p]) => scopeCommandUsage(p.usage, commandUsageScopes.get(field))), options.hidden),
2241
2245
  leadingNames: sharedBufferLeadingNames(parserPairs.map(([_, p]) => p)),
2242
2246
  acceptingAnyToken: parserPairs.some(([_, p]) => p.acceptingAnyToken),
2243
2247
  get initialState() {
@@ -2489,7 +2493,7 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
2489
2493
  state: state.state[field]
2490
2494
  };
2491
2495
  const docs = p.getDocFragments(fieldState, defaultValue?.[field]);
2492
- commandMetadata = collectCommandDocMetadata(commandMetadata, docs);
2496
+ commandMetadata = collectCommandDocMetadata(commandMetadata, docs, false, commandUsageScopes.get(field));
2493
2497
  return docs.fragments;
2494
2498
  });
2495
2499
  const hiddenAwareFragments = applyHiddenToDocFragments(fragments, options.hidden);
@@ -2946,12 +2950,16 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
2946
2950
  consumed: allConsumed
2947
2951
  };
2948
2952
  };
2953
+ const commandUsageScopes = parsers.map(() => /* @__PURE__ */ new WeakMap());
2949
2954
  const tupleParser = {
2950
2955
  mode: combinedMode,
2951
2956
  $valueType: [],
2952
2957
  $stateType: [],
2953
2958
  [fieldParsersKey]: parsers.map((parser, index) => [String(index), parser]),
2954
- usage: parsers.toSorted((a, b) => b.priority - a.priority).flatMap((p) => p.usage),
2959
+ usage: parsers.map((p, i) => ({
2960
+ p,
2961
+ i
2962
+ })).toSorted((a, b) => b.p.priority - a.p.priority).flatMap(({ p, i }) => scopeCommandUsage(p.usage, commandUsageScopes[i])),
2955
2963
  leadingNames: sharedBufferLeadingNames(parsers),
2956
2964
  acceptingAnyToken: parsers.some((p) => p.acceptingAnyToken),
2957
2965
  priority: parsers.length > 0 ? Math.max(...parsers.map((p) => p.priority)) : 0,
@@ -3144,7 +3152,7 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
3144
3152
  state: state.state[i]
3145
3153
  };
3146
3154
  const docs = p.getDocFragments(indexState, defaultValue?.[i]);
3147
- commandMetadata = collectCommandDocMetadata(commandMetadata, docs);
3155
+ commandMetadata = collectCommandDocMetadata(commandMetadata, docs, false, commandUsageScopes[i]);
3148
3156
  return docs.fragments;
3149
3157
  });
3150
3158
  const entries = fragments.filter((d) => d.type === "entry");
@@ -3638,13 +3646,14 @@ function merge(...args) {
3638
3646
  consumed: allConsumed
3639
3647
  };
3640
3648
  };
3649
+ const commandUsageScopes = parsers.map(() => /* @__PURE__ */ new WeakMap());
3641
3650
  const mergeParser = {
3642
3651
  mode: combinedMode,
3643
3652
  $valueType: [],
3644
3653
  $stateType: [],
3645
3654
  [fieldParsersKey]: mergedFieldParsers,
3646
3655
  priority: Math.max(...mergeParseLanes.map((lane) => lane.priority)),
3647
- usage: applyHiddenToUsage(parsers.flatMap((p) => p.usage), options.hidden),
3656
+ usage: applyHiddenToUsage(parsers.flatMap((p, i) => scopeCommandUsage(p.usage, commandUsageScopes[i])), options.hidden),
3648
3657
  leadingNames: sharedBufferLeadingNames(mergeParseLanes),
3649
3658
  acceptingAnyToken: mergeParseLanes.some((lane) => lane.acceptingAnyToken),
3650
3659
  initialState,
@@ -4073,7 +4082,7 @@ function merge(...args) {
4073
4082
  state: state.state
4074
4083
  };
4075
4084
  const docFragments = p.getDocFragments(parserState, void 0);
4076
- commandMetadata = collectCommandDocMetadata(commandMetadata, docFragments, true);
4085
+ commandMetadata = collectCommandDocMetadata(commandMetadata, docFragments, true, commandUsageScopes[i]);
4077
4086
  brief ??= docFragments.brief;
4078
4087
  description ??= docFragments.description;
4079
4088
  footer ??= docFragments.footer;
@@ -4610,12 +4619,13 @@ function concat(...parsers) {
4610
4619
  } : {}
4611
4620
  };
4612
4621
  };
4622
+ const commandUsageScopes = parsers.map(() => /* @__PURE__ */ new WeakMap());
4613
4623
  const concatParser = {
4614
4624
  mode: combinedMode,
4615
4625
  $valueType: [],
4616
4626
  $stateType: [],
4617
4627
  priority: parsers.length > 0 ? Math.max(...parsers.map((p) => p.priority)) : 0,
4618
- usage: parsers.flatMap((p) => p.usage),
4628
+ usage: parsers.flatMap((p, i) => scopeCommandUsage(p.usage, commandUsageScopes[i])),
4619
4629
  leadingNames: sharedBufferLeadingNames(parsers),
4620
4630
  acceptingAnyToken: parsers.some((p) => p.acceptingAnyToken),
4621
4631
  initialState,
@@ -4733,7 +4743,7 @@ function concat(...parsers) {
4733
4743
  state: state.state[index]
4734
4744
  };
4735
4745
  const docs = p.getDocFragments(indexState, void 0);
4736
- commandMetadata = collectCommandDocMetadata(commandMetadata, docs);
4746
+ commandMetadata = collectCommandDocMetadata(commandMetadata, docs, false, commandUsageScopes[index]);
4737
4747
  return docs.fragments;
4738
4748
  });
4739
4749
  const entries = fragments.filter((f) => f.type === "entry");
@@ -4944,8 +4954,12 @@ function conditional(discriminator, branches, defaultBranch, options) {
4944
4954
  else result.push(term);
4945
4955
  return result;
4946
4956
  }
4947
- const branchUsages = branchParsers.map(([key, p]) => [...appendLiteralToUsage(discriminator.usage, key), ...p.usage]);
4948
- if (defaultBranch) branchUsages.push(defaultBranch.usage);
4957
+ const discriminatorUsageScope = /* @__PURE__ */ new WeakMap();
4958
+ const branchUsageScope = /* @__PURE__ */ new WeakMap();
4959
+ const commandUsageScopes = new Map(branchParsers.map(([key]) => [key, /* @__PURE__ */ new WeakMap()]));
4960
+ const defaultUsageScope = /* @__PURE__ */ new WeakMap();
4961
+ const branchUsages = branchParsers.map(([key, p]) => scopeCommandUsage([...appendLiteralToUsage(scopeCommandUsage(discriminator.usage, discriminatorUsageScope), key), ...scopeCommandUsage(p.usage, branchUsageScope)], commandUsageScopes.get(key)));
4962
+ if (defaultBranch) branchUsages.push(scopeCommandUsage(defaultBranch.usage, defaultUsageScope));
4949
4963
  const usage = branchUsages.length > 1 ? [{
4950
4964
  type: "exclusive",
4951
4965
  terms: branchUsages
@@ -5795,7 +5809,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
5795
5809
  if (isAsync) return suggestAsync(context, prefix);
5796
5810
  return suggestSync(context, prefix);
5797
5811
  },
5798
- getDocFragments(_state, _defaultValue) {
5812
+ getDocFragments(state, _defaultValue) {
5799
5813
  const fragments = [];
5800
5814
  const discriminatorFragments = discriminator.getDocFragments({ kind: "unavailable" }, void 0);
5801
5815
  fragments.push(...discriminatorFragments.fragments);
@@ -5819,7 +5833,27 @@ function conditional(discriminator, branches, defaultBranch, options) {
5819
5833
  entries
5820
5834
  });
5821
5835
  }
5822
- return { fragments };
5836
+ let selected = getSelectedCommandUsage(void 0);
5837
+ if (state.kind === "available" && state.state.selectedBranch != null) {
5838
+ const selection = state.state.selectedBranch;
5839
+ const branch = selection.kind === "default" ? defaultBranch : branches[selection.key];
5840
+ if (branch != null) {
5841
+ const docs = branch.getDocFragments({
5842
+ kind: "available",
5843
+ state: getWrappedChildState(state.state, state.state.branchState, branch)
5844
+ }, void 0);
5845
+ if (selection.kind === "default") selected = getSelectedCommandUsage(scopeCommandDocMetadata(getCommandDocMetadata(docs), defaultUsageScope));
5846
+ else {
5847
+ const discriminatorDocs = discriminator.getDocFragments({
5848
+ kind: "available",
5849
+ state: getWrappedChildState(state.state, state.state.discriminatorState, discriminator)
5850
+ }, void 0);
5851
+ const metadata = collectCommandDocMetadata(scopeCommandDocMetadata(getCommandDocMetadata(discriminatorDocs), discriminatorUsageScope), docs, false, branchUsageScope);
5852
+ selected = getSelectedCommandUsage(scopeCommandDocMetadata(metadata, commandUsageScopes.get(selection.key)));
5853
+ }
5854
+ }
5855
+ }
5856
+ return withCommandDocMetadata({ fragments }, withSelectedCommandUsage({}, selected));
5823
5857
  }
5824
5858
  };
5825
5859
  defineInheritedAnnotationParser(conditionalParser);
@@ -22,23 +22,102 @@ function serializePath(path) {
22
22
  if (path.length === 0) return "";
23
23
  return path.map(serializeKey).join("");
24
24
  }
25
+ function height(node$1) {
26
+ return node$1?.height ?? 0;
27
+ }
28
+ function node(key, entry, left, right) {
29
+ return {
30
+ key,
31
+ entry,
32
+ left,
33
+ right,
34
+ height: 1 + Math.max(height(left), height(right))
35
+ };
36
+ }
37
+ function balance(key, entry, left, right) {
38
+ if (height(left) - height(right) > 1 && left != null) {
39
+ const pivot = left.right;
40
+ if (height(pivot) > height(left.left) && pivot != null) return node(pivot.key, pivot.entry, node(left.key, left.entry, left.left, pivot.left), node(key, entry, pivot.right, right));
41
+ return node(left.key, left.entry, left.left, node(key, entry, left.right, right));
42
+ }
43
+ if (height(right) - height(left) > 1 && right != null) {
44
+ const pivot = right.left;
45
+ if (height(pivot) > height(right.right) && pivot != null) return node(pivot.key, pivot.entry, node(key, entry, left, pivot.left), node(right.key, right.entry, pivot.right, right.right));
46
+ return node(right.key, right.entry, node(key, entry, left, right.left), right.right);
47
+ }
48
+ return node(key, entry, left, right);
49
+ }
50
+ function setEntry(root, key, entry) {
51
+ if (root == null) return node(key, entry, void 0, void 0);
52
+ if (key === root.key) return entry === root.entry ? root : {
53
+ ...root,
54
+ entry
55
+ };
56
+ if (key < root.key) {
57
+ const left = setEntry(root.left, key, entry);
58
+ return left === root.left ? root : balance(root.key, root.entry, left, root.right);
59
+ }
60
+ const right = setEntry(root.right, key, entry);
61
+ return right === root.right ? root : balance(root.key, root.entry, root.left, right);
62
+ }
63
+ function popMin(root) {
64
+ if (root.left == null) return [root, root.right];
65
+ const [minimum, left] = popMin(root.left);
66
+ return [minimum, balance(root.key, root.entry, left, root.right)];
67
+ }
68
+ function deleteEntry(root, key) {
69
+ if (root == null) return void 0;
70
+ if (key === root.key) {
71
+ if (root.left == null) return root.right;
72
+ if (root.right == null) return root.left;
73
+ const [successor, right$1] = popMin(root.right);
74
+ return balance(successor.key, successor.entry, root.left, right$1);
75
+ }
76
+ if (key < root.key) {
77
+ const left = deleteEntry(root.left, key);
78
+ return left === root.left ? root : balance(root.key, root.entry, left, root.right);
79
+ }
80
+ const right = deleteEntry(root.right, key);
81
+ return right === root.right ? root : balance(root.key, root.entry, root.left, right);
82
+ }
83
+ function inspectNode(root, lower, upper) {
84
+ if (root == null) return {
85
+ size: 0,
86
+ height: 0
87
+ };
88
+ if (lower !== void 0 && root.key <= lower || upper !== void 0 && root.key >= upper) throw new TypeError("Input trace keys are not strictly ordered.");
89
+ const left = inspectNode(root.left, lower, root.key);
90
+ const right = inspectNode(root.right, root.key, upper);
91
+ const actualHeight = 1 + Math.max(left.height, right.height);
92
+ if (root.height !== actualHeight || Math.abs(left.height - right.height) > 1) throw new TypeError("Input trace heights or balance are invalid.");
93
+ return {
94
+ size: 1 + left.size + right.size,
95
+ height: actualHeight
96
+ };
97
+ }
25
98
  var InputTraceImpl = class InputTraceImpl {
26
- #entries;
27
- constructor(entries) {
28
- this.#entries = entries ?? /* @__PURE__ */ new Map();
99
+ #root;
100
+ constructor(root) {
101
+ this.#root = root;
29
102
  }
30
103
  get(path) {
31
- return this.#entries.get(serializePath(path));
104
+ const key = serializePath(path);
105
+ let current = this.#root;
106
+ while (current != null) {
107
+ if (key === current.key) return current.entry;
108
+ current = key < current.key ? current.left : current.right;
109
+ }
110
+ return void 0;
32
111
  }
33
112
  set(path, entry) {
34
- const copy = new Map(this.#entries);
35
- copy.set(serializePath(path), entry);
36
- return new InputTraceImpl(copy);
113
+ return new InputTraceImpl(setEntry(this.#root, serializePath(path), entry));
37
114
  }
38
115
  delete(path) {
39
- const copy = new Map(this.#entries);
40
- copy.delete(serializePath(path));
41
- return new InputTraceImpl(copy);
116
+ return new InputTraceImpl(deleteEntry(this.#root, serializePath(path)));
117
+ }
118
+ static inspect(trace) {
119
+ if (!(trace instanceof InputTraceImpl)) throw new TypeError("Expected an Optique input trace.");
120
+ return inspectNode(trace.#root);
42
121
  }
43
122
  };
44
123
  /**
@@ -67,11 +67,14 @@ interface InputTrace {
67
67
  delete(path: readonly PropertyKey[]): InputTrace;
68
68
  }
69
69
  /**
70
- * Creates a new empty {@link InputTrace}.
70
+ * Checks private tree invariants without exposing mutable nodes.
71
+ * This module is not a package export; the checker is used by internal tests.
71
72
  *
72
- * @returns An empty immutable input trace.
73
+ * @param trace The trace to inspect.
74
+ * @returns Its size and verified height.
75
+ * @throws {TypeError} If the trace is foreign or its tree invariants are invalid.
73
76
  * @internal
74
- * @since 1.0.0
77
+ * @since 1.0.16
75
78
  */
76
79
  //#endregion
77
80
  export { InputTrace };
@@ -67,11 +67,14 @@ interface InputTrace {
67
67
  delete(path: readonly PropertyKey[]): InputTrace;
68
68
  }
69
69
  /**
70
- * Creates a new empty {@link InputTrace}.
70
+ * Checks private tree invariants without exposing mutable nodes.
71
+ * This module is not a package export; the checker is used by internal tests.
71
72
  *
72
- * @returns An empty immutable input trace.
73
+ * @param trace The trace to inspect.
74
+ * @returns Its size and verified height.
75
+ * @throws {TypeError} If the trace is foreign or its tree invariants are invalid.
73
76
  * @internal
74
- * @since 1.0.0
77
+ * @since 1.0.16
75
78
  */
76
79
  //#endregion
77
80
  export { InputTrace };