@optique/core 0.10.0-dev.295 → 0.10.0-dev.297

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: 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: {
@@ -482,12 +538,18 @@ function longestMatch(...args) {
482
538
  * @internal
483
539
  */
484
540
  function* suggestObjectSync(context, prefix, parserPairs) {
541
+ const registry = context.dependencyRegistry instanceof DependencyRegistry ? context.dependencyRegistry : new DependencyRegistry();
542
+ if (context.state && typeof context.state === "object") collectDependencies(context.state, registry);
543
+ const contextWithRegistry = {
544
+ ...context,
545
+ dependencyRegistry: registry
546
+ };
485
547
  if (context.buffer.length > 0) {
486
548
  const lastToken = context.buffer[context.buffer.length - 1];
487
549
  for (const [field, parser] of parserPairs) if (isOptionRequiringValue(parser.usage, lastToken)) {
488
550
  const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
489
551
  yield* parser.suggest({
490
- ...context,
552
+ ...contextWithRegistry,
491
553
  state: fieldState
492
554
  }, prefix);
493
555
  return;
@@ -497,7 +559,7 @@ function* suggestObjectSync(context, prefix, parserPairs) {
497
559
  for (const [field, parser] of parserPairs) {
498
560
  const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
499
561
  const fieldSuggestions = parser.suggest({
500
- ...context,
562
+ ...contextWithRegistry,
501
563
  state: fieldState
502
564
  }, prefix);
503
565
  suggestions.push(...fieldSuggestions);
@@ -509,12 +571,18 @@ function* suggestObjectSync(context, prefix, parserPairs) {
509
571
  * @internal
510
572
  */
511
573
  async function* suggestObjectAsync(context, prefix, parserPairs) {
574
+ const registry = context.dependencyRegistry instanceof DependencyRegistry ? context.dependencyRegistry : new DependencyRegistry();
575
+ if (context.state && typeof context.state === "object") collectDependencies(context.state, registry);
576
+ const contextWithRegistry = {
577
+ ...context,
578
+ dependencyRegistry: registry
579
+ };
512
580
  if (context.buffer.length > 0) {
513
581
  const lastToken = context.buffer[context.buffer.length - 1];
514
582
  for (const [field, parser] of parserPairs) if (isOptionRequiringValue(parser.usage, lastToken)) {
515
583
  const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
516
584
  const suggestions$1 = parser.suggest({
517
- ...context,
585
+ ...contextWithRegistry,
518
586
  state: fieldState
519
587
  }, prefix);
520
588
  for await (const s of suggestions$1) yield s;
@@ -525,7 +593,7 @@ async function* suggestObjectAsync(context, prefix, parserPairs) {
525
593
  for (const [field, parser] of parserPairs) {
526
594
  const fieldState = context.state && typeof context.state === "object" && field in context.state ? context.state[field] : parser.initialState;
527
595
  const fieldSuggestions = parser.suggest({
528
- ...context,
596
+ ...contextWithRegistry,
529
597
  state: fieldState
530
598
  }, prefix);
531
599
  for await (const s of fieldSuggestions) suggestions.push(s);
@@ -591,19 +659,17 @@ function resolveDeferred(state, registry) {
591
659
  const parser = deferredState.parser;
592
660
  const depIds = deferredState.dependencyIds;
593
661
  if (depIds && depIds.length > 0) {
662
+ const defaults = deferredState.defaultValues;
594
663
  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[ParseWithDependency](deferredState.rawInput, dependencyValues);
603
- if (reParseResult instanceof Promise) return deferredState.preliminaryResult;
604
- return reParseResult;
664
+ for (let i = 0; i < depIds.length; i++) {
665
+ const depId$1 = depIds[i];
666
+ if (registry.has(depId$1)) dependencyValues.push(registry.get(depId$1));
667
+ else if (defaults && i < defaults.length) dependencyValues.push(defaults[i]);
668
+ else return deferredState.preliminaryResult;
605
669
  }
606
- return deferredState.preliminaryResult;
670
+ const reParseResult = parser[ParseWithDependency](deferredState.rawInput, dependencyValues);
671
+ if (reParseResult instanceof Promise) return deferredState.preliminaryResult;
672
+ return reParseResult;
607
673
  }
608
674
  const depId = deferredState.dependencyId;
609
675
  if (registry.has(depId)) {
@@ -648,18 +714,16 @@ async function resolveDeferredAsync(state, registry) {
648
714
  const parser = deferredState.parser;
649
715
  const depIds = deferredState.dependencyIds;
650
716
  if (depIds && depIds.length > 0) {
717
+ const defaults = deferredState.defaultValues;
651
718
  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;
719
+ for (let i = 0; i < depIds.length; i++) {
720
+ const depId$1 = depIds[i];
721
+ if (registry.has(depId$1)) dependencyValues.push(registry.get(depId$1));
722
+ else if (defaults && i < defaults.length) dependencyValues.push(defaults[i]);
723
+ else return deferredState.preliminaryResult;
657
724
  }
658
- if (allDepsAvailable) {
659
- const reParseResult = parser[ParseWithDependency](deferredState.rawInput, dependencyValues);
660
- return Promise.resolve(reParseResult);
661
- }
662
- return deferredState.preliminaryResult;
725
+ const reParseResult = parser[ParseWithDependency](deferredState.rawInput, dependencyValues);
726
+ return Promise.resolve(reParseResult);
663
727
  }
664
728
  const depId = deferredState.dependencyId;
665
729
  if (registry.has(depId)) {
@@ -863,7 +927,8 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
863
927
  } else if (fieldState === void 0 && isWrappedDependencySource(fieldParser)) {
864
928
  const pendingState = fieldParser[WrappedDependencySourceMarker];
865
929
  const completed = fieldParser.complete([pendingState]);
866
- preCompletedState[fieldKey] = completed;
930
+ if (isDependencySourceState(completed)) preCompletedState[fieldKey] = completed;
931
+ else preCompletedState[fieldKey] = fieldState;
867
932
  } else preCompletedState[fieldKey] = fieldState;
868
933
  }
869
934
  const resolvedState = resolveDeferredParseStates(preCompletedState);
@@ -912,7 +977,8 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
912
977
  } else if (fieldState === void 0 && isWrappedDependencySource(fieldParser)) {
913
978
  const pendingState = fieldParser[WrappedDependencySourceMarker];
914
979
  const completed = await fieldParser.complete([pendingState]);
915
- preCompletedState[fieldKey] = completed;
980
+ if (isDependencySourceState(completed)) preCompletedState[fieldKey] = completed;
981
+ else preCompletedState[fieldKey] = fieldState;
916
982
  } else preCompletedState[fieldKey] = fieldState;
917
983
  }
918
984
  const resolvedState = await resolveDeferredParseStatesAsync(preCompletedState);
@@ -1162,10 +1228,43 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1162
1228
  },
1163
1229
  complete(state) {
1164
1230
  if (!isAsync) {
1165
- const result = [];
1166
1231
  const stateArray = state;
1232
+ const preCompletedState = [];
1167
1233
  for (let i = 0; i < syncParsers.length; i++) {
1168
- const valueResult = syncParsers[i].complete(stateArray[i]);
1234
+ const elementState = stateArray[i];
1235
+ const elementParser = syncParsers[i];
1236
+ if (Array.isArray(elementState) && elementState.length === 1 && isPendingDependencySourceState(elementState[0])) {
1237
+ const completed = elementParser.complete(elementState);
1238
+ preCompletedState[i] = completed;
1239
+ } else if (elementState === void 0 && isPendingDependencySourceState(elementParser.initialState)) {
1240
+ const completed = elementParser.complete([elementParser.initialState]);
1241
+ preCompletedState[i] = completed;
1242
+ } else if (elementState === void 0 && isWrappedDependencySource(elementParser)) {
1243
+ const pendingState = elementParser[WrappedDependencySourceMarker];
1244
+ const completed = elementParser.complete([pendingState]);
1245
+ preCompletedState[i] = completed;
1246
+ } else preCompletedState[i] = elementState;
1247
+ }
1248
+ const resolvedState = resolveDeferredParseStates(preCompletedState);
1249
+ const resolvedArray = resolvedState;
1250
+ const result = [];
1251
+ for (let i = 0; i < syncParsers.length; i++) {
1252
+ const elementResolvedState = resolvedArray[i];
1253
+ const elementParser = syncParsers[i];
1254
+ const originalElementState = stateArray[i];
1255
+ const wasPreCompletedCase1 = Array.isArray(originalElementState) && originalElementState.length === 1 && isPendingDependencySourceState(originalElementState[0]);
1256
+ const wasPreCompletedCase2 = originalElementState === void 0 && isPendingDependencySourceState(elementParser.initialState);
1257
+ const wasPreCompletedCase3 = originalElementState === void 0 && isWrappedDependencySource(elementParser);
1258
+ if (isDependencySourceState(elementResolvedState) && (wasPreCompletedCase1 || wasPreCompletedCase2 || wasPreCompletedCase3)) {
1259
+ const depResult = elementResolvedState.result;
1260
+ if (depResult.success) result[i] = depResult.value;
1261
+ else return {
1262
+ success: false,
1263
+ error: depResult.error
1264
+ };
1265
+ continue;
1266
+ }
1267
+ const valueResult = elementParser.complete(elementResolvedState);
1169
1268
  if (valueResult.success) result[i] = valueResult.value;
1170
1269
  else return {
1171
1270
  success: false,
@@ -1178,10 +1277,43 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1178
1277
  };
1179
1278
  }
1180
1279
  return (async () => {
1181
- const result = [];
1182
1280
  const stateArray = state;
1281
+ const preCompletedState = [];
1183
1282
  for (let i = 0; i < parsers.length; i++) {
1184
- const valueResult = await parsers[i].complete(stateArray[i]);
1283
+ const elementState = stateArray[i];
1284
+ const elementParser = parsers[i];
1285
+ if (Array.isArray(elementState) && elementState.length === 1 && isPendingDependencySourceState(elementState[0])) {
1286
+ const completed = await elementParser.complete(elementState);
1287
+ preCompletedState[i] = completed;
1288
+ } else if (elementState === void 0 && isPendingDependencySourceState(elementParser.initialState)) {
1289
+ const completed = await elementParser.complete([elementParser.initialState]);
1290
+ preCompletedState[i] = completed;
1291
+ } else if (elementState === void 0 && isWrappedDependencySource(elementParser)) {
1292
+ const pendingState = elementParser[WrappedDependencySourceMarker];
1293
+ const completed = await elementParser.complete([pendingState]);
1294
+ preCompletedState[i] = completed;
1295
+ } else preCompletedState[i] = elementState;
1296
+ }
1297
+ const resolvedState = await resolveDeferredParseStatesAsync(preCompletedState);
1298
+ const resolvedArray = resolvedState;
1299
+ const result = [];
1300
+ for (let i = 0; i < parsers.length; i++) {
1301
+ const elementResolvedState = resolvedArray[i];
1302
+ const elementParser = parsers[i];
1303
+ const originalElementState = stateArray[i];
1304
+ const wasPreCompletedCase1 = Array.isArray(originalElementState) && originalElementState.length === 1 && isPendingDependencySourceState(originalElementState[0]);
1305
+ const wasPreCompletedCase2 = originalElementState === void 0 && isPendingDependencySourceState(elementParser.initialState);
1306
+ const wasPreCompletedCase3 = originalElementState === void 0 && isWrappedDependencySource(elementParser);
1307
+ if (isDependencySourceState(elementResolvedState) && (wasPreCompletedCase1 || wasPreCompletedCase2 || wasPreCompletedCase3)) {
1308
+ const depResult = elementResolvedState.result;
1309
+ if (depResult.success) result[i] = depResult.value;
1310
+ else return {
1311
+ success: false,
1312
+ error: depResult.error
1313
+ };
1314
+ continue;
1315
+ }
1316
+ const valueResult = await elementParser.complete(elementResolvedState);
1185
1317
  if (valueResult.success) result[i] = valueResult.value;
1186
1318
  else return {
1187
1319
  success: false,
@@ -2106,6 +2238,7 @@ function conditional(discriminator, branches, defaultBranch, options) {
2106
2238
  };
2107
2239
  };
2108
2240
  const completeSync = (state) => {
2241
+ const syncDiscriminator = discriminator;
2109
2242
  const syncDefaultBranch = defaultBranch;
2110
2243
  const syncBranches = branches;
2111
2244
  if (state.selectedBranch === void 0) {
@@ -2124,7 +2257,14 @@ function conditional(discriminator, branches, defaultBranch, options) {
2124
2257
  };
2125
2258
  }
2126
2259
  const branchParser = state.selectedBranch.kind === "default" ? syncDefaultBranch : syncBranches[state.selectedBranch.key];
2127
- const branchResult = branchParser.complete(state.branchState);
2260
+ const discriminatorCompleteResult = syncDiscriminator.complete(state.discriminatorState);
2261
+ const combinedState = {
2262
+ _discriminator: state.discriminatorState,
2263
+ _branch: state.branchState
2264
+ };
2265
+ const resolvedCombinedState = resolveDeferredParseStates(combinedState);
2266
+ const resolvedBranchState = resolvedCombinedState._branch;
2267
+ const branchResult = branchParser.complete(resolvedBranchState);
2128
2268
  if (!branchResult.success) {
2129
2269
  if (state.discriminatorValue !== void 0 && options?.errors?.branchError) return {
2130
2270
  success: false,
@@ -2132,7 +2272,11 @@ function conditional(discriminator, branches, defaultBranch, options) {
2132
2272
  };
2133
2273
  return branchResult;
2134
2274
  }
2135
- const discriminatorValue = state.selectedBranch.kind === "default" ? void 0 : state.selectedBranch.key;
2275
+ let discriminatorValue;
2276
+ if (state.selectedBranch.kind === "default") discriminatorValue = void 0;
2277
+ else if (isDependencySourceState(discriminatorCompleteResult)) discriminatorValue = discriminatorCompleteResult.result.success ? discriminatorCompleteResult.result.value : state.selectedBranch.key;
2278
+ else if (discriminatorCompleteResult.success) discriminatorValue = discriminatorCompleteResult.value;
2279
+ else discriminatorValue = state.selectedBranch.key;
2136
2280
  return {
2137
2281
  success: true,
2138
2282
  value: [discriminatorValue, branchResult.value]
@@ -2155,7 +2299,14 @@ function conditional(discriminator, branches, defaultBranch, options) {
2155
2299
  };
2156
2300
  }
2157
2301
  const branchParser = state.selectedBranch.kind === "default" ? defaultBranch : branches[state.selectedBranch.key];
2158
- const branchResult = await branchParser.complete(state.branchState);
2302
+ const discriminatorCompleteResult = await discriminator.complete(state.discriminatorState);
2303
+ const combinedState = {
2304
+ _discriminator: state.discriminatorState,
2305
+ _branch: state.branchState
2306
+ };
2307
+ const resolvedCombinedState = await resolveDeferredParseStatesAsync(combinedState);
2308
+ const resolvedBranchState = resolvedCombinedState._branch;
2309
+ const branchResult = await branchParser.complete(resolvedBranchState);
2159
2310
  if (!branchResult.success) {
2160
2311
  if (state.discriminatorValue !== void 0 && options?.errors?.branchError) return {
2161
2312
  success: false,
@@ -2163,7 +2314,11 @@ function conditional(discriminator, branches, defaultBranch, options) {
2163
2314
  };
2164
2315
  return branchResult;
2165
2316
  }
2166
- const discriminatorValue = state.selectedBranch.kind === "default" ? void 0 : state.selectedBranch.key;
2317
+ let discriminatorValue;
2318
+ if (state.selectedBranch.kind === "default") discriminatorValue = void 0;
2319
+ else if (isDependencySourceState(discriminatorCompleteResult)) discriminatorValue = discriminatorCompleteResult.result.success ? discriminatorCompleteResult.result.value : state.selectedBranch.key;
2320
+ else if (discriminatorCompleteResult.success) discriminatorValue = discriminatorCompleteResult.value;
2321
+ else discriminatorValue = state.selectedBranch.key;
2167
2322
  return {
2168
2323
  success: true,
2169
2324
  value: [discriminatorValue, branchResult.value]