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

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,10 +1,83 @@
1
1
  const require_annotations = require('./annotations.cjs');
2
2
  const require_message = require('./message.cjs');
3
- const require_dependency = require('./dependency.cjs');
4
3
  const require_mode_dispatch = require('./mode-dispatch.cjs');
5
4
  const require_dependency_metadata = require('./dependency-metadata.cjs');
6
5
 
7
6
  //#region src/modifiers.ts
7
+ function withChildExecPath(exec, segment) {
8
+ if (exec == null) return void 0;
9
+ return {
10
+ ...exec,
11
+ path: [...exec.path ?? [], segment]
12
+ };
13
+ }
14
+ function mergeChildExec(parent, child) {
15
+ if (parent == null) return child;
16
+ if (child == null) return parent;
17
+ return {
18
+ ...parent,
19
+ trace: child.trace ?? parent.trace,
20
+ dependencyRuntime: child.dependencyRuntime ?? parent.dependencyRuntime,
21
+ dependencyRegistry: child.dependencyRegistry ?? parent.dependencyRegistry,
22
+ preCompletedByParser: child.preCompletedByParser ?? parent.preCompletedByParser,
23
+ excludedSourceFields: child.excludedSourceFields ?? parent.excludedSourceFields
24
+ };
25
+ }
26
+ function withChildContext(context, segment, state) {
27
+ const exec = withChildExecPath(context.exec, segment);
28
+ const dependencyRegistry = context.dependencyRegistry ?? exec?.dependencyRegistry;
29
+ return {
30
+ ...context,
31
+ state,
32
+ ...exec != null ? {
33
+ exec: dependencyRegistry === exec.dependencyRegistry ? exec : {
34
+ ...exec,
35
+ dependencyRegistry
36
+ },
37
+ dependencyRegistry
38
+ } : {}
39
+ };
40
+ }
41
+ function isTerminalMultipleItemState(state) {
42
+ const unwrapped = unwrapMultipleItemState(state).value;
43
+ return unwrapped != null && typeof unwrapped === "object" && Object.hasOwn(unwrapped, "success") && typeof unwrapped.success === "boolean";
44
+ }
45
+ function isUnstartedMultipleItemState(state, originalState) {
46
+ const unwrappedState = unwrapMultipleItemState(state);
47
+ if (unwrappedState.value == null) return true;
48
+ if (originalState === void 0) return false;
49
+ const unwrappedOriginalState = unwrapMultipleItemState(originalState);
50
+ return unwrappedState.value === unwrappedOriginalState.value && (unwrappedState.viaBoundCliWrapper || unwrappedOriginalState.viaBoundCliWrapper || unwrappedOriginalState.value != null && typeof unwrappedOriginalState.value === "object");
51
+ }
52
+ function isBoundCliWrapperState(state) {
53
+ return state != null && typeof state === "object" && Object.hasOwn(state, "hasCliValue") && typeof state.hasCliValue === "boolean" && (Object.hasOwn(state, "cliState") || state.hasCliValue === false);
54
+ }
55
+ function unwrapMultipleItemState(state) {
56
+ let unwrapped = state;
57
+ let viaBoundCliWrapper = false;
58
+ while (true) {
59
+ if (require_annotations.isInjectedAnnotationWrapper(unwrapped)) {
60
+ unwrapped = require_annotations.unwrapInjectedAnnotationWrapper(unwrapped);
61
+ continue;
62
+ }
63
+ if (Array.isArray(unwrapped) && unwrapped.length === 1) {
64
+ unwrapped = unwrapped[0];
65
+ continue;
66
+ }
67
+ if (isBoundCliWrapperState(unwrapped)) {
68
+ viaBoundCliWrapper = true;
69
+ unwrapped = unwrapped.cliState;
70
+ continue;
71
+ }
72
+ return {
73
+ value: unwrapped,
74
+ viaBoundCliWrapper
75
+ };
76
+ }
77
+ }
78
+ function isPromiseLike(value) {
79
+ return value != null && (typeof value === "object" || typeof value === "function") && "then" in value && typeof value.then === "function";
80
+ }
8
81
  /**
9
82
  * Internal helper for optional-style parsing logic shared by optional()
10
83
  * and withDefault(). Handles the common pattern of:
@@ -77,14 +150,16 @@ function processOptionalStyleResult(result, innerState, context) {
77
150
  */
78
151
  function adaptShouldDeferCompletion(innerCheck) {
79
152
  return (state, exec) => {
80
- if (Array.isArray(state)) {
81
- const inner = require_annotations.getAnnotations(state) != null && state[0] != null && typeof state[0] === "object" ? require_annotations.inheritAnnotations(state, state[0]) : state[0];
82
- return innerCheck(inner, exec);
83
- }
153
+ if (Array.isArray(state)) return innerCheck(normalizeOptionalLikeInnerState(state, state[0]), exec);
84
154
  if (state != null && typeof state === "object") return innerCheck(state, exec);
85
155
  return false;
86
156
  };
87
157
  }
