@optique/core 0.10.0-dev.294 → 0.10.0-dev.296
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 +220 -24
- package/dist/constructs.js +221 -25
- package/dist/dependency.cjs +136 -7
- package/dist/dependency.d.cts +79 -1
- package/dist/dependency.d.ts +79 -1
- package/dist/dependency.js +130 -7
- package/dist/index.cjs +7 -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 +137 -15
- package/dist/modifiers.js +137 -15
- package/dist/primitives.cjs +5 -1
- package/dist/primitives.d.cts +4 -3
- package/dist/primitives.d.ts +4 -3
- package/dist/primitives.js +6 -2
- package/package.json +1 -1
package/dist/constructs.cjs
CHANGED
|
@@ -243,11 +243,38 @@ function or(...args) {
|
|
|
243
243
|
state: context.state == null || context.state[0] !== i || !context.state[1].success ? parser.initialState : context.state[1].next.state
|
|
244
244
|
});
|
|
245
245
|
if (result.success && result.consumed.length > 0) {
|
|
246
|
-
if (context.state?.[0] !== i && context.state?.[1].success)
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
246
|
+
if (context.state?.[0] !== i && context.state?.[1].success) {
|
|
247
|
+
const previouslyConsumed = context.state[1].consumed;
|
|
248
|
+
const checkResult = parser.parse({
|
|
249
|
+
...context,
|
|
250
|
+
buffer: previouslyConsumed,
|
|
251
|
+
state: parser.initialState
|
|
252
|
+
});
|
|
253
|
+
const canConsumeShared = checkResult.success && checkResult.consumed.length === previouslyConsumed.length && checkResult.consumed.every((c, idx) => c === previouslyConsumed[idx]);
|
|
254
|
+
if (!canConsumeShared) return {
|
|
255
|
+
success: false,
|
|
256
|
+
consumed: context.buffer.length - result.next.buffer.length,
|
|
257
|
+
error: require_message.message`${require_message.values(context.state[1].consumed)} and ${require_message.values(result.consumed)} cannot be used together.`
|
|
258
|
+
};
|
|
259
|
+
const replayedResult = parser.parse({
|
|
260
|
+
...context,
|
|
261
|
+
state: checkResult.next.state
|
|
262
|
+
});
|
|
263
|
+
if (!replayedResult.success) return replayedResult;
|
|
264
|
+
return {
|
|
265
|
+
success: true,
|
|
266
|
+
next: {
|
|
267
|
+
...context,
|
|
268
|
+
buffer: replayedResult.next.buffer,
|
|
269
|
+
optionsTerminated: replayedResult.next.optionsTerminated,
|
|
270
|
+
state: [i, {
|
|
271
|
+
...replayedResult,
|
|
272
|
+
consumed: [...previouslyConsumed, ...replayedResult.consumed]
|
|
273
|
+
}]
|
|
274
|
+
},
|
|
275
|
+
consumed: replayedResult.consumed
|
|
276
|
+
};
|
|
277
|
+
}
|
|
251
278
|
return {
|
|
252
279
|
success: true,
|
|
253
280
|
next: {
|
|
@@ -276,11 +303,40 @@ function or(...args) {
|
|
|
276
303
|
});
|
|
277
304
|
const result = await resultOrPromise;
|
|
278
305
|
if (result.success && result.consumed.length > 0) {
|
|
279
|
-
if (context.state?.[0] !== i && context.state?.[1].success)
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
306
|
+
if (context.state?.[0] !== i && context.state?.[1].success) {
|
|
307
|
+
const previouslyConsumed = context.state[1].consumed;
|
|
308
|
+
const checkResultOrPromise = parser.parse({
|
|
309
|
+
...context,
|
|
310
|
+
buffer: previouslyConsumed,
|
|
311
|
+
state: parser.initialState
|
|
312
|
+
});
|
|
313
|
+
const checkResult = await checkResultOrPromise;
|
|
314
|
+
const canConsumeShared = checkResult.success && checkResult.consumed.length === previouslyConsumed.length && checkResult.consumed.every((c, idx) => c === previouslyConsumed[idx]);
|
|
315
|
+
if (!canConsumeShared) return {
|
|
316
|
+
success: false,
|
|
317
|
+
consumed: context.buffer.length - result.next.buffer.length,
|
|
318
|
+
error: require_message.message`${require_message.values(context.state[1].consumed)} and ${require_message.values(result.consumed)} cannot be used together.`
|
|
319
|
+
};
|
|
320
|
+
const replayedResultOrPromise = parser.parse({
|
|
321
|
+
...context,
|
|
322
|
+
state: checkResult.next.state
|
|
323
|
+
});
|
|
324
|
+
const replayedResult = await replayedResultOrPromise;
|
|
325
|
+
if (!replayedResult.success) return replayedResult;
|
|
326
|
+
return {
|
|
327
|
+
success: true,
|
|
328
|
+
next: {
|
|
329
|
+
...context,
|
|
330
|
+
buffer: replayedResult.next.buffer,
|
|
331
|
+
optionsTerminated: replayedResult.next.optionsTerminated,
|
|
332
|
+
state: [i, {
|
|
333
|
+
...replayedResult,
|
|
334
|
+
consumed: [...previouslyConsumed, ...replayedResult.consumed]
|
|
335
|
+
}]
|
|
336
|
+
},
|
|
337
|
+
consumed: replayedResult.consumed
|
|
338
|
+
};
|
|
339
|
+
}
|
|
284
340
|
return {
|
|
285
341
|
success: true,
|
|
286
342
|
next: {
|
|
@@ -848,12 +904,46 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
848
904
|
return parseSync(context);
|
|
849
905
|
},
|
|
850
906
|
complete(state) {
|
|
851
|
-
const resolvedState = isAsync ? state : resolveDeferredParseStates(state);
|
|
852
907
|
if (!isAsync) {
|
|
908
|
+
const preCompletedState = {};
|
|
909
|
+
for (const field of parserKeys) {
|
|
910
|
+
const fieldKey = field;
|
|
911
|
+
const fieldState = state[fieldKey];
|
|
912
|
+
const fieldParser = parsers[field];
|
|
913
|
+
if (Array.isArray(fieldState) && fieldState.length === 1 && require_dependency.isPendingDependencySourceState(fieldState[0])) {
|
|
914
|
+
const completed = fieldParser.complete(fieldState);
|
|
915
|
+
preCompletedState[fieldKey] = completed;
|
|
916
|
+
} else if (fieldState === void 0 && require_dependency.isPendingDependencySourceState(fieldParser.initialState)) {
|
|
917
|
+
const completed = fieldParser.complete([fieldParser.initialState]);
|
|
918
|
+
preCompletedState[fieldKey] = completed;
|
|
919
|
+
} else if (fieldState === void 0 && require_dependency.isWrappedDependencySource(fieldParser)) {
|
|
920
|
+
const pendingState = fieldParser[require_dependency.WrappedDependencySourceMarker];
|
|
921
|
+
const completed = fieldParser.complete([pendingState]);
|
|
922
|
+
if (require_dependency.isDependencySourceState(completed)) preCompletedState[fieldKey] = completed;
|
|
923
|
+
else preCompletedState[fieldKey] = fieldState;
|
|
924
|
+
} else preCompletedState[fieldKey] = fieldState;
|
|
925
|
+
}
|
|
926
|
+
const resolvedState = resolveDeferredParseStates(preCompletedState);
|
|
853
927
|
const result = {};
|
|
854
928
|
for (const field of parserKeys) {
|
|
855
|
-
const
|
|
856
|
-
|
|
929
|
+
const fieldKey = field;
|
|
930
|
+
const fieldResolvedState = resolvedState[fieldKey];
|
|
931
|
+
const fieldParser = parsers[field];
|
|
932
|
+
const originalFieldState = state[fieldKey];
|
|
933
|
+
const wasPreCompletedCase1 = Array.isArray(originalFieldState) && originalFieldState.length === 1 && require_dependency.isPendingDependencySourceState(originalFieldState[0]);
|
|
934
|
+
const wasPreCompletedCase2 = originalFieldState === void 0 && require_dependency.isPendingDependencySourceState(fieldParser.initialState);
|
|
935
|
+
const wasPreCompletedCase3 = originalFieldState === void 0 && require_dependency.isWrappedDependencySource(fieldParser);
|
|
936
|
+
if (require_dependency.isDependencySourceState(fieldResolvedState) && (wasPreCompletedCase1 || wasPreCompletedCase2 || wasPreCompletedCase3)) {
|
|
937
|
+
const depResult = fieldResolvedState.result;
|
|
938
|
+
if (depResult.success) result[fieldKey] = depResult.value;
|
|
939
|
+
else return {
|
|
940
|
+
success: false,
|
|
941
|
+
error: depResult.error
|
|
942
|
+
};
|
|
943
|
+
continue;
|
|
944
|
+
}
|
|
945
|
+
const valueResult = fieldParser.complete(fieldResolvedState);
|
|
946
|
+
if (valueResult.success) result[fieldKey] = valueResult.value;
|
|
857
947
|
else return {
|
|
858
948
|
success: false,
|
|
859
949
|
error: valueResult.error
|
|
@@ -865,11 +955,45 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
865
955
|
};
|
|
866
956
|
}
|
|
867
957
|
return (async () => {
|
|
868
|
-
const
|
|
958
|
+
const preCompletedState = {};
|
|
959
|
+
for (const field of parserKeys) {
|
|
960
|
+
const fieldKey = field;
|
|
961
|
+
const fieldState = state[fieldKey];
|
|
962
|
+
const fieldParser = parsers[field];
|
|
963
|
+
if (Array.isArray(fieldState) && fieldState.length === 1 && require_dependency.isPendingDependencySourceState(fieldState[0])) {
|
|
964
|
+
const completed = await fieldParser.complete(fieldState);
|
|
965
|
+
preCompletedState[fieldKey] = completed;
|
|
966
|
+
} else if (fieldState === void 0 && require_dependency.isPendingDependencySourceState(fieldParser.initialState)) {
|
|
967
|
+
const completed = await fieldParser.complete([fieldParser.initialState]);
|
|
968
|
+
preCompletedState[fieldKey] = completed;
|
|
969
|
+
} else if (fieldState === void 0 && require_dependency.isWrappedDependencySource(fieldParser)) {
|
|
970
|
+
const pendingState = fieldParser[require_dependency.WrappedDependencySourceMarker];
|
|
971
|
+
const completed = await fieldParser.complete([pendingState]);
|
|
972
|
+
if (require_dependency.isDependencySourceState(completed)) preCompletedState[fieldKey] = completed;
|
|
973
|
+
else preCompletedState[fieldKey] = fieldState;
|
|
974
|
+
} else preCompletedState[fieldKey] = fieldState;
|
|
975
|
+
}
|
|
976
|
+
const resolvedState = await resolveDeferredParseStatesAsync(preCompletedState);
|
|
869
977
|
const result = {};
|
|
870
978
|
for (const field of parserKeys) {
|
|
871
|
-
const
|
|
872
|
-
|
|
979
|
+
const fieldKey = field;
|
|
980
|
+
const fieldResolvedState = resolvedState[fieldKey];
|
|
981
|
+
const fieldParser = parsers[field];
|
|
982
|
+
const originalFieldState = state[fieldKey];
|
|
983
|
+
const wasPreCompletedCase1 = Array.isArray(originalFieldState) && originalFieldState.length === 1 && require_dependency.isPendingDependencySourceState(originalFieldState[0]);
|
|
984
|
+
const wasPreCompletedCase2 = originalFieldState === void 0 && require_dependency.isPendingDependencySourceState(fieldParser.initialState);
|
|
985
|
+
const wasPreCompletedCase3 = originalFieldState === void 0 && require_dependency.isWrappedDependencySource(fieldParser);
|
|
986
|
+
if (require_dependency.isDependencySourceState(fieldResolvedState) && (wasPreCompletedCase1 || wasPreCompletedCase2 || wasPreCompletedCase3)) {
|
|
987
|
+
const depResult = fieldResolvedState.result;
|
|
988
|
+
if (depResult.success) result[fieldKey] = depResult.value;
|
|
989
|
+
else return {
|
|
990
|
+
success: false,
|
|
991
|
+
error: depResult.error
|
|
992
|
+
};
|
|
993
|
+
continue;
|
|
994
|
+
}
|
|
995
|
+
const valueResult = await fieldParser.complete(fieldResolvedState);
|
|
996
|
+
if (valueResult.success) result[fieldKey] = valueResult.value;
|
|
873
997
|
else return {
|
|
874
998
|
success: false,
|
|
875
999
|
error: valueResult.error
|
|
@@ -1096,10 +1220,43 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1096
1220
|
},
|
|
1097
1221
|
complete(state) {
|
|
1098
1222
|
if (!isAsync) {
|
|
1099
|
-
const result = [];
|
|
1100
1223
|
const stateArray = state;
|
|
1224
|
+
const preCompletedState = [];
|
|
1101
1225
|
for (let i = 0; i < syncParsers.length; i++) {
|
|
1102
|
-
const
|
|
1226
|
+
const elementState = stateArray[i];
|
|
1227
|
+
const elementParser = syncParsers[i];
|
|
1228
|
+
if (Array.isArray(elementState) && elementState.length === 1 && require_dependency.isPendingDependencySourceState(elementState[0])) {
|
|
1229
|
+
const completed = elementParser.complete(elementState);
|
|
1230
|
+
preCompletedState[i] = completed;
|
|
1231
|
+
} else if (elementState === void 0 && require_dependency.isPendingDependencySourceState(elementParser.initialState)) {
|
|
1232
|
+
const completed = elementParser.complete([elementParser.initialState]);
|
|
1233
|
+
preCompletedState[i] = completed;
|
|
1234
|
+
} else if (elementState === void 0 && require_dependency.isWrappedDependencySource(elementParser)) {
|
|
1235
|
+
const pendingState = elementParser[require_dependency.WrappedDependencySourceMarker];
|
|
1236
|
+
const completed = elementParser.complete([pendingState]);
|
|
1237
|
+
preCompletedState[i] = completed;
|
|
1238
|
+
} else preCompletedState[i] = elementState;
|
|
1239
|
+
}
|
|
1240
|
+
const resolvedState = resolveDeferredParseStates(preCompletedState);
|
|
1241
|
+
const resolvedArray = resolvedState;
|
|
1242
|
+
const result = [];
|
|
1243
|
+
for (let i = 0; i < syncParsers.length; i++) {
|
|
1244
|
+
const elementResolvedState = resolvedArray[i];
|
|
1245
|
+
const elementParser = syncParsers[i];
|
|
1246
|
+
const originalElementState = stateArray[i];
|
|
1247
|
+
const wasPreCompletedCase1 = Array.isArray(originalElementState) && originalElementState.length === 1 && require_dependency.isPendingDependencySourceState(originalElementState[0]);
|
|
1248
|
+
const wasPreCompletedCase2 = originalElementState === void 0 && require_dependency.isPendingDependencySourceState(elementParser.initialState);
|
|
1249
|
+
const wasPreCompletedCase3 = originalElementState === void 0 && require_dependency.isWrappedDependencySource(elementParser);
|
|
1250
|
+
if (require_dependency.isDependencySourceState(elementResolvedState) && (wasPreCompletedCase1 || wasPreCompletedCase2 || wasPreCompletedCase3)) {
|
|
1251
|
+
const depResult = elementResolvedState.result;
|
|
1252
|
+
if (depResult.success) result[i] = depResult.value;
|
|
1253
|
+
else return {
|
|
1254
|
+
success: false,
|
|
1255
|
+
error: depResult.error
|
|
1256
|
+
};
|
|
1257
|
+
continue;
|
|
1258
|
+
}
|
|
1259
|
+
const valueResult = elementParser.complete(elementResolvedState);
|
|
1103
1260
|
if (valueResult.success) result[i] = valueResult.value;
|
|
1104
1261
|
else return {
|
|
1105
1262
|
success: false,
|
|
@@ -1112,10 +1269,43 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1112
1269
|
};
|
|
1113
1270
|
}
|
|
1114
1271
|
return (async () => {
|
|
1115
|
-
const result = [];
|
|
1116
1272
|
const stateArray = state;
|
|
1273
|
+
const preCompletedState = [];
|
|
1274
|
+
for (let i = 0; i < parsers.length; i++) {
|
|
1275
|
+
const elementState = stateArray[i];
|
|
1276
|
+
const elementParser = parsers[i];
|
|
1277
|
+
if (Array.isArray(elementState) && elementState.length === 1 && require_dependency.isPendingDependencySourceState(elementState[0])) {
|
|
1278
|
+
const completed = await elementParser.complete(elementState);
|
|
1279
|
+
preCompletedState[i] = completed;
|
|
1280
|
+
} else if (elementState === void 0 && require_dependency.isPendingDependencySourceState(elementParser.initialState)) {
|
|
1281
|
+
const completed = await elementParser.complete([elementParser.initialState]);
|
|
1282
|
+
preCompletedState[i] = completed;
|
|
1283
|
+
} else if (elementState === void 0 && require_dependency.isWrappedDependencySource(elementParser)) {
|
|
1284
|
+
const pendingState = elementParser[require_dependency.WrappedDependencySourceMarker];
|
|
1285
|
+
const completed = await elementParser.complete([pendingState]);
|
|
1286
|
+
preCompletedState[i] = completed;
|
|
1287
|
+
} else preCompletedState[i] = elementState;
|
|
1288
|
+
}
|
|
1289
|
+
const resolvedState = await resolveDeferredParseStatesAsync(preCompletedState);
|
|
1290
|
+
const resolvedArray = resolvedState;
|
|
1291
|
+
const result = [];
|
|
1117
1292
|
for (let i = 0; i < parsers.length; i++) {
|
|
1118
|
-
const
|
|
1293
|
+
const elementResolvedState = resolvedArray[i];
|
|
1294
|
+
const elementParser = parsers[i];
|
|
1295
|
+
const originalElementState = stateArray[i];
|
|
1296
|
+
const wasPreCompletedCase1 = Array.isArray(originalElementState) && originalElementState.length === 1 && require_dependency.isPendingDependencySourceState(originalElementState[0]);
|
|
1297
|
+
const wasPreCompletedCase2 = originalElementState === void 0 && require_dependency.isPendingDependencySourceState(elementParser.initialState);
|
|
1298
|
+
const wasPreCompletedCase3 = originalElementState === void 0 && require_dependency.isWrappedDependencySource(elementParser);
|
|
1299
|
+
if (require_dependency.isDependencySourceState(elementResolvedState) && (wasPreCompletedCase1 || wasPreCompletedCase2 || wasPreCompletedCase3)) {
|
|
1300
|
+
const depResult = elementResolvedState.result;
|
|
1301
|
+
if (depResult.success) result[i] = depResult.value;
|
|
1302
|
+
else return {
|
|
1303
|
+
success: false,
|
|
1304
|
+
error: depResult.error
|
|
1305
|
+
};
|
|
1306
|
+
continue;
|
|
1307
|
+
}
|
|
1308
|
+
const valueResult = await elementParser.complete(elementResolvedState);
|
|
1119
1309
|
if (valueResult.success) result[i] = valueResult.value;
|
|
1120
1310
|
else return {
|
|
1121
1311
|
success: false,
|
|
@@ -1576,11 +1766,14 @@ function concat(...parsers) {
|
|
|
1576
1766
|
};
|
|
1577
1767
|
};
|
|
1578
1768
|
const completeSync = (state) => {
|
|
1579
|
-
const results = [];
|
|
1580
1769
|
const stateArray = state;
|
|
1770
|
+
const combinedState = {};
|
|
1771
|
+
for (let i = 0; i < stateArray.length; i++) combinedState[i] = stateArray[i];
|
|
1772
|
+
const resolvedCombinedState = resolveDeferredParseStates(combinedState);
|
|
1773
|
+
const results = [];
|
|
1581
1774
|
for (let i = 0; i < syncParsers.length; i++) {
|
|
1582
1775
|
const parser = syncParsers[i];
|
|
1583
|
-
const parserState =
|
|
1776
|
+
const parserState = resolvedCombinedState[i];
|
|
1584
1777
|
const result = parser.complete(parserState);
|
|
1585
1778
|
if (!result.success) return result;
|
|
1586
1779
|
if (Array.isArray(result.value)) results.push(...result.value);
|
|
@@ -1592,11 +1785,14 @@ function concat(...parsers) {
|
|
|
1592
1785
|
};
|
|
1593
1786
|
};
|
|
1594
1787
|
const completeAsync = async (state) => {
|
|
1595
|
-
const results = [];
|
|
1596
1788
|
const stateArray = state;
|
|
1789
|
+
const combinedState = {};
|
|
1790
|
+
for (let i = 0; i < stateArray.length; i++) combinedState[i] = stateArray[i];
|
|
1791
|
+
const resolvedCombinedState = await resolveDeferredParseStatesAsync(combinedState);
|
|
1792
|
+
const results = [];
|
|
1597
1793
|
for (let i = 0; i < parsers.length; i++) {
|
|
1598
1794
|
const parser = parsers[i];
|
|
1599
|
-
const parserState =
|
|
1795
|
+
const parserState = resolvedCombinedState[i];
|
|
1600
1796
|
const result = await parser.complete(parserState);
|
|
1601
1797
|
if (!result.success) return result;
|
|
1602
1798
|
if (Array.isArray(result.value)) results.push(...result.value);
|
package/dist/constructs.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { message, optionName, values } from "./message.js";
|
|
2
|
-
import { DependencyId, DependencyRegistry, ParseWithDependency, isDeferredParseState, isDependencySourceState } from "./dependency.js";
|
|
2
|
+
import { DependencyId, DependencyRegistry, ParseWithDependency, WrappedDependencySourceMarker, isDeferredParseState, isDependencySourceState, isPendingDependencySourceState, isWrappedDependencySource } from "./dependency.js";
|
|
3
3
|
import { extractArgumentMetavars, extractCommandNames, extractOptionNames } from "./usage.js";
|
|
4
4
|
import { createErrorWithSuggestions, deduplicateSuggestions } from "./suggestion.js";
|
|
5
5
|
|
|
@@ -243,11 +243,38 @@ function or(...args) {
|
|
|
243
243
|
state: context.state == null || context.state[0] !== i || !context.state[1].success ? parser.initialState : context.state[1].next.state
|
|
244
244
|
});
|
|
245
245
|
if (result.success && result.consumed.length > 0) {
|
|
246
|
-
if (context.state?.[0] !== i && context.state?.[1].success)
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
246
|
+
if (context.state?.[0] !== i && context.state?.[1].success) {
|
|
247
|
+
const previouslyConsumed = context.state[1].consumed;
|
|
248
|
+
const checkResult = parser.parse({
|
|
249
|
+
...context,
|
|
250
|
+
buffer: previouslyConsumed,
|
|
251
|
+
state: parser.initialState
|
|
252
|
+
});
|
|
253
|
+
const canConsumeShared = checkResult.success && checkResult.consumed.length === previouslyConsumed.length && checkResult.consumed.every((c, idx) => c === previouslyConsumed[idx]);
|
|
254
|
+
if (!canConsumeShared) return {
|
|
255
|
+
success: false,
|
|
256
|
+
consumed: context.buffer.length - result.next.buffer.length,
|
|
257
|
+
error: message`${values(context.state[1].consumed)} and ${values(result.consumed)} cannot be used together.`
|
|
258
|
+
};
|
|
259
|
+
const replayedResult = parser.parse({
|
|
260
|
+
...context,
|
|
261
|
+
state: checkResult.next.state
|
|
262
|
+
});
|
|
263
|
+
if (!replayedResult.success) return replayedResult;
|
|
264
|
+
return {
|
|
265
|
+
success: true,
|
|
266
|
+
next: {
|
|
267
|
+
...context,
|
|
268
|
+
buffer: replayedResult.next.buffer,
|
|
269
|
+
optionsTerminated: replayedResult.next.optionsTerminated,
|
|
270
|
+
state: [i, {
|
|
271
|
+
...replayedResult,
|
|
272
|
+
consumed: [...previouslyConsumed, ...replayedResult.consumed]
|
|
273
|
+
}]
|
|
274
|
+
},
|
|
275
|
+
consumed: replayedResult.consumed
|
|
276
|
+
};
|
|
277
|
+
}
|
|
251
278
|
return {
|
|
252
279
|
success: true,
|
|
253
280
|
next: {
|
|
@@ -276,11 +303,40 @@ function or(...args) {
|
|
|
276
303
|
});
|
|
277
304
|
const result = await resultOrPromise;
|
|
278
305
|
if (result.success && result.consumed.length > 0) {
|
|
279
|
-
if (context.state?.[0] !== i && context.state?.[1].success)
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
306
|
+
if (context.state?.[0] !== i && context.state?.[1].success) {
|
|
307
|
+
const previouslyConsumed = context.state[1].consumed;
|
|
308
|
+
const checkResultOrPromise = parser.parse({
|
|
309
|
+
...context,
|
|
310
|
+
buffer: previouslyConsumed,
|
|
311
|
+
state: parser.initialState
|
|
312
|
+
});
|
|
313
|
+
const checkResult = await checkResultOrPromise;
|
|
314
|
+
const canConsumeShared = checkResult.success && checkResult.consumed.length === previouslyConsumed.length && checkResult.consumed.every((c, idx) => c === previouslyConsumed[idx]);
|
|
315
|
+
if (!canConsumeShared) return {
|
|
316
|
+
success: false,
|
|
317
|
+
consumed: context.buffer.length - result.next.buffer.length,
|
|
318
|
+
error: message`${values(context.state[1].consumed)} and ${values(result.consumed)} cannot be used together.`
|
|
319
|
+
};
|
|
320
|
+
const replayedResultOrPromise = parser.parse({
|
|
321
|
+
...context,
|
|
322
|
+
state: checkResult.next.state
|
|
323
|
+
});
|
|
324
|
+
const replayedResult = await replayedResultOrPromise;
|
|
325
|
+
if (!replayedResult.success) return replayedResult;
|
|
326
|
+
return {
|
|
327
|
+
success: true,
|
|
328
|
+
next: {
|
|
329
|
+
...context,
|
|
330
|
+
buffer: replayedResult.next.buffer,
|
|
331
|
+
optionsTerminated: replayedResult.next.optionsTerminated,
|
|
332
|
+
state: [i, {
|
|
333
|
+
...replayedResult,
|
|
334
|
+
consumed: [...previouslyConsumed, ...replayedResult.consumed]
|
|
335
|
+
}]
|
|
336
|
+
},
|
|
337
|
+
consumed: replayedResult.consumed
|
|
338
|
+
};
|
|
339
|
+
}
|
|
284
340
|
return {
|
|
285
341
|
success: true,
|
|
286
342
|
next: {
|
|
@@ -848,12 +904,46 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
848
904
|
return parseSync(context);
|
|
849
905
|
},
|
|
850
906
|
complete(state) {
|
|
851
|
-
const resolvedState = isAsync ? state : resolveDeferredParseStates(state);
|
|
852
907
|
if (!isAsync) {
|
|
908
|
+
const preCompletedState = {};
|
|
909
|
+
for (const field of parserKeys) {
|
|
910
|
+
const fieldKey = field;
|
|
911
|
+
const fieldState = state[fieldKey];
|
|
912
|
+
const fieldParser = parsers[field];
|
|
913
|
+
if (Array.isArray(fieldState) && fieldState.length === 1 && isPendingDependencySourceState(fieldState[0])) {
|
|
914
|
+
const completed = fieldParser.complete(fieldState);
|
|
915
|
+
preCompletedState[fieldKey] = completed;
|
|
916
|
+
} else if (fieldState === void 0 && isPendingDependencySourceState(fieldParser.initialState)) {
|
|
917
|
+
const completed = fieldParser.complete([fieldParser.initialState]);
|
|
918
|
+
preCompletedState[fieldKey] = completed;
|
|
919
|
+
} else if (fieldState === void 0 && isWrappedDependencySource(fieldParser)) {
|
|
920
|
+
const pendingState = fieldParser[WrappedDependencySourceMarker];
|
|
921
|
+
const completed = fieldParser.complete([pendingState]);
|
|
922
|
+
if (isDependencySourceState(completed)) preCompletedState[fieldKey] = completed;
|
|
923
|
+
else preCompletedState[fieldKey] = fieldState;
|
|
924
|
+
} else preCompletedState[fieldKey] = fieldState;
|
|
925
|
+
}
|
|
926
|
+
const resolvedState = resolveDeferredParseStates(preCompletedState);
|
|
853
927
|
const result = {};
|
|
854
928
|
for (const field of parserKeys) {
|
|
855
|
-
const
|
|
856
|
-
|
|
929
|
+
const fieldKey = field;
|
|
930
|
+
const fieldResolvedState = resolvedState[fieldKey];
|
|
931
|
+
const fieldParser = parsers[field];
|
|
932
|
+
const originalFieldState = state[fieldKey];
|
|
933
|
+
const wasPreCompletedCase1 = Array.isArray(originalFieldState) && originalFieldState.length === 1 && isPendingDependencySourceState(originalFieldState[0]);
|
|
934
|
+
const wasPreCompletedCase2 = originalFieldState === void 0 && isPendingDependencySourceState(fieldParser.initialState);
|
|
935
|
+
const wasPreCompletedCase3 = originalFieldState === void 0 && isWrappedDependencySource(fieldParser);
|
|
936
|
+
if (isDependencySourceState(fieldResolvedState) && (wasPreCompletedCase1 || wasPreCompletedCase2 || wasPreCompletedCase3)) {
|
|
937
|
+
const depResult = fieldResolvedState.result;
|
|
938
|
+
if (depResult.success) result[fieldKey] = depResult.value;
|
|
939
|
+
else return {
|
|
940
|
+
success: false,
|
|
941
|
+
error: depResult.error
|
|
942
|
+
};
|
|
943
|
+
continue;
|
|
944
|
+
}
|
|
945
|
+
const valueResult = fieldParser.complete(fieldResolvedState);
|
|
946
|
+
if (valueResult.success) result[fieldKey] = valueResult.value;
|
|
857
947
|
else return {
|
|
858
948
|
success: false,
|
|
859
949
|
error: valueResult.error
|
|
@@ -865,11 +955,45 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
865
955
|
};
|
|
866
956
|
}
|
|
867
957
|
return (async () => {
|
|
868
|
-
const
|
|
958
|
+
const preCompletedState = {};
|
|
959
|
+
for (const field of parserKeys) {
|
|
960
|
+
const fieldKey = field;
|
|
961
|
+
const fieldState = state[fieldKey];
|
|
962
|
+
const fieldParser = parsers[field];
|
|
963
|
+
if (Array.isArray(fieldState) && fieldState.length === 1 && isPendingDependencySourceState(fieldState[0])) {
|
|
964
|
+
const completed = await fieldParser.complete(fieldState);
|
|
965
|
+
preCompletedState[fieldKey] = completed;
|
|
966
|
+
} else if (fieldState === void 0 && isPendingDependencySourceState(fieldParser.initialState)) {
|
|
967
|
+
const completed = await fieldParser.complete([fieldParser.initialState]);
|
|
968
|
+
preCompletedState[fieldKey] = completed;
|
|
969
|
+
} else if (fieldState === void 0 && isWrappedDependencySource(fieldParser)) {
|
|
970
|
+
const pendingState = fieldParser[WrappedDependencySourceMarker];
|
|
971
|
+
const completed = await fieldParser.complete([pendingState]);
|
|
972
|
+
if (isDependencySourceState(completed)) preCompletedState[fieldKey] = completed;
|
|
973
|
+
else preCompletedState[fieldKey] = fieldState;
|
|
974
|
+
} else preCompletedState[fieldKey] = fieldState;
|
|
975
|
+
}
|
|
976
|
+
const resolvedState = await resolveDeferredParseStatesAsync(preCompletedState);
|
|
869
977
|
const result = {};
|
|
870
978
|
for (const field of parserKeys) {
|
|
871
|
-
const
|
|
872
|
-
|
|
979
|
+
const fieldKey = field;
|
|
980
|
+
const fieldResolvedState = resolvedState[fieldKey];
|
|
981
|
+
const fieldParser = parsers[field];
|
|
982
|
+
const originalFieldState = state[fieldKey];
|
|
983
|
+
const wasPreCompletedCase1 = Array.isArray(originalFieldState) && originalFieldState.length === 1 && isPendingDependencySourceState(originalFieldState[0]);
|
|
984
|
+
const wasPreCompletedCase2 = originalFieldState === void 0 && isPendingDependencySourceState(fieldParser.initialState);
|
|
985
|
+
const wasPreCompletedCase3 = originalFieldState === void 0 && isWrappedDependencySource(fieldParser);
|
|
986
|
+
if (isDependencySourceState(fieldResolvedState) && (wasPreCompletedCase1 || wasPreCompletedCase2 || wasPreCompletedCase3)) {
|
|
987
|
+
const depResult = fieldResolvedState.result;
|
|
988
|
+
if (depResult.success) result[fieldKey] = depResult.value;
|
|
989
|
+
else return {
|
|
990
|
+
success: false,
|
|
991
|
+
error: depResult.error
|
|
992
|
+
};
|
|
993
|
+
continue;
|
|
994
|
+
}
|
|
995
|
+
const valueResult = await fieldParser.complete(fieldResolvedState);
|
|
996
|
+
if (valueResult.success) result[fieldKey] = valueResult.value;
|
|
873
997
|
else return {
|
|
874
998
|
success: false,
|
|
875
999
|
error: valueResult.error
|
|
@@ -1096,10 +1220,43 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1096
1220
|
},
|
|
1097
1221
|
complete(state) {
|
|
1098
1222
|
if (!isAsync) {
|
|
1099
|
-
const result = [];
|
|
1100
1223
|
const stateArray = state;
|
|
1224
|
+
const preCompletedState = [];
|
|
1101
1225
|
for (let i = 0; i < syncParsers.length; i++) {
|
|
1102
|
-
const
|
|
1226
|
+
const elementState = stateArray[i];
|
|
1227
|
+
const elementParser = syncParsers[i];
|
|
1228
|
+
if (Array.isArray(elementState) && elementState.length === 1 && isPendingDependencySourceState(elementState[0])) {
|
|
1229
|
+
const completed = elementParser.complete(elementState);
|
|
1230
|
+
preCompletedState[i] = completed;
|
|
1231
|
+
} else if (elementState === void 0 && isPendingDependencySourceState(elementParser.initialState)) {
|
|
1232
|
+
const completed = elementParser.complete([elementParser.initialState]);
|
|
1233
|
+
preCompletedState[i] = completed;
|
|
1234
|
+
} else if (elementState === void 0 && isWrappedDependencySource(elementParser)) {
|
|
1235
|
+
const pendingState = elementParser[WrappedDependencySourceMarker];
|
|
1236
|
+
const completed = elementParser.complete([pendingState]);
|
|
1237
|
+
preCompletedState[i] = completed;
|
|
1238
|
+
} else preCompletedState[i] = elementState;
|
|
1239
|
+
}
|
|
1240
|
+
const resolvedState = resolveDeferredParseStates(preCompletedState);
|
|
1241
|
+
const resolvedArray = resolvedState;
|
|
1242
|
+
const result = [];
|
|
1243
|
+
for (let i = 0; i < syncParsers.length; i++) {
|
|
1244
|
+
const elementResolvedState = resolvedArray[i];
|
|
1245
|
+
const elementParser = syncParsers[i];
|
|
1246
|
+
const originalElementState = stateArray[i];
|
|
1247
|
+
const wasPreCompletedCase1 = Array.isArray(originalElementState) && originalElementState.length === 1 && isPendingDependencySourceState(originalElementState[0]);
|
|
1248
|
+
const wasPreCompletedCase2 = originalElementState === void 0 && isPendingDependencySourceState(elementParser.initialState);
|
|
1249
|
+
const wasPreCompletedCase3 = originalElementState === void 0 && isWrappedDependencySource(elementParser);
|
|
1250
|
+
if (isDependencySourceState(elementResolvedState) && (wasPreCompletedCase1 || wasPreCompletedCase2 || wasPreCompletedCase3)) {
|
|
1251
|
+
const depResult = elementResolvedState.result;
|
|
1252
|
+
if (depResult.success) result[i] = depResult.value;
|
|
1253
|
+
else return {
|
|
1254
|
+
success: false,
|
|
1255
|
+
error: depResult.error
|
|
1256
|
+
};
|
|
1257
|
+
continue;
|
|
1258
|
+
}
|
|
1259
|
+
const valueResult = elementParser.complete(elementResolvedState);
|
|
1103
1260
|
if (valueResult.success) result[i] = valueResult.value;
|
|
1104
1261
|
else return {
|
|
1105
1262
|
success: false,
|
|
@@ -1112,10 +1269,43 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
|
|
|
1112
1269
|
};
|
|
1113
1270
|
}
|
|
1114
1271
|
return (async () => {
|
|
1115
|
-
const result = [];
|
|
1116
1272
|
const stateArray = state;
|
|
1273
|
+
const preCompletedState = [];
|
|
1274
|
+
for (let i = 0; i < parsers.length; i++) {
|
|
1275
|
+
const elementState = stateArray[i];
|
|
1276
|
+
const elementParser = parsers[i];
|
|
1277
|
+
if (Array.isArray(elementState) && elementState.length === 1 && isPendingDependencySourceState(elementState[0])) {
|
|
1278
|
+
const completed = await elementParser.complete(elementState);
|
|
1279
|
+
preCompletedState[i] = completed;
|
|
1280
|
+
} else if (elementState === void 0 && isPendingDependencySourceState(elementParser.initialState)) {
|
|
1281
|
+
const completed = await elementParser.complete([elementParser.initialState]);
|
|
1282
|
+
preCompletedState[i] = completed;
|
|
1283
|
+
} else if (elementState === void 0 && isWrappedDependencySource(elementParser)) {
|
|
1284
|
+
const pendingState = elementParser[WrappedDependencySourceMarker];
|
|
1285
|
+
const completed = await elementParser.complete([pendingState]);
|
|
1286
|
+
preCompletedState[i] = completed;
|
|
1287
|
+
} else preCompletedState[i] = elementState;
|
|
1288
|
+
}
|
|
1289
|
+
const resolvedState = await resolveDeferredParseStatesAsync(preCompletedState);
|
|
1290
|
+
const resolvedArray = resolvedState;
|
|
1291
|
+
const result = [];
|
|
1117
1292
|
for (let i = 0; i < parsers.length; i++) {
|
|
1118
|
-
const
|
|
1293
|
+
const elementResolvedState = resolvedArray[i];
|
|
1294
|
+
const elementParser = parsers[i];
|
|
1295
|
+
const originalElementState = stateArray[i];
|
|
1296
|
+
const wasPreCompletedCase1 = Array.isArray(originalElementState) && originalElementState.length === 1 && isPendingDependencySourceState(originalElementState[0]);
|
|
1297
|
+
const wasPreCompletedCase2 = originalElementState === void 0 && isPendingDependencySourceState(elementParser.initialState);
|
|
1298
|
+
const wasPreCompletedCase3 = originalElementState === void 0 && isWrappedDependencySource(elementParser);
|
|
1299
|
+
if (isDependencySourceState(elementResolvedState) && (wasPreCompletedCase1 || wasPreCompletedCase2 || wasPreCompletedCase3)) {
|
|
1300
|
+
const depResult = elementResolvedState.result;
|
|
1301
|
+
if (depResult.success) result[i] = depResult.value;
|
|
1302
|
+
else return {
|
|
1303
|
+
success: false,
|
|
1304
|
+
error: depResult.error
|
|
1305
|
+
};
|
|
1306
|
+
continue;
|
|
1307
|
+
}
|
|
1308
|
+
const valueResult = await elementParser.complete(elementResolvedState);
|
|
1119
1309
|
if (valueResult.success) result[i] = valueResult.value;
|
|
1120
1310
|
else return {
|
|
1121
1311
|
success: false,
|
|
@@ -1576,11 +1766,14 @@ function concat(...parsers) {
|
|
|
1576
1766
|
};
|
|
1577
1767
|
};
|
|
1578
1768
|
const completeSync = (state) => {
|
|
1579
|
-
const results = [];
|
|
1580
1769
|
const stateArray = state;
|
|
1770
|
+
const combinedState = {};
|
|
1771
|
+
for (let i = 0; i < stateArray.length; i++) combinedState[i] = stateArray[i];
|
|
1772
|
+
const resolvedCombinedState = resolveDeferredParseStates(combinedState);
|
|
1773
|
+
const results = [];
|
|
1581
1774
|
for (let i = 0; i < syncParsers.length; i++) {
|
|
1582
1775
|
const parser = syncParsers[i];
|
|
1583
|
-
const parserState =
|
|
1776
|
+
const parserState = resolvedCombinedState[i];
|
|
1584
1777
|
const result = parser.complete(parserState);
|
|
1585
1778
|
if (!result.success) return result;
|
|
1586
1779
|
if (Array.isArray(result.value)) results.push(...result.value);
|
|
@@ -1592,11 +1785,14 @@ function concat(...parsers) {
|
|
|
1592
1785
|
};
|
|
1593
1786
|
};
|
|
1594
1787
|
const completeAsync = async (state) => {
|
|
1595
|
-
const results = [];
|
|
1596
1788
|
const stateArray = state;
|
|
1789
|
+
const combinedState = {};
|
|
1790
|
+
for (let i = 0; i < stateArray.length; i++) combinedState[i] = stateArray[i];
|
|
1791
|
+
const resolvedCombinedState = await resolveDeferredParseStatesAsync(combinedState);
|
|
1792
|
+
const results = [];
|
|
1597
1793
|
for (let i = 0; i < parsers.length; i++) {
|
|
1598
1794
|
const parser = parsers[i];
|
|
1599
|
-
const parserState =
|
|
1795
|
+
const parserState = resolvedCombinedState[i];
|
|
1600
1796
|
const result = await parser.complete(parserState);
|
|
1601
1797
|
if (!result.success) return result;
|
|
1602
1798
|
if (Array.isArray(result.value)) results.push(...result.value);
|