@optique/core 1.0.0-dev.1611 → 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.
- package/dist/constructs.cjs +937 -557
- package/dist/constructs.js +938 -558
- package/dist/dependency-metadata.cjs +12 -13
- package/dist/dependency-metadata.d.cts +7 -3
- package/dist/dependency-metadata.d.ts +7 -3
- package/dist/dependency-metadata.js +12 -13
- package/dist/dependency-runtime.cjs +372 -13
- package/dist/dependency-runtime.d.cts +28 -2
- package/dist/dependency-runtime.d.ts +28 -2
- package/dist/dependency-runtime.js +367 -14
- package/dist/dependency.cjs +158 -65
- package/dist/dependency.d.cts +34 -8
- package/dist/dependency.d.ts +34 -8
- package/dist/dependency.js +156 -66
- package/dist/facade.cjs +2 -2
- package/dist/facade.js +2 -2
- package/dist/index.cjs +6 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +4 -4
- package/dist/input-trace.cjs +56 -0
- package/dist/input-trace.d.cts +77 -0
- package/dist/input-trace.d.ts +77 -0
- package/dist/input-trace.js +55 -0
- package/dist/modifiers.cjs +320 -182
- package/dist/modifiers.js +320 -182
- package/dist/parser.cjs +106 -12
- package/dist/parser.d.cts +87 -5
- package/dist/parser.d.ts +87 -5
- package/dist/parser.js +105 -13
- package/dist/primitives.cjs +293 -163
- package/dist/primitives.d.cts +2 -8
- package/dist/primitives.d.ts +2 -8
- package/dist/primitives.js +294 -164
- package/package.json +1 -1
package/dist/constructs.cjs
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
const require_annotations = require('./annotations.cjs');
|
|
2
2
|
const require_message = require('./message.cjs');
|
|
3
3
|
const require_dependency = require('./dependency.cjs');
|
|
4
|
-
const require_dependency_runtime = require('./dependency-runtime.cjs');
|
|
5
|
-
const require_mode_dispatch = require('./mode-dispatch.cjs');
|
|
6
4
|
const require_validate = require('./validate.cjs');
|
|
7
5
|
const require_usage = require('./usage.cjs');
|
|
8
6
|
const require_doc = require('./doc.cjs');
|
|
7
|
+
const require_mode_dispatch = require('./mode-dispatch.cjs');
|
|
9
8
|
const require_suggestion = require('./suggestion.cjs');
|
|
10
9
|
const require_usage_internals = require('./usage-internals.cjs');
|
|
10
|
+
const require_parser = require('./parser.cjs');
|
|
11
|
+
const require_dependency_runtime = require('./dependency-runtime.cjs');
|
|
11
12
|
|
|
12
13
|
//#region src/constructs.ts
|
|
13
14
|
/**
|
|
@@ -15,6 +16,59 @@ const require_usage_internals = require('./usage-internals.cjs');
|
|
|
15
16
|
* do not match any specific name at the first buffer position.
|
|
16
17
|
*/
|
|
17
18
|
const EMPTY_LEADING_NAMES = /* @__PURE__ */ new Set();
|
|
19
|
+
function isNonCliBoundSourceState(state, parser) {
|
|
20
|
+
return parser[require_parser.unmatchedNonCliDependencySourceStateMarker] === true && state != null && typeof state === "object" && Object.hasOwn(state, "hasCliValue") && state.hasCliValue === false;
|
|
21
|
+
}
|
|
22
|
+
function withChildExecPath(exec, segment) {
|
|
23
|
+
if (exec == null) return void 0;
|
|
24
|
+
return {
|
|
25
|
+
...exec,
|
|
26
|
+
path: [...exec.path ?? [], segment]
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function mergeChildExec(parent, child) {
|
|
30
|
+
if (parent == null) return child;
|
|
31
|
+
if (child == null) return parent;
|
|
32
|
+
return {
|
|
33
|
+
...parent,
|
|
34
|
+
trace: child.trace ?? parent.trace,
|
|
35
|
+
dependencyRuntime: child.dependencyRuntime ?? parent.dependencyRuntime,
|
|
36
|
+
dependencyRegistry: child.dependencyRegistry ?? parent.dependencyRegistry,
|
|
37
|
+
preCompletedByParser: child.preCompletedByParser ?? parent.preCompletedByParser,
|
|
38
|
+
excludedSourceFields: child.excludedSourceFields ?? parent.excludedSourceFields
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function withChildContext(context, segment, state, usage) {
|
|
42
|
+
const exec = withChildExecPath(context.exec, segment);
|
|
43
|
+
const dependencyRegistry = context.dependencyRegistry ?? exec?.dependencyRegistry;
|
|
44
|
+
return {
|
|
45
|
+
...context,
|
|
46
|
+
state,
|
|
47
|
+
...usage != null ? { usage } : {},
|
|
48
|
+
...exec != null ? {
|
|
49
|
+
exec: dependencyRegistry === exec.dependencyRegistry ? exec : {
|
|
50
|
+
...exec,
|
|
51
|
+
dependencyRegistry
|
|
52
|
+
},
|
|
53
|
+
dependencyRegistry
|
|
54
|
+
} : {}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function isUnmatchedDependencyState(state, parser) {
|
|
58
|
+
if (state === void 0) return true;
|
|
59
|
+
if (Array.isArray(state) && state.length === 1 && require_dependency.isPendingDependencySourceState(state[0])) return true;
|
|
60
|
+
if (require_dependency.isPendingDependencySourceState(state)) return true;
|
|
61
|
+
if (isNonCliBoundSourceState(state, parser)) return true;
|
|
62
|
+
return state === parser.initialState;
|
|
63
|
+
}
|
|
64
|
+
function filterPreCompletedRuntimeNodes(nodes, preCompletedKeys) {
|
|
65
|
+
if (preCompletedKeys.size < 1) return nodes;
|
|
66
|
+
return nodes.filter((node) => {
|
|
67
|
+
const segment = node.path.at(-1);
|
|
68
|
+
if (typeof segment === "number") return !preCompletedKeys.has(String(segment));
|
|
69
|
+
return segment == null || !preCompletedKeys.has(segment);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
18
72
|
/**
|
|
19
73
|
* Computes the union of `leadingNames` from all given parsers.
|
|
20
74
|
* Used for alternative combinators (`or()`, `longestMatch()`) where all
|
|
@@ -93,8 +147,12 @@ function prepareStateForCompletion(fieldState, parser) {
|
|
|
93
147
|
*/
|
|
94
148
|
function getAnnotatedFieldState(parentState, field, parser) {
|
|
95
149
|
const sourceState = parentState != null && typeof parentState === "object" && field in parentState ? parentState[field] : parser.initialState;
|
|
96
|
-
if (sourceState == null || typeof sourceState !== "object") return sourceState;
|
|
97
150
|
const annotations = require_annotations.getAnnotations(parentState);
|
|
151
|
+
if (sourceState == null) {
|
|
152
|
+
if (annotations !== void 0 && Reflect.get(parser, inheritParentAnnotationsKey) === true) return require_annotations.injectAnnotations({}, annotations);
|
|
153
|
+
return sourceState;
|
|
154
|
+
}
|
|
155
|
+
if (typeof sourceState !== "object") return sourceState;
|
|
98
156
|
if (annotations === void 0 || require_annotations.getAnnotations(sourceState) === annotations) return sourceState;
|
|
99
157
|
return Reflect.get(parser, inheritParentAnnotationsKey) === true ? require_annotations.injectAnnotations(sourceState, annotations) : require_annotations.inheritAnnotations(parentState, sourceState);
|
|
100
158
|
}
|
|
@@ -304,8 +362,8 @@ function createExclusiveComplete(parsers, options, noMatchContext, mode) {
|
|
|
304
362
|
success: false,
|
|
305
363
|
error: result.error
|
|
306
364
|
};
|
|
307
|
-
return require_mode_dispatch.dispatchByMode(mode, () => syncParsers[i].complete(result.next.state, exec), async () => {
|
|
308
|
-
const completeResult = await parsers[i].complete(result.next.state, exec);
|
|
365
|
+
return require_mode_dispatch.dispatchByMode(mode, () => syncParsers[i].complete(result.next.state, withChildExecPath(exec, i)), async () => {
|
|
366
|
+
const completeResult = await parsers[i].complete(result.next.state, withChildExecPath(exec, i));
|
|
309
367
|
return completeResult;
|
|
310
368
|
});
|
|
311
369
|
};
|
|
@@ -319,31 +377,24 @@ function createExclusiveSuggest(parsers, mode) {
|
|
|
319
377
|
return (context, prefix) => {
|
|
320
378
|
return require_mode_dispatch.dispatchIterableByMode(mode, function* () {
|
|
321
379
|
const suggestions = [];
|
|
322
|
-
if (context.state == null) for (
|
|
323
|
-
const
|
|
324
|
-
|
|
325
|
-
state: parser.initialState
|
|
326
|
-
}, prefix);
|
|
380
|
+
if (context.state == null) for (let i = 0; i < syncParsers.length; i++) {
|
|
381
|
+
const parser = syncParsers[i];
|
|
382
|
+
const parserSuggestions = parser.suggest(withChildContext(context, i, parser.initialState), prefix);
|
|
327
383
|
suggestions.push(...parserSuggestions);
|
|
328
384
|
}
|
|
329
385
|
else {
|
|
330
386
|
const [index, parserResult] = context.state;
|
|
331
387
|
if (parserResult.success) {
|
|
332
|
-
const parserSuggestions = syncParsers[index].suggest(
|
|
333
|
-
...context,
|
|
334
|
-
state: parserResult.next.state
|
|
335
|
-
}, prefix);
|
|
388
|
+
const parserSuggestions = syncParsers[index].suggest(withChildContext(context, index, parserResult.next.state), prefix);
|
|
336
389
|
suggestions.push(...parserSuggestions);
|
|
337
390
|
}
|
|
338
391
|
}
|
|
339
392
|
yield* require_suggestion.deduplicateSuggestions(suggestions);
|
|
340
393
|
}, async function* () {
|
|
341
394
|
const suggestions = [];
|
|
342
|
-
if (context.state == null) for (
|
|
343
|
-
const
|
|
344
|
-
|
|
345
|
-
state: parser.initialState
|
|
346
|
-
}, prefix);
|
|
395
|
+
if (context.state == null) for (let i = 0; i < parsers.length; i++) {
|
|
396
|
+
const parser = parsers[i];
|
|
397
|
+
const parserSuggestions = parser.suggest(withChildContext(context, i, parser.initialState), prefix);
|
|
347
398
|
if (parser.$mode === "async") for await (const s of parserSuggestions) suggestions.push(s);
|
|
348
399
|
else suggestions.push(...parserSuggestions);
|
|
349
400
|
}
|
|
@@ -351,10 +402,7 @@ function createExclusiveSuggest(parsers, mode) {
|
|
|
351
402
|
const [index, parserResult] = context.state;
|
|
352
403
|
if (parserResult.success) {
|
|
353
404
|
const parser = parsers[index];
|
|
354
|
-
const parserSuggestions = parser.suggest(
|
|
355
|
-
...context,
|
|
356
|
-
state: parserResult.next.state
|
|
357
|
-
}, prefix);
|
|
405
|
+
const parserSuggestions = parser.suggest(withChildContext(context, index, parserResult.next.state), prefix);
|
|
358
406
|
if (parser.$mode === "async") for await (const s of parserSuggestions) suggestions.push(s);
|
|
359
407
|
else suggestions.push(...parserSuggestions);
|
|
360
408
|
}
|
|
@@ -363,6 +411,13 @@ function createExclusiveSuggest(parsers, mode) {
|
|
|
363
411
|
});
|
|
364
412
|
};
|
|
365
413
|
}
|
|
414
|
+
function getExclusiveSuggestRuntimeNodes(parsers, state, path) {
|
|
415
|
+
if (!Array.isArray(state) || state.length !== 2 || typeof state[0] !== "number") return [];
|
|
416
|
+
const [index, parserResult] = state;
|
|
417
|
+
if (!parserResult?.success || index < 0 || index >= parsers.length) return [];
|
|
418
|
+
const parser = parsers[index];
|
|
419
|
+
return require_parser.getParserSuggestRuntimeNodes(parser, parserResult.next.state, [...path, index]);
|
|
420
|
+
}
|
|
366
421
|
/**
|
|
367
422
|
* Gets the no-match error, either from custom options or default.
|
|
368
423
|
* Shared by or() and longestMatch().
|
|
@@ -372,6 +427,26 @@ function getNoMatchError(options, noMatchContext) {
|
|
|
372
427
|
const customNoMatch = options?.errors?.noMatch;
|
|
373
428
|
return customNoMatch ? typeof customNoMatch === "function" ? customNoMatch(noMatchContext) : customNoMatch : generateNoMatchError(noMatchContext);
|
|
374
429
|
}
|
|
430
|
+
function composeExclusiveDependencyMetadata(parsers) {
|
|
431
|
+
const sourceBranches = parsers.filter((parser) => parser.dependencyMetadata?.source != null);
|
|
432
|
+
if (sourceBranches.length < 1) return void 0;
|
|
433
|
+
const sourceIds = new Set(sourceBranches.map((parser) => parser.dependencyMetadata.source.sourceId));
|
|
434
|
+
if (sourceIds.size !== 1) return void 0;
|
|
435
|
+
const sharedSource = sourceBranches[0].dependencyMetadata.source;
|
|
436
|
+
return { source: {
|
|
437
|
+
...sharedSource,
|
|
438
|
+
getMissingSourceValue: void 0,
|
|
439
|
+
preservesSourceValue: sourceBranches.every((parser) => parser.dependencyMetadata?.source?.preservesSourceValue !== false),
|
|
440
|
+
extractSourceValue(state) {
|
|
441
|
+
if (!Array.isArray(state) || state.length !== 2 || typeof state[0] !== "number") return void 0;
|
|
442
|
+
const [index, parserResult] = state;
|
|
443
|
+
if (!parserResult?.success) return void 0;
|
|
444
|
+
const branchSource = parsers[index].dependencyMetadata?.source;
|
|
445
|
+
if (branchSource?.extractSourceValue == null) return void 0;
|
|
446
|
+
return branchSource.extractSourceValue(parserResult.next.state);
|
|
447
|
+
}
|
|
448
|
+
} };
|
|
449
|
+
}
|
|
375
450
|
/**
|
|
376
451
|
* @since 0.5.0
|
|
377
452
|
*/
|
|
@@ -404,17 +479,13 @@ function or(...args) {
|
|
|
404
479
|
const orderedParsers = syncParsers.map((p, i) => [p, i]);
|
|
405
480
|
orderedParsers.sort(([_, a], [__, b]) => context.state?.[0] === a ? -1 : context.state?.[0] === b ? 1 : a - b);
|
|
406
481
|
for (const [parser, i] of orderedParsers) {
|
|
407
|
-
const result = parser.parse(
|
|
408
|
-
...context,
|
|
409
|
-
state: context.state == null || context.state[0] !== i || !context.state[1].success ? parser.initialState : context.state[1].next.state
|
|
410
|
-
});
|
|
482
|
+
const result = parser.parse(withChildContext(context, i, context.state == null || context.state[0] !== i || !context.state[1].success ? parser.initialState : context.state[1].next.state));
|
|
411
483
|
if (result.success && result.consumed.length > 0) {
|
|
412
484
|
if (context.state?.[0] !== i && context.state?.[1].success) {
|
|
413
485
|
const previouslyConsumed = context.state[1].consumed;
|
|
414
486
|
const checkResult = parser.parse({
|
|
415
|
-
...context,
|
|
416
|
-
buffer: previouslyConsumed
|
|
417
|
-
state: parser.initialState
|
|
487
|
+
...withChildContext(context, i, parser.initialState),
|
|
488
|
+
buffer: previouslyConsumed
|
|
418
489
|
});
|
|
419
490
|
const canConsumeShared = checkResult.success && checkResult.consumed.length === previouslyConsumed.length && checkResult.consumed.every((c, idx) => c === previouslyConsumed[idx]);
|
|
420
491
|
if (!canConsumeShared) return {
|
|
@@ -422,11 +493,19 @@ function or(...args) {
|
|
|
422
493
|
consumed: context.buffer.length - result.next.buffer.length,
|
|
423
494
|
error: require_message.message`${require_message.values(context.state[1].consumed)} and ${require_message.values(result.consumed)} cannot be used together.`
|
|
424
495
|
};
|
|
496
|
+
const replayExec = mergeChildExec(context.exec, checkResult.next.exec);
|
|
425
497
|
const replayedResult = parser.parse({
|
|
426
|
-
...
|
|
498
|
+
...withChildContext({
|
|
499
|
+
...context,
|
|
500
|
+
...replayExec != null ? {
|
|
501
|
+
exec: replayExec,
|
|
502
|
+
dependencyRegistry: replayExec.dependencyRegistry
|
|
503
|
+
} : {}
|
|
504
|
+
}, i, checkResult.next.state),
|
|
427
505
|
state: checkResult.next.state
|
|
428
506
|
});
|
|
429
507
|
if (!replayedResult.success) return replayedResult;
|
|
508
|
+
const mergedExec$1 = mergeChildExec(replayExec, replayedResult.next.exec);
|
|
430
509
|
return {
|
|
431
510
|
success: true,
|
|
432
511
|
next: {
|
|
@@ -436,18 +515,27 @@ function or(...args) {
|
|
|
436
515
|
state: [i, {
|
|
437
516
|
...replayedResult,
|
|
438
517
|
consumed: [...previouslyConsumed, ...replayedResult.consumed]
|
|
439
|
-
}]
|
|
518
|
+
}],
|
|
519
|
+
...mergedExec$1 != null ? {
|
|
520
|
+
exec: mergedExec$1,
|
|
521
|
+
dependencyRegistry: mergedExec$1.dependencyRegistry
|
|
522
|
+
} : {}
|
|
440
523
|
},
|
|
441
524
|
consumed: replayedResult.consumed
|
|
442
525
|
};
|
|
443
526
|
}
|
|
527
|
+
const mergedExec = mergeChildExec(context.exec, result.next.exec);
|
|
444
528
|
return {
|
|
445
529
|
success: true,
|
|
446
530
|
next: {
|
|
447
531
|
...context,
|
|
448
532
|
buffer: result.next.buffer,
|
|
449
533
|
optionsTerminated: result.next.optionsTerminated,
|
|
450
|
-
state: [i, result]
|
|
534
|
+
state: [i, result],
|
|
535
|
+
...mergedExec != null ? {
|
|
536
|
+
exec: mergedExec,
|
|
537
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
538
|
+
} : {}
|
|
451
539
|
},
|
|
452
540
|
consumed: result.consumed
|
|
453
541
|
};
|
|
@@ -463,18 +551,14 @@ function or(...args) {
|
|
|
463
551
|
const orderedParsers = parsers.map((p, i) => [p, i]);
|
|
464
552
|
orderedParsers.sort(([_, a], [__, b]) => context.state?.[0] === a ? -1 : context.state?.[0] === b ? 1 : a - b);
|
|
465
553
|
for (const [parser, i] of orderedParsers) {
|
|
466
|
-
const resultOrPromise = parser.parse(
|
|
467
|
-
...context,
|
|
468
|
-
state: context.state == null || context.state[0] !== i || !context.state[1].success ? parser.initialState : context.state[1].next.state
|
|
469
|
-
});
|
|
554
|
+
const resultOrPromise = parser.parse(withChildContext(context, i, context.state == null || context.state[0] !== i || !context.state[1].success ? parser.initialState : context.state[1].next.state));
|
|
470
555
|
const result = await resultOrPromise;
|
|
471
556
|
if (result.success && result.consumed.length > 0) {
|
|
472
557
|
if (context.state?.[0] !== i && context.state?.[1].success) {
|
|
473
558
|
const previouslyConsumed = context.state[1].consumed;
|
|
474
559
|
const checkResultOrPromise = parser.parse({
|
|
475
|
-
...context,
|
|
476
|
-
buffer: previouslyConsumed
|
|
477
|
-
state: parser.initialState
|
|
560
|
+
...withChildContext(context, i, parser.initialState),
|
|
561
|
+
buffer: previouslyConsumed
|
|
478
562
|
});
|
|
479
563
|
const checkResult = await checkResultOrPromise;
|
|
480
564
|
const canConsumeShared = checkResult.success && checkResult.consumed.length === previouslyConsumed.length && checkResult.consumed.every((c, idx) => c === previouslyConsumed[idx]);
|
|
@@ -483,12 +567,17 @@ function or(...args) {
|
|
|
483
567
|
consumed: context.buffer.length - result.next.buffer.length,
|
|
484
568
|
error: require_message.message`${require_message.values(context.state[1].consumed)} and ${require_message.values(result.consumed)} cannot be used together.`
|
|
485
569
|
};
|
|
486
|
-
const
|
|
570
|
+
const replayExec = mergeChildExec(context.exec, checkResult.next.exec);
|
|
571
|
+
const replayedResultOrPromise = parser.parse({ ...withChildContext({
|
|
487
572
|
...context,
|
|
488
|
-
|
|
489
|
-
|
|
573
|
+
...replayExec != null ? {
|
|
574
|
+
exec: replayExec,
|
|
575
|
+
dependencyRegistry: replayExec.dependencyRegistry
|
|
576
|
+
} : {}
|
|
577
|
+
}, i, checkResult.next.state) });
|
|
490
578
|
const replayedResult = await replayedResultOrPromise;
|
|
491
579
|
if (!replayedResult.success) return replayedResult;
|
|
580
|
+
const mergedExec$1 = mergeChildExec(replayExec, replayedResult.next.exec);
|
|
492
581
|
return {
|
|
493
582
|
success: true,
|
|
494
583
|
next: {
|
|
@@ -498,18 +587,27 @@ function or(...args) {
|
|
|
498
587
|
state: [i, {
|
|
499
588
|
...replayedResult,
|
|
500
589
|
consumed: [...previouslyConsumed, ...replayedResult.consumed]
|
|
501
|
-
}]
|
|
590
|
+
}],
|
|
591
|
+
...mergedExec$1 != null ? {
|
|
592
|
+
exec: mergedExec$1,
|
|
593
|
+
dependencyRegistry: mergedExec$1.dependencyRegistry
|
|
594
|
+
} : {}
|
|
502
595
|
},
|
|
503
596
|
consumed: replayedResult.consumed
|
|
504
597
|
};
|
|
505
598
|
}
|
|
599
|
+
const mergedExec = mergeChildExec(context.exec, result.next.exec);
|
|
506
600
|
return {
|
|
507
601
|
success: true,
|
|
508
602
|
next: {
|
|
509
603
|
...context,
|
|
510
604
|
buffer: result.next.buffer,
|
|
511
605
|
optionsTerminated: result.next.optionsTerminated,
|
|
512
|
-
state: [i, result]
|
|
606
|
+
state: [i, result],
|
|
607
|
+
...mergedExec != null ? {
|
|
608
|
+
exec: mergedExec,
|
|
609
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
610
|
+
} : {}
|
|
513
611
|
},
|
|
514
612
|
consumed: result.consumed
|
|
515
613
|
};
|
|
@@ -536,6 +634,9 @@ function or(...args) {
|
|
|
536
634
|
parse(context) {
|
|
537
635
|
return require_mode_dispatch.dispatchByMode(combinedMode, () => parseSync(context), () => parseAsync(context));
|
|
538
636
|
},
|
|
637
|
+
getSuggestRuntimeNodes(state, path) {
|
|
638
|
+
return getExclusiveSuggestRuntimeNodes(parsers, state, path);
|
|
639
|
+
},
|
|
539
640
|
suggest: createExclusiveSuggest(parsers, combinedMode),
|
|
540
641
|
getDocFragments(state, _defaultValue) {
|
|
541
642
|
let brief;
|
|
@@ -564,6 +665,8 @@ function or(...args) {
|
|
|
564
665
|
};
|
|
565
666
|
}
|
|
566
667
|
};
|
|
668
|
+
const singleDependencyMetadata = composeExclusiveDependencyMetadata(parsers);
|
|
669
|
+
if (singleDependencyMetadata != null) singleResult.dependencyMetadata = singleDependencyMetadata;
|
|
567
670
|
return singleResult;
|
|
568
671
|
}
|
|
569
672
|
/**
|
|
@@ -598,10 +701,7 @@ function longestMatch(...args) {
|
|
|
598
701
|
let error = getInitialError(context);
|
|
599
702
|
for (let i = 0; i < syncParsers.length; i++) {
|
|
600
703
|
const parser = syncParsers[i];
|
|
601
|
-
const result = parser.parse(
|
|
602
|
-
...context,
|
|
603
|
-
state: context.state == null || context.state[0] !== i || !context.state[1].success ? parser.initialState : context.state[1].next.state
|
|
604
|
-
});
|
|
704
|
+
const result = parser.parse(withChildContext(context, i, context.state == null || context.state[0] !== i || !context.state[1].success ? parser.initialState : context.state[1].next.state));
|
|
605
705
|
if (result.success) {
|
|
606
706
|
const consumed = context.buffer.length - result.next.buffer.length;
|
|
607
707
|
if (bestMatch === null || consumed > bestMatch.consumed) bestMatch = {
|
|
@@ -611,16 +711,23 @@ function longestMatch(...args) {
|
|
|
611
711
|
};
|
|
612
712
|
} else if (error.consumed < result.consumed) error = result;
|
|
613
713
|
}
|
|
614
|
-
if (bestMatch && bestMatch.result.success)
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
714
|
+
if (bestMatch && bestMatch.result.success) {
|
|
715
|
+
const mergedExec = mergeChildExec(context.exec, bestMatch.result.next.exec);
|
|
716
|
+
return {
|
|
717
|
+
success: true,
|
|
718
|
+
next: {
|
|
719
|
+
...context,
|
|
720
|
+
buffer: bestMatch.result.next.buffer,
|
|
721
|
+
optionsTerminated: bestMatch.result.next.optionsTerminated,
|
|
722
|
+
state: [bestMatch.index, bestMatch.result],
|
|
723
|
+
...mergedExec != null ? {
|
|
724
|
+
exec: mergedExec,
|
|
725
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
726
|
+
} : {}
|
|
727
|
+
},
|
|
728
|
+
consumed: bestMatch.result.consumed
|
|
729
|
+
};
|
|
730
|
+
}
|
|
624
731
|
return {
|
|
625
732
|
...error,
|
|
626
733
|
success: false
|
|
@@ -631,10 +738,7 @@ function longestMatch(...args) {
|
|
|
631
738
|
let error = getInitialError(context);
|
|
632
739
|
for (let i = 0; i < parsers.length; i++) {
|
|
633
740
|
const parser = parsers[i];
|
|
634
|
-
const resultOrPromise = parser.parse(
|
|
635
|
-
...context,
|
|
636
|
-
state: context.state == null || context.state[0] !== i || !context.state[1].success ? parser.initialState : context.state[1].next.state
|
|
637
|
-
});
|
|
741
|
+
const resultOrPromise = parser.parse(withChildContext(context, i, context.state == null || context.state[0] !== i || !context.state[1].success ? parser.initialState : context.state[1].next.state));
|
|
638
742
|
const result = await resultOrPromise;
|
|
639
743
|
if (result.success) {
|
|
640
744
|
const consumed = context.buffer.length - result.next.buffer.length;
|
|
@@ -645,16 +749,23 @@ function longestMatch(...args) {
|
|
|
645
749
|
};
|
|
646
750
|
} else if (error.consumed < result.consumed) error = result;
|
|
647
751
|
}
|
|
648
|
-
if (bestMatch && bestMatch.result.success)
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
752
|
+
if (bestMatch && bestMatch.result.success) {
|
|
753
|
+
const mergedExec = mergeChildExec(context.exec, bestMatch.result.next.exec);
|
|
754
|
+
return {
|
|
755
|
+
success: true,
|
|
756
|
+
next: {
|
|
757
|
+
...context,
|
|
758
|
+
buffer: bestMatch.result.next.buffer,
|
|
759
|
+
optionsTerminated: bestMatch.result.next.optionsTerminated,
|
|
760
|
+
state: [bestMatch.index, bestMatch.result],
|
|
761
|
+
...mergedExec != null ? {
|
|
762
|
+
exec: mergedExec,
|
|
763
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
764
|
+
} : {}
|
|
765
|
+
},
|
|
766
|
+
consumed: bestMatch.result.consumed
|
|
767
|
+
};
|
|
768
|
+
}
|
|
658
769
|
return {
|
|
659
770
|
...error,
|
|
660
771
|
success: false
|
|
@@ -676,6 +787,9 @@ function longestMatch(...args) {
|
|
|
676
787
|
parse(context) {
|
|
677
788
|
return require_mode_dispatch.dispatchByMode(combinedMode, () => parseSync(context), () => parseAsync(context));
|
|
678
789
|
},
|
|
790
|
+
getSuggestRuntimeNodes(state, path) {
|
|
791
|
+
return getExclusiveSuggestRuntimeNodes(parsers, state, path);
|
|
792
|
+
},
|
|
679
793
|
suggest: createExclusiveSuggest(parsers, combinedMode),
|
|
680
794
|
getDocFragments(state, _defaultValue) {
|
|
681
795
|
let brief;
|
|
@@ -711,6 +825,8 @@ function longestMatch(...args) {
|
|
|
711
825
|
};
|
|
712
826
|
}
|
|
713
827
|
};
|
|
828
|
+
const multiDependencyMetadata = composeExclusiveDependencyMetadata(parsers);
|
|
829
|
+
if (multiDependencyMetadata != null) multiResult.dependencyMetadata = multiDependencyMetadata;
|
|
714
830
|
return multiResult;
|
|
715
831
|
}
|
|
716
832
|
/**
|
|
@@ -719,32 +835,32 @@ function longestMatch(...args) {
|
|
|
719
835
|
*/
|
|
720
836
|
function* suggestObjectSync(context, prefix, parserPairs) {
|
|
721
837
|
const runtime = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
|
|
722
|
-
const
|
|
838
|
+
const sourceParserPairs = filterExcludedFieldParsers(parserPairs, context.exec?.excludedSourceFields);
|
|
839
|
+
const nodes = require_dependency_runtime.buildRuntimeNodesFromPairs(sourceParserPairs, context.state && typeof context.state === "object" ? context.state : {}, context.exec?.path);
|
|
723
840
|
require_dependency_runtime.collectExplicitSourceValues(nodes, runtime);
|
|
724
|
-
if (context.state && typeof context.state === "object") require_dependency_runtime.collectSourcesFromState(context.state, runtime);
|
|
725
|
-
completeDependencySourceDefaults(context,
|
|
841
|
+
if (context.state && typeof context.state === "object") require_dependency_runtime.collectSourcesFromState(context.state, runtime, /* @__PURE__ */ new WeakSet(), context.exec?.excludedSourceFields);
|
|
842
|
+
completeDependencySourceDefaults(context, sourceParserPairs, runtime.registry, context.exec);
|
|
726
843
|
const contextWithRegistry = {
|
|
727
844
|
...context,
|
|
728
|
-
dependencyRegistry: runtime.registry
|
|
845
|
+
dependencyRegistry: runtime.registry,
|
|
846
|
+
...context.exec != null ? { exec: {
|
|
847
|
+
...context.exec,
|
|
848
|
+
dependencyRuntime: runtime,
|
|
849
|
+
dependencyRegistry: runtime.registry
|
|
850
|
+
} } : {}
|
|
729
851
|
};
|
|
730
852
|
if (context.buffer.length > 0) {
|
|
731
853
|
const lastToken = context.buffer[context.buffer.length - 1];
|
|
732
854
|
for (const [field, parser] of parserPairs) if (isOptionRequiringValue(parser.usage, lastToken)) {
|
|
733
855
|
const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
|
|
734
|
-
yield* parser.suggest(
|
|
735
|
-
...contextWithRegistry,
|
|
736
|
-
state: fieldState
|
|
737
|
-
}, prefix);
|
|
856
|
+
yield* parser.suggest(withChildContext(contextWithRegistry, field, fieldState), prefix);
|
|
738
857
|
return;
|
|
739
858
|
}
|
|
740
859
|
}
|
|
741
860
|
const suggestions = [];
|
|
742
861
|
for (const [field, parser] of parserPairs) {
|
|
743
862
|
const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
|
|
744
|
-
const fieldSuggestions = parser.suggest(
|
|
745
|
-
...contextWithRegistry,
|
|
746
|
-
state: fieldState
|
|
747
|
-
}, prefix);
|
|
863
|
+
const fieldSuggestions = parser.suggest(withChildContext(contextWithRegistry, field, fieldState), prefix);
|
|
748
864
|
suggestions.push(...fieldSuggestions);
|
|
749
865
|
}
|
|
750
866
|
yield* require_suggestion.deduplicateSuggestions(suggestions);
|
|
@@ -755,22 +871,25 @@ function* suggestObjectSync(context, prefix, parserPairs) {
|
|
|
755
871
|
*/
|
|
756
872
|
async function* suggestObjectAsync(context, prefix, parserPairs) {
|
|
757
873
|
const runtime = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
|
|
758
|
-
const
|
|
759
|
-
require_dependency_runtime.
|
|
760
|
-
|
|
761
|
-
|
|
874
|
+
const sourceParserPairs = filterExcludedFieldParsers(parserPairs, context.exec?.excludedSourceFields);
|
|
875
|
+
const nodes = require_dependency_runtime.buildRuntimeNodesFromPairs(sourceParserPairs, context.state && typeof context.state === "object" ? context.state : {}, context.exec?.path);
|
|
876
|
+
await require_dependency_runtime.collectExplicitSourceValuesAsync(nodes, runtime);
|
|
877
|
+
if (context.state && typeof context.state === "object") require_dependency_runtime.collectSourcesFromState(context.state, runtime, /* @__PURE__ */ new WeakSet(), context.exec?.excludedSourceFields);
|
|
878
|
+
await completeDependencySourceDefaultsAsync(context, sourceParserPairs, runtime.registry, context.exec);
|
|
762
879
|
const contextWithRegistry = {
|
|
763
880
|
...context,
|
|
764
|
-
dependencyRegistry: runtime.registry
|
|
881
|
+
dependencyRegistry: runtime.registry,
|
|
882
|
+
...context.exec != null ? { exec: {
|
|
883
|
+
...context.exec,
|
|
884
|
+
dependencyRuntime: runtime,
|
|
885
|
+
dependencyRegistry: runtime.registry
|
|
886
|
+
} } : {}
|
|
765
887
|
};
|
|
766
888
|
if (context.buffer.length > 0) {
|
|
767
889
|
const lastToken = context.buffer[context.buffer.length - 1];
|
|
768
890
|
for (const [field, parser] of parserPairs) if (isOptionRequiringValue(parser.usage, lastToken)) {
|
|
769
891
|
const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
|
|
770
|
-
const suggestions$1 = parser.suggest(
|
|
771
|
-
...contextWithRegistry,
|
|
772
|
-
state: fieldState
|
|
773
|
-
}, prefix);
|
|
892
|
+
const suggestions$1 = parser.suggest(withChildContext(contextWithRegistry, field, fieldState), prefix);
|
|
774
893
|
for await (const s of suggestions$1) yield s;
|
|
775
894
|
return;
|
|
776
895
|
}
|
|
@@ -778,10 +897,7 @@ async function* suggestObjectAsync(context, prefix, parserPairs) {
|
|
|
778
897
|
const suggestions = [];
|
|
779
898
|
for (const [field, parser] of parserPairs) {
|
|
780
899
|
const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
|
|
781
|
-
const fieldSuggestions = parser.suggest(
|
|
782
|
-
...contextWithRegistry,
|
|
783
|
-
state: fieldState
|
|
784
|
-
}, prefix);
|
|
900
|
+
const fieldSuggestions = parser.suggest(withChildContext(contextWithRegistry, field, fieldState), prefix);
|
|
785
901
|
for await (const s of fieldSuggestions) suggestions.push(s);
|
|
786
902
|
}
|
|
787
903
|
yield* require_suggestion.deduplicateSuggestions(suggestions);
|
|
@@ -805,6 +921,21 @@ function registerCompletedDependency(completed, registry) {
|
|
|
805
921
|
function* pendingDependencyDefaults(context, parserPairs) {
|
|
806
922
|
for (const [field, fieldParser] of parserPairs) {
|
|
807
923
|
const fieldState = context.state != null && typeof context.state === "object" && field in context.state ? context.state[field] : void 0;
|
|
924
|
+
const annotatedFieldState = getAnnotatedFieldState(context.state, field, fieldParser);
|
|
925
|
+
if (fieldParser.dependencyMetadata?.source?.getMissingSourceValue != null && isUnmatchedDependencyState(fieldState, fieldParser)) {
|
|
926
|
+
yield {
|
|
927
|
+
parser: fieldParser,
|
|
928
|
+
state: annotatedFieldState
|
|
929
|
+
};
|
|
930
|
+
continue;
|
|
931
|
+
}
|
|
932
|
+
if (fieldParser.dependencyMetadata?.source != null && isUnmatchedDependencyState(fieldState, fieldParser) && (annotatedFieldState !== fieldState || isNonCliBoundSourceState(fieldState, fieldParser))) {
|
|
933
|
+
yield {
|
|
934
|
+
parser: fieldParser,
|
|
935
|
+
state: annotatedFieldState
|
|
936
|
+
};
|
|
937
|
+
continue;
|
|
938
|
+
}
|
|
808
939
|
if (fieldState != null) {
|
|
809
940
|
if (!Array.isArray(fieldState) && !require_dependency.isDependencySourceState(fieldState) && (require_dependency.isWrappedDependencySource(fieldParser) || require_dependency.isPendingDependencySourceState(fieldParser.initialState))) yield {
|
|
810
941
|
parser: fieldParser,
|
|
@@ -851,9 +982,11 @@ function completeDependencySourceDefaults(context, parserPairs, registry, exec)
|
|
|
851
982
|
*/
|
|
852
983
|
function wrapAsDependencySourceState(completed, parser) {
|
|
853
984
|
if (require_dependency.isDependencySourceState(completed)) return completed;
|
|
854
|
-
const
|
|
985
|
+
const metadataSource = parser.dependencyMetadata?.source;
|
|
986
|
+
if (metadataSource?.preservesSourceValue === false) return void 0;
|
|
987
|
+
const hasDep = metadataSource != null || require_dependency.isWrappedDependencySource(parser) || require_dependency.isPendingDependencySourceState(parser.initialState);
|
|
855
988
|
if (hasDep && typeof completed === "object" && completed !== null && "success" in completed && completed.success && "value" in completed && completed.value !== void 0) {
|
|
856
|
-
const depId = require_dependency.isWrappedDependencySource(parser) ? parser[require_dependency.wrappedDependencySourceMarker][require_dependency.dependencyId] : parser.initialState[require_dependency.dependencyId];
|
|
989
|
+
const depId = metadataSource?.sourceId ?? (require_dependency.isWrappedDependencySource(parser) ? parser[require_dependency.wrappedDependencySourceMarker][require_dependency.dependencyId] : parser.initialState[require_dependency.dependencyId]);
|
|
857
990
|
return require_dependency.createDependencySourceState(completed, depId);
|
|
858
991
|
}
|
|
859
992
|
return void 0;
|
|
@@ -909,6 +1042,20 @@ function collectChildFieldParsers(parsers) {
|
|
|
909
1042
|
for (const parser of parsers) if (fieldParsersKey in parser) pairs.push(...parser[fieldParsersKey]);
|
|
910
1043
|
return pairs;
|
|
911
1044
|
}
|
|
1045
|
+
function filterDuplicateFieldParsers(pairs) {
|
|
1046
|
+
const counts = /* @__PURE__ */ new Map();
|
|
1047
|
+
for (const [field] of pairs) counts.set(field, (counts.get(field) ?? 0) + 1);
|
|
1048
|
+
return pairs.filter(([field]) => (counts.get(field) ?? 0) <= 1);
|
|
1049
|
+
}
|
|
1050
|
+
function collectDuplicateFieldNames(pairs) {
|
|
1051
|
+
const counts = /* @__PURE__ */ new Map();
|
|
1052
|
+
for (const [field] of pairs) counts.set(field, (counts.get(field) ?? 0) + 1);
|
|
1053
|
+
return new Set([...counts.entries()].filter(([, count]) => count > 1).map(([field]) => field));
|
|
1054
|
+
}
|
|
1055
|
+
function filterExcludedFieldParsers(pairs, excludedFields) {
|
|
1056
|
+
if (excludedFields == null || excludedFields.size < 1) return pairs;
|
|
1057
|
+
return pairs.filter(([field]) => !excludedFields.has(field));
|
|
1058
|
+
}
|
|
912
1059
|
/**
|
|
913
1060
|
* Pre-completes dependency source fields and registers their values in
|
|
914
1061
|
* the given registry. Unlike `completeDependencySourceDefaults()` (used
|
|
@@ -935,22 +1082,37 @@ function preCompleteAndRegisterDependencies(state, fieldParserPairs, registry, e
|
|
|
935
1082
|
continue;
|
|
936
1083
|
}
|
|
937
1084
|
const fieldState = state[field];
|
|
1085
|
+
const annotatedFieldState = getAnnotatedFieldState(state, field, fieldParser);
|
|
1086
|
+
if (fieldParser.dependencyMetadata?.source?.getMissingSourceValue != null && isUnmatchedDependencyState(fieldState, fieldParser)) {
|
|
1087
|
+
const completed = fieldParser.complete(annotatedFieldState, withChildExecPath(exec, field));
|
|
1088
|
+
preCompleted.set(field, completed);
|
|
1089
|
+
const depState = wrapAsDependencySourceState(completed, fieldParser);
|
|
1090
|
+
if (depState) registerCompletedDependency(depState, registry);
|
|
1091
|
+
continue;
|
|
1092
|
+
}
|
|
1093
|
+
if (fieldParser.dependencyMetadata?.source != null && isUnmatchedDependencyState(fieldState, fieldParser) && (annotatedFieldState !== fieldState || isNonCliBoundSourceState(fieldState, fieldParser))) {
|
|
1094
|
+
const completed = fieldParser.complete(annotatedFieldState, withChildExecPath(exec, field));
|
|
1095
|
+
preCompleted.set(field, completed);
|
|
1096
|
+
const depState = wrapAsDependencySourceState(completed, fieldParser);
|
|
1097
|
+
if (depState) registerCompletedDependency(depState, registry);
|
|
1098
|
+
continue;
|
|
1099
|
+
}
|
|
938
1100
|
if (Array.isArray(fieldState) && fieldState.length === 1 && require_dependency.isPendingDependencySourceState(fieldState[0])) {
|
|
939
|
-
const completed = fieldParser.complete(fieldState, exec);
|
|
1101
|
+
const completed = fieldParser.complete(fieldState, withChildExecPath(exec, field));
|
|
940
1102
|
preCompleted.set(field, completed);
|
|
941
1103
|
if (require_dependency.isDependencySourceState(completed)) registerCompletedDependency(completed, registry);
|
|
942
1104
|
} else if (fieldState === void 0 && require_dependency.isPendingDependencySourceState(fieldParser.initialState)) {
|
|
943
|
-
const completed = fieldParser.complete([fieldParser.initialState], exec);
|
|
1105
|
+
const completed = fieldParser.complete([fieldParser.initialState], withChildExecPath(exec, field));
|
|
944
1106
|
preCompleted.set(field, completed);
|
|
945
1107
|
if (require_dependency.isDependencySourceState(completed)) registerCompletedDependency(completed, registry);
|
|
946
1108
|
} else if (fieldState === void 0 && require_dependency.isWrappedDependencySource(fieldParser)) {
|
|
947
1109
|
const pendingState = fieldParser[require_dependency.wrappedDependencySourceMarker];
|
|
948
|
-
const completed = fieldParser.complete([pendingState], exec);
|
|
1110
|
+
const completed = fieldParser.complete([pendingState], withChildExecPath(exec, field));
|
|
949
1111
|
preCompleted.set(field, completed);
|
|
950
1112
|
if (require_dependency.isDependencySourceState(completed)) registerCompletedDependency(completed, registry);
|
|
951
1113
|
} else if (fieldState != null && !Array.isArray(fieldState) && !require_dependency.isDependencySourceState(fieldState) && (require_dependency.isWrappedDependencySource(fieldParser) || require_dependency.isPendingDependencySourceState(fieldParser.initialState))) {
|
|
952
|
-
const annotatedFieldState = getAnnotatedFieldState(state, field, fieldParser);
|
|
953
|
-
const completed = fieldParser.complete(annotatedFieldState, exec);
|
|
1114
|
+
const annotatedFieldState$1 = getAnnotatedFieldState(state, field, fieldParser);
|
|
1115
|
+
const completed = fieldParser.complete(annotatedFieldState$1, withChildExecPath(exec, field));
|
|
954
1116
|
preCompleted.set(field, completed);
|
|
955
1117
|
const depState = wrapAsDependencySourceState(completed, fieldParser);
|
|
956
1118
|
if (depState) registerCompletedDependency(depState, registry);
|
|
@@ -973,22 +1135,37 @@ async function preCompleteAndRegisterDependenciesAsync(state, fieldParserPairs,
|
|
|
973
1135
|
continue;
|
|
974
1136
|
}
|
|
975
1137
|
const fieldState = state[field];
|
|
1138
|
+
const annotatedFieldState = getAnnotatedFieldState(state, field, fieldParser);
|
|
1139
|
+
if (fieldParser.dependencyMetadata?.source?.getMissingSourceValue != null && isUnmatchedDependencyState(fieldState, fieldParser)) {
|
|
1140
|
+
const completed = await fieldParser.complete(annotatedFieldState, withChildExecPath(exec, field));
|
|
1141
|
+
preCompleted.set(field, completed);
|
|
1142
|
+
const depState = wrapAsDependencySourceState(completed, fieldParser);
|
|
1143
|
+
if (depState) registerCompletedDependency(depState, registry);
|
|
1144
|
+
continue;
|
|
1145
|
+
}
|
|
1146
|
+
if (fieldParser.dependencyMetadata?.source != null && isUnmatchedDependencyState(fieldState, fieldParser) && (annotatedFieldState !== fieldState || isNonCliBoundSourceState(fieldState, fieldParser))) {
|
|
1147
|
+
const completed = await fieldParser.complete(annotatedFieldState, withChildExecPath(exec, field));
|
|
1148
|
+
preCompleted.set(field, completed);
|
|
1149
|
+
const depState = wrapAsDependencySourceState(completed, fieldParser);
|
|
1150
|
+
if (depState) registerCompletedDependency(depState, registry);
|
|
1151
|
+
continue;
|
|
1152
|
+
}
|
|
976
1153
|
if (Array.isArray(fieldState) && fieldState.length === 1 && require_dependency.isPendingDependencySourceState(fieldState[0])) {
|
|
977
|
-
const completed = await fieldParser.complete(fieldState, exec);
|
|
1154
|
+
const completed = await fieldParser.complete(fieldState, withChildExecPath(exec, field));
|
|
978
1155
|
preCompleted.set(field, completed);
|
|
979
1156
|
if (require_dependency.isDependencySourceState(completed)) registerCompletedDependency(completed, registry);
|
|
980
1157
|
} else if (fieldState === void 0 && require_dependency.isPendingDependencySourceState(fieldParser.initialState)) {
|
|
981
|
-
const completed = await fieldParser.complete([fieldParser.initialState], exec);
|
|
1158
|
+
const completed = await fieldParser.complete([fieldParser.initialState], withChildExecPath(exec, field));
|
|
982
1159
|
preCompleted.set(field, completed);
|
|
983
1160
|
if (require_dependency.isDependencySourceState(completed)) registerCompletedDependency(completed, registry);
|
|
984
1161
|
} else if (fieldState === void 0 && require_dependency.isWrappedDependencySource(fieldParser)) {
|
|
985
1162
|
const pendingState = fieldParser[require_dependency.wrappedDependencySourceMarker];
|
|
986
|
-
const completed = await fieldParser.complete([pendingState], exec);
|
|
1163
|
+
const completed = await fieldParser.complete([pendingState], withChildExecPath(exec, field));
|
|
987
1164
|
preCompleted.set(field, completed);
|
|
988
1165
|
if (require_dependency.isDependencySourceState(completed)) registerCompletedDependency(completed, registry);
|
|
989
1166
|
} else if (fieldState != null && !Array.isArray(fieldState) && !require_dependency.isDependencySourceState(fieldState) && (require_dependency.isWrappedDependencySource(fieldParser) || require_dependency.isPendingDependencySourceState(fieldParser.initialState))) {
|
|
990
|
-
const annotatedFieldState = getAnnotatedFieldState(state, field, fieldParser);
|
|
991
|
-
const completed = await fieldParser.complete(annotatedFieldState, exec);
|
|
1167
|
+
const annotatedFieldState$1 = getAnnotatedFieldState(state, field, fieldParser);
|
|
1168
|
+
const completed = await fieldParser.complete(annotatedFieldState$1, withChildExecPath(exec, field));
|
|
992
1169
|
preCompleted.set(field, completed);
|
|
993
1170
|
const depState = wrapAsDependencySourceState(completed, fieldParser);
|
|
994
1171
|
if (depState) registerCompletedDependency(depState, registry);
|
|
@@ -996,153 +1173,6 @@ async function preCompleteAndRegisterDependenciesAsync(state, fieldParserPairs,
|
|
|
996
1173
|
}
|
|
997
1174
|
return preCompleted;
|
|
998
1175
|
}
|
|
999
|
-
/**
|
|
1000
|
-
* Recursively collects dependency values from DependencySourceState objects
|
|
1001
|
-
* found anywhere in the state tree.
|
|
1002
|
-
* @internal
|
|
1003
|
-
*/
|
|
1004
|
-
function collectDependencies(state, registry, visited = /* @__PURE__ */ new WeakSet()) {
|
|
1005
|
-
if (state === null || state === void 0) return;
|
|
1006
|
-
if (typeof state === "object") {
|
|
1007
|
-
if (visited.has(state)) return;
|
|
1008
|
-
visited.add(state);
|
|
1009
|
-
}
|
|
1010
|
-
if (require_dependency.isDependencySourceState(state)) {
|
|
1011
|
-
const depId = state[require_dependency.dependencyId];
|
|
1012
|
-
const result = state.result;
|
|
1013
|
-
if (result.success) registry.set(depId, result.value);
|
|
1014
|
-
return;
|
|
1015
|
-
}
|
|
1016
|
-
if (Array.isArray(state)) {
|
|
1017
|
-
for (const item of state) collectDependencies(item, registry, visited);
|
|
1018
|
-
return;
|
|
1019
|
-
}
|
|
1020
|
-
if (typeof state === "object" && !require_dependency.isDeferredParseState(state)) for (const key of Reflect.ownKeys(state)) collectDependencies(state[key], registry, visited);
|
|
1021
|
-
}
|
|
1022
|
-
/**
|
|
1023
|
-
* Checks if a value is a plain object (created with `{}` or `Object.create(null)`).
|
|
1024
|
-
* Class instances like `Temporal.PlainDate`, `URL`, `Date`, etc. return false.
|
|
1025
|
-
* This is used to determine whether to recursively traverse an object when
|
|
1026
|
-
* resolving deferred parse states - we only want to traverse plain objects
|
|
1027
|
-
* that are part of the parser state structure, not user values.
|
|
1028
|
-
*/
|
|
1029
|
-
function isPlainObject(value) {
|
|
1030
|
-
if (typeof value !== "object" || value === null) return false;
|
|
1031
|
-
const proto = Object.getPrototypeOf(value);
|
|
1032
|
-
return proto === Object.prototype || proto === null;
|
|
1033
|
-
}
|
|
1034
|
-
/**
|
|
1035
|
-
* Collects dependency values for a DeferredParseState from the registry.
|
|
1036
|
-
* Returns the collected values array, or null if any required dependency
|
|
1037
|
-
* is missing (and no default is available).
|
|
1038
|
-
*/
|
|
1039
|
-
function collectDependencyValues(deferredState, registry) {
|
|
1040
|
-
const depIds = deferredState.dependencyIds;
|
|
1041
|
-
if (depIds && depIds.length > 0) {
|
|
1042
|
-
const defaults$1 = deferredState.defaultValues;
|
|
1043
|
-
const dependencyValues = [];
|
|
1044
|
-
for (let i = 0; i < depIds.length; i++) {
|
|
1045
|
-
const depId$1 = depIds[i];
|
|
1046
|
-
if (registry.has(depId$1)) dependencyValues.push(registry.get(depId$1));
|
|
1047
|
-
else if (defaults$1 && i < defaults$1.length) dependencyValues.push(defaults$1[i]);
|
|
1048
|
-
else return null;
|
|
1049
|
-
}
|
|
1050
|
-
return dependencyValues;
|
|
1051
|
-
}
|
|
1052
|
-
const depId = deferredState.dependencyId;
|
|
1053
|
-
if (registry.has(depId)) return registry.get(depId);
|
|
1054
|
-
const defaults = deferredState.defaultValues;
|
|
1055
|
-
if (defaults && defaults.length > 0) return defaults[0];
|
|
1056
|
-
return null;
|
|
1057
|
-
}
|
|
1058
|
-
/**
|
|
1059
|
-
* Recursively resolves DeferredParseState objects found anywhere in the state tree.
|
|
1060
|
-
* Returns the resolved state (sync version).
|
|
1061
|
-
*
|
|
1062
|
-
* Only traverses:
|
|
1063
|
-
* - DeferredParseState (to resolve it)
|
|
1064
|
-
* - DependencySourceState (skipped, kept as-is)
|
|
1065
|
-
* - Arrays (to find nested deferred states)
|
|
1066
|
-
* - Plain objects (to find nested deferred states in parser state structures)
|
|
1067
|
-
*
|
|
1068
|
-
* Does NOT traverse class instances (e.g., Temporal.PlainDate, URL) since these
|
|
1069
|
-
* are user values that should be preserved as-is.
|
|
1070
|
-
*/
|
|
1071
|
-
function resolveDeferred(state, registry, visited = /* @__PURE__ */ new WeakSet()) {
|
|
1072
|
-
if (state === null || state === void 0) return state;
|
|
1073
|
-
if (typeof state === "object") {
|
|
1074
|
-
if (visited.has(state)) return state;
|
|
1075
|
-
visited.add(state);
|
|
1076
|
-
}
|
|
1077
|
-
if (require_dependency.isDeferredParseState(state)) {
|
|
1078
|
-
const deferredState = state;
|
|
1079
|
-
const dependencyValue = collectDependencyValues(deferredState, registry);
|
|
1080
|
-
if (dependencyValue === null) return deferredState.preliminaryResult;
|
|
1081
|
-
const reParseResult = deferredState.parser[require_dependency.parseWithDependency](deferredState.rawInput, dependencyValue);
|
|
1082
|
-
if (reParseResult instanceof Promise) return deferredState.preliminaryResult;
|
|
1083
|
-
return reParseResult;
|
|
1084
|
-
}
|
|
1085
|
-
if (require_dependency.isDependencySourceState(state)) return state;
|
|
1086
|
-
if (Array.isArray(state)) return state.map((item) => resolveDeferred(item, registry, visited));
|
|
1087
|
-
if (isPlainObject(state)) {
|
|
1088
|
-
const resolved = {};
|
|
1089
|
-
for (const key of Reflect.ownKeys(state)) resolved[key] = resolveDeferred(state[key], registry, visited);
|
|
1090
|
-
return resolved;
|
|
1091
|
-
}
|
|
1092
|
-
return state;
|
|
1093
|
-
}
|
|
1094
|
-
function resolveDeferredParseStates(fieldStates, initialRegistry) {
|
|
1095
|
-
const registry = initialRegistry ?? new require_dependency.DependencyRegistry();
|
|
1096
|
-
collectDependencies(fieldStates, registry);
|
|
1097
|
-
return resolveDeferred(fieldStates, registry);
|
|
1098
|
-
}
|
|
1099
|
-
/**
|
|
1100
|
-
* Recursively resolves DeferredParseState objects found anywhere in the state tree.
|
|
1101
|
-
* Returns the resolved state (async version).
|
|
1102
|
-
*
|
|
1103
|
-
* Only traverses:
|
|
1104
|
-
* - DeferredParseState (to resolve it)
|
|
1105
|
-
* - DependencySourceState (skipped, kept as-is)
|
|
1106
|
-
* - Arrays (to find nested deferred states)
|
|
1107
|
-
* - Plain objects (to find nested deferred states in parser state structures)
|
|
1108
|
-
*
|
|
1109
|
-
* Does NOT traverse class instances (e.g., Temporal.PlainDate, URL) since these
|
|
1110
|
-
* are user values that should be preserved as-is.
|
|
1111
|
-
*/
|
|
1112
|
-
async function resolveDeferredAsync(state, registry, visited = /* @__PURE__ */ new WeakSet()) {
|
|
1113
|
-
if (state === null || state === void 0) return state;
|
|
1114
|
-
if (typeof state === "object") {
|
|
1115
|
-
if (visited.has(state)) return state;
|
|
1116
|
-
visited.add(state);
|
|
1117
|
-
}
|
|
1118
|
-
if (require_dependency.isDeferredParseState(state)) {
|
|
1119
|
-
const deferredState = state;
|
|
1120
|
-
const dependencyValue = collectDependencyValues(deferredState, registry);
|
|
1121
|
-
if (dependencyValue === null) return deferredState.preliminaryResult;
|
|
1122
|
-
const reParseResult = deferredState.parser[require_dependency.parseWithDependency](deferredState.rawInput, dependencyValue);
|
|
1123
|
-
return Promise.resolve(reParseResult);
|
|
1124
|
-
}
|
|
1125
|
-
if (require_dependency.isDependencySourceState(state)) return state;
|
|
1126
|
-
if (Array.isArray(state)) return Promise.all(state.map((item) => resolveDeferredAsync(item, registry, visited)));
|
|
1127
|
-
if (isPlainObject(state)) {
|
|
1128
|
-
const resolved = {};
|
|
1129
|
-
const keys = Reflect.ownKeys(state);
|
|
1130
|
-
await Promise.all(keys.map(async (key) => {
|
|
1131
|
-
resolved[key] = await resolveDeferredAsync(state[key], registry, visited);
|
|
1132
|
-
}));
|
|
1133
|
-
return resolved;
|
|
1134
|
-
}
|
|
1135
|
-
return state;
|
|
1136
|
-
}
|
|
1137
|
-
/**
|
|
1138
|
-
* Async version of resolveDeferredParseStates for async parsers.
|
|
1139
|
-
* @internal
|
|
1140
|
-
*/
|
|
1141
|
-
async function resolveDeferredParseStatesAsync(fieldStates, initialRegistry) {
|
|
1142
|
-
const registry = initialRegistry ?? new require_dependency.DependencyRegistry();
|
|
1143
|
-
collectDependencies(fieldStates, registry);
|
|
1144
|
-
return await resolveDeferredAsync(fieldStates, registry);
|
|
1145
|
-
}
|
|
1146
1176
|
function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
1147
1177
|
const label = typeof labelOrParsers === "string" ? labelOrParsers : void 0;
|
|
1148
1178
|
if (label != null) require_validate.validateLabel(label);
|
|
@@ -1174,11 +1204,20 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1174
1204
|
})() : void 0;
|
|
1175
1205
|
if (cache?.has(fieldKey)) return cache.get(fieldKey);
|
|
1176
1206
|
const sourceState = parentState != null && typeof parentState === "object" && fieldKey in parentState ? parentState[fieldKey] : parser.initialState;
|
|
1177
|
-
|
|
1207
|
+
const annotations = require_annotations.getAnnotations(parentState);
|
|
1208
|
+
if (sourceState == null) {
|
|
1209
|
+
if (annotations !== void 0 && Reflect.get(parser, inheritParentAnnotationsKey) === true) {
|
|
1210
|
+
const inheritedState$1 = require_annotations.injectAnnotations({}, annotations);
|
|
1211
|
+
cache?.set(fieldKey, inheritedState$1);
|
|
1212
|
+
return inheritedState$1;
|
|
1213
|
+
}
|
|
1214
|
+
cache?.set(fieldKey, sourceState);
|
|
1215
|
+
return sourceState;
|
|
1216
|
+
}
|
|
1217
|
+
if (typeof sourceState !== "object") {
|
|
1178
1218
|
cache?.set(fieldKey, sourceState);
|
|
1179
1219
|
return sourceState;
|
|
1180
1220
|
}
|
|
1181
|
-
const annotations = require_annotations.getAnnotations(parentState);
|
|
1182
1221
|
if (annotations === void 0 || require_annotations.getAnnotations(sourceState) === annotations) {
|
|
1183
1222
|
cache?.set(fieldKey, sourceState);
|
|
1184
1223
|
return sourceState;
|
|
@@ -1214,11 +1253,9 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1214
1253
|
madeProgress = false;
|
|
1215
1254
|
const getFieldState = createFieldStateGetter(currentContext.state);
|
|
1216
1255
|
for (const [field, parser] of parserPairs) {
|
|
1217
|
-
const result = parser.parse(
|
|
1218
|
-
...currentContext,
|
|
1219
|
-
state: getFieldState(field, parser)
|
|
1220
|
-
});
|
|
1256
|
+
const result = parser.parse(withChildContext(currentContext, field, getFieldState(field, parser)));
|
|
1221
1257
|
if (result.success && result.consumed.length > 0) {
|
|
1258
|
+
const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
|
|
1222
1259
|
currentContext = {
|
|
1223
1260
|
...currentContext,
|
|
1224
1261
|
buffer: result.next.buffer,
|
|
@@ -1226,7 +1263,12 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1226
1263
|
state: {
|
|
1227
1264
|
...currentContext.state,
|
|
1228
1265
|
[field]: result.next.state
|
|
1229
|
-
}
|
|
1266
|
+
},
|
|
1267
|
+
...mergedExec != null ? {
|
|
1268
|
+
trace: mergedExec.trace,
|
|
1269
|
+
exec: mergedExec,
|
|
1270
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
1271
|
+
} : {}
|
|
1230
1272
|
};
|
|
1231
1273
|
allConsumed.push(...result.consumed);
|
|
1232
1274
|
anySuccess = true;
|
|
@@ -1245,7 +1287,7 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1245
1287
|
const getFieldState = createFieldStateGetter(context.state);
|
|
1246
1288
|
for (const [field, parser] of parserPairs) {
|
|
1247
1289
|
const fieldState = getFieldState(field, parser);
|
|
1248
|
-
const completeResult = parser.complete(fieldState, context.exec);
|
|
1290
|
+
const completeResult = parser.complete(fieldState, withChildExecPath(context.exec, field));
|
|
1249
1291
|
if (!completeResult.success) {
|
|
1250
1292
|
allCanComplete = false;
|
|
1251
1293
|
break;
|
|
@@ -1272,12 +1314,10 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1272
1314
|
madeProgress = false;
|
|
1273
1315
|
const getFieldState = createFieldStateGetter(currentContext.state);
|
|
1274
1316
|
for (const [field, parser] of parserPairs) {
|
|
1275
|
-
const resultOrPromise = parser.parse(
|
|
1276
|
-
...currentContext,
|
|
1277
|
-
state: getFieldState(field, parser)
|
|
1278
|
-
});
|
|
1317
|
+
const resultOrPromise = parser.parse(withChildContext(currentContext, field, getFieldState(field, parser)));
|
|
1279
1318
|
const result = await resultOrPromise;
|
|
1280
1319
|
if (result.success && result.consumed.length > 0) {
|
|
1320
|
+
const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
|
|
1281
1321
|
currentContext = {
|
|
1282
1322
|
...currentContext,
|
|
1283
1323
|
buffer: result.next.buffer,
|
|
@@ -1285,7 +1325,12 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1285
1325
|
state: {
|
|
1286
1326
|
...currentContext.state,
|
|
1287
1327
|
[field]: result.next.state
|
|
1288
|
-
}
|
|
1328
|
+
},
|
|
1329
|
+
...mergedExec != null ? {
|
|
1330
|
+
trace: mergedExec.trace,
|
|
1331
|
+
exec: mergedExec,
|
|
1332
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
1333
|
+
} : {}
|
|
1289
1334
|
};
|
|
1290
1335
|
allConsumed.push(...result.consumed);
|
|
1291
1336
|
anySuccess = true;
|
|
@@ -1304,7 +1349,7 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1304
1349
|
const getFieldState = createFieldStateGetter(context.state);
|
|
1305
1350
|
for (const [field, parser] of parserPairs) {
|
|
1306
1351
|
const fieldState = getFieldState(field, parser);
|
|
1307
|
-
const completeResult = await parser.complete(fieldState, context.exec);
|
|
1352
|
+
const completeResult = await parser.complete(fieldState, withChildExecPath(context.exec, field));
|
|
1308
1353
|
if (!completeResult.success) {
|
|
1309
1354
|
allCanComplete = false;
|
|
1310
1355
|
break;
|
|
@@ -1343,7 +1388,7 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1343
1388
|
...exec,
|
|
1344
1389
|
dependencyRuntime: runtime
|
|
1345
1390
|
};
|
|
1346
|
-
const typedParserPairs = parserPairs;
|
|
1391
|
+
const typedParserPairs = filterExcludedFieldParsers(parserPairs, exec?.excludedSourceFields);
|
|
1347
1392
|
const preCompleted = preCompleteAndRegisterDependencies(state, typedParserPairs, runtime.registry, childExec);
|
|
1348
1393
|
const phase3Exec = {
|
|
1349
1394
|
...childExec,
|
|
@@ -1356,6 +1401,7 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1356
1401
|
const fieldParser = parsers[field];
|
|
1357
1402
|
annotatedState[fieldKey] = getFieldState(field, fieldParser);
|
|
1358
1403
|
}
|
|
1404
|
+
require_dependency_runtime.collectExplicitSourceValues(filterPreCompletedRuntimeNodes(require_dependency_runtime.buildRuntimeNodesFromPairs(typedParserPairs, annotatedState, exec?.path), new Set(preCompleted.keys())), runtime);
|
|
1359
1405
|
const resolvedFieldStates = require_dependency_runtime.resolveStateWithRuntime(annotatedState, runtime);
|
|
1360
1406
|
const result = {};
|
|
1361
1407
|
const deferredKeys = /* @__PURE__ */ new Map();
|
|
@@ -1368,7 +1414,7 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1368
1414
|
if (preCompletedResult !== void 0) valueResult = unwrapCompleteResult(preCompletedResult);
|
|
1369
1415
|
else {
|
|
1370
1416
|
const fieldState = resolvedFieldStates[fieldKey];
|
|
1371
|
-
valueResult = unwrapCompleteResult(fieldParser.complete(fieldState, phase3Exec));
|
|
1417
|
+
valueResult = unwrapCompleteResult(fieldParser.complete(fieldState, withChildExecPath(phase3Exec, fieldKey)));
|
|
1372
1418
|
}
|
|
1373
1419
|
if (valueResult.success) {
|
|
1374
1420
|
result[fieldKey] = valueResult.value;
|
|
@@ -1395,7 +1441,7 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1395
1441
|
...exec,
|
|
1396
1442
|
dependencyRuntime: runtime
|
|
1397
1443
|
};
|
|
1398
|
-
const asyncParserPairs = parserPairs;
|
|
1444
|
+
const asyncParserPairs = filterExcludedFieldParsers(parserPairs, exec?.excludedSourceFields);
|
|
1399
1445
|
const preCompleted = await preCompleteAndRegisterDependenciesAsync(state, asyncParserPairs, runtime.registry, childExec);
|
|
1400
1446
|
const phase3Exec = {
|
|
1401
1447
|
...childExec,
|
|
@@ -1408,20 +1454,12 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1408
1454
|
const fieldParser = parsers[field];
|
|
1409
1455
|
annotatedState[fieldKey] = getFieldState(field, fieldParser);
|
|
1410
1456
|
}
|
|
1457
|
+
await require_dependency_runtime.collectExplicitSourceValuesAsync(filterPreCompletedRuntimeNodes(require_dependency_runtime.buildRuntimeNodesFromPairs(asyncParserPairs, annotatedState, exec?.path), new Set(preCompleted.keys())), runtime);
|
|
1411
1458
|
const resolvedFieldStates = await require_dependency_runtime.resolveStateWithRuntimeAsync(annotatedState, runtime);
|
|
1412
1459
|
const result = {};
|
|
1413
1460
|
const deferredKeys = /* @__PURE__ */ new Map();
|
|
1414
1461
|
let hasDeferred = false;
|
|
1415
|
-
|
|
1416
|
-
const fieldKey = field;
|
|
1417
|
-
const fieldParser = parsers[field];
|
|
1418
|
-
let valueResult;
|
|
1419
|
-
const preCompletedResult = preCompleted.get(fieldKey);
|
|
1420
|
-
if (preCompletedResult !== void 0) valueResult = unwrapCompleteResult(preCompletedResult);
|
|
1421
|
-
else {
|
|
1422
|
-
const fieldState = resolvedFieldStates[fieldKey];
|
|
1423
|
-
valueResult = unwrapCompleteResult(await fieldParser.complete(fieldState, phase3Exec));
|
|
1424
|
-
}
|
|
1462
|
+
const applyValueResult = (fieldKey, valueResult) => {
|
|
1425
1463
|
if (valueResult.success) {
|
|
1426
1464
|
result[fieldKey] = valueResult.value;
|
|
1427
1465
|
if (valueResult.deferred) if (valueResult.deferredKeys) deferredKeys.set(fieldKey, valueResult.deferredKeys);
|
|
@@ -1431,6 +1469,41 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1431
1469
|
success: false,
|
|
1432
1470
|
error: valueResult.error
|
|
1433
1471
|
};
|
|
1472
|
+
return void 0;
|
|
1473
|
+
};
|
|
1474
|
+
const concurrentFields = [];
|
|
1475
|
+
const deferredFields = [];
|
|
1476
|
+
for (const field of parserKeys) {
|
|
1477
|
+
const fieldKey = field;
|
|
1478
|
+
const fieldParser = parsers[field];
|
|
1479
|
+
const preCompletedResult = preCompleted.get(fieldKey);
|
|
1480
|
+
if (preCompletedResult !== void 0) {
|
|
1481
|
+
const failure = applyValueResult(fieldKey, unwrapCompleteResult(preCompletedResult));
|
|
1482
|
+
if (failure != null) return failure;
|
|
1483
|
+
continue;
|
|
1484
|
+
}
|
|
1485
|
+
if (typeof fieldParser.shouldDeferCompletion === "function" && fieldParser.shouldDeferCompletion(resolvedFieldStates[fieldKey], withChildExecPath(phase3Exec, fieldKey)) === true) deferredFields.push(field);
|
|
1486
|
+
else concurrentFields.push(field);
|
|
1487
|
+
}
|
|
1488
|
+
const concurrentResults = await Promise.all(concurrentFields.map(async (field) => {
|
|
1489
|
+
const fieldKey = field;
|
|
1490
|
+
const fieldParser = parsers[field];
|
|
1491
|
+
const valueResult = unwrapCompleteResult(await fieldParser.complete(resolvedFieldStates[fieldKey], withChildExecPath(phase3Exec, fieldKey)));
|
|
1492
|
+
return {
|
|
1493
|
+
fieldKey,
|
|
1494
|
+
valueResult
|
|
1495
|
+
};
|
|
1496
|
+
}));
|
|
1497
|
+
for (const { fieldKey, valueResult } of concurrentResults) {
|
|
1498
|
+
const failure = applyValueResult(fieldKey, valueResult);
|
|
1499
|
+
if (failure != null) return failure;
|
|
1500
|
+
}
|
|
1501
|
+
for (const field of deferredFields) {
|
|
1502
|
+
const fieldKey = field;
|
|
1503
|
+
const fieldParser = parsers[field];
|
|
1504
|
+
const valueResult = unwrapCompleteResult(await fieldParser.complete(resolvedFieldStates[fieldKey], withChildExecPath(phase3Exec, fieldKey)));
|
|
1505
|
+
const failure = applyValueResult(fieldKey, valueResult);
|
|
1506
|
+
if (failure != null) return failure;
|
|
1434
1507
|
}
|
|
1435
1508
|
const isDeferred = deferredKeys.size > 0 || hasDeferred;
|
|
1436
1509
|
return {
|
|
@@ -1503,13 +1576,19 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1503
1576
|
function suggestTupleSync(context, prefix, parsers) {
|
|
1504
1577
|
const suggestions = [];
|
|
1505
1578
|
const stateArray = context.state;
|
|
1579
|
+
const runtime = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
|
|
1580
|
+
if (stateArray && Array.isArray(stateArray)) {
|
|
1581
|
+
require_dependency_runtime.collectExplicitSourceValues(require_dependency_runtime.buildRuntimeNodesFromArray(parsers, stateArray, context.exec?.path), runtime);
|
|
1582
|
+
require_dependency_runtime.collectSourcesFromState(stateArray, runtime);
|
|
1583
|
+
}
|
|
1584
|
+
const contextWithRegistry = {
|
|
1585
|
+
...context,
|
|
1586
|
+
dependencyRegistry: runtime.registry
|
|
1587
|
+
};
|
|
1506
1588
|
for (let i = 0; i < parsers.length; i++) {
|
|
1507
1589
|
const parser = parsers[i];
|
|
1508
1590
|
const parserState = stateArray && Array.isArray(stateArray) ? stateArray[i] : parser.initialState;
|
|
1509
|
-
const parserSuggestions = parser.suggest(
|
|
1510
|
-
...context,
|
|
1511
|
-
state: parserState
|
|
1512
|
-
}, prefix);
|
|
1591
|
+
const parserSuggestions = parser.suggest(withChildContext(contextWithRegistry, i, parserState), prefix);
|
|
1513
1592
|
suggestions.push(...parserSuggestions);
|
|
1514
1593
|
}
|
|
1515
1594
|
return require_suggestion.deduplicateSuggestions(suggestions);
|
|
@@ -1517,13 +1596,19 @@ function suggestTupleSync(context, prefix, parsers) {
|
|
|
1517
1596
|
async function* suggestTupleAsync(context, prefix, parsers) {
|
|
1518
1597
|
const suggestions = [];
|
|
1519
1598
|
const stateArray = context.state;
|
|
1599
|
+
const runtime = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
|
|
1600
|
+
if (stateArray && Array.isArray(stateArray)) {
|
|
1601
|
+
await require_dependency_runtime.collectExplicitSourceValuesAsync(require_dependency_runtime.buildRuntimeNodesFromArray(parsers, stateArray, context.exec?.path), runtime);
|
|
1602
|
+
require_dependency_runtime.collectSourcesFromState(stateArray, runtime);
|
|
1603
|
+
}
|
|
1604
|
+
const contextWithRegistry = {
|
|
1605
|
+
...context,
|
|
1606
|
+
dependencyRegistry: runtime.registry
|
|
1607
|
+
};
|
|
1520
1608
|
for (let i = 0; i < parsers.length; i++) {
|
|
1521
1609
|
const parser = parsers[i];
|
|
1522
1610
|
const parserState = stateArray && Array.isArray(stateArray) ? stateArray[i] : parser.initialState;
|
|
1523
|
-
const parserSuggestions = parser.suggest(
|
|
1524
|
-
...context,
|
|
1525
|
-
state: parserState
|
|
1526
|
-
}, prefix);
|
|
1611
|
+
const parserSuggestions = parser.suggest(withChildContext(contextWithRegistry, i, parserState), prefix);
|
|
1527
1612
|
if (parser.$mode === "async") for await (const s of parserSuggestions) suggestions.push(s);
|
|
1528
1613
|
else suggestions.push(...parserSuggestions);
|
|
1529
1614
|
}
|
|
@@ -1557,17 +1642,19 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1557
1642
|
const stateArray = currentContext.state;
|
|
1558
1643
|
const remainingParsers = syncParsers.map((parser, index) => [parser, index]).filter(([_, index]) => !matchedParsers.has(index)).sort(([parserA], [parserB]) => parserB.priority - parserA.priority);
|
|
1559
1644
|
for (const [parser, index] of remainingParsers) {
|
|
1560
|
-
const result = parser.parse(
|
|
1561
|
-
...currentContext,
|
|
1562
|
-
state: stateArray[index]
|
|
1563
|
-
});
|
|
1645
|
+
const result = parser.parse(withChildContext(currentContext, index, stateArray[index]));
|
|
1564
1646
|
if (result.success && result.consumed.length > 0) {
|
|
1565
1647
|
const newStateArray = stateArray.map((s, idx) => idx === index ? result.next.state : s);
|
|
1648
|
+
const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
|
|
1566
1649
|
currentContext = {
|
|
1567
1650
|
...currentContext,
|
|
1568
1651
|
buffer: result.next.buffer,
|
|
1569
1652
|
optionsTerminated: result.next.optionsTerminated,
|
|
1570
|
-
state: newStateArray
|
|
1653
|
+
state: newStateArray,
|
|
1654
|
+
...mergedExec != null ? {
|
|
1655
|
+
exec: mergedExec,
|
|
1656
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
1657
|
+
} : {}
|
|
1571
1658
|
};
|
|
1572
1659
|
allConsumed.push(...result.consumed);
|
|
1573
1660
|
matchedParsers.add(index);
|
|
@@ -1576,15 +1663,17 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1576
1663
|
} else if (!result.success && error.consumed < result.consumed) error = result;
|
|
1577
1664
|
}
|
|
1578
1665
|
if (!foundMatch) for (const [parser, index] of remainingParsers) {
|
|
1579
|
-
const result = parser.parse(
|
|
1580
|
-
...currentContext,
|
|
1581
|
-
state: stateArray[index]
|
|
1582
|
-
});
|
|
1666
|
+
const result = parser.parse(withChildContext(currentContext, index, stateArray[index]));
|
|
1583
1667
|
if (result.success && result.consumed.length < 1) {
|
|
1584
1668
|
const newStateArray = stateArray.map((s, idx) => idx === index ? result.next.state : s);
|
|
1669
|
+
const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
|
|
1585
1670
|
currentContext = {
|
|
1586
1671
|
...currentContext,
|
|
1587
|
-
state: newStateArray
|
|
1672
|
+
state: newStateArray,
|
|
1673
|
+
...mergedExec != null ? {
|
|
1674
|
+
exec: mergedExec,
|
|
1675
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
1676
|
+
} : {}
|
|
1588
1677
|
};
|
|
1589
1678
|
matchedParsers.add(index);
|
|
1590
1679
|
foundMatch = true;
|
|
@@ -1619,18 +1708,20 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1619
1708
|
const stateArray = currentContext.state;
|
|
1620
1709
|
const remainingParsers = parsers.map((parser, index) => [parser, index]).filter(([_, index]) => !matchedParsers.has(index)).sort(([parserA], [parserB]) => parserB.priority - parserA.priority);
|
|
1621
1710
|
for (const [parser, index] of remainingParsers) {
|
|
1622
|
-
const resultOrPromise = parser.parse(
|
|
1623
|
-
...currentContext,
|
|
1624
|
-
state: stateArray[index]
|
|
1625
|
-
});
|
|
1711
|
+
const resultOrPromise = parser.parse(withChildContext(currentContext, index, stateArray[index]));
|
|
1626
1712
|
const result = await resultOrPromise;
|
|
1627
1713
|
if (result.success && result.consumed.length > 0) {
|
|
1628
1714
|
const newStateArray = stateArray.map((s, idx) => idx === index ? result.next.state : s);
|
|
1715
|
+
const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
|
|
1629
1716
|
currentContext = {
|
|
1630
1717
|
...currentContext,
|
|
1631
1718
|
buffer: result.next.buffer,
|
|
1632
1719
|
optionsTerminated: result.next.optionsTerminated,
|
|
1633
|
-
state: newStateArray
|
|
1720
|
+
state: newStateArray,
|
|
1721
|
+
...mergedExec != null ? {
|
|
1722
|
+
exec: mergedExec,
|
|
1723
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
1724
|
+
} : {}
|
|
1634
1725
|
};
|
|
1635
1726
|
allConsumed.push(...result.consumed);
|
|
1636
1727
|
matchedParsers.add(index);
|
|
@@ -1639,16 +1730,18 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1639
1730
|
} else if (!result.success && error.consumed < result.consumed) error = result;
|
|
1640
1731
|
}
|
|
1641
1732
|
if (!foundMatch) for (const [parser, index] of remainingParsers) {
|
|
1642
|
-
const resultOrPromise = parser.parse(
|
|
1643
|
-
...currentContext,
|
|
1644
|
-
state: stateArray[index]
|
|
1645
|
-
});
|
|
1733
|
+
const resultOrPromise = parser.parse(withChildContext(currentContext, index, stateArray[index]));
|
|
1646
1734
|
const result = await resultOrPromise;
|
|
1647
1735
|
if (result.success && result.consumed.length < 1) {
|
|
1648
1736
|
const newStateArray = stateArray.map((s, idx) => idx === index ? result.next.state : s);
|
|
1737
|
+
const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
|
|
1649
1738
|
currentContext = {
|
|
1650
1739
|
...currentContext,
|
|
1651
|
-
state: newStateArray
|
|
1740
|
+
state: newStateArray,
|
|
1741
|
+
...mergedExec != null ? {
|
|
1742
|
+
exec: mergedExec,
|
|
1743
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
1744
|
+
} : {}
|
|
1652
1745
|
};
|
|
1653
1746
|
matchedParsers.add(index);
|
|
1654
1747
|
foundMatch = true;
|
|
@@ -1674,6 +1767,7 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1674
1767
|
$mode: combinedMode,
|
|
1675
1768
|
$valueType: [],
|
|
1676
1769
|
$stateType: [],
|
|
1770
|
+
[fieldParsersKey]: parsers.map((parser, index) => [String(index), parser]),
|
|
1677
1771
|
usage: parsers.toSorted((a, b) => b.priority - a.priority).flatMap((p) => p.usage),
|
|
1678
1772
|
leadingNames: sharedBufferLeadingNames(parsers),
|
|
1679
1773
|
acceptingAnyToken: parsers.some((p) => p.acceptingAnyToken),
|
|
@@ -1693,6 +1787,7 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1693
1787
|
const tuplePairs = syncParsers.map((p, i) => [String(i), p]);
|
|
1694
1788
|
const tupleState = Object.fromEntries(stateArray.map((s, i) => [String(i), s]));
|
|
1695
1789
|
const preCompleted = preCompleteAndRegisterDependencies(tupleState, tuplePairs, runtime.registry, childExec);
|
|
1790
|
+
require_dependency_runtime.collectExplicitSourceValues(filterPreCompletedRuntimeNodes(require_dependency_runtime.buildRuntimeNodesFromArray(syncParsers, stateArray, exec?.path), new Set(preCompleted.keys())), runtime);
|
|
1696
1791
|
const phase3Exec = {
|
|
1697
1792
|
...childExec,
|
|
1698
1793
|
preCompletedByParser: void 0
|
|
@@ -1708,7 +1803,7 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1708
1803
|
if (preCompletedResult !== void 0) valueResult = unwrapCompleteResult(preCompletedResult);
|
|
1709
1804
|
else {
|
|
1710
1805
|
const elementState = prepareStateForCompletion(resolvedArray[i], elementParser);
|
|
1711
|
-
valueResult = unwrapCompleteResult(elementParser.complete(elementState, phase3Exec));
|
|
1806
|
+
valueResult = unwrapCompleteResult(elementParser.complete(elementState, withChildExecPath(phase3Exec, i)));
|
|
1712
1807
|
}
|
|
1713
1808
|
if (valueResult.success) {
|
|
1714
1809
|
result[i] = valueResult.value;
|
|
@@ -1739,6 +1834,7 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1739
1834
|
const tuplePairs = parsers.map((p, i) => [String(i), p]);
|
|
1740
1835
|
const tupleState = Object.fromEntries(stateArray.map((s, i) => [String(i), s]));
|
|
1741
1836
|
const preCompleted = await preCompleteAndRegisterDependenciesAsync(tupleState, tuplePairs, runtime.registry, childExec);
|
|
1837
|
+
await require_dependency_runtime.collectExplicitSourceValuesAsync(filterPreCompletedRuntimeNodes(require_dependency_runtime.buildRuntimeNodesFromArray(parsers, stateArray, exec?.path), new Set(preCompleted.keys())), runtime);
|
|
1742
1838
|
const phase3Exec = {
|
|
1743
1839
|
...childExec,
|
|
1744
1840
|
preCompletedByParser: void 0
|
|
@@ -1754,7 +1850,7 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1754
1850
|
if (preCompletedResult !== void 0) valueResult = unwrapCompleteResult(preCompletedResult);
|
|
1755
1851
|
else {
|
|
1756
1852
|
const elementState = prepareStateForCompletion(resolvedArray[i], elementParser);
|
|
1757
|
-
valueResult = unwrapCompleteResult(await elementParser.complete(elementState, phase3Exec));
|
|
1853
|
+
valueResult = unwrapCompleteResult(await elementParser.complete(elementState, withChildExecPath(phase3Exec, i)));
|
|
1758
1854
|
}
|
|
1759
1855
|
if (valueResult.success) {
|
|
1760
1856
|
result[i] = valueResult.value;
|
|
@@ -1857,18 +1953,25 @@ function merge(...args) {
|
|
|
1857
1953
|
const syncSorted = syncWithIndex.toSorted(([a], [b]) => b.priority - a.priority);
|
|
1858
1954
|
const syncParsers = syncSorted.map(([p]) => p);
|
|
1859
1955
|
if (!options.allowDuplicates) checkDuplicateOptionNames(sorted.map(([parser, originalIndex]) => [String(originalIndex), parser.usage]));
|
|
1956
|
+
const mergedFieldParsers = collectChildFieldParsers(parsers);
|
|
1957
|
+
const duplicateOutputFieldNames = collectDuplicateFieldNames(mergedFieldParsers);
|
|
1958
|
+
const parserStateKey = (index) => `__parser_${index}`;
|
|
1959
|
+
const localObjectStateKey = (index) => `__merge_local_${index}`;
|
|
1960
|
+
const shouldPreserveLocalChildState = (parser) => parser.initialState != null && typeof parser.initialState === "object" && Object.keys(parser.initialState).some((field) => duplicateOutputFieldNames.has(field));
|
|
1860
1961
|
const initialState = {};
|
|
1861
1962
|
for (let i = 0; i < parsers.length; i++) {
|
|
1862
1963
|
const parser = parsers[i];
|
|
1863
|
-
if (parser.initialState === void 0) initialState[
|
|
1964
|
+
if (parser.initialState === void 0) initialState[parserStateKey(i)] = void 0;
|
|
1864
1965
|
else if (parser.initialState && typeof parser.initialState === "object") for (const field in parser.initialState) initialState[field] = parser.initialState[field];
|
|
1865
1966
|
}
|
|
1866
1967
|
const extractParserState = (parser, context, index) => {
|
|
1867
1968
|
if (parser.initialState === void 0) {
|
|
1868
|
-
const key =
|
|
1969
|
+
const key = parserStateKey(index);
|
|
1869
1970
|
if (context.state && typeof context.state === "object" && key in context.state) return context.state[key];
|
|
1870
1971
|
return void 0;
|
|
1871
1972
|
} else if (parser.initialState && typeof parser.initialState === "object") {
|
|
1973
|
+
const localStateKey = localObjectStateKey(index);
|
|
1974
|
+
if (shouldPreserveLocalChildState(parser) && context.state && typeof context.state === "object" && localStateKey in context.state) return context.state[localStateKey];
|
|
1872
1975
|
if (context.state && typeof context.state === "object") {
|
|
1873
1976
|
const extractedState = {};
|
|
1874
1977
|
for (const field in parser.initialState) extractedState[field] = field in context.state ? context.state[field] : parser.initialState[field];
|
|
@@ -1878,9 +1981,9 @@ function merge(...args) {
|
|
|
1878
1981
|
}
|
|
1879
1982
|
return parser.initialState;
|
|
1880
1983
|
};
|
|
1881
|
-
const mergeResultState = (parser, context, result, index) => {
|
|
1984
|
+
const mergeResultState = (parser, context, parserState, result, index) => {
|
|
1882
1985
|
if (parser.initialState === void 0) {
|
|
1883
|
-
const key =
|
|
1986
|
+
const key = parserStateKey(index);
|
|
1884
1987
|
if (result.success) {
|
|
1885
1988
|
if (result.consumed.length > 0 || result.next.state !== void 0) return {
|
|
1886
1989
|
...context.state,
|
|
@@ -1889,10 +1992,17 @@ function merge(...args) {
|
|
|
1889
1992
|
}
|
|
1890
1993
|
return { ...context.state };
|
|
1891
1994
|
}
|
|
1892
|
-
|
|
1995
|
+
if (!result.success) return { ...context.state };
|
|
1996
|
+
const mergedState = {
|
|
1893
1997
|
...context.state,
|
|
1894
1998
|
...result.next.state
|
|
1895
|
-
}
|
|
1999
|
+
};
|
|
2000
|
+
if (!shouldPreserveLocalChildState(parser)) return mergedState;
|
|
2001
|
+
if (result.consumed.length === 0 && result.next.state === parserState) return mergedState;
|
|
2002
|
+
return {
|
|
2003
|
+
...mergedState,
|
|
2004
|
+
[localObjectStateKey(index)]: result.next.state
|
|
2005
|
+
};
|
|
1896
2006
|
};
|
|
1897
2007
|
const parseSync = (context) => {
|
|
1898
2008
|
let currentContext = context;
|
|
@@ -1900,17 +2010,19 @@ function merge(...args) {
|
|
|
1900
2010
|
for (let i = 0; i < syncParsers.length; i++) {
|
|
1901
2011
|
const parser = syncParsers[i];
|
|
1902
2012
|
const parserState = extractParserState(parser, currentContext, i);
|
|
1903
|
-
const result = parser.parse(
|
|
1904
|
-
...currentContext,
|
|
1905
|
-
state: parserState
|
|
1906
|
-
});
|
|
2013
|
+
const result = parser.parse(withChildContext(currentContext, i, parserState));
|
|
1907
2014
|
if (result.success) {
|
|
1908
|
-
const
|
|
2015
|
+
const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
|
|
2016
|
+
const newState = mergeResultState(parser, currentContext, parserState, result, i);
|
|
1909
2017
|
const newContext = {
|
|
1910
2018
|
...currentContext,
|
|
1911
2019
|
buffer: result.next.buffer,
|
|
1912
2020
|
optionsTerminated: result.next.optionsTerminated,
|
|
1913
|
-
state: newState
|
|
2021
|
+
state: newState,
|
|
2022
|
+
...mergedExec != null ? {
|
|
2023
|
+
exec: mergedExec,
|
|
2024
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
2025
|
+
} : {}
|
|
1914
2026
|
};
|
|
1915
2027
|
if (result.consumed.length > 0) return {
|
|
1916
2028
|
success: true,
|
|
@@ -1943,18 +2055,20 @@ function merge(...args) {
|
|
|
1943
2055
|
for (let i = 0; i < parsers.length; i++) {
|
|
1944
2056
|
const parser = parsers[i];
|
|
1945
2057
|
const parserState = extractParserState(parser, currentContext, i);
|
|
1946
|
-
const resultOrPromise = parser.parse(
|
|
1947
|
-
...currentContext,
|
|
1948
|
-
state: parserState
|
|
1949
|
-
});
|
|
2058
|
+
const resultOrPromise = parser.parse(withChildContext(currentContext, i, parserState));
|
|
1950
2059
|
const result = await resultOrPromise;
|
|
1951
2060
|
if (result.success) {
|
|
1952
|
-
const
|
|
2061
|
+
const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
|
|
2062
|
+
const newState = mergeResultState(parser, currentContext, parserState, result, i);
|
|
1953
2063
|
const newContext = {
|
|
1954
2064
|
...currentContext,
|
|
1955
2065
|
buffer: result.next.buffer,
|
|
1956
2066
|
optionsTerminated: result.next.optionsTerminated,
|
|
1957
|
-
state: newState
|
|
2067
|
+
state: newState,
|
|
2068
|
+
...mergedExec != null ? {
|
|
2069
|
+
exec: mergedExec,
|
|
2070
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
2071
|
+
} : {}
|
|
1958
2072
|
};
|
|
1959
2073
|
if (result.consumed.length > 0) return {
|
|
1960
2074
|
success: true,
|
|
@@ -1981,7 +2095,6 @@ function merge(...args) {
|
|
|
1981
2095
|
error: require_message.message`No matching option or argument found.`
|
|
1982
2096
|
};
|
|
1983
2097
|
};
|
|
1984
|
-
const mergedFieldParsers = collectChildFieldParsers(parsers);
|
|
1985
2098
|
const mergeParser = {
|
|
1986
2099
|
$mode: combinedMode,
|
|
1987
2100
|
$valueType: [],
|
|
@@ -1999,10 +2112,12 @@ function merge(...args) {
|
|
|
1999
2112
|
complete(state, exec) {
|
|
2000
2113
|
const extractCompleteState = (parser, resolvedState, index) => {
|
|
2001
2114
|
if (parser.initialState === void 0) {
|
|
2002
|
-
const key =
|
|
2115
|
+
const key = parserStateKey(index);
|
|
2003
2116
|
if (resolvedState && typeof resolvedState === "object" && key in resolvedState) return resolvedState[key];
|
|
2004
2117
|
return void 0;
|
|
2005
2118
|
} else if (parser.initialState && typeof parser.initialState === "object") {
|
|
2119
|
+
const key = localObjectStateKey(index);
|
|
2120
|
+
if (shouldPreserveLocalChildState(parser) && resolvedState && typeof resolvedState === "object" && key in resolvedState) return resolvedState[key];
|
|
2006
2121
|
if (resolvedState && typeof resolvedState === "object") {
|
|
2007
2122
|
const extractedState = {};
|
|
2008
2123
|
for (const field in parser.initialState) extractedState[field] = field in resolvedState ? resolvedState[field] : parser.initialState[field];
|
|
@@ -2020,14 +2135,25 @@ function merge(...args) {
|
|
|
2020
2135
|
...exec,
|
|
2021
2136
|
dependencyRuntime: runtime
|
|
2022
2137
|
};
|
|
2023
|
-
const
|
|
2138
|
+
const duplicateFieldNames = collectDuplicateFieldNames(mergedFieldParsers);
|
|
2139
|
+
const unambiguousFieldParsers = filterDuplicateFieldParsers(mergedFieldParsers);
|
|
2140
|
+
const perChildPhase1 = syncParsers.map((parser, i) => {
|
|
2024
2141
|
if (fieldParsersKey in parser) {
|
|
2025
2142
|
const pairs = parser[fieldParsersKey];
|
|
2026
|
-
const
|
|
2027
|
-
|
|
2143
|
+
const excludedSourceFields = new Set(pairs.map(([field]) => field).filter((field) => duplicateFieldNames.has(field)));
|
|
2144
|
+
const phase1Pairs = filterExcludedFieldParsers(pairs, excludedSourceFields);
|
|
2145
|
+
const preCompleted = preCompleteAndRegisterDependencies(state, phase1Pairs, runtime.registry, withChildExecPath(childExec, i));
|
|
2146
|
+
return {
|
|
2147
|
+
cache: filterDuplicateKeys(preCompleted, phase1Pairs),
|
|
2148
|
+
excludedSourceFields: excludedSourceFields.size > 0 ? excludedSourceFields : void 0
|
|
2149
|
+
};
|
|
2028
2150
|
}
|
|
2029
|
-
return
|
|
2151
|
+
return {
|
|
2152
|
+
cache: void 0,
|
|
2153
|
+
excludedSourceFields: void 0
|
|
2154
|
+
};
|
|
2030
2155
|
});
|
|
2156
|
+
require_dependency_runtime.collectExplicitSourceValues(require_dependency_runtime.buildRuntimeNodesFromPairs(unambiguousFieldParsers, state, exec?.path), runtime);
|
|
2031
2157
|
const resolvedState = require_dependency_runtime.resolveStateWithRuntime(state, runtime);
|
|
2032
2158
|
const object$1 = {};
|
|
2033
2159
|
const deferredKeys = /* @__PURE__ */ new Map();
|
|
@@ -2035,11 +2161,21 @@ function merge(...args) {
|
|
|
2035
2161
|
for (let i = 0; i < syncParsers.length; i++) {
|
|
2036
2162
|
const parser = syncParsers[i];
|
|
2037
2163
|
const parserState = extractCompleteState(parser, resolvedState, i);
|
|
2038
|
-
const cache =
|
|
2039
|
-
const
|
|
2040
|
-
|
|
2164
|
+
const { cache, excludedSourceFields } = perChildPhase1[i];
|
|
2165
|
+
const childCompleteExec = withChildExecPath(childExec, i);
|
|
2166
|
+
const completeExec = excludedSourceFields == null ? {
|
|
2167
|
+
...childCompleteExec,
|
|
2041
2168
|
preCompletedByParser: cache
|
|
2042
|
-
})
|
|
2169
|
+
} : (() => {
|
|
2170
|
+
const childRuntime = require_dependency_runtime.createDependencyRuntimeContext(runtime.registry.clone());
|
|
2171
|
+
return {
|
|
2172
|
+
...childCompleteExec,
|
|
2173
|
+
dependencyRuntime: childRuntime,
|
|
2174
|
+
dependencyRegistry: childRuntime.registry,
|
|
2175
|
+
preCompletedByParser: cache
|
|
2176
|
+
};
|
|
2177
|
+
})();
|
|
2178
|
+
const result = unwrapCompleteResult(parser.complete(parserState, completeExec));
|
|
2043
2179
|
if (!result.success) return result;
|
|
2044
2180
|
const resultValue = result.value;
|
|
2045
2181
|
for (const field in resultValue) {
|
|
@@ -2065,12 +2201,26 @@ function merge(...args) {
|
|
|
2065
2201
|
...exec,
|
|
2066
2202
|
dependencyRuntime: runtime
|
|
2067
2203
|
};
|
|
2068
|
-
const
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2204
|
+
const duplicateFieldNames = collectDuplicateFieldNames(mergedFieldParsers);
|
|
2205
|
+
const unambiguousFieldParsers = filterDuplicateFieldParsers(mergedFieldParsers);
|
|
2206
|
+
const perChildPhase1 = [];
|
|
2207
|
+
for (let i = 0; i < parsers.length; i++) {
|
|
2208
|
+
const parser = parsers[i];
|
|
2209
|
+
if (fieldParsersKey in parser) {
|
|
2210
|
+
const pairs = parser[fieldParsersKey];
|
|
2211
|
+
const excludedSourceFields = new Set(pairs.map(([field]) => field).filter((field) => duplicateFieldNames.has(field)));
|
|
2212
|
+
const phase1Pairs = filterExcludedFieldParsers(pairs, excludedSourceFields);
|
|
2213
|
+
const preCompleted = await preCompleteAndRegisterDependenciesAsync(state, phase1Pairs, runtime.registry, withChildExecPath(childExec, i));
|
|
2214
|
+
perChildPhase1.push({
|
|
2215
|
+
cache: filterDuplicateKeys(preCompleted, phase1Pairs),
|
|
2216
|
+
excludedSourceFields: excludedSourceFields.size > 0 ? excludedSourceFields : void 0
|
|
2217
|
+
});
|
|
2218
|
+
} else perChildPhase1.push({
|
|
2219
|
+
cache: void 0,
|
|
2220
|
+
excludedSourceFields: void 0
|
|
2221
|
+
});
|
|
2222
|
+
}
|
|
2223
|
+
await require_dependency_runtime.collectExplicitSourceValuesAsync(require_dependency_runtime.buildRuntimeNodesFromPairs(unambiguousFieldParsers, state, exec?.path), runtime);
|
|
2074
2224
|
const resolvedState = await require_dependency_runtime.resolveStateWithRuntimeAsync(state, runtime);
|
|
2075
2225
|
const object$1 = {};
|
|
2076
2226
|
const deferredKeys = /* @__PURE__ */ new Map();
|
|
@@ -2078,11 +2228,21 @@ function merge(...args) {
|
|
|
2078
2228
|
for (let i = 0; i < parsers.length; i++) {
|
|
2079
2229
|
const parser = parsers[i];
|
|
2080
2230
|
const parserState = extractCompleteState(parser, resolvedState, i);
|
|
2081
|
-
const asyncCache =
|
|
2082
|
-
const
|
|
2083
|
-
|
|
2231
|
+
const { cache: asyncCache, excludedSourceFields } = perChildPhase1[i];
|
|
2232
|
+
const childCompleteExec = withChildExecPath(childExec, i);
|
|
2233
|
+
const completeExec = excludedSourceFields == null ? {
|
|
2234
|
+
...childCompleteExec,
|
|
2084
2235
|
preCompletedByParser: asyncCache
|
|
2085
|
-
})
|
|
2236
|
+
} : (() => {
|
|
2237
|
+
const childRuntime = require_dependency_runtime.createDependencyRuntimeContext(runtime.registry.clone());
|
|
2238
|
+
return {
|
|
2239
|
+
...childCompleteExec,
|
|
2240
|
+
dependencyRuntime: childRuntime,
|
|
2241
|
+
dependencyRegistry: childRuntime.registry,
|
|
2242
|
+
preCompletedByParser: asyncCache
|
|
2243
|
+
};
|
|
2244
|
+
})();
|
|
2245
|
+
const result = unwrapCompleteResult(await parser.complete(parserState, completeExec));
|
|
2086
2246
|
if (!result.success) return result;
|
|
2087
2247
|
const resultValue = result.value;
|
|
2088
2248
|
for (const field in resultValue) {
|
|
@@ -2107,10 +2267,12 @@ function merge(...args) {
|
|
|
2107
2267
|
if (options.hidden === true) return require_mode_dispatch.dispatchIterableByMode(combinedMode, function* () {}, async function* () {});
|
|
2108
2268
|
const extractState = (p, i) => {
|
|
2109
2269
|
if (p.initialState === void 0) {
|
|
2110
|
-
const key =
|
|
2270
|
+
const key = parserStateKey(i);
|
|
2111
2271
|
if (context.state && typeof context.state === "object" && key in context.state) return context.state[key];
|
|
2112
2272
|
return void 0;
|
|
2113
2273
|
} else if (p.initialState && typeof p.initialState === "object") {
|
|
2274
|
+
const key = localObjectStateKey(i);
|
|
2275
|
+
if (shouldPreserveLocalChildState(p) && context.state && typeof context.state === "object" && key in context.state) return context.state[key];
|
|
2114
2276
|
if (context.state && typeof context.state === "object") {
|
|
2115
2277
|
const extractedState = {};
|
|
2116
2278
|
for (const field in p.initialState) extractedState[field] = field in context.state ? context.state[field] : p.initialState[field];
|
|
@@ -2122,8 +2284,17 @@ function merge(...args) {
|
|
|
2122
2284
|
};
|
|
2123
2285
|
if (isAsync) return async function* () {
|
|
2124
2286
|
const runtime$1 = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
|
|
2125
|
-
const
|
|
2126
|
-
|
|
2287
|
+
const mergedPairs$1 = collectChildFieldParsers(parsers);
|
|
2288
|
+
const duplicateFieldNames$1 = collectDuplicateFieldNames(mergedPairs$1);
|
|
2289
|
+
const childFieldPairs$1 = filterDuplicateFieldParsers(mergedPairs$1);
|
|
2290
|
+
const perChildExcludedSourceFields$1 = parsers.map((parser) => {
|
|
2291
|
+
if (!(fieldParsersKey in parser)) return void 0;
|
|
2292
|
+
const pairs = parser[fieldParsersKey];
|
|
2293
|
+
const excludedSourceFields = new Set(pairs.map(([field]) => field).filter((field) => duplicateFieldNames$1.has(field)));
|
|
2294
|
+
return excludedSourceFields.size > 0 ? excludedSourceFields : void 0;
|
|
2295
|
+
});
|
|
2296
|
+
if (context.state && typeof context.state === "object") await require_dependency_runtime.collectExplicitSourceValuesAsync(require_dependency_runtime.buildRuntimeNodesFromPairs(childFieldPairs$1, context.state, context.exec?.path), runtime$1);
|
|
2297
|
+
if (context.state && typeof context.state === "object") require_dependency_runtime.collectSourcesFromState(context.state, runtime$1, /* @__PURE__ */ new WeakSet(), duplicateFieldNames$1);
|
|
2127
2298
|
await completeDependencySourceDefaultsAsync(context, childFieldPairs$1, runtime$1.registry, context.exec);
|
|
2128
2299
|
const contextWithRegistry$1 = {
|
|
2129
2300
|
...context,
|
|
@@ -2133,18 +2304,37 @@ function merge(...args) {
|
|
|
2133
2304
|
for (let i = 0; i < parsers.length; i++) {
|
|
2134
2305
|
const parser = parsers[i];
|
|
2135
2306
|
const parserState = extractState(parser, i);
|
|
2136
|
-
const
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
|
|
2307
|
+
const childContext = withChildContext(contextWithRegistry$1, i, parserState);
|
|
2308
|
+
const excludedSourceFields = perChildExcludedSourceFields$1[i];
|
|
2309
|
+
const contextForChild = excludedSourceFields == null ? childContext : (() => {
|
|
2310
|
+
const childRuntime = require_dependency_runtime.createDependencyRuntimeContext(runtime$1.registry.clone());
|
|
2311
|
+
return {
|
|
2312
|
+
...childContext,
|
|
2313
|
+
dependencyRegistry: childRuntime.registry,
|
|
2314
|
+
exec: childContext.exec == null ? childContext.exec : {
|
|
2315
|
+
...childContext.exec,
|
|
2316
|
+
dependencyRegistry: childRuntime.registry
|
|
2317
|
+
}
|
|
2318
|
+
};
|
|
2319
|
+
})();
|
|
2320
|
+
const parserSuggestions = parser.suggest(contextForChild, prefix);
|
|
2140
2321
|
if (parser.$mode === "async") for await (const s of parserSuggestions) suggestions.push(s);
|
|
2141
2322
|
else suggestions.push(...parserSuggestions);
|
|
2142
2323
|
}
|
|
2143
2324
|
yield* require_suggestion.deduplicateSuggestions(suggestions);
|
|
2144
2325
|
}();
|
|
2145
2326
|
const runtime = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
|
|
2146
|
-
const
|
|
2147
|
-
|
|
2327
|
+
const mergedPairs = collectChildFieldParsers(syncParsers);
|
|
2328
|
+
const duplicateFieldNames = collectDuplicateFieldNames(mergedPairs);
|
|
2329
|
+
const childFieldPairs = filterDuplicateFieldParsers(mergedPairs);
|
|
2330
|
+
const perChildExcludedSourceFields = syncParsers.map((parser) => {
|
|
2331
|
+
if (!(fieldParsersKey in parser)) return void 0;
|
|
2332
|
+
const pairs = parser[fieldParsersKey];
|
|
2333
|
+
const excludedSourceFields = new Set(pairs.map(([field]) => field).filter((field) => duplicateFieldNames.has(field)));
|
|
2334
|
+
return excludedSourceFields.size > 0 ? excludedSourceFields : void 0;
|
|
2335
|
+
});
|
|
2336
|
+
if (context.state && typeof context.state === "object") require_dependency_runtime.collectExplicitSourceValues(require_dependency_runtime.buildRuntimeNodesFromPairs(childFieldPairs, context.state, context.exec?.path), runtime);
|
|
2337
|
+
if (context.state && typeof context.state === "object") require_dependency_runtime.collectSourcesFromState(context.state, runtime, /* @__PURE__ */ new WeakSet(), duplicateFieldNames);
|
|
2148
2338
|
completeDependencySourceDefaults(context, childFieldPairs, runtime.registry, context.exec);
|
|
2149
2339
|
const contextWithRegistry = {
|
|
2150
2340
|
...context,
|
|
@@ -2155,10 +2345,20 @@ function merge(...args) {
|
|
|
2155
2345
|
for (let i = 0; i < syncParsers.length; i++) {
|
|
2156
2346
|
const parser = syncParsers[i];
|
|
2157
2347
|
const parserState = extractState(parser, i);
|
|
2158
|
-
const
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2348
|
+
const childContext = withChildContext(contextWithRegistry, i, parserState);
|
|
2349
|
+
const excludedSourceFields = perChildExcludedSourceFields[i];
|
|
2350
|
+
const contextForChild = excludedSourceFields == null ? childContext : (() => {
|
|
2351
|
+
const childRuntime = require_dependency_runtime.createDependencyRuntimeContext(runtime.registry.clone());
|
|
2352
|
+
return {
|
|
2353
|
+
...childContext,
|
|
2354
|
+
dependencyRegistry: childRuntime.registry,
|
|
2355
|
+
exec: childContext.exec == null ? childContext.exec : {
|
|
2356
|
+
...childContext.exec,
|
|
2357
|
+
dependencyRegistry: childRuntime.registry
|
|
2358
|
+
}
|
|
2359
|
+
};
|
|
2360
|
+
})();
|
|
2361
|
+
const parserSuggestions = parser.suggest(contextForChild, prefix);
|
|
2162
2362
|
suggestions.push(...parserSuggestions);
|
|
2163
2363
|
}
|
|
2164
2364
|
yield* require_suggestion.deduplicateSuggestions(suggestions);
|
|
@@ -2233,10 +2433,36 @@ function merge(...args) {
|
|
|
2233
2433
|
* async branches of `concat().suggest()`.
|
|
2234
2434
|
* @internal
|
|
2235
2435
|
*/
|
|
2236
|
-
function buildSuggestRegistry(preParsedContext) {
|
|
2436
|
+
function buildSuggestRegistry(preParsedContext, parsers) {
|
|
2437
|
+
const stateArray = preParsedContext.state;
|
|
2438
|
+
const runtime = require_dependency_runtime.createDependencyRuntimeContext(preParsedContext.dependencyRegistry?.clone());
|
|
2439
|
+
if (stateArray && Array.isArray(stateArray)) {
|
|
2440
|
+
const nodes = require_dependency_runtime.buildRuntimeNodesFromArray(parsers, stateArray, preParsedContext.exec?.path);
|
|
2441
|
+
require_dependency_runtime.collectExplicitSourceValues(nodes, runtime);
|
|
2442
|
+
require_dependency_runtime.collectSourcesFromState(stateArray, runtime);
|
|
2443
|
+
require_dependency_runtime.fillMissingSourceDefaults(nodes, runtime);
|
|
2444
|
+
const prefix = preParsedContext.exec?.path ?? [];
|
|
2445
|
+
for (let i = 0; i < parsers.length; i++) seedSuggestRuntimeFromFieldParsers(parsers[i], stateArray[i], runtime, [...prefix, i]);
|
|
2446
|
+
}
|
|
2447
|
+
return {
|
|
2448
|
+
context: {
|
|
2449
|
+
...preParsedContext,
|
|
2450
|
+
dependencyRegistry: runtime.registry
|
|
2451
|
+
},
|
|
2452
|
+
stateArray
|
|
2453
|
+
};
|
|
2454
|
+
}
|
|
2455
|
+
async function buildSuggestRegistryAsync(preParsedContext, parsers) {
|
|
2237
2456
|
const stateArray = preParsedContext.state;
|
|
2238
2457
|
const runtime = require_dependency_runtime.createDependencyRuntimeContext(preParsedContext.dependencyRegistry?.clone());
|
|
2239
|
-
if (stateArray && Array.isArray(stateArray))
|
|
2458
|
+
if (stateArray && Array.isArray(stateArray)) {
|
|
2459
|
+
const nodes = require_dependency_runtime.buildRuntimeNodesFromArray(parsers, stateArray, preParsedContext.exec?.path);
|
|
2460
|
+
await require_dependency_runtime.collectExplicitSourceValuesAsync(nodes, runtime);
|
|
2461
|
+
require_dependency_runtime.collectSourcesFromState(stateArray, runtime);
|
|
2462
|
+
await require_dependency_runtime.fillMissingSourceDefaultsAsync(nodes, runtime);
|
|
2463
|
+
const prefix = preParsedContext.exec?.path ?? [];
|
|
2464
|
+
for (let i = 0; i < parsers.length; i++) await seedSuggestRuntimeFromFieldParsersAsync(parsers[i], stateArray[i], runtime, [...prefix, i]);
|
|
2465
|
+
}
|
|
2240
2466
|
return {
|
|
2241
2467
|
context: {
|
|
2242
2468
|
...preParsedContext,
|
|
@@ -2245,6 +2471,30 @@ function buildSuggestRegistry(preParsedContext) {
|
|
|
2245
2471
|
stateArray
|
|
2246
2472
|
};
|
|
2247
2473
|
}
|
|
2474
|
+
function seedSuggestRuntimeFromFieldParsers(parser, state, runtime, parentPath) {
|
|
2475
|
+
if (!(fieldParsersKey in parser)) return;
|
|
2476
|
+
const rawPairs = parser[fieldParsersKey];
|
|
2477
|
+
const duplicateFieldNames = collectDuplicateFieldNames(rawPairs);
|
|
2478
|
+
const pairs = filterDuplicateFieldParsers(rawPairs);
|
|
2479
|
+
const stateRecord = state != null && typeof state === "object" ? state : {};
|
|
2480
|
+
const nodes = require_dependency_runtime.buildRuntimeNodesFromPairs(pairs, stateRecord, parentPath);
|
|
2481
|
+
require_dependency_runtime.collectExplicitSourceValues(nodes, runtime);
|
|
2482
|
+
require_dependency_runtime.collectSourcesFromState(state, runtime, /* @__PURE__ */ new WeakSet(), duplicateFieldNames);
|
|
2483
|
+
require_dependency_runtime.fillMissingSourceDefaults(nodes, runtime);
|
|
2484
|
+
for (const [field, childParser] of pairs) seedSuggestRuntimeFromFieldParsers(childParser, Object.hasOwn(stateRecord, field) ? stateRecord[field] : void 0, runtime, [...parentPath, field]);
|
|
2485
|
+
}
|
|
2486
|
+
async function seedSuggestRuntimeFromFieldParsersAsync(parser, state, runtime, parentPath) {
|
|
2487
|
+
if (!(fieldParsersKey in parser)) return;
|
|
2488
|
+
const rawPairs = parser[fieldParsersKey];
|
|
2489
|
+
const duplicateFieldNames = collectDuplicateFieldNames(rawPairs);
|
|
2490
|
+
const pairs = filterDuplicateFieldParsers(rawPairs);
|
|
2491
|
+
const stateRecord = state != null && typeof state === "object" ? state : {};
|
|
2492
|
+
const nodes = require_dependency_runtime.buildRuntimeNodesFromPairs(pairs, stateRecord, parentPath);
|
|
2493
|
+
await require_dependency_runtime.collectExplicitSourceValuesAsync(nodes, runtime);
|
|
2494
|
+
require_dependency_runtime.collectSourcesFromState(state, runtime, /* @__PURE__ */ new WeakSet(), duplicateFieldNames);
|
|
2495
|
+
await require_dependency_runtime.fillMissingSourceDefaultsAsync(nodes, runtime);
|
|
2496
|
+
for (const [field, childParser] of pairs) await seedSuggestRuntimeFromFieldParsersAsync(childParser, Object.hasOwn(stateRecord, field) ? stateRecord[field] : void 0, runtime, [...parentPath, field]);
|
|
2497
|
+
}
|
|
2248
2498
|
/**
|
|
2249
2499
|
* This helper replays child parsers in priority order (mirroring
|
|
2250
2500
|
* `concat.parse()`) to accumulate dependency source values for suggestions.
|
|
@@ -2297,21 +2547,23 @@ function tryParseSuggestList(context, stateArray, parsers, matchedParsers, remai
|
|
|
2297
2547
|
for (let ri = 0; ri < remaining.length; ri++) {
|
|
2298
2548
|
const [parser, index] = remaining[ri];
|
|
2299
2549
|
const parserState = index < stateArray.length ? stateArray[index] : parser.initialState;
|
|
2300
|
-
const resultOrPromise = parser.parse(
|
|
2301
|
-
...context,
|
|
2302
|
-
state: parserState
|
|
2303
|
-
});
|
|
2550
|
+
const resultOrPromise = parser.parse(withChildContext(context, index, parserState));
|
|
2304
2551
|
if (resultOrPromise != null && typeof resultOrPromise === "object" && "then" in resultOrPromise && typeof resultOrPromise.then === "function") {
|
|
2305
2552
|
const tail = remaining.slice(ri + 1);
|
|
2306
2553
|
return resultOrPromise.then((result$1) => {
|
|
2307
2554
|
if (result$1.success && result$1.consumed.length > 0) {
|
|
2308
2555
|
stateArray[index] = result$1.next.state;
|
|
2309
2556
|
matchedParsers.add(index);
|
|
2557
|
+
const mergedExec = mergeChildExec(context.exec, result$1.next.exec);
|
|
2310
2558
|
return preParseSuggestLoop({
|
|
2311
2559
|
...context,
|
|
2312
2560
|
buffer: result$1.next.buffer,
|
|
2313
2561
|
optionsTerminated: result$1.next.optionsTerminated,
|
|
2314
|
-
state: stateArray
|
|
2562
|
+
state: stateArray,
|
|
2563
|
+
...mergedExec != null ? {
|
|
2564
|
+
exec: mergedExec,
|
|
2565
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
2566
|
+
} : {}
|
|
2315
2567
|
}, stateArray, parsers, matchedParsers);
|
|
2316
2568
|
}
|
|
2317
2569
|
const next = tryParseSuggestList(context, stateArray, parsers, matchedParsers, tail);
|
|
@@ -2329,11 +2581,16 @@ function tryParseSuggestList(context, stateArray, parsers, matchedParsers, remai
|
|
|
2329
2581
|
if (result.success && result.consumed.length > 0) {
|
|
2330
2582
|
stateArray[index] = result.next.state;
|
|
2331
2583
|
matchedParsers.add(index);
|
|
2584
|
+
const mergedExec = mergeChildExec(context.exec, result.next.exec);
|
|
2332
2585
|
return {
|
|
2333
2586
|
...context,
|
|
2334
2587
|
buffer: result.next.buffer,
|
|
2335
2588
|
optionsTerminated: result.next.optionsTerminated,
|
|
2336
|
-
state: stateArray
|
|
2589
|
+
state: stateArray,
|
|
2590
|
+
...mergedExec != null ? {
|
|
2591
|
+
exec: mergedExec,
|
|
2592
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
2593
|
+
} : {}
|
|
2337
2594
|
};
|
|
2338
2595
|
}
|
|
2339
2596
|
}
|
|
@@ -2359,17 +2616,19 @@ function concat(...parsers) {
|
|
|
2359
2616
|
const stateArray = currentContext.state;
|
|
2360
2617
|
const remainingParsers = syncParsers.map((parser, index) => [parser, index]).filter(([_, index]) => !matchedParsers.has(index)).sort(([parserA], [parserB]) => parserB.priority - parserA.priority);
|
|
2361
2618
|
for (const [parser, index] of remainingParsers) {
|
|
2362
|
-
const result = parser.parse(
|
|
2363
|
-
...currentContext,
|
|
2364
|
-
state: stateArray[index]
|
|
2365
|
-
});
|
|
2619
|
+
const result = parser.parse(withChildContext(currentContext, index, stateArray[index]));
|
|
2366
2620
|
if (result.success && result.consumed.length > 0) {
|
|
2367
2621
|
const newStateArray = stateArray.map((s, idx) => idx === index ? result.next.state : s);
|
|
2622
|
+
const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
|
|
2368
2623
|
currentContext = {
|
|
2369
2624
|
...currentContext,
|
|
2370
2625
|
buffer: result.next.buffer,
|
|
2371
2626
|
optionsTerminated: result.next.optionsTerminated,
|
|
2372
|
-
state: newStateArray
|
|
2627
|
+
state: newStateArray,
|
|
2628
|
+
...mergedExec != null ? {
|
|
2629
|
+
exec: mergedExec,
|
|
2630
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
2631
|
+
} : {}
|
|
2373
2632
|
};
|
|
2374
2633
|
allConsumed.push(...result.consumed);
|
|
2375
2634
|
matchedParsers.add(index);
|
|
@@ -2378,15 +2637,17 @@ function concat(...parsers) {
|
|
|
2378
2637
|
} else if (!result.success && error.consumed < result.consumed) error = result;
|
|
2379
2638
|
}
|
|
2380
2639
|
if (!foundMatch) for (const [parser, index] of remainingParsers) {
|
|
2381
|
-
const result = parser.parse(
|
|
2382
|
-
...currentContext,
|
|
2383
|
-
state: stateArray[index]
|
|
2384
|
-
});
|
|
2640
|
+
const result = parser.parse(withChildContext(currentContext, index, stateArray[index]));
|
|
2385
2641
|
if (result.success && result.consumed.length < 1) {
|
|
2386
2642
|
const newStateArray = stateArray.map((s, idx) => idx === index ? result.next.state : s);
|
|
2643
|
+
const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
|
|
2387
2644
|
currentContext = {
|
|
2388
2645
|
...currentContext,
|
|
2389
|
-
state: newStateArray
|
|
2646
|
+
state: newStateArray,
|
|
2647
|
+
...mergedExec != null ? {
|
|
2648
|
+
exec: mergedExec,
|
|
2649
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
2650
|
+
} : {}
|
|
2390
2651
|
};
|
|
2391
2652
|
matchedParsers.add(index);
|
|
2392
2653
|
foundMatch = true;
|
|
@@ -2421,17 +2682,19 @@ function concat(...parsers) {
|
|
|
2421
2682
|
const stateArray = currentContext.state;
|
|
2422
2683
|
const remainingParsers = parsers.map((parser, index) => [parser, index]).filter(([_, index]) => !matchedParsers.has(index)).sort(([parserA], [parserB]) => parserB.priority - parserA.priority);
|
|
2423
2684
|
for (const [parser, index] of remainingParsers) {
|
|
2424
|
-
const result = await parser.parse(
|
|
2425
|
-
...currentContext,
|
|
2426
|
-
state: stateArray[index]
|
|
2427
|
-
});
|
|
2685
|
+
const result = await parser.parse(withChildContext(currentContext, index, stateArray[index]));
|
|
2428
2686
|
if (result.success && result.consumed.length > 0) {
|
|
2429
2687
|
const newStateArray = stateArray.map((s, idx) => idx === index ? result.next.state : s);
|
|
2688
|
+
const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
|
|
2430
2689
|
currentContext = {
|
|
2431
2690
|
...currentContext,
|
|
2432
2691
|
buffer: result.next.buffer,
|
|
2433
2692
|
optionsTerminated: result.next.optionsTerminated,
|
|
2434
|
-
state: newStateArray
|
|
2693
|
+
state: newStateArray,
|
|
2694
|
+
...mergedExec != null ? {
|
|
2695
|
+
exec: mergedExec,
|
|
2696
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
2697
|
+
} : {}
|
|
2435
2698
|
};
|
|
2436
2699
|
allConsumed.push(...result.consumed);
|
|
2437
2700
|
matchedParsers.add(index);
|
|
@@ -2440,15 +2703,17 @@ function concat(...parsers) {
|
|
|
2440
2703
|
} else if (!result.success && error.consumed < result.consumed) error = result;
|
|
2441
2704
|
}
|
|
2442
2705
|
if (!foundMatch) for (const [parser, index] of remainingParsers) {
|
|
2443
|
-
const result = await parser.parse(
|
|
2444
|
-
...currentContext,
|
|
2445
|
-
state: stateArray[index]
|
|
2446
|
-
});
|
|
2706
|
+
const result = await parser.parse(withChildContext(currentContext, index, stateArray[index]));
|
|
2447
2707
|
if (result.success && result.consumed.length < 1) {
|
|
2448
2708
|
const newStateArray = stateArray.map((s, idx) => idx === index ? result.next.state : s);
|
|
2709
|
+
const mergedExec = mergeChildExec(currentContext.exec, result.next.exec);
|
|
2449
2710
|
currentContext = {
|
|
2450
2711
|
...currentContext,
|
|
2451
|
-
state: newStateArray
|
|
2712
|
+
state: newStateArray,
|
|
2713
|
+
...mergedExec != null ? {
|
|
2714
|
+
exec: mergedExec,
|
|
2715
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
2716
|
+
} : {}
|
|
2452
2717
|
};
|
|
2453
2718
|
matchedParsers.add(index);
|
|
2454
2719
|
foundMatch = true;
|
|
@@ -2485,7 +2750,7 @@ function concat(...parsers) {
|
|
|
2485
2750
|
for (let i = 0; i < syncParsers.length; i++) {
|
|
2486
2751
|
const parser = syncParsers[i];
|
|
2487
2752
|
const parserState = prepareStateForCompletion(resolvedArray[i], parser);
|
|
2488
|
-
const result = unwrapCompleteResult(parser.complete(parserState, childExec));
|
|
2753
|
+
const result = unwrapCompleteResult(parser.complete(parserState, withChildExecPath(childExec, i)));
|
|
2489
2754
|
if (!result.success) return result;
|
|
2490
2755
|
const baseIndex = results.length;
|
|
2491
2756
|
if (Array.isArray(result.value)) {
|
|
@@ -2528,7 +2793,7 @@ function concat(...parsers) {
|
|
|
2528
2793
|
for (let i = 0; i < parsers.length; i++) {
|
|
2529
2794
|
const parser = parsers[i];
|
|
2530
2795
|
const parserState = prepareStateForCompletion(resolvedArray[i], parser);
|
|
2531
|
-
const result = unwrapCompleteResult(await parser.complete(parserState, childExec));
|
|
2796
|
+
const result = unwrapCompleteResult(await parser.complete(parserState, withChildExecPath(childExec, i)));
|
|
2532
2797
|
if (!result.success) return result;
|
|
2533
2798
|
const baseIndex = results.length;
|
|
2534
2799
|
if (Array.isArray(result.value)) {
|
|
@@ -2576,31 +2841,25 @@ function concat(...parsers) {
|
|
|
2576
2841
|
suggest(context, prefix) {
|
|
2577
2842
|
if (isAsync) return async function* () {
|
|
2578
2843
|
const preParsedContext$1 = await preParseSuggestContextAsync(context, parsers);
|
|
2579
|
-
const { context: contextWithRegistry$1, stateArray: stateArray$1 } =
|
|
2844
|
+
const { context: contextWithRegistry$1, stateArray: stateArray$1 } = await buildSuggestRegistryAsync(preParsedContext$1, parsers);
|
|
2580
2845
|
const suggestions = [];
|
|
2581
2846
|
for (let i = 0; i < parsers.length; i++) {
|
|
2582
2847
|
const parser = parsers[i];
|
|
2583
2848
|
const parserState = stateArray$1 && Array.isArray(stateArray$1) ? stateArray$1[i] : parser.initialState;
|
|
2584
|
-
const parserSuggestions = parser.suggest(
|
|
2585
|
-
...contextWithRegistry$1,
|
|
2586
|
-
state: parserState
|
|
2587
|
-
}, prefix);
|
|
2849
|
+
const parserSuggestions = parser.suggest(withChildContext(contextWithRegistry$1, i, parserState), prefix);
|
|
2588
2850
|
if (parser.$mode === "async") for await (const s of parserSuggestions) suggestions.push(s);
|
|
2589
2851
|
else suggestions.push(...parserSuggestions);
|
|
2590
2852
|
}
|
|
2591
2853
|
yield* require_suggestion.deduplicateSuggestions(suggestions);
|
|
2592
2854
|
}();
|
|
2593
2855
|
const preParsedContext = preParseSuggestContext(context, syncParsers);
|
|
2594
|
-
const { context: contextWithRegistry, stateArray } = buildSuggestRegistry(preParsedContext);
|
|
2856
|
+
const { context: contextWithRegistry, stateArray } = buildSuggestRegistry(preParsedContext, syncParsers);
|
|
2595
2857
|
return function* () {
|
|
2596
2858
|
const suggestions = [];
|
|
2597
2859
|
for (let i = 0; i < syncParsers.length; i++) {
|
|
2598
2860
|
const parser = syncParsers[i];
|
|
2599
2861
|
const parserState = stateArray && Array.isArray(stateArray) ? stateArray[i] : parser.initialState;
|
|
2600
|
-
const parserSuggestions = parser.suggest(
|
|
2601
|
-
...contextWithRegistry,
|
|
2602
|
-
state: parserState
|
|
2603
|
-
}, prefix);
|
|
2862
|
+
const parserSuggestions = parser.suggest(withChildContext(contextWithRegistry, i, parserState), prefix);
|
|
2604
2863
|
suggestions.push(...parserSuggestions);
|
|
2605
2864
|
}
|
|
2606
2865
|
yield* require_suggestion.deduplicateSuggestions(suggestions);
|
|
@@ -2646,6 +2905,13 @@ function group(label, parser, options = {}) {
|
|
|
2646
2905
|
initialState: parser.initialState,
|
|
2647
2906
|
...fieldParsersKey in parser ? { [fieldParsersKey]: parser[fieldParsersKey] } : {},
|
|
2648
2907
|
...typeof parser.shouldDeferCompletion === "function" ? { shouldDeferCompletion: parser.shouldDeferCompletion.bind(parser) } : {},
|
|
2908
|
+
getSuggestRuntimeNodes(state, path) {
|
|
2909
|
+
return parser.getSuggestRuntimeNodes?.(state, path) ?? (parser.dependencyMetadata?.source != null ? [{
|
|
2910
|
+
path,
|
|
2911
|
+
parser,
|
|
2912
|
+
state
|
|
2913
|
+
}] : []);
|
|
2914
|
+
},
|
|
2649
2915
|
parse: (context) => parser.parse(context),
|
|
2650
2916
|
complete: (state, exec) => parser.complete(state, exec),
|
|
2651
2917
|
suggest: (context, prefix) => {
|
|
@@ -2788,57 +3054,69 @@ function conditional(discriminator, branches, defaultBranch, options) {
|
|
|
2788
3054
|
const syncDefaultBranch = defaultBranch;
|
|
2789
3055
|
if (state.selectedBranch !== void 0) {
|
|
2790
3056
|
const branchParser = state.selectedBranch.kind === "default" ? syncDefaultBranch : syncBranches[state.selectedBranch.key];
|
|
2791
|
-
const branchResult = branchParser.parse(
|
|
2792
|
-
|
|
2793
|
-
|
|
2794
|
-
|
|
2795
|
-
|
|
2796
|
-
|
|
2797
|
-
|
|
2798
|
-
|
|
2799
|
-
|
|
2800
|
-
|
|
2801
|
-
|
|
2802
|
-
|
|
2803
|
-
|
|
2804
|
-
|
|
2805
|
-
|
|
2806
|
-
|
|
3057
|
+
const branchResult = branchParser.parse(withChildContext(context, "_branch", state.branchState, branchParser.usage));
|
|
3058
|
+
if (branchResult.success) {
|
|
3059
|
+
const mergedExec = mergeChildExec(context.exec, branchResult.next.exec);
|
|
3060
|
+
return {
|
|
3061
|
+
success: true,
|
|
3062
|
+
next: {
|
|
3063
|
+
...branchResult.next,
|
|
3064
|
+
state: {
|
|
3065
|
+
...state,
|
|
3066
|
+
branchState: branchResult.next.state
|
|
3067
|
+
},
|
|
3068
|
+
...mergedExec != null ? {
|
|
3069
|
+
exec: mergedExec,
|
|
3070
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
3071
|
+
} : {}
|
|
3072
|
+
},
|
|
3073
|
+
consumed: branchResult.consumed
|
|
3074
|
+
};
|
|
3075
|
+
}
|
|
2807
3076
|
return branchResult;
|
|
2808
3077
|
}
|
|
2809
|
-
const discriminatorResult = syncDiscriminator.parse({
|
|
2810
|
-
...context,
|
|
2811
|
-
state: state.discriminatorState
|
|
2812
|
-
});
|
|
3078
|
+
const discriminatorResult = syncDiscriminator.parse({ ...withChildContext(context, "_discriminator", state.discriminatorState) });
|
|
2813
3079
|
if (discriminatorResult.success && discriminatorResult.consumed.length > 0) {
|
|
2814
|
-
const completionResult = syncDiscriminator.complete(discriminatorResult.next.state, context.exec);
|
|
3080
|
+
const completionResult = syncDiscriminator.complete(discriminatorResult.next.state, withChildExecPath(context.exec, "_discriminator"));
|
|
2815
3081
|
if (completionResult.success) {
|
|
2816
3082
|
const value = completionResult.value;
|
|
2817
3083
|
const branchParser = syncBranches[value];
|
|
2818
3084
|
if (branchParser) {
|
|
3085
|
+
const discriminatorExec = mergeChildExec(context.exec, discriminatorResult.next.exec);
|
|
2819
3086
|
const branchParseResult = branchParser.parse({
|
|
2820
|
-
...
|
|
3087
|
+
...withChildContext({
|
|
3088
|
+
...context,
|
|
3089
|
+
...discriminatorExec != null ? {
|
|
3090
|
+
exec: discriminatorExec,
|
|
3091
|
+
dependencyRegistry: discriminatorExec.dependencyRegistry
|
|
3092
|
+
} : {}
|
|
3093
|
+
}, "_branch", branchParser.initialState, branchParser.usage),
|
|
2821
3094
|
buffer: discriminatorResult.next.buffer,
|
|
2822
|
-
optionsTerminated: discriminatorResult.next.optionsTerminated
|
|
2823
|
-
state: branchParser.initialState,
|
|
2824
|
-
usage: branchParser.usage
|
|
3095
|
+
optionsTerminated: discriminatorResult.next.optionsTerminated
|
|
2825
3096
|
});
|
|
2826
|
-
if (branchParseResult.success)
|
|
2827
|
-
|
|
2828
|
-
|
|
2829
|
-
|
|
2830
|
-
|
|
2831
|
-
|
|
2832
|
-
|
|
2833
|
-
|
|
2834
|
-
|
|
2835
|
-
|
|
3097
|
+
if (branchParseResult.success) {
|
|
3098
|
+
const mergedExec = mergeChildExec(discriminatorExec, branchParseResult.next.exec);
|
|
3099
|
+
return {
|
|
3100
|
+
success: true,
|
|
3101
|
+
next: {
|
|
3102
|
+
...branchParseResult.next,
|
|
3103
|
+
state: {
|
|
3104
|
+
discriminatorState: discriminatorResult.next.state,
|
|
3105
|
+
discriminatorValue: value,
|
|
3106
|
+
selectedBranch: {
|
|
3107
|
+
kind: "branch",
|
|
3108
|
+
key: value
|
|
3109
|
+
},
|
|
3110
|
+
branchState: branchParseResult.next.state
|
|
2836
3111
|
},
|
|
2837
|
-
|
|
2838
|
-
|
|
2839
|
-
|
|
2840
|
-
|
|
2841
|
-
|
|
3112
|
+
...mergedExec != null ? {
|
|
3113
|
+
exec: mergedExec,
|
|
3114
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
3115
|
+
} : {}
|
|
3116
|
+
},
|
|
3117
|
+
consumed: [...discriminatorResult.consumed, ...branchParseResult.consumed]
|
|
3118
|
+
};
|
|
3119
|
+
}
|
|
2842
3120
|
return {
|
|
2843
3121
|
success: true,
|
|
2844
3122
|
next: {
|
|
@@ -2851,7 +3129,11 @@ function conditional(discriminator, branches, defaultBranch, options) {
|
|
|
2851
3129
|
key: value
|
|
2852
3130
|
},
|
|
2853
3131
|
branchState: branchParser.initialState
|
|
2854
|
-
}
|
|
3132
|
+
},
|
|
3133
|
+
...discriminatorExec != null ? {
|
|
3134
|
+
exec: discriminatorExec,
|
|
3135
|
+
dependencyRegistry: discriminatorExec.dependencyRegistry
|
|
3136
|
+
} : {}
|
|
2855
3137
|
},
|
|
2856
3138
|
consumed: discriminatorResult.consumed
|
|
2857
3139
|
};
|
|
@@ -2859,23 +3141,26 @@ function conditional(discriminator, branches, defaultBranch, options) {
|
|
|
2859
3141
|
}
|
|
2860
3142
|
}
|
|
2861
3143
|
if (syncDefaultBranch !== void 0) {
|
|
2862
|
-
const defaultResult = syncDefaultBranch.parse(
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
|
|
2866
|
-
|
|
2867
|
-
|
|
2868
|
-
|
|
2869
|
-
|
|
2870
|
-
|
|
2871
|
-
|
|
2872
|
-
|
|
2873
|
-
|
|
2874
|
-
|
|
2875
|
-
|
|
2876
|
-
|
|
2877
|
-
|
|
2878
|
-
|
|
3144
|
+
const defaultResult = syncDefaultBranch.parse(withChildContext(context, "_branch", state.branchState ?? syncDefaultBranch.initialState, syncDefaultBranch.usage));
|
|
3145
|
+
if (defaultResult.success && defaultResult.consumed.length > 0) {
|
|
3146
|
+
const mergedExec = mergeChildExec(context.exec, defaultResult.next.exec);
|
|
3147
|
+
return {
|
|
3148
|
+
success: true,
|
|
3149
|
+
next: {
|
|
3150
|
+
...defaultResult.next,
|
|
3151
|
+
state: {
|
|
3152
|
+
...state,
|
|
3153
|
+
selectedBranch: { kind: "default" },
|
|
3154
|
+
branchState: defaultResult.next.state
|
|
3155
|
+
},
|
|
3156
|
+
...mergedExec != null ? {
|
|
3157
|
+
exec: mergedExec,
|
|
3158
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
3159
|
+
} : {}
|
|
3160
|
+
},
|
|
3161
|
+
consumed: defaultResult.consumed
|
|
3162
|
+
};
|
|
3163
|
+
}
|
|
2879
3164
|
}
|
|
2880
3165
|
return {
|
|
2881
3166
|
success: false,
|
|
@@ -2887,57 +3172,69 @@ function conditional(discriminator, branches, defaultBranch, options) {
|
|
|
2887
3172
|
const state = context.state ?? initialState;
|
|
2888
3173
|
if (state.selectedBranch !== void 0) {
|
|
2889
3174
|
const branchParser = state.selectedBranch.kind === "default" ? defaultBranch : branches[state.selectedBranch.key];
|
|
2890
|
-
const branchResult = await branchParser.parse(
|
|
2891
|
-
|
|
2892
|
-
|
|
2893
|
-
|
|
2894
|
-
|
|
2895
|
-
|
|
2896
|
-
|
|
2897
|
-
|
|
2898
|
-
|
|
2899
|
-
|
|
2900
|
-
|
|
2901
|
-
|
|
2902
|
-
|
|
2903
|
-
|
|
2904
|
-
|
|
2905
|
-
|
|
3175
|
+
const branchResult = await branchParser.parse(withChildContext(context, "_branch", state.branchState, branchParser.usage));
|
|
3176
|
+
if (branchResult.success) {
|
|
3177
|
+
const mergedExec = mergeChildExec(context.exec, branchResult.next.exec);
|
|
3178
|
+
return {
|
|
3179
|
+
success: true,
|
|
3180
|
+
next: {
|
|
3181
|
+
...branchResult.next,
|
|
3182
|
+
state: {
|
|
3183
|
+
...state,
|
|
3184
|
+
branchState: branchResult.next.state
|
|
3185
|
+
},
|
|
3186
|
+
...mergedExec != null ? {
|
|
3187
|
+
exec: mergedExec,
|
|
3188
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
3189
|
+
} : {}
|
|
3190
|
+
},
|
|
3191
|
+
consumed: branchResult.consumed
|
|
3192
|
+
};
|
|
3193
|
+
}
|
|
2906
3194
|
return branchResult;
|
|
2907
3195
|
}
|
|
2908
|
-
const discriminatorResult = await discriminator.parse({
|
|
2909
|
-
...context,
|
|
2910
|
-
state: state.discriminatorState
|
|
2911
|
-
});
|
|
3196
|
+
const discriminatorResult = await discriminator.parse({ ...withChildContext(context, "_discriminator", state.discriminatorState) });
|
|
2912
3197
|
if (discriminatorResult.success && discriminatorResult.consumed.length > 0) {
|
|
2913
|
-
const completionResult = await discriminator.complete(discriminatorResult.next.state, context.exec);
|
|
3198
|
+
const completionResult = await discriminator.complete(discriminatorResult.next.state, withChildExecPath(context.exec, "_discriminator"));
|
|
2914
3199
|
if (completionResult.success) {
|
|
2915
3200
|
const value = completionResult.value;
|
|
2916
3201
|
const branchParser = branches[value];
|
|
2917
3202
|
if (branchParser) {
|
|
3203
|
+
const discriminatorExec = mergeChildExec(context.exec, discriminatorResult.next.exec);
|
|
2918
3204
|
const branchParseResult = await branchParser.parse({
|
|
2919
|
-
...
|
|
3205
|
+
...withChildContext({
|
|
3206
|
+
...context,
|
|
3207
|
+
...discriminatorExec != null ? {
|
|
3208
|
+
exec: discriminatorExec,
|
|
3209
|
+
dependencyRegistry: discriminatorExec.dependencyRegistry
|
|
3210
|
+
} : {}
|
|
3211
|
+
}, "_branch", branchParser.initialState, branchParser.usage),
|
|
2920
3212
|
buffer: discriminatorResult.next.buffer,
|
|
2921
|
-
optionsTerminated: discriminatorResult.next.optionsTerminated
|
|
2922
|
-
state: branchParser.initialState,
|
|
2923
|
-
usage: branchParser.usage
|
|
3213
|
+
optionsTerminated: discriminatorResult.next.optionsTerminated
|
|
2924
3214
|
});
|
|
2925
|
-
if (branchParseResult.success)
|
|
2926
|
-
|
|
2927
|
-
|
|
2928
|
-
|
|
2929
|
-
|
|
2930
|
-
|
|
2931
|
-
|
|
2932
|
-
|
|
2933
|
-
|
|
2934
|
-
|
|
3215
|
+
if (branchParseResult.success) {
|
|
3216
|
+
const mergedExec = mergeChildExec(discriminatorExec, branchParseResult.next.exec);
|
|
3217
|
+
return {
|
|
3218
|
+
success: true,
|
|
3219
|
+
next: {
|
|
3220
|
+
...branchParseResult.next,
|
|
3221
|
+
state: {
|
|
3222
|
+
discriminatorState: discriminatorResult.next.state,
|
|
3223
|
+
discriminatorValue: value,
|
|
3224
|
+
selectedBranch: {
|
|
3225
|
+
kind: "branch",
|
|
3226
|
+
key: value
|
|
3227
|
+
},
|
|
3228
|
+
branchState: branchParseResult.next.state
|
|
2935
3229
|
},
|
|
2936
|
-
|
|
2937
|
-
|
|
2938
|
-
|
|
2939
|
-
|
|
2940
|
-
|
|
3230
|
+
...mergedExec != null ? {
|
|
3231
|
+
exec: mergedExec,
|
|
3232
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
3233
|
+
} : {}
|
|
3234
|
+
},
|
|
3235
|
+
consumed: [...discriminatorResult.consumed, ...branchParseResult.consumed]
|
|
3236
|
+
};
|
|
3237
|
+
}
|
|
2941
3238
|
return {
|
|
2942
3239
|
success: true,
|
|
2943
3240
|
next: {
|
|
@@ -2950,7 +3247,11 @@ function conditional(discriminator, branches, defaultBranch, options) {
|
|
|
2950
3247
|
key: value
|
|
2951
3248
|
},
|
|
2952
3249
|
branchState: branchParser.initialState
|
|
2953
|
-
}
|
|
3250
|
+
},
|
|
3251
|
+
...discriminatorExec != null ? {
|
|
3252
|
+
exec: discriminatorExec,
|
|
3253
|
+
dependencyRegistry: discriminatorExec.dependencyRegistry
|
|
3254
|
+
} : {}
|
|
2954
3255
|
},
|
|
2955
3256
|
consumed: discriminatorResult.consumed
|
|
2956
3257
|
};
|
|
@@ -2958,23 +3259,26 @@ function conditional(discriminator, branches, defaultBranch, options) {
|
|
|
2958
3259
|
}
|
|
2959
3260
|
}
|
|
2960
3261
|
if (defaultBranch !== void 0) {
|
|
2961
|
-
const defaultResult = await defaultBranch.parse(
|
|
2962
|
-
|
|
2963
|
-
|
|
2964
|
-
|
|
2965
|
-
|
|
2966
|
-
|
|
2967
|
-
|
|
2968
|
-
|
|
2969
|
-
|
|
2970
|
-
|
|
2971
|
-
|
|
2972
|
-
|
|
2973
|
-
|
|
2974
|
-
|
|
2975
|
-
|
|
2976
|
-
|
|
2977
|
-
|
|
3262
|
+
const defaultResult = await defaultBranch.parse(withChildContext(context, "_branch", state.branchState ?? defaultBranch.initialState, defaultBranch.usage));
|
|
3263
|
+
if (defaultResult.success && defaultResult.consumed.length > 0) {
|
|
3264
|
+
const mergedExec = mergeChildExec(context.exec, defaultResult.next.exec);
|
|
3265
|
+
return {
|
|
3266
|
+
success: true,
|
|
3267
|
+
next: {
|
|
3268
|
+
...defaultResult.next,
|
|
3269
|
+
state: {
|
|
3270
|
+
...state,
|
|
3271
|
+
selectedBranch: { kind: "default" },
|
|
3272
|
+
branchState: defaultResult.next.state
|
|
3273
|
+
},
|
|
3274
|
+
...mergedExec != null ? {
|
|
3275
|
+
exec: mergedExec,
|
|
3276
|
+
dependencyRegistry: mergedExec.dependencyRegistry
|
|
3277
|
+
} : {}
|
|
3278
|
+
},
|
|
3279
|
+
consumed: defaultResult.consumed
|
|
3280
|
+
};
|
|
3281
|
+
}
|
|
2978
3282
|
}
|
|
2979
3283
|
return {
|
|
2980
3284
|
success: false,
|
|
@@ -2989,7 +3293,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
|
|
|
2989
3293
|
if (state.selectedBranch === void 0) {
|
|
2990
3294
|
if (syncDefaultBranch !== void 0) {
|
|
2991
3295
|
const branchState = state.branchState ?? syncDefaultBranch.initialState;
|
|
2992
|
-
const defaultResult = syncDefaultBranch.complete(branchState, exec);
|
|
3296
|
+
const defaultResult = syncDefaultBranch.complete(branchState, withChildExecPath(exec, "_branch"));
|
|
2993
3297
|
if (!defaultResult.success) return defaultResult;
|
|
2994
3298
|
return {
|
|
2995
3299
|
success: true,
|
|
@@ -3006,14 +3310,26 @@ function conditional(discriminator, branches, defaultBranch, options) {
|
|
|
3006
3310
|
};
|
|
3007
3311
|
}
|
|
3008
3312
|
const branchParser = state.selectedBranch.kind === "default" ? syncDefaultBranch : syncBranches[state.selectedBranch.key];
|
|
3009
|
-
const discriminatorCompleteResult = syncDiscriminator.complete(state.discriminatorState, exec);
|
|
3010
3313
|
const combinedState = {
|
|
3011
3314
|
_discriminator: state.discriminatorState,
|
|
3012
3315
|
_branch: state.branchState
|
|
3013
3316
|
};
|
|
3014
|
-
const
|
|
3015
|
-
|
|
3016
|
-
|
|
3317
|
+
const runtime = require_dependency_runtime.createDependencyRuntimeContext(exec?.dependencyRegistry?.clone());
|
|
3318
|
+
require_dependency_runtime.collectExplicitSourceValues(require_dependency_runtime.buildRuntimeNodesFromPairs([["_discriminator", discriminator], ["_branch", branchParser]], combinedState, exec?.path), runtime);
|
|
3319
|
+
require_dependency_runtime.collectSourcesFromState(combinedState, runtime);
|
|
3320
|
+
const resolvedBranchState = require_dependency_runtime.resolveStateWithRuntime(state.branchState, runtime);
|
|
3321
|
+
const completionExec = {
|
|
3322
|
+
...exec ?? {
|
|
3323
|
+
usage: branchParser.usage,
|
|
3324
|
+
path: [],
|
|
3325
|
+
trace: void 0
|
|
3326
|
+
},
|
|
3327
|
+
phase: "complete",
|
|
3328
|
+
dependencyRuntime: runtime,
|
|
3329
|
+
dependencyRegistry: runtime.registry
|
|
3330
|
+
};
|
|
3331
|
+
const discriminatorCompleteResult = state.selectedBranch.kind === "default" ? void 0 : syncDiscriminator.complete(state.discriminatorState, withChildExecPath(completionExec, "_discriminator"));
|
|
3332
|
+
const branchResult = branchParser.complete(resolvedBranchState, withChildExecPath(completionExec, "_branch"));
|
|
3017
3333
|
if (!branchResult.success) {
|
|
3018
3334
|
if (state.discriminatorValue !== void 0 && options?.errors?.branchError) return {
|
|
3019
3335
|
success: false,
|
|
@@ -3023,9 +3339,10 @@ function conditional(discriminator, branches, defaultBranch, options) {
|
|
|
3023
3339
|
}
|
|
3024
3340
|
let discriminatorValue;
|
|
3025
3341
|
if (state.selectedBranch.kind === "default") discriminatorValue = void 0;
|
|
3026
|
-
else
|
|
3027
|
-
|
|
3028
|
-
|
|
3342
|
+
else {
|
|
3343
|
+
const completedDiscriminator = unwrapCompleteResult(discriminatorCompleteResult);
|
|
3344
|
+
discriminatorValue = completedDiscriminator.success ? completedDiscriminator.value : state.selectedBranch.key;
|
|
3345
|
+
}
|
|
3029
3346
|
return {
|
|
3030
3347
|
success: true,
|
|
3031
3348
|
value: [discriminatorValue, branchResult.value],
|
|
@@ -3039,7 +3356,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
|
|
|
3039
3356
|
if (state.selectedBranch === void 0) {
|
|
3040
3357
|
if (defaultBranch !== void 0) {
|
|
3041
3358
|
const branchState = state.branchState ?? defaultBranch.initialState;
|
|
3042
|
-
const defaultResult = await defaultBranch.complete(branchState, exec);
|
|
3359
|
+
const defaultResult = await defaultBranch.complete(branchState, withChildExecPath(exec, "_branch"));
|
|
3043
3360
|
if (!defaultResult.success) return defaultResult;
|
|
3044
3361
|
return {
|
|
3045
3362
|
success: true,
|
|
@@ -3056,14 +3373,26 @@ function conditional(discriminator, branches, defaultBranch, options) {
|
|
|
3056
3373
|
};
|
|
3057
3374
|
}
|
|
3058
3375
|
const branchParser = state.selectedBranch.kind === "default" ? defaultBranch : branches[state.selectedBranch.key];
|
|
3059
|
-
const discriminatorCompleteResult = await discriminator.complete(state.discriminatorState, exec);
|
|
3060
3376
|
const combinedState = {
|
|
3061
3377
|
_discriminator: state.discriminatorState,
|
|
3062
3378
|
_branch: state.branchState
|
|
3063
3379
|
};
|
|
3064
|
-
const
|
|
3065
|
-
|
|
3066
|
-
|
|
3380
|
+
const runtime = require_dependency_runtime.createDependencyRuntimeContext(exec?.dependencyRegistry?.clone());
|
|
3381
|
+
await require_dependency_runtime.collectExplicitSourceValuesAsync(require_dependency_runtime.buildRuntimeNodesFromPairs([["_discriminator", discriminator], ["_branch", branchParser]], combinedState, exec?.path), runtime);
|
|
3382
|
+
require_dependency_runtime.collectSourcesFromState(combinedState, runtime);
|
|
3383
|
+
const resolvedBranchState = await require_dependency_runtime.resolveStateWithRuntimeAsync(state.branchState, runtime);
|
|
3384
|
+
const completionExec = {
|
|
3385
|
+
...exec ?? {
|
|
3386
|
+
usage: branchParser.usage,
|
|
3387
|
+
path: [],
|
|
3388
|
+
trace: void 0
|
|
3389
|
+
},
|
|
3390
|
+
phase: "complete",
|
|
3391
|
+
dependencyRuntime: runtime,
|
|
3392
|
+
dependencyRegistry: runtime.registry
|
|
3393
|
+
};
|
|
3394
|
+
const discriminatorCompleteResult = state.selectedBranch.kind === "default" ? void 0 : await discriminator.complete(state.discriminatorState, withChildExecPath(completionExec, "_discriminator"));
|
|
3395
|
+
const branchResult = await branchParser.complete(resolvedBranchState, withChildExecPath(completionExec, "_branch"));
|
|
3067
3396
|
if (!branchResult.success) {
|
|
3068
3397
|
if (state.discriminatorValue !== void 0 && options?.errors?.branchError) return {
|
|
3069
3398
|
success: false,
|
|
@@ -3073,9 +3402,10 @@ function conditional(discriminator, branches, defaultBranch, options) {
|
|
|
3073
3402
|
}
|
|
3074
3403
|
let discriminatorValue;
|
|
3075
3404
|
if (state.selectedBranch.kind === "default") discriminatorValue = void 0;
|
|
3076
|
-
else
|
|
3077
|
-
|
|
3078
|
-
|
|
3405
|
+
else {
|
|
3406
|
+
const completedDiscriminator = unwrapCompleteResult(discriminatorCompleteResult);
|
|
3407
|
+
discriminatorValue = completedDiscriminator.success ? completedDiscriminator.value : state.selectedBranch.key;
|
|
3408
|
+
}
|
|
3079
3409
|
return {
|
|
3080
3410
|
success: true,
|
|
3081
3411
|
value: [discriminatorValue, branchResult.value],
|
|
@@ -3091,39 +3421,89 @@ function conditional(discriminator, branches, defaultBranch, options) {
|
|
|
3091
3421
|
const syncBranches = branches;
|
|
3092
3422
|
const syncDefaultBranch = defaultBranch;
|
|
3093
3423
|
if (state.selectedBranch === void 0) {
|
|
3094
|
-
|
|
3095
|
-
|
|
3096
|
-
|
|
3097
|
-
|
|
3098
|
-
|
|
3424
|
+
const runtime = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
|
|
3425
|
+
require_dependency_runtime.collectExplicitSourceValues(require_dependency_runtime.buildRuntimeNodesFromPairs(syncDefaultBranch == null ? [["_discriminator", discriminator]] : [["_discriminator", discriminator], ["_branch", syncDefaultBranch]], {
|
|
3426
|
+
_discriminator: state.discriminatorState,
|
|
3427
|
+
_branch: state.branchState
|
|
3428
|
+
}, context.exec?.path), runtime);
|
|
3429
|
+
require_dependency_runtime.collectSourcesFromState({
|
|
3430
|
+
_discriminator: state.discriminatorState,
|
|
3431
|
+
_branch: state.branchState
|
|
3432
|
+
}, runtime);
|
|
3433
|
+
const suggestContext = {
|
|
3099
3434
|
...context,
|
|
3100
|
-
|
|
3101
|
-
|
|
3435
|
+
dependencyRegistry: runtime.registry,
|
|
3436
|
+
...context.exec != null ? { exec: {
|
|
3437
|
+
...context.exec,
|
|
3438
|
+
dependencyRuntime: runtime,
|
|
3439
|
+
dependencyRegistry: runtime.registry
|
|
3440
|
+
} } : {}
|
|
3441
|
+
};
|
|
3442
|
+
yield* syncDiscriminator.suggest(withChildContext(suggestContext, "_discriminator", state.discriminatorState), prefix);
|
|
3443
|
+
if (syncDefaultBranch !== void 0) yield* syncDefaultBranch.suggest(withChildContext(suggestContext, "_branch", state.branchState ?? syncDefaultBranch.initialState), prefix);
|
|
3102
3444
|
} else {
|
|
3103
3445
|
const branchParser = state.selectedBranch.kind === "default" ? syncDefaultBranch : syncBranches[state.selectedBranch.key];
|
|
3104
|
-
|
|
3446
|
+
const runtime = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
|
|
3447
|
+
const combinedState = {
|
|
3448
|
+
_discriminator: state.discriminatorState,
|
|
3449
|
+
_branch: state.branchState
|
|
3450
|
+
};
|
|
3451
|
+
require_dependency_runtime.collectExplicitSourceValues(require_dependency_runtime.buildRuntimeNodesFromPairs([["_discriminator", discriminator], ["_branch", branchParser]], combinedState, context.exec?.path), runtime);
|
|
3452
|
+
require_dependency_runtime.collectSourcesFromState(combinedState, runtime);
|
|
3453
|
+
const suggestContext = {
|
|
3105
3454
|
...context,
|
|
3106
|
-
|
|
3107
|
-
|
|
3455
|
+
dependencyRegistry: runtime.registry,
|
|
3456
|
+
...context.exec != null ? { exec: {
|
|
3457
|
+
...context.exec,
|
|
3458
|
+
dependencyRuntime: runtime,
|
|
3459
|
+
dependencyRegistry: runtime.registry
|
|
3460
|
+
} } : {}
|
|
3461
|
+
};
|
|
3462
|
+
yield* branchParser.suggest(withChildContext(suggestContext, "_branch", state.branchState), prefix);
|
|
3108
3463
|
}
|
|
3109
3464
|
}
|
|
3110
3465
|
async function* suggestAsync(context, prefix) {
|
|
3111
3466
|
const state = context.state ?? initialState;
|
|
3112
3467
|
if (state.selectedBranch === void 0) {
|
|
3113
|
-
|
|
3114
|
-
|
|
3115
|
-
|
|
3116
|
-
|
|
3117
|
-
|
|
3468
|
+
const runtime = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
|
|
3469
|
+
await require_dependency_runtime.collectExplicitSourceValuesAsync(require_dependency_runtime.buildRuntimeNodesFromPairs(defaultBranch == null ? [["_discriminator", discriminator]] : [["_discriminator", discriminator], ["_branch", defaultBranch]], {
|
|
3470
|
+
_discriminator: state.discriminatorState,
|
|
3471
|
+
_branch: state.branchState
|
|
3472
|
+
}, context.exec?.path), runtime);
|
|
3473
|
+
require_dependency_runtime.collectSourcesFromState({
|
|
3474
|
+
_discriminator: state.discriminatorState,
|
|
3475
|
+
_branch: state.branchState
|
|
3476
|
+
}, runtime);
|
|
3477
|
+
const suggestContext = {
|
|
3118
3478
|
...context,
|
|
3119
|
-
|
|
3120
|
-
|
|
3479
|
+
dependencyRegistry: runtime.registry,
|
|
3480
|
+
...context.exec != null ? { exec: {
|
|
3481
|
+
...context.exec,
|
|
3482
|
+
dependencyRuntime: runtime,
|
|
3483
|
+
dependencyRegistry: runtime.registry
|
|
3484
|
+
} } : {}
|
|
3485
|
+
};
|
|
3486
|
+
yield* discriminator.suggest(withChildContext(suggestContext, "_discriminator", state.discriminatorState), prefix);
|
|
3487
|
+
if (defaultBranch !== void 0) yield* defaultBranch.suggest(withChildContext(suggestContext, "_branch", state.branchState ?? defaultBranch.initialState), prefix);
|
|
3121
3488
|
} else {
|
|
3122
3489
|
const branchParser = state.selectedBranch.kind === "default" ? defaultBranch : branches[state.selectedBranch.key];
|
|
3123
|
-
|
|
3490
|
+
const runtime = require_dependency_runtime.createDependencyRuntimeContext(context.dependencyRegistry?.clone());
|
|
3491
|
+
const combinedState = {
|
|
3492
|
+
_discriminator: state.discriminatorState,
|
|
3493
|
+
_branch: state.branchState
|
|
3494
|
+
};
|
|
3495
|
+
await require_dependency_runtime.collectExplicitSourceValuesAsync(require_dependency_runtime.buildRuntimeNodesFromPairs([["_discriminator", discriminator], ["_branch", branchParser]], combinedState, context.exec?.path), runtime);
|
|
3496
|
+
require_dependency_runtime.collectSourcesFromState(combinedState, runtime);
|
|
3497
|
+
const suggestContext = {
|
|
3124
3498
|
...context,
|
|
3125
|
-
|
|
3126
|
-
|
|
3499
|
+
dependencyRegistry: runtime.registry,
|
|
3500
|
+
...context.exec != null ? { exec: {
|
|
3501
|
+
...context.exec,
|
|
3502
|
+
dependencyRuntime: runtime,
|
|
3503
|
+
dependencyRegistry: runtime.registry
|
|
3504
|
+
} } : {}
|
|
3505
|
+
};
|
|
3506
|
+
yield* branchParser.suggest(withChildContext(suggestContext, "_branch", state.branchState), prefix);
|
|
3127
3507
|
}
|
|
3128
3508
|
}
|
|
3129
3509
|
return {
|