@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.
@@ -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) return {
247
- success: false,
248
- consumed: context.buffer.length - result.next.buffer.length,
249
- error: require_message.message`${require_message.values(context.state[1].consumed)} and ${require_message.values(result.consumed)} cannot be used together.`
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) return {
280
- success: false,
281
- consumed: context.buffer.length - result.next.buffer.length,
282
- error: require_message.message`${require_message.values(context.state[1].consumed)} and ${require_message.values(result.consumed)} cannot be used together.`
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 valueResult = parsers[field].complete(resolvedState[field]);
856
- if (valueResult.success) result[field] = valueResult.value;
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 resolvedState$1 = await resolveDeferredParseStatesAsync(state);
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 valueResult = await parsers[field].complete(resolvedState$1[field]);
872
- if (valueResult.success) result[field] = valueResult.value;
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 valueResult = syncParsers[i].complete(stateArray[i]);
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 valueResult = await parsers[i].complete(stateArray[i]);
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 = stateArray[i];
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 = stateArray[i];
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);
@@ -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) return {
247
- success: false,
248
- consumed: context.buffer.length - result.next.buffer.length,
249
- error: message`${values(context.state[1].consumed)} and ${values(result.consumed)} cannot be used together.`
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) return {
280
- success: false,
281
- consumed: context.buffer.length - result.next.buffer.length,
282
- error: message`${values(context.state[1].consumed)} and ${values(result.consumed)} cannot be used together.`
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 valueResult = parsers[field].complete(resolvedState[field]);
856
- if (valueResult.success) result[field] = valueResult.value;
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 resolvedState$1 = await resolveDeferredParseStatesAsync(state);
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 valueResult = await parsers[field].complete(resolvedState$1[field]);
872
- if (valueResult.success) result[field] = valueResult.value;
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 valueResult = syncParsers[i].complete(stateArray[i]);
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 valueResult = await parsers[i].complete(stateArray[i]);
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 = stateArray[i];
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 = stateArray[i];
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);