@optique/core 0.10.0-dev.293 → 0.10.0-dev.295
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 +226 -60
- package/dist/constructs.js +227 -61
- package/dist/dependency.cjs +66 -1
- package/dist/dependency.d.cts +79 -2
- package/dist/dependency.d.ts +79 -2
- package/dist/dependency.js +60 -1
- package/dist/index.cjs +6 -0
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/modifiers.cjs +16 -0
- package/dist/modifiers.js +16 -0
- package/dist/primitives.cjs +7 -2
- package/dist/primitives.d.cts +4 -3
- package/dist/primitives.d.ts +4 -3
- package/dist/primitives.js +8 -3
- package/package.json +1 -1
package/dist/constructs.cjs
CHANGED
|
@@ -541,32 +541,145 @@ async function* suggestObjectAsync(context, prefix, parserPairs) {
|
|
|
541
541
|
* @returns The field states with deferred states resolved to their actual values
|
|
542
542
|
* @internal
|
|
543
543
|
*/
|
|
544
|
+
/**
|
|
545
|
+
* Recursively collects dependency values from DependencySourceState objects
|
|
546
|
+
* found anywhere in the state tree.
|
|
547
|
+
*/
|
|
548
|
+
function collectDependencies(state, registry) {
|
|
549
|
+
if (state === null || state === void 0) return;
|
|
550
|
+
if (require_dependency.isDependencySourceState(state)) {
|
|
551
|
+
const depId = state[require_dependency.DependencyId];
|
|
552
|
+
const result = state.result;
|
|
553
|
+
if (result.success) registry.set(depId, result.value);
|
|
554
|
+
return;
|
|
555
|
+
}
|
|
556
|
+
if (Array.isArray(state)) {
|
|
557
|
+
for (const item of state) collectDependencies(item, registry);
|
|
558
|
+
return;
|
|
559
|
+
}
|
|
560
|
+
if (typeof state === "object" && !require_dependency.isDeferredParseState(state)) for (const key of Reflect.ownKeys(state)) collectDependencies(state[key], registry);
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Checks if a value is a plain object (created with `{}` or `Object.create(null)`).
|
|
564
|
+
* Class instances like `Temporal.PlainDate`, `URL`, `Date`, etc. return false.
|
|
565
|
+
* This is used to determine whether to recursively traverse an object when
|
|
566
|
+
* resolving deferred parse states - we only want to traverse plain objects
|
|
567
|
+
* that are part of the parser state structure, not user values.
|
|
568
|
+
*/
|
|
569
|
+
function isPlainObject(value) {
|
|
570
|
+
if (typeof value !== "object" || value === null) return false;
|
|
571
|
+
const proto = Object.getPrototypeOf(value);
|
|
572
|
+
return proto === Object.prototype || proto === null;
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* Recursively resolves DeferredParseState objects found anywhere in the state tree.
|
|
576
|
+
* Returns the resolved state (sync version).
|
|
577
|
+
*
|
|
578
|
+
* Only traverses:
|
|
579
|
+
* - DeferredParseState (to resolve it)
|
|
580
|
+
* - DependencySourceState (skipped, kept as-is)
|
|
581
|
+
* - Arrays (to find nested deferred states)
|
|
582
|
+
* - Plain objects (to find nested deferred states in parser state structures)
|
|
583
|
+
*
|
|
584
|
+
* Does NOT traverse class instances (e.g., Temporal.PlainDate, URL) since these
|
|
585
|
+
* are user values that should be preserved as-is.
|
|
586
|
+
*/
|
|
587
|
+
function resolveDeferred(state, registry) {
|
|
588
|
+
if (state === null || state === void 0) return state;
|
|
589
|
+
if (require_dependency.isDeferredParseState(state)) {
|
|
590
|
+
const deferredState = state;
|
|
591
|
+
const parser = deferredState.parser;
|
|
592
|
+
const depIds = deferredState.dependencyIds;
|
|
593
|
+
if (depIds && depIds.length > 0) {
|
|
594
|
+
const dependencyValues = [];
|
|
595
|
+
let allDepsAvailable = true;
|
|
596
|
+
for (const depId$1 of depIds) if (registry.has(depId$1)) dependencyValues.push(registry.get(depId$1));
|
|
597
|
+
else {
|
|
598
|
+
allDepsAvailable = false;
|
|
599
|
+
break;
|
|
600
|
+
}
|
|
601
|
+
if (allDepsAvailable) {
|
|
602
|
+
const reParseResult = parser[require_dependency.ParseWithDependency](deferredState.rawInput, dependencyValues);
|
|
603
|
+
if (reParseResult instanceof Promise) return deferredState.preliminaryResult;
|
|
604
|
+
return reParseResult;
|
|
605
|
+
}
|
|
606
|
+
return deferredState.preliminaryResult;
|
|
607
|
+
}
|
|
608
|
+
const depId = deferredState.dependencyId;
|
|
609
|
+
if (registry.has(depId)) {
|
|
610
|
+
const dependencyValue = registry.get(depId);
|
|
611
|
+
const reParseResult = parser[require_dependency.ParseWithDependency](deferredState.rawInput, dependencyValue);
|
|
612
|
+
if (reParseResult instanceof Promise) return deferredState.preliminaryResult;
|
|
613
|
+
return reParseResult;
|
|
614
|
+
}
|
|
615
|
+
return deferredState.preliminaryResult;
|
|
616
|
+
}
|
|
617
|
+
if (require_dependency.isDependencySourceState(state)) return state;
|
|
618
|
+
if (Array.isArray(state)) return state.map((item) => resolveDeferred(item, registry));
|
|
619
|
+
if (isPlainObject(state)) {
|
|
620
|
+
const resolved = {};
|
|
621
|
+
for (const key of Reflect.ownKeys(state)) resolved[key] = resolveDeferred(state[key], registry);
|
|
622
|
+
return resolved;
|
|
623
|
+
}
|
|
624
|
+
return state;
|
|
625
|
+
}
|
|
544
626
|
function resolveDeferredParseStates(fieldStates) {
|
|
545
627
|
const registry = new require_dependency.DependencyRegistry();
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
628
|
+
collectDependencies(fieldStates, registry);
|
|
629
|
+
return resolveDeferred(fieldStates, registry);
|
|
630
|
+
}
|
|
631
|
+
/**
|
|
632
|
+
* Recursively resolves DeferredParseState objects found anywhere in the state tree.
|
|
633
|
+
* Returns the resolved state (async version).
|
|
634
|
+
*
|
|
635
|
+
* Only traverses:
|
|
636
|
+
* - DeferredParseState (to resolve it)
|
|
637
|
+
* - DependencySourceState (skipped, kept as-is)
|
|
638
|
+
* - Arrays (to find nested deferred states)
|
|
639
|
+
* - Plain objects (to find nested deferred states in parser state structures)
|
|
640
|
+
*
|
|
641
|
+
* Does NOT traverse class instances (e.g., Temporal.PlainDate, URL) since these
|
|
642
|
+
* are user values that should be preserved as-is.
|
|
643
|
+
*/
|
|
644
|
+
async function resolveDeferredAsync(state, registry) {
|
|
645
|
+
if (state === null || state === void 0) return state;
|
|
646
|
+
if (require_dependency.isDeferredParseState(state)) {
|
|
647
|
+
const deferredState = state;
|
|
648
|
+
const parser = deferredState.parser;
|
|
649
|
+
const depIds = deferredState.dependencyIds;
|
|
650
|
+
if (depIds && depIds.length > 0) {
|
|
651
|
+
const dependencyValues = [];
|
|
652
|
+
let allDepsAvailable = true;
|
|
653
|
+
for (const depId$1 of depIds) if (registry.has(depId$1)) dependencyValues.push(registry.get(depId$1));
|
|
654
|
+
else {
|
|
655
|
+
allDepsAvailable = false;
|
|
656
|
+
break;
|
|
657
|
+
}
|
|
658
|
+
if (allDepsAvailable) {
|
|
659
|
+
const reParseResult = parser[require_dependency.ParseWithDependency](deferredState.rawInput, dependencyValues);
|
|
660
|
+
return Promise.resolve(reParseResult);
|
|
661
|
+
}
|
|
662
|
+
return deferredState.preliminaryResult;
|
|
552
663
|
}
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
const deferredState = fieldState;
|
|
559
|
-
const depId = deferredState.dependencyId;
|
|
560
|
-
if (registry.has(depId)) {
|
|
561
|
-
const dependencyValue = registry.get(depId);
|
|
562
|
-
const parser = deferredState.parser;
|
|
563
|
-
const reParseResult = parser[require_dependency.ParseWithDependency](deferredState.rawInput, dependencyValue);
|
|
564
|
-
if (reParseResult instanceof Promise) resolvedStates[key] = deferredState.preliminaryResult;
|
|
565
|
-
else resolvedStates[key] = reParseResult;
|
|
566
|
-
} else resolvedStates[key] = deferredState.preliminaryResult;
|
|
664
|
+
const depId = deferredState.dependencyId;
|
|
665
|
+
if (registry.has(depId)) {
|
|
666
|
+
const dependencyValue = registry.get(depId);
|
|
667
|
+
const reParseResult = parser[require_dependency.ParseWithDependency](deferredState.rawInput, dependencyValue);
|
|
668
|
+
return Promise.resolve(reParseResult);
|
|
567
669
|
}
|
|
670
|
+
return deferredState.preliminaryResult;
|
|
671
|
+
}
|
|
672
|
+
if (require_dependency.isDependencySourceState(state)) return state;
|
|
673
|
+
if (Array.isArray(state)) return Promise.all(state.map((item) => resolveDeferredAsync(item, registry)));
|
|
674
|
+
if (isPlainObject(state)) {
|
|
675
|
+
const resolved = {};
|
|
676
|
+
const keys = Reflect.ownKeys(state);
|
|
677
|
+
await Promise.all(keys.map(async (key) => {
|
|
678
|
+
resolved[key] = await resolveDeferredAsync(state[key], registry);
|
|
679
|
+
}));
|
|
680
|
+
return resolved;
|
|
568
681
|
}
|
|
569
|
-
return
|
|
682
|
+
return state;
|
|
570
683
|
}
|
|
571
684
|
/**
|
|
572
685
|
* Async version of resolveDeferredParseStates for async parsers.
|
|
@@ -574,29 +687,8 @@ function resolveDeferredParseStates(fieldStates) {
|
|
|
574
687
|
*/
|
|
575
688
|
async function resolveDeferredParseStatesAsync(fieldStates) {
|
|
576
689
|
const registry = new require_dependency.DependencyRegistry();
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
if (require_dependency.isDependencySourceState(fieldState)) {
|
|
580
|
-
const depId = fieldState[require_dependency.DependencyId];
|
|
581
|
-
const result = fieldState.result;
|
|
582
|
-
if (result.success) registry.set(depId, result.value);
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
const resolvedStates = { ...fieldStates };
|
|
586
|
-
for (const key of Reflect.ownKeys(fieldStates)) {
|
|
587
|
-
const fieldState = fieldStates[key];
|
|
588
|
-
if (require_dependency.isDeferredParseState(fieldState)) {
|
|
589
|
-
const deferredState = fieldState;
|
|
590
|
-
const depId = deferredState.dependencyId;
|
|
591
|
-
if (registry.has(depId)) {
|
|
592
|
-
const dependencyValue = registry.get(depId);
|
|
593
|
-
const parser = deferredState.parser;
|
|
594
|
-
const reParseResult = parser[require_dependency.ParseWithDependency](deferredState.rawInput, dependencyValue);
|
|
595
|
-
resolvedStates[key] = await Promise.resolve(reParseResult);
|
|
596
|
-
} else resolvedStates[key] = deferredState.preliminaryResult;
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
return resolvedStates;
|
|
690
|
+
collectDependencies(fieldStates, registry);
|
|
691
|
+
return await resolveDeferredAsync(fieldStates, registry);
|
|
600
692
|
}
|
|
601
693
|
function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
602
694
|
const label = typeof labelOrParsers === "string" ? labelOrParsers : void 0;
|
|
@@ -756,12 +848,45 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
756
848
|
return parseSync(context);
|
|
757
849
|
},
|
|
758
850
|
complete(state) {
|
|
759
|
-
const resolvedState = isAsync ? state : resolveDeferredParseStates(state);
|
|
760
851
|
if (!isAsync) {
|
|
852
|
+
const preCompletedState = {};
|
|
853
|
+
for (const field of parserKeys) {
|
|
854
|
+
const fieldKey = field;
|
|
855
|
+
const fieldState = state[fieldKey];
|
|
856
|
+
const fieldParser = parsers[field];
|
|
857
|
+
if (Array.isArray(fieldState) && fieldState.length === 1 && require_dependency.isPendingDependencySourceState(fieldState[0])) {
|
|
858
|
+
const completed = fieldParser.complete(fieldState);
|
|
859
|
+
preCompletedState[fieldKey] = completed;
|
|
860
|
+
} else if (fieldState === void 0 && require_dependency.isPendingDependencySourceState(fieldParser.initialState)) {
|
|
861
|
+
const completed = fieldParser.complete([fieldParser.initialState]);
|
|
862
|
+
preCompletedState[fieldKey] = completed;
|
|
863
|
+
} else if (fieldState === void 0 && require_dependency.isWrappedDependencySource(fieldParser)) {
|
|
864
|
+
const pendingState = fieldParser[require_dependency.WrappedDependencySourceMarker];
|
|
865
|
+
const completed = fieldParser.complete([pendingState]);
|
|
866
|
+
preCompletedState[fieldKey] = completed;
|
|
867
|
+
} else preCompletedState[fieldKey] = fieldState;
|
|
868
|
+
}
|
|
869
|
+
const resolvedState = resolveDeferredParseStates(preCompletedState);
|
|
761
870
|
const result = {};
|
|
762
871
|
for (const field of parserKeys) {
|
|
763
|
-
const
|
|
764
|
-
|
|
872
|
+
const fieldKey = field;
|
|
873
|
+
const fieldResolvedState = resolvedState[fieldKey];
|
|
874
|
+
const fieldParser = parsers[field];
|
|
875
|
+
const originalFieldState = state[fieldKey];
|
|
876
|
+
const wasPreCompletedCase1 = Array.isArray(originalFieldState) && originalFieldState.length === 1 && require_dependency.isPendingDependencySourceState(originalFieldState[0]);
|
|
877
|
+
const wasPreCompletedCase2 = originalFieldState === void 0 && require_dependency.isPendingDependencySourceState(fieldParser.initialState);
|
|
878
|
+
const wasPreCompletedCase3 = originalFieldState === void 0 && require_dependency.isWrappedDependencySource(fieldParser);
|
|
879
|
+
if (require_dependency.isDependencySourceState(fieldResolvedState) && (wasPreCompletedCase1 || wasPreCompletedCase2 || wasPreCompletedCase3)) {
|
|
880
|
+
const depResult = fieldResolvedState.result;
|
|
881
|
+
if (depResult.success) result[fieldKey] = depResult.value;
|
|
882
|
+
else return {
|
|
883
|
+
success: false,
|
|
884
|
+
error: depResult.error
|
|
885
|
+
};
|
|
886
|
+
continue;
|
|
887
|
+
}
|
|
888
|
+
const valueResult = fieldParser.complete(fieldResolvedState);
|
|
889
|
+
if (valueResult.success) result[fieldKey] = valueResult.value;
|
|
765
890
|
else return {
|
|
766
891
|
success: false,
|
|
767
892
|
error: valueResult.error
|
|
@@ -773,11 +898,44 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
773
898
|
};
|
|
774
899
|
}
|
|
775
900
|
return (async () => {
|
|
776
|
-
const
|
|
901
|
+
const preCompletedState = {};
|
|
902
|
+
for (const field of parserKeys) {
|
|
903
|
+
const fieldKey = field;
|
|
904
|
+
const fieldState = state[fieldKey];
|
|
905
|
+
const fieldParser = parsers[field];
|
|
906
|
+
if (Array.isArray(fieldState) && fieldState.length === 1 && require_dependency.isPendingDependencySourceState(fieldState[0])) {
|
|
907
|
+
const completed = await fieldParser.complete(fieldState);
|
|
908
|
+
preCompletedState[fieldKey] = completed;
|
|
909
|
+
} else if (fieldState === void 0 && require_dependency.isPendingDependencySourceState(fieldParser.initialState)) {
|
|
910
|
+
const completed = await fieldParser.complete([fieldParser.initialState]);
|
|
911
|
+
preCompletedState[fieldKey] = completed;
|
|
912
|
+
} else if (fieldState === void 0 && require_dependency.isWrappedDependencySource(fieldParser)) {
|
|
913
|
+
const pendingState = fieldParser[require_dependency.WrappedDependencySourceMarker];
|
|
914
|
+
const completed = await fieldParser.complete([pendingState]);
|
|
915
|
+
preCompletedState[fieldKey] = completed;
|
|
916
|
+
} else preCompletedState[fieldKey] = fieldState;
|
|
917
|
+
}
|
|
918
|
+
const resolvedState = await resolveDeferredParseStatesAsync(preCompletedState);
|
|
777
919
|
const result = {};
|
|
778
920
|
for (const field of parserKeys) {
|
|
779
|
-
const
|
|
780
|
-
|
|
921
|
+
const fieldKey = field;
|
|
922
|
+
const fieldResolvedState = resolvedState[fieldKey];
|
|
923
|
+
const fieldParser = parsers[field];
|
|
924
|
+
const originalFieldState = state[fieldKey];
|
|
925
|
+
const wasPreCompletedCase1 = Array.isArray(originalFieldState) && originalFieldState.length === 1 && require_dependency.isPendingDependencySourceState(originalFieldState[0]);
|
|
926
|
+
const wasPreCompletedCase2 = originalFieldState === void 0 && require_dependency.isPendingDependencySourceState(fieldParser.initialState);
|
|
927
|
+
const wasPreCompletedCase3 = originalFieldState === void 0 && require_dependency.isWrappedDependencySource(fieldParser);
|
|
928
|
+
if (require_dependency.isDependencySourceState(fieldResolvedState) && (wasPreCompletedCase1 || wasPreCompletedCase2 || wasPreCompletedCase3)) {
|
|
929
|
+
const depResult = fieldResolvedState.result;
|
|
930
|
+
if (depResult.success) result[fieldKey] = depResult.value;
|
|
931
|
+
else return {
|
|
932
|
+
success: false,
|
|
933
|
+
error: depResult.error
|
|
934
|
+
};
|
|
935
|
+
continue;
|
|
936
|
+
}
|
|
937
|
+
const valueResult = await fieldParser.complete(fieldResolvedState);
|
|
938
|
+
if (valueResult.success) result[fieldKey] = valueResult.value;
|
|
781
939
|
else return {
|
|
782
940
|
success: false,
|
|
783
941
|
error: valueResult.error
|
|
@@ -1220,15 +1378,15 @@ function merge(...args) {
|
|
|
1220
1378
|
return parseSync(context);
|
|
1221
1379
|
},
|
|
1222
1380
|
complete(state) {
|
|
1223
|
-
const extractCompleteState = (parser, index) => {
|
|
1381
|
+
const extractCompleteState = (parser, resolvedState, index) => {
|
|
1224
1382
|
if (parser.initialState === void 0) {
|
|
1225
1383
|
const key = `__parser_${index}`;
|
|
1226
|
-
if (
|
|
1384
|
+
if (resolvedState && typeof resolvedState === "object" && key in resolvedState) return resolvedState[key];
|
|
1227
1385
|
return void 0;
|
|
1228
1386
|
} else if (parser.initialState && typeof parser.initialState === "object") {
|
|
1229
|
-
if (
|
|
1387
|
+
if (resolvedState && typeof resolvedState === "object") {
|
|
1230
1388
|
const extractedState = {};
|
|
1231
|
-
for (const field in parser.initialState) extractedState[field] = field in
|
|
1389
|
+
for (const field in parser.initialState) extractedState[field] = field in resolvedState ? resolvedState[field] : parser.initialState[field];
|
|
1232
1390
|
return extractedState;
|
|
1233
1391
|
}
|
|
1234
1392
|
return parser.initialState;
|
|
@@ -1236,10 +1394,11 @@ function merge(...args) {
|
|
|
1236
1394
|
return parser.initialState;
|
|
1237
1395
|
};
|
|
1238
1396
|
if (!isAsync) {
|
|
1397
|
+
const resolvedState = resolveDeferredParseStates(state);
|
|
1239
1398
|
const object$1 = {};
|
|
1240
1399
|
for (let i = 0; i < syncParsers.length; i++) {
|
|
1241
1400
|
const parser = syncParsers[i];
|
|
1242
|
-
const parserState = extractCompleteState(parser, i);
|
|
1401
|
+
const parserState = extractCompleteState(parser, resolvedState, i);
|
|
1243
1402
|
const result = parser.complete(parserState);
|
|
1244
1403
|
if (!result.success) return result;
|
|
1245
1404
|
for (const field in result.value) object$1[field] = result.value[field];
|
|
@@ -1250,10 +1409,11 @@ function merge(...args) {
|
|
|
1250
1409
|
};
|
|
1251
1410
|
}
|
|
1252
1411
|
return (async () => {
|
|
1412
|
+
const resolvedState = await resolveDeferredParseStatesAsync(state);
|
|
1253
1413
|
const object$1 = {};
|
|
1254
1414
|
for (let i = 0; i < parsers.length; i++) {
|
|
1255
1415
|
const parser = parsers[i];
|
|
1256
|
-
const parserState = extractCompleteState(parser, i);
|
|
1416
|
+
const parserState = extractCompleteState(parser, resolvedState, i);
|
|
1257
1417
|
const result = await parser.complete(parserState);
|
|
1258
1418
|
if (!result.success) return result;
|
|
1259
1419
|
for (const field in result.value) object$1[field] = result.value[field];
|
|
@@ -1482,11 +1642,14 @@ function concat(...parsers) {
|
|
|
1482
1642
|
};
|
|
1483
1643
|
};
|
|
1484
1644
|
const completeSync = (state) => {
|
|
1485
|
-
const results = [];
|
|
1486
1645
|
const stateArray = state;
|
|
1646
|
+
const combinedState = {};
|
|
1647
|
+
for (let i = 0; i < stateArray.length; i++) combinedState[i] = stateArray[i];
|
|
1648
|
+
const resolvedCombinedState = resolveDeferredParseStates(combinedState);
|
|
1649
|
+
const results = [];
|
|
1487
1650
|
for (let i = 0; i < syncParsers.length; i++) {
|
|
1488
1651
|
const parser = syncParsers[i];
|
|
1489
|
-
const parserState =
|
|
1652
|
+
const parserState = resolvedCombinedState[i];
|
|
1490
1653
|
const result = parser.complete(parserState);
|
|
1491
1654
|
if (!result.success) return result;
|
|
1492
1655
|
if (Array.isArray(result.value)) results.push(...result.value);
|
|
@@ -1498,11 +1661,14 @@ function concat(...parsers) {
|
|
|
1498
1661
|
};
|
|
1499
1662
|
};
|
|
1500
1663
|
const completeAsync = async (state) => {
|
|
1501
|
-
const results = [];
|
|
1502
1664
|
const stateArray = state;
|
|
1665
|
+
const combinedState = {};
|
|
1666
|
+
for (let i = 0; i < stateArray.length; i++) combinedState[i] = stateArray[i];
|
|
1667
|
+
const resolvedCombinedState = await resolveDeferredParseStatesAsync(combinedState);
|
|
1668
|
+
const results = [];
|
|
1503
1669
|
for (let i = 0; i < parsers.length; i++) {
|
|
1504
1670
|
const parser = parsers[i];
|
|
1505
|
-
const parserState =
|
|
1671
|
+
const parserState = resolvedCombinedState[i];
|
|
1506
1672
|
const result = await parser.complete(parserState);
|
|
1507
1673
|
if (!result.success) return result;
|
|
1508
1674
|
if (Array.isArray(result.value)) results.push(...result.value);
|