158
+ function normalizeOptionalLikeInnerState(state, initialState) {
159
+ 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];
160
+ if (state != null && typeof state === "object") return state;
161
+ return initialState;
162
+ }
88
163
  /**
89
164
  * Creates a parser that makes another parser optional, allowing it to succeed
90
165
  * without consuming input if the wrapped parser fails to match.
@@ -100,25 +175,20 @@ function adaptShouldDeferCompletion(innerCheck) {
100
175
  function optional(parser) {
101
176
  const syncParser = parser;
102
177
  function* suggestSync(context, prefix) {
103
- const innerState = Array.isArray(context.state) ? context.state[0] : syncParser.initialState;
178
+ const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState);
104
179
  yield* syncParser.suggest({
105
180
  ...context,
106
181
  state: innerState
107
182
  }, prefix);
108
183
  }
109
184
  async function* suggestAsync(context, prefix) {
110
- const innerState = Array.isArray(context.state) ? context.state[0] : syncParser.initialState;
185
+ const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState);
111
186
  const suggestions = parser.suggest({
112
187
  ...context,
113
188
  state: innerState
114
189
  }, prefix);
115
190
  for await (const s of suggestions) yield s;
116
191
  }
117
- const innerHasWrappedDependency = require_dependency.isWrappedDependencySource(parser);
118
- const innerHasDirectDependency = require_dependency.isPendingDependencySourceState(syncParser.initialState);
119
- const wrappedDependencyMarker = innerHasWrappedDependency ? { [require_dependency.wrappedDependencySourceMarker]: parser[require_dependency.wrappedDependencySourceMarker] } : innerHasDirectDependency ? { [require_dependency.wrappedDependencySourceMarker]: syncParser.initialState } : {};
120
- const hasWrappedDependencySource = require_dependency.wrappedDependencySourceMarker in wrappedDependencyMarker;
121
- const wrappedPendingState = hasWrappedDependencySource ? wrappedDependencyMarker[require_dependency.wrappedDependencySourceMarker] : void 0;
122
192
  const optionalParser = {
123
193
  $mode: parser.$mode,
124
194
  $valueType: [],
@@ -132,17 +202,29 @@ function optional(parser) {
132
202
  leadingNames: parser.leadingNames,
133
203
  acceptingAnyToken: false,
134
204
  initialState: void 0,
135
- ...wrappedDependencyMarker,
136
205
  ...typeof parser.shouldDeferCompletion === "function" ? { shouldDeferCompletion: adaptShouldDeferCompletion(parser.shouldDeferCompletion.bind(parser)) } : {},
206
+ getSuggestRuntimeNodes(state, path) {
207
+ if (optionalParser.dependencyMetadata?.source != null) return [{
208
+ path,
209
+ parser: optionalParser,
210
+ state
211
+ }];
212
+ const innerState = normalizeOptionalLikeInnerState(state, parser.initialState);
213
+ return parser.getSuggestRuntimeNodes?.(innerState, path) ?? (parser.dependencyMetadata?.source != null ? [{
214
+ path,
215
+ parser,
216
+ state: innerState
217
+ }] : []);
218
+ },
137
219
  parse(context) {
138
220
  return require_mode_dispatch.dispatchByMode(parser.$mode, () => parseOptionalStyleSync(context, syncParser), () => parseOptionalStyleAsync(context, parser));
139
221
  },
140
222
  complete(state, exec) {
141
223
  if (!Array.isArray(state)) {
142
- if (innerHasWrappedDependency && wrappedPendingState) return require_mode_dispatch.dispatchByMode(parser.$mode, () => syncParser.complete([wrappedPendingState], exec), () => parser.complete([wrappedPendingState], exec));
143
224
  if (typeof parser.shouldDeferCompletion === "function" && state != null && typeof state === "object") {
144
225
  const innerComplete = () => {
145
- const innerResult = require_mode_dispatch.dispatchByMode(parser.$mode, () => syncParser.complete(state, exec), () => parser.complete(state, exec));
226
+ const innerState = normalizeOptionalLikeInnerState(state, parser.initialState);
227
+ const innerResult = require_mode_dispatch.dispatchByMode(parser.$mode, () => syncParser.complete(innerState, exec), async () => await parser.complete(innerState, exec));
146
228
  return require_mode_dispatch.mapModeValue(parser.$mode, innerResult, (result) => result.success ? result : {
147
229
  success: true,
148
230
  value: void 0
@@ -150,20 +232,18 @@ function optional(parser) {
150
232
  };
151
233
  return innerComplete();
152
234
  }
235
+ const sourceMetadata = parser.dependencyMetadata?.source;
236
+ if (sourceMetadata?.preservesSourceValue !== false && sourceMetadata?.getMissingSourceValue != null) {
237
+ const delegatedState = normalizeOptionalLikeInnerState(state, parser.initialState);
238
+ return require_mode_dispatch.dispatchByMode(parser.$mode, () => syncParser.complete(delegatedState, exec), async () => await parser.complete(delegatedState, exec));
239
+ }
153
240
  return {
154
241
  success: true,
155
242
  value: void 0
156
243
  };
157
244
  }
158
- if (Array.isArray(state) && state.length === 1 && require_dependency.isPendingDependencySourceState(state[0])) {
159
- if (innerHasWrappedDependency) return require_mode_dispatch.dispatchByMode(parser.$mode, () => syncParser.complete(state, exec), () => parser.complete(state, exec));
160
- return {
161
- success: true,
162
- value: void 0
163
- };
164
- }
165
- const innerElement = require_annotations.getAnnotations(state) != null && state[0] != null && typeof state[0] === "object" ? require_annotations.inheritAnnotations(state, state[0]) : state[0];
166
- return require_mode_dispatch.dispatchByMode(parser.$mode, () => syncParser.complete(innerElement, exec), () => parser.complete(innerElement, exec));
245
+ const innerElement = normalizeOptionalLikeInnerState(state, parser.initialState);
246
+ return require_mode_dispatch.dispatchByMode(parser.$mode, () => syncParser.complete(innerElement, exec), async () => await parser.complete(innerElement, exec));
167
247
  },
168
248
  suggest(context, prefix) {
169
249
  return require_mode_dispatch.dispatchIterableByMode(parser.$mode, () => suggestSync(context, prefix), () => suggestAsync(context, prefix));
@@ -240,22 +320,20 @@ function withDefault(parser, defaultValue, options) {
240
320
  }
241
321
  };
242
322
  function* suggestSync(context, prefix) {
243
- const innerState = Array.isArray(context.state) ? context.state[0] : syncParser.initialState;
323
+ const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState);
244
324
  yield* syncParser.suggest({
245
325
  ...context,
246
326
  state: innerState
247
327
  }, prefix);
248
328
  }
249
329
  async function* suggestAsync(context, prefix) {
250
- const innerState = Array.isArray(context.state) ? context.state[0] : syncParser.initialState;
330
+ const innerState = normalizeOptionalLikeInnerState(context.state, syncParser.initialState);
251
331
  const suggestions = parser.suggest({
252
332
  ...context,
253
333
  state: innerState
254
334
  }, prefix);
255
335
  for await (const s of suggestions) yield s;
256
336
  }
257
- const innerInitialState = syncParser.initialState;
258
- const wrappedDependencyMarker = require_dependency.isPendingDependencySourceState(innerInitialState) ? { [require_dependency.wrappedDependencySourceMarker]: innerInitialState } : require_dependency.isWrappedDependencySource(parser) ? { [require_dependency.wrappedDependencySourceMarker]: parser[require_dependency.wrappedDependencySourceMarker] } : {};
259
337
  const withDefaultParser = {
260
338
  $mode: parser.$mode,
261
339
  $valueType: [],
@@ -268,8 +346,20 @@ function withDefault(parser, defaultValue, options) {
268
346
  leadingNames: parser.leadingNames,
269
347
  acceptingAnyToken: false,
270
348
  initialState: void 0,
271
- ...wrappedDependencyMarker,
272
349
  ...typeof parser.shouldDeferCompletion === "function" ? { shouldDeferCompletion: adaptShouldDeferCompletion(parser.shouldDeferCompletion.bind(parser)) } : {},
350
+ getSuggestRuntimeNodes(state, path) {
351
+ if (withDefaultParser.dependencyMetadata?.source != null) return [{
352
+ path,
353
+ parser: withDefaultParser,
354
+ state
355
+ }];
356
+ const innerState = normalizeOptionalLikeInnerState(state, parser.initialState);
357
+ return parser.getSuggestRuntimeNodes?.(innerState, path) ?? (parser.dependencyMetadata?.source != null ? [{
358
+ path,
359
+ parser,
360
+ state: innerState
361
+ }] : []);
362
+ },
273
363
  parse(context) {
274
364
  return require_mode_dispatch.dispatchByMode(parser.$mode, () => parseOptionalStyleSync(context, syncParser), () => parseOptionalStyleAsync(context, parser));
275
365
  },
@@ -282,51 +372,9 @@ function withDefault(parser, defaultValue, options) {
282
372
  return raw;
283
373
  }
284
374
  if (!Array.isArray(state)) {
285
- if (require_dependency.transformsDependencyValue(parser)) {
286
- const innerResult = require_mode_dispatch.dispatchByMode(parser.$mode, () => syncParser.complete(void 0, exec), () => parser.complete(void 0, exec));
287
- const handleInnerResult = (res) => {
288
- if (require_dependency.isDependencySourceState(res)) try {
289
- const value = evaluateDefault();
290
- return require_dependency.createDependencySourceState({
291
- success: true,
292
- value
293
- }, res[require_dependency.dependencyId]);
294
- } catch (error) {
295
- return {
296
- success: false,
297
- error: error instanceof WithDefaultError ? error.errorMessage : require_message.message`${require_message.text(String(error))}`
298
- };
299
- }
300
- try {
301
- const value = evaluateDefault();
302
- return {
303
- success: true,
304
- value
305
- };
306
- } catch (error) {
307
- return {
308
- success: false,
309
- error: error instanceof WithDefaultError ? error.errorMessage : require_message.message`${require_message.text(String(error))}`
310
- };
311
- }
312
- };
313
- return require_mode_dispatch.mapModeValue(parser.$mode, innerResult, handleInnerResult);
314
- }
315
- if (require_dependency.isWrappedDependencySource(parser)) try {
316
- const value = evaluateDefault();
317
- const pendingState = parser[require_dependency.wrappedDependencySourceMarker];
318
- return require_dependency.createDependencySourceState({
319
- success: true,
320
- value
321
- }, pendingState[require_dependency.dependencyId]);
322
- } catch (error) {
323
- return {
324
- success: false,
325
- error: error instanceof WithDefaultError ? error.errorMessage : require_message.message`${require_message.text(String(error))}`
326
- };
327
- }
328
375
  if (typeof parser.shouldDeferCompletion === "function" && state != null && typeof state === "object") {
329
- const innerResult = require_mode_dispatch.dispatchByMode(parser.$mode, () => syncParser.complete(state, exec), () => parser.complete(state, exec));
376
+ const innerState = normalizeOptionalLikeInnerState(state, parser.initialState);
377
+ const innerResult = require_mode_dispatch.dispatchByMode(parser.$mode, () => syncParser.complete(innerState, exec), async () => await parser.complete(innerState, exec));
330
378
  return innerResult;
331
379
  }
332
380
  try {
@@ -342,52 +390,8 @@ function withDefault(parser, defaultValue, options) {
342
390
  };
343
391
  }
344
392
  }
345
- if (require_dependency.isPendingDependencySourceState(state[0])) {
346
- if (require_dependency.transformsDependencyValue(parser)) {
347
- const innerResult = require_mode_dispatch.dispatchByMode(parser.$mode, () => syncParser.complete(state, exec), () => parser.complete(state, exec));
348
- const handleInnerResult = (res) => {
349
- if (require_dependency.isDependencySourceState(res)) try {
350
- const value = evaluateDefault();
351
- return require_dependency.createDependencySourceState({
352
- success: true,
353
- value
354
- }, res[require_dependency.dependencyId]);
355
- } catch (error) {
356
- return {
357
- success: false,
358
- error: error instanceof WithDefaultError ? error.errorMessage : require_message.message`${require_message.text(String(error))}`
359
- };
360
- }
361
- try {
362
- const value = evaluateDefault();
363
- return {
364
- success: true,
365
- value
366
- };
367
- } catch (error) {
368
- return {
369
- success: false,
370
- error: error instanceof WithDefaultError ? error.errorMessage : require_message.message`${require_message.text(String(error))}`
371
- };
372
- }
373
- };
374
- return require_mode_dispatch.mapModeValue(parser.$mode, innerResult, handleInnerResult);
375
- }
376
- try {
377
- const value = evaluateDefault();
378
- return require_dependency.createDependencySourceState({
379
- success: true,
380
- value
381
- }, state[0][require_dependency.dependencyId]);
382
- } catch (error) {
383
- return {
384
- success: false,
385
- error: error instanceof WithDefaultError ? error.errorMessage : require_message.message`${require_message.text(String(error))}`
386
- };
387
- }
388
- }
389
- const innerElement = require_annotations.getAnnotations(state) != null && state[0] != null && typeof state[0] === "object" ? require_annotations.inheritAnnotations(state, state[0]) : state[0];
390
- return require_mode_dispatch.dispatchByMode(parser.$mode, () => syncParser.complete(innerElement, exec), () => parser.complete(innerElement, exec));
393
+ const innerElement = normalizeOptionalLikeInnerState(state, parser.initialState);
394
+ return require_mode_dispatch.dispatchByMode(parser.$mode, () => syncParser.complete(innerElement, exec), async () => await parser.complete(innerElement, exec));
391
395
  },
392
396
  suggest(context, prefix) {
393
397
  return require_mode_dispatch.dispatchIterableByMode(parser.$mode, () => suggestSync(context, prefix), () => suggestAsync(context, prefix));
@@ -561,15 +565,22 @@ function map(parser, transform) {
561
565
  };
562
566
  });
563
567
  };
564
- const dependencyMarkers = require_dependency.isWrappedDependencySource(parser) ? {
565
- [require_dependency.wrappedDependencySourceMarker]: parser[require_dependency.wrappedDependencySourceMarker],
566
- [require_dependency.transformsDependencyValueMarker]: true
567
- } : {};
568
568
  const mappedParser = {
569
569
  ...parser,
570
570
  $valueType: [],
571
571
  complete,
572
- ...dependencyMarkers,
572
+ getSuggestRuntimeNodes(state, path) {
573
+ if (mappedParser.dependencyMetadata?.source != null) return [{
574
+ path,
575
+ parser: mappedParser,
576
+ state
577
+ }];
578
+ return parser.getSuggestRuntimeNodes?.(state, path) ?? (parser.dependencyMetadata?.source != null ? [{
579
+ path,
580
+ parser,
581
+ state
582
+ }] : []);
583
+ },
573
584
  getDocFragments(state, _defaultValue) {
574
585
  return parser.getDocFragments(state, void 0);
575
586
  }
@@ -616,7 +627,7 @@ function map(parser, transform) {
616
627
  ...composed.derived,
617
628
  replayParse: (rawInput, depValues) => {
618
629
  const result = innerReplay(rawInput, depValues);
619
- return result instanceof Promise ? result.then(applyMappedReplay) : applyMappedReplay(result);
630
+ return isPromiseLike(result) ? result.then(applyMappedReplay) : applyMappedReplay(result);
620
631
  }
621
632
  }
622
633
  };
@@ -646,7 +657,9 @@ function multiple(parser, options = {}) {
646
657
  const unwrapInjectedWrapper = require_annotations.unwrapInjectedAnnotationWrapper;
647
658
  const completeSyncWithUnwrappedFallback = (state, exec) => {
648
659
  try {
649
- return syncParser.complete(state, exec);
660
+ const result = syncParser.complete(state, exec);
661
+ if (!result.success && require_annotations.isInjectedAnnotationWrapper(state)) return syncParser.complete(unwrapInjectedWrapper(state), exec);
662
+ return result;
650
663
  } catch (error) {
651
664
  if (!require_annotations.isInjectedAnnotationWrapper(state)) throw error;
652
665
  return syncParser.complete(unwrapInjectedWrapper(state), exec);
@@ -670,7 +683,9 @@ function multiple(parser, options = {}) {
670
683
  };
671
684
  const completeAsyncWithUnwrappedFallback = async (state, exec) => {
672
685
  try {
673
- return await parser.complete(state, exec);
686
+ const result = await parser.complete(state, exec);
687
+ if (!result.success && require_annotations.isInjectedAnnotationWrapper(state)) return await parser.complete(unwrapInjectedWrapper(state), exec);
688
+ return result;
674
689
  } catch (error) {
675
690
  if (!require_annotations.isInjectedAnnotationWrapper(state)) throw error;
676
691
  return await parser.complete(unwrapInjectedWrapper(state), exec);
@@ -692,56 +707,133 @@ function multiple(parser, options = {}) {
692
707
  });
693
708
  }
694
709
  };
710
+ const getInnerSuggestRuntimeNodes = (state, path) => parser.getSuggestRuntimeNodes?.(state, path) ?? (parser.dependencyMetadata?.source != null ? [{
711
+ path,
712
+ parser,
713
+ state
714
+ }] : []);
695
715
  const parseSync = (context) => {
696
- let added = context.state.length < 1;
697
- const currentItemStateWithAnnotations = context.state.at(-1) ?? require_annotations.inheritAnnotations(context.state, syncParser.initialState);
698
- let result = parseSyncWithUnwrappedFallback({
699
- ...context,
700
- state: currentItemStateWithAnnotations
701
- });
702
- if (!result.success) if (!added) {
716
+ const currentItemState = context.state.at(-1);
717
+ const canExtendCurrent = currentItemState != null && !isTerminalMultipleItemState(currentItemState);
718
+ const canOpenFreshItem = context.state.length < max;
719
+ if (!canExtendCurrent && !canOpenFreshItem) return {
720
+ success: true,
721
+ next: context,
722
+ consumed: []
723
+ };
724
+ let added = !canExtendCurrent;
725
+ let itemIndex = canExtendCurrent ? context.state.length - 1 : context.state.length;
726
+ const currentItemStateWithAnnotations = canExtendCurrent ? currentItemState : require_annotations.inheritAnnotations(context.state, syncParser.initialState);
727
+ let result = parseSyncWithUnwrappedFallback(withChildContext(context, itemIndex, currentItemStateWithAnnotations));
728
+ if (!result.success) if (!added && canOpenFreshItem && result.consumed === 0) {
703
729
  const nextInitialState = require_annotations.inheritAnnotations(context.state, syncParser.initialState);
704
- result = parseSyncWithUnwrappedFallback({
705
- ...context,
706
- state: nextInitialState
707
- });
730
+ itemIndex = context.state.length;
731
+ result = parseSyncWithUnwrappedFallback(withChildContext(context, itemIndex, nextInitialState));
708
732
  if (!result.success) return result;
709
733
  added = true;
710
734
  } else return result;
735
+ const mergedExec = mergeChildExec(context.exec, result.next.exec);
736
+ if (added && result.consumed.length === 0 && result.next.optionsTerminated === context.optionsTerminated && isUnstartedMultipleItemState(result.next.state, currentItemStateWithAnnotations)) return {
737
+ success: true,
738
+ next: {
739
+ ...result.next,
740
+ state: context.state,
741
+ ...mergedExec != null ? {
742
+ trace: mergedExec.trace,
743
+ exec: mergedExec,
744
+ dependencyRegistry: mergedExec.dependencyRegistry
745
+ } : {}
746
+ },
747
+ consumed: result.consumed
748
+ };
711
749
  const itemAnnotationSource = added ? context.state : currentItemStateWithAnnotations;
750
+ if (result.next.state === currentItemStateWithAnnotations && result.consumed.length > 0 && (!added || result.next.optionsTerminated !== context.optionsTerminated)) return {
751
+ success: true,
752
+ next: {
753
+ ...result.next,
754
+ state: context.state,
755
+ ...mergedExec != null ? {
756
+ trace: mergedExec.trace,
757
+ exec: mergedExec,
758
+ dependencyRegistry: mergedExec.dependencyRegistry
759
+ } : {}
760
+ },
761
+ consumed: result.consumed
762
+ };
712
763
  const nextItemState = require_annotations.inheritAnnotations(itemAnnotationSource, result.next.state);
713
764
  return {
714
765
  success: true,
715
766
  next: {
716
767
  ...result.next,
717
- state: require_annotations.annotateFreshArray(context.state, [...added ? context.state : context.state.slice(0, -1), nextItemState])
768
+ state: require_annotations.annotateFreshArray(context.state, [...added ? context.state : context.state.slice(0, -1), nextItemState]),
769
+ ...mergedExec != null ? {
770
+ trace: mergedExec.trace,
771
+ exec: mergedExec,
772
+ dependencyRegistry: mergedExec.dependencyRegistry
773
+ } : {}
718
774
  },
719
775
  consumed: result.consumed
720
776
  };
721
777
  };
722
778
  const parseAsync = async (context) => {
723
- let added = context.state.length < 1;
724
- const currentItemStateWithAnnotations = context.state.at(-1) ?? require_annotations.inheritAnnotations(context.state, parser.initialState);
725
- let result = await parseAsyncWithUnwrappedFallback({
726
- ...context,
727
- state: currentItemStateWithAnnotations
728
- });
729
- if (!result.success) if (!added) {
779
+ const currentItemState = context.state.at(-1);
780
+ const canExtendCurrent = currentItemState != null && !isTerminalMultipleItemState(currentItemState);
781
+ const canOpenFreshItem = context.state.length < max;
782
+ if (!canExtendCurrent && !canOpenFreshItem) return {
783
+ success: true,
784
+ next: context,
785
+ consumed: []
786
+ };
787
+ let added = !canExtendCurrent;
788
+ let itemIndex = canExtendCurrent ? context.state.length - 1 : context.state.length;
789
+ const currentItemStateWithAnnotations = canExtendCurrent ? currentItemState : require_annotations.inheritAnnotations(context.state, parser.initialState);
790
+ let result = await parseAsyncWithUnwrappedFallback(withChildContext(context, itemIndex, currentItemStateWithAnnotations));
791
+ if (!result.success) if (!added && canOpenFreshItem && result.consumed === 0) {
730
792
  const nextInitialState = require_annotations.inheritAnnotations(context.state, parser.initialState);
731
- result = await parseAsyncWithUnwrappedFallback({
732
- ...context,
733
- state: nextInitialState
734
- });
793
+ itemIndex = context.state.length;
794
+ result = await parseAsyncWithUnwrappedFallback(withChildContext(context, itemIndex, nextInitialState));
735
795
  if (!result.success) return result;
736
796
  added = true;
737
797
  } else return result;
798
+ const mergedExec = mergeChildExec(context.exec, result.next.exec);
799
+ if (added && result.consumed.length === 0 && result.next.optionsTerminated === context.optionsTerminated && isUnstartedMultipleItemState(result.next.state, currentItemStateWithAnnotations)) return {
800
+ success: true,
801
+ next: {
802
+ ...result.next,
803
+ state: context.state,
804
+ ...mergedExec != null ? {
805
+ trace: mergedExec.trace,
806
+ exec: mergedExec,
807
+ dependencyRegistry: mergedExec.dependencyRegistry
808
+ } : {}
809
+ },
810
+ consumed: result.consumed
811
+ };
738
812
  const itemAnnotationSource = added ? context.state : currentItemStateWithAnnotations;
813
+ if (result.next.state === currentItemStateWithAnnotations && result.consumed.length > 0 && (!added || result.next.optionsTerminated !== context.optionsTerminated)) return {
814
+ success: true,
815
+ next: {
816
+ ...result.next,
817
+ state: context.state,
818
+ ...mergedExec != null ? {
819
+ trace: mergedExec.trace,
820
+ exec: mergedExec,
821
+ dependencyRegistry: mergedExec.dependencyRegistry
822
+ } : {}
823
+ },
824
+ consumed: result.consumed
825
+ };
739
826
  const nextItemState = require_annotations.inheritAnnotations(itemAnnotationSource, result.next.state);
740
827
  return {
741
828
  success: true,
742
829
  next: {
743
830
  ...result.next,
744
- state: require_annotations.annotateFreshArray(context.state, [...added ? context.state : context.state.slice(0, -1), nextItemState])
831
+ state: require_annotations.annotateFreshArray(context.state, [...added ? context.state : context.state.slice(0, -1), nextItemState]),
832
+ ...mergedExec != null ? {
833
+ trace: mergedExec.trace,
834
+ exec: mergedExec,
835
+ dependencyRegistry: mergedExec.dependencyRegistry
836
+ } : {}
745
837
  },
746
838
  consumed: result.consumed
747
839
  };
@@ -759,6 +851,14 @@ function multiple(parser, options = {}) {
759
851
  leadingNames: parser.leadingNames,
760
852
  acceptingAnyToken: min > 0 && (parser.acceptingAnyToken ?? false),
761
853
  initialState: [],
854
+ getSuggestRuntimeNodes(state, path) {
855
+ const innerNodes = state.flatMap((item, i) => [...getInnerSuggestRuntimeNodes(item, [...path, i])]);
856
+ return resultParser.dependencyMetadata?.source != null ? [{
857
+ path,
858
+ parser: resultParser,
859
+ state
860
+ }, ...innerNodes] : innerNodes;
861
+ },
762
862
  parse(context) {
763
863
  return require_mode_dispatch.dispatchByMode(parser.$mode, () => parseSync(context), () => parseAsync(context));
764
864
  },
@@ -768,7 +868,7 @@ function multiple(parser, options = {}) {
768
868
  const deferredIndices = /* @__PURE__ */ new Map();
769
869
  let hasDeferred = false;
770
870
  for (let i = 0; i < state.length; i++) {
771
- const valueResult = completeSyncWithUnwrappedFallback(state[i], exec);
871
+ const valueResult = completeSyncWithUnwrappedFallback(state[i], withChildExecPath(exec, i));
772
872
  if (valueResult.success) {
773
873
  const unwrappedValue = unwrapInjectedWrapper(valueResult.value);
774
874
  result.push(unwrappedValue);
@@ -782,12 +882,11 @@ function multiple(parser, options = {}) {
782
882
  }
783
883
  return validateMultipleResult(result, deferredIndices, hasDeferred);
784
884
  }, async () => {
785
- const results = await Promise.all(state.map((s) => completeAsyncWithUnwrappedFallback(s, exec)));
786
885
  const values = [];
787
886
  const deferredIndices = /* @__PURE__ */ new Map();
788
887
  let hasDeferred = false;
789
- for (let i = 0; i < results.length; i++) {
790
- const valueResult = results[i];
888
+ for (let i = 0; i < state.length; i++) {
889
+ const valueResult = await completeAsyncWithUnwrappedFallback(state[i], withChildExecPath(exec, i));
791
890
  if (valueResult.success) {
792
891
  const unwrappedValue = unwrapInjectedWrapper(valueResult.value);
793
892
  values.push(unwrappedValue);
@@ -803,18 +902,33 @@ function multiple(parser, options = {}) {
803
902
  });
804
903
  },
805
904
  suggest(context, prefix) {
806
- const selectedValues = /* @__PURE__ */ new Set();
807
- const suggestInitialState = require_annotations.inheritAnnotations(context.state, parser.initialState);
905
+ const currentItemState = context.state.at(-1);
906
+ const canExtendCurrent = currentItemState != null && !isTerminalMultipleItemState(currentItemState);
907
+ const canOpenNew = context.state.length < max;
908
+ if (!canExtendCurrent && !canOpenNew) return require_mode_dispatch.dispatchIterableByMode(parser.$mode, function* () {}, async function* () {});
909
+ const itemIndex = canExtendCurrent ? context.state.length - 1 : context.state.length;
910
+ const suggestInitialState = canExtendCurrent ? currentItemState : require_annotations.inheritAnnotations(context.state, parser.initialState);
808
911
  const suggestFallbackState = unwrapInjectedWrapper(suggestInitialState);
809
912
  const hasSuggestFallbackState = suggestFallbackState !== suggestInitialState;
810
- for (const s of context.state) {
811
- const completed = completeSyncWithUnwrappedFallback(s);
812
- if (completed.success) {
813
- const valueStr = String(unwrapInjectedWrapper(completed.value));
814
- selectedValues.add(valueStr);
913
+ const collectSelectedValuesSync = () => {
914
+ const selectedValues = /* @__PURE__ */ new Set();
915
+ for (let i = 0; i < context.state.length; i++) {
916
+ const childContext = withChildContext(context, i, context.state[i]);
917
+ const completed = completeSyncWithUnwrappedFallback(childContext.state, childContext.exec);
918
+ if (completed.success) selectedValues.add(String(unwrapInjectedWrapper(completed.value)));
815
919
  }
816
- }
817
- const shouldInclude = (suggestion) => {
920
+ return selectedValues;
921
+ };
922
+ const collectSelectedValuesAsync = async () => {
923
+ const selectedValues = /* @__PURE__ */ new Set();
924
+ for (let i = 0; i < context.state.length; i++) {
925
+ const childContext = withChildContext(context, i, context.state[i]);
926
+ const completed = await completeAsyncWithUnwrappedFallback(childContext.state, childContext.exec);
927
+ if (completed.success) selectedValues.add(String(unwrapInjectedWrapper(completed.value)));
928
+ }
929
+ return selectedValues;
930
+ };
931
+ const shouldInclude = (selectedValues, suggestion) => {
818
932
  if (suggestion.kind === "literal") return !selectedValues.has(suggestion.text);
819
933
  return true;
820
934
  };
@@ -835,11 +949,12 @@ function multiple(parser, options = {}) {
835
949
  ]);
836
950
  };
837
951
  return require_mode_dispatch.dispatchIterableByMode(parser.$mode, function* () {
952
+ const selectedValues = collectSelectedValuesSync();
838
953
  const emitted = /* @__PURE__ */ new Set();
839
954
  const yieldUnique = function* (suggestions) {
840
955
  for (const s of suggestions) {
841
956
  const key = suggestionKey(s);
842
- if (shouldInclude(s) && !emitted.has(key)) {
957
+ if (shouldInclude(selectedValues, s) && !emitted.has(key)) {
843
958
  emitted.add(key);
844
959
  yield s;
845
960
  }
@@ -847,24 +962,19 @@ function multiple(parser, options = {}) {
847
962
  };
848
963
  let shouldTryFallback = false;
849
964
  try {
850
- yield* yieldUnique(syncParser.suggest({
851
- ...context,
852
- state: suggestInitialState
853
- }, prefix));
965
+ yield* yieldUnique(syncParser.suggest(withChildContext(context, itemIndex, suggestInitialState), prefix));
854
966
  } catch (error) {
855
967
  if (!hasSuggestFallbackState) throw error;
856
968
  shouldTryFallback = true;
857
969
  }
858
- if (shouldTryFallback) yield* yieldUnique(syncParser.suggest({
859
- ...context,
860
- state: suggestFallbackState
861
- }, prefix));
970
+ if (shouldTryFallback) yield* yieldUnique(syncParser.suggest(withChildContext(context, itemIndex, suggestFallbackState), prefix));
862
971
  }, async function* () {
972
+ const selectedValues = await collectSelectedValuesAsync();
863
973
  const emitted = /* @__PURE__ */ new Set();
864
974
  const yieldUnique = async function* (suggestions) {
865
975
  for await (const s of suggestions) {
866
976
  const key = suggestionKey(s);
867
- if (shouldInclude(s) && !emitted.has(key)) {
977
+ if (shouldInclude(selectedValues, s) && !emitted.has(key)) {
868
978
  emitted.add(key);
869
979
  yield s;
870
980
  }
@@ -872,18 +982,12 @@ function multiple(parser, options = {}) {
872
982
  };
873
983
  let shouldTryFallback = false;
874
984
  try {
875
- yield* yieldUnique(parser.suggest({
876
- ...context,
877
- state: suggestInitialState
878
- }, prefix));
985
+ yield* yieldUnique(parser.suggest(withChildContext(context, itemIndex, suggestInitialState), prefix));
879
986
  } catch (error) {
880
987
  if (!hasSuggestFallbackState) throw error;
881
988
  shouldTryFallback = true;
882
989
  }
883
- if (shouldTryFallback) yield* yieldUnique(parser.suggest({
884
- ...context,
885
- state: suggestFallbackState
886
- }, prefix));
990
+ if (shouldTryFallback) yield* yieldUnique(parser.suggest(withChildContext(context, itemIndex, suggestFallbackState), prefix));
887
991
  });
888
992
  },
889
993
  getDocFragments(state, defaultValue) {
@@ -951,6 +1055,33 @@ function multiple(parser, options = {}) {
951
1055
  enumerable: false
952
1056
  });
953
1057
  }
1058
+ if (parser.dependencyMetadata?.source != null) {
1059
+ const innerSource = parser.dependencyMetadata.source;
1060
+ Object.defineProperty(resultParser, "dependencyMetadata", {
1061
+ value: {
1062
+ ...parser.dependencyMetadata,
1063
+ source: {
1064
+ ...innerSource,
1065
+ preservesSourceValue: false,
1066
+ extractSourceValue: (state) => {
1067
+ if (!Array.isArray(state)) return innerSource.extractSourceValue(state);
1068
+ const scan = (index) => {
1069
+ for (let i = index; i >= 0; i--) {
1070
+ const result = innerSource.extractSourceValue(state[i]);
1071
+ if (result == null) continue;
1072
+ if (isPromiseLike(result)) return Promise.resolve(result).then((resolved) => resolved ?? scan(i - 1));
1073
+ return result;
1074
+ }
1075
+ return void 0;
1076
+ };
1077
+ return scan(state.length - 1);
1078
+ }
1079
+ }
1080
+ },
1081
+ configurable: true,
1082
+ enumerable: false
1083
+ });
1084
+ }
954
1085
  return resultParser;
955
1086
  }
956
1087
  /**
@@ -1019,6 +1150,13 @@ function nonEmpty(parser) {
1019
1150
  acceptingAnyToken: parser.acceptingAnyToken,
1020
1151
  initialState: parser.initialState,
1021
1152
  ...typeof parser.shouldDeferCompletion === "function" ? { shouldDeferCompletion: parser.shouldDeferCompletion.bind(parser) } : {},
1153
+ getSuggestRuntimeNodes(state, path) {
1154
+ return parser.getSuggestRuntimeNodes?.(state, path) ?? (parser.dependencyMetadata?.source != null ? [{
1155
+ path,
1156
+ parser,
1157
+ state
1158
+ }] : []);
1159
+ },
1022
1160
  parse(context) {
1023
1161
  return require_mode_dispatch.dispatchByMode(parser.$mode, () => parseSync(context), () => parseAsync(context));
1024
1162
  },