@optique/core 0.10.0-dev.295 → 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: {
@@ -863,7 +919,8 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
863
919
  } else if (fieldState === void 0 && require_dependency.isWrappedDependencySource(fieldParser)) {
864
920
  const pendingState = fieldParser[require_dependency.WrappedDependencySourceMarker];
865
921
  const completed = fieldParser.complete([pendingState]);
866
- preCompletedState[fieldKey] = completed;
922
+ if (require_dependency.isDependencySourceState(completed)) preCompletedState[fieldKey] = completed;
923
+ else preCompletedState[fieldKey] = fieldState;
867
924
  } else preCompletedState[fieldKey] = fieldState;
868
925
  }
869
926
  const resolvedState = resolveDeferredParseStates(preCompletedState);
@@ -912,7 +969,8 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
912
969
  } else if (fieldState === void 0 && require_dependency.isWrappedDependencySource(fieldParser)) {
913
970
  const pendingState = fieldParser[require_dependency.WrappedDependencySourceMarker];
914
971
  const completed = await fieldParser.complete([pendingState]);
915
- preCompletedState[fieldKey] = completed;
972
+ if (require_dependency.isDependencySourceState(completed)) preCompletedState[fieldKey] = completed;
973
+ else preCompletedState[fieldKey] = fieldState;
916
974
  } else preCompletedState[fieldKey] = fieldState;
917
975
  }
918
976
  const resolvedState = await resolveDeferredParseStatesAsync(preCompletedState);
@@ -1162,10 +1220,43 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1162
1220
  },
1163
1221
  complete(state) {
1164
1222
  if (!isAsync) {
1165
- const result = [];
1166
1223
  const stateArray = state;
1224
+ const preCompletedState = [];
1167
1225
  for (let i = 0; i < syncParsers.length; i++) {
1168
- 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);
1169
1260
  if (valueResult.success) result[i] = valueResult.value;
1170
1261
  else return {
1171
1262
  success: false,
@@ -1178,10 +1269,43 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1178
1269
  };
1179
1270
  }
1180
1271
  return (async () => {
1181
- const result = [];
1182
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 = [];
1183
1292
  for (let i = 0; i < parsers.length; i++) {
1184
- 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);
1185
1309
  if (valueResult.success) result[i] = valueResult.value;
1186
1310
  else return {
1187
1311
  success: false,
@@ -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: {
@@ -863,7 +919,8 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
863
919
  } else if (fieldState === void 0 && isWrappedDependencySource(fieldParser)) {
864
920
  const pendingState = fieldParser[WrappedDependencySourceMarker];
865
921
  const completed = fieldParser.complete([pendingState]);
866
- preCompletedState[fieldKey] = completed;
922
+ if (isDependencySourceState(completed)) preCompletedState[fieldKey] = completed;
923
+ else preCompletedState[fieldKey] = fieldState;
867
924
  } else preCompletedState[fieldKey] = fieldState;
868
925
  }
869
926
  const resolvedState = resolveDeferredParseStates(preCompletedState);
@@ -912,7 +969,8 @@ function object(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
912
969
  } else if (fieldState === void 0 && isWrappedDependencySource(fieldParser)) {
913
970
  const pendingState = fieldParser[WrappedDependencySourceMarker];
914
971
  const completed = await fieldParser.complete([pendingState]);
915
- preCompletedState[fieldKey] = completed;
972
+ if (isDependencySourceState(completed)) preCompletedState[fieldKey] = completed;
973
+ else preCompletedState[fieldKey] = fieldState;
916
974
  } else preCompletedState[fieldKey] = fieldState;
917
975
  }
918
976
  const resolvedState = await resolveDeferredParseStatesAsync(preCompletedState);
@@ -1162,10 +1220,43 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1162
1220
  },
1163
1221
  complete(state) {
1164
1222
  if (!isAsync) {
1165
- const result = [];
1166
1223
  const stateArray = state;
1224
+ const preCompletedState = [];
1167
1225
  for (let i = 0; i < syncParsers.length; i++) {
1168
- 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);
1169
1260
  if (valueResult.success) result[i] = valueResult.value;
1170
1261
  else return {
1171
1262
  success: false,
@@ -1178,10 +1269,43 @@ function tuple(labelOrParsers, maybeParsersOrOptions, maybeOptions) {
1178
1269
  };
1179
1270
  }
1180
1271
  return (async () => {
1181
- const result = [];
1182
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 = [];
1183
1292
  for (let i = 0; i < parsers.length; i++) {
1184
- 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);
1185
1309
  if (valueResult.success) result[i] = valueResult.value;
1186
1310
  else return {
1187
1311
  success: false,
@@ -1,3 +1,4 @@
1
+ const require_message = require('./message.cjs');
1
2
 
2
3
  //#region src/dependency.ts
3
4
  /**
@@ -200,7 +201,16 @@ function createSyncDerivedFromParser(sourceId, options) {
200
201
  return derivedParser.parse(input);
201
202
  },
202
203
  [ParseWithDependency](input, dependencyValue) {
203
- const derivedParser = options.factory(...dependencyValue);
204
+ let derivedParser;
205
+ try {
206
+ derivedParser = options.factory(...dependencyValue);
207
+ } catch (e) {
208
+ const msg = e instanceof Error ? e.message : String(e);
209
+ return {
210
+ success: false,
211
+ error: require_message.message`Factory error: ${msg}`
212
+ };
213
+ }
204
214
  return derivedParser.parse(input);
205
215
  },
206
216
  format(value) {
@@ -233,7 +243,16 @@ function createAsyncDerivedFromParserFromAsyncFactory(sourceId, options) {
233
243
  return derivedParser.parse(input);
234
244
  },
235
245
  [ParseWithDependency](input, dependencyValue) {
236
- const derivedParser = options.factory(...dependencyValue);
246
+ let derivedParser;
247
+ try {
248
+ derivedParser = options.factory(...dependencyValue);
249
+ } catch (e) {
250
+ const msg = e instanceof Error ? e.message : String(e);
251
+ return Promise.resolve({
252
+ success: false,
253
+ error: require_message.message`Factory error: ${msg}`
254
+ });
255
+ }
237
256
  return derivedParser.parse(input);
238
257
  },
239
258
  format(value) {
@@ -266,7 +285,16 @@ function createAsyncDerivedFromParserFromSyncFactory(sourceId, options) {
266
285
  return Promise.resolve(derivedParser.parse(input));
267
286
  },
268
287
  [ParseWithDependency](input, dependencyValue) {
269
- const derivedParser = options.factory(...dependencyValue);
288
+ let derivedParser;
289
+ try {
290
+ derivedParser = options.factory(...dependencyValue);
291
+ } catch (e) {
292
+ const msg = e instanceof Error ? e.message : String(e);
293
+ return Promise.resolve({
294
+ success: false,
295
+ error: require_message.message`Factory error: ${msg}`
296
+ });
297
+ }
270
298
  return Promise.resolve(derivedParser.parse(input));
271
299
  },
272
300
  format(value) {
@@ -311,7 +339,16 @@ function createSyncDerivedParser(sourceId, options) {
311
339
  return derivedParser.parse(input);
312
340
  },
313
341
  [ParseWithDependency](input, dependencyValue) {
314
- const derivedParser = options.factory(dependencyValue);
342
+ let derivedParser;
343
+ try {
344
+ derivedParser = options.factory(dependencyValue);
345
+ } catch (e) {
346
+ const msg = e instanceof Error ? e.message : String(e);
347
+ return {
348
+ success: false,
349
+ error: require_message.message`Factory error: ${msg}`
350
+ };
351
+ }
315
352
  return derivedParser.parse(input);
316
353
  },
317
354
  format(value) {
@@ -342,7 +379,16 @@ function createAsyncDerivedParserFromAsyncFactory(sourceId, options) {
342
379
  return derivedParser.parse(input);
343
380
  },
344
381
  [ParseWithDependency](input, dependencyValue) {
345
- const derivedParser = options.factory(dependencyValue);
382
+ let derivedParser;
383
+ try {
384
+ derivedParser = options.factory(dependencyValue);
385
+ } catch (e) {
386
+ const msg = e instanceof Error ? e.message : String(e);
387
+ return Promise.resolve({
388
+ success: false,
389
+ error: require_message.message`Factory error: ${msg}`
390
+ });
391
+ }
346
392
  return derivedParser.parse(input);
347
393
  },
348
394
  format(value) {
@@ -373,7 +419,16 @@ function createAsyncDerivedParserFromSyncFactory(sourceId, options) {
373
419
  return Promise.resolve(derivedParser.parse(input));
374
420
  },
375
421
  [ParseWithDependency](input, dependencyValue) {
376
- const derivedParser = options.factory(dependencyValue);
422
+ let derivedParser;
423
+ try {
424
+ derivedParser = options.factory(dependencyValue);
425
+ } catch (e) {
426
+ const msg = e instanceof Error ? e.message : String(e);
427
+ return Promise.resolve({
428
+ success: false,
429
+ error: require_message.message`Factory error: ${msg}`
430
+ });
431
+ }
377
432
  return Promise.resolve(derivedParser.parse(input));
378
433
  },
379
434
  format(value) {
@@ -492,6 +547,28 @@ function createPendingDependencySourceState(dependencyId) {
492
547
  */
493
548
  const WrappedDependencySourceMarker = Symbol.for("@optique/core/dependency/WrappedDependencySourceMarker");
494
549
  /**
550
+ * A unique symbol used to indicate that a wrapper transforms the dependency
551
+ * source value. This is used by withDefault to determine whether its default
552
+ * value should be registered as the dependency value.
553
+ *
554
+ * When a wrapper has this marker set to `true`, it means the wrapper transforms
555
+ * the dependency source value (e.g., via map()), so the wrapper's output is NOT
556
+ * a valid dependency source value.
557
+ *
558
+ * @since 0.10.0
559
+ */
560
+ const TransformsDependencyValueMarker = Symbol.for("@optique/core/dependency/TransformsDependencyValueMarker");
561
+ /**
562
+ * Checks if a parser transforms the dependency value (has TransformsDependencyValueMarker).
563
+ *
564
+ * @param parser The parser to check.
565
+ * @returns `true` if the parser transforms the dependency value.
566
+ * @since 0.10.0
567
+ */
568
+ function transformsDependencyValue(parser) {
569
+ return typeof parser === "object" && parser !== null && TransformsDependencyValueMarker in parser && parser[TransformsDependencyValueMarker] === true;
570
+ }
571
+ /**
495
572
  * Checks if a parser wraps a dependency source (has WrappedDependencySourceMarker).
496
573
  *
497
574
  * @param parser The parser to check.
@@ -576,6 +653,7 @@ exports.DependencySourceStateMarker = DependencySourceStateMarker;
576
653
  exports.DerivedValueParserMarker = DerivedValueParserMarker;
577
654
  exports.ParseWithDependency = ParseWithDependency;
578
655
  exports.PendingDependencySourceStateMarker = PendingDependencySourceStateMarker;
656
+ exports.TransformsDependencyValueMarker = TransformsDependencyValueMarker;
579
657
  exports.WrappedDependencySourceMarker = WrappedDependencySourceMarker;
580
658
  exports.createDeferredParseState = createDeferredParseState;
581
659
  exports.createDependencySourceState = createDependencySourceState;
@@ -590,4 +668,5 @@ exports.isDependencySource = isDependencySource;
590
668
  exports.isDependencySourceState = isDependencySourceState;
591
669
  exports.isDerivedValueParser = isDerivedValueParser;
592
670
  exports.isPendingDependencySourceState = isPendingDependencySourceState;
593
- exports.isWrappedDependencySource = isWrappedDependencySource;
671
+ exports.isWrappedDependencySource = isWrappedDependencySource;
672
+ exports.transformsDependencyValue = transformsDependencyValue;
@@ -602,6 +602,28 @@ declare function createPendingDependencySourceState(dependencyId: symbol): Pendi
602
602
  * @since 0.10.0
603
603
  */
604
604
  declare const WrappedDependencySourceMarker: unique symbol;
605
+ /**
606
+ * A unique symbol used to indicate that a wrapper transforms the dependency
607
+ * source value. This is used by withDefault to determine whether its default
608
+ * value should be registered as the dependency value.
609
+ *
610
+ * When a wrapper has this marker set to `true`, it means the wrapper transforms
611
+ * the dependency source value (e.g., via map()), so the wrapper's output is NOT
612
+ * a valid dependency source value.
613
+ *
614
+ * @since 0.10.0
615
+ */
616
+ declare const TransformsDependencyValueMarker: unique symbol;
617
+ /**
618
+ * Checks if a parser transforms the dependency value (has TransformsDependencyValueMarker).
619
+ *
620
+ * @param parser The parser to check.
621
+ * @returns `true` if the parser transforms the dependency value.
622
+ * @since 0.10.0
623
+ */
624
+ declare function transformsDependencyValue(parser: unknown): parser is {
625
+ [TransformsDependencyValueMarker]: true;
626
+ };
605
627
  /**
606
628
  * Checks if a parser wraps a dependency source (has WrappedDependencySourceMarker).
607
629
  *
@@ -691,4 +713,4 @@ type DependencyError = {
691
713
  */
692
714
  declare function formatDependencyError(error: DependencyError): Message;
693
715
  //#endregion
694
- export { AnyDependencySource, CombineMode, CombinedDependencyMode, DeferredParseMarker, DeferredParseState, DependencyError, DependencyId, DependencyIds, DependencyMode, DependencyRegistry, DependencySource, DependencySourceMarker, DependencySourceState, DependencySourceStateMarker, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, DerivedValueParserMarker, ParseWithDependency, PendingDependencySourceState, PendingDependencySourceStateMarker, ResolvedDependency, WrappedDependencySourceMarker, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, formatDependencyError, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource };
716
+ export { AnyDependencySource, CombineMode, CombinedDependencyMode, DeferredParseMarker, DeferredParseState, DependencyError, DependencyId, DependencyIds, DependencyMode, DependencyRegistry, DependencySource, DependencySourceMarker, DependencySourceState, DependencySourceStateMarker, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, DerivedValueParserMarker, ParseWithDependency, PendingDependencySourceState, PendingDependencySourceStateMarker, ResolvedDependency, TransformsDependencyValueMarker, WrappedDependencySourceMarker, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, formatDependencyError, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource, transformsDependencyValue };
@@ -602,6 +602,28 @@ declare function createPendingDependencySourceState(dependencyId: symbol): Pendi
602
602
  * @since 0.10.0
603
603
  */
604
604
  declare const WrappedDependencySourceMarker: unique symbol;
605
+ /**
606
+ * A unique symbol used to indicate that a wrapper transforms the dependency
607
+ * source value. This is used by withDefault to determine whether its default
608
+ * value should be registered as the dependency value.
609
+ *
610
+ * When a wrapper has this marker set to `true`, it means the wrapper transforms
611
+ * the dependency source value (e.g., via map()), so the wrapper's output is NOT
612
+ * a valid dependency source value.
613
+ *
614
+ * @since 0.10.0
615
+ */
616
+ declare const TransformsDependencyValueMarker: unique symbol;
617
+ /**
618
+ * Checks if a parser transforms the dependency value (has TransformsDependencyValueMarker).
619
+ *
620
+ * @param parser The parser to check.
621
+ * @returns `true` if the parser transforms the dependency value.
622
+ * @since 0.10.0
623
+ */
624
+ declare function transformsDependencyValue(parser: unknown): parser is {
625
+ [TransformsDependencyValueMarker]: true;
626
+ };
605
627
  /**
606
628
  * Checks if a parser wraps a dependency source (has WrappedDependencySourceMarker).
607
629
  *
@@ -691,4 +713,4 @@ type DependencyError = {
691
713
  */
692
714
  declare function formatDependencyError(error: DependencyError): Message;
693
715
  //#endregion
694
- export { AnyDependencySource, CombineMode, CombinedDependencyMode, DeferredParseMarker, DeferredParseState, DependencyError, DependencyId, DependencyIds, DependencyMode, DependencyRegistry, DependencySource, DependencySourceMarker, DependencySourceState, DependencySourceStateMarker, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, DerivedValueParserMarker, ParseWithDependency, PendingDependencySourceState, PendingDependencySourceStateMarker, ResolvedDependency, WrappedDependencySourceMarker, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, formatDependencyError, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource };
716
+ export { AnyDependencySource, CombineMode, CombinedDependencyMode, DeferredParseMarker, DeferredParseState, DependencyError, DependencyId, DependencyIds, DependencyMode, DependencyRegistry, DependencySource, DependencySourceMarker, DependencySourceState, DependencySourceStateMarker, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, DerivedValueParserMarker, ParseWithDependency, PendingDependencySourceState, PendingDependencySourceStateMarker, ResolvedDependency, TransformsDependencyValueMarker, WrappedDependencySourceMarker, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, formatDependencyError, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource, transformsDependencyValue };
@@ -1,3 +1,5 @@
1
+ import { message } from "./message.js";
2
+
1
3
  //#region src/dependency.ts
2
4
  /**
3
5
  * A unique symbol used to identify dependency sources at compile time.
@@ -199,7 +201,16 @@ function createSyncDerivedFromParser(sourceId, options) {
199
201
  return derivedParser.parse(input);
200
202
  },
201
203
  [ParseWithDependency](input, dependencyValue) {
202
- const derivedParser = options.factory(...dependencyValue);
204
+ let derivedParser;
205
+ try {
206
+ derivedParser = options.factory(...dependencyValue);
207
+ } catch (e) {
208
+ const msg = e instanceof Error ? e.message : String(e);
209
+ return {
210
+ success: false,
211
+ error: message`Factory error: ${msg}`
212
+ };
213
+ }
203
214
  return derivedParser.parse(input);
204
215
  },
205
216
  format(value) {
@@ -232,7 +243,16 @@ function createAsyncDerivedFromParserFromAsyncFactory(sourceId, options) {
232
243
  return derivedParser.parse(input);
233
244
  },
234
245
  [ParseWithDependency](input, dependencyValue) {
235
- const derivedParser = options.factory(...dependencyValue);
246
+ let derivedParser;
247
+ try {
248
+ derivedParser = options.factory(...dependencyValue);
249
+ } catch (e) {
250
+ const msg = e instanceof Error ? e.message : String(e);
251
+ return Promise.resolve({
252
+ success: false,
253
+ error: message`Factory error: ${msg}`
254
+ });
255
+ }
236
256
  return derivedParser.parse(input);
237
257
  },
238
258
  format(value) {
@@ -265,7 +285,16 @@ function createAsyncDerivedFromParserFromSyncFactory(sourceId, options) {
265
285
  return Promise.resolve(derivedParser.parse(input));
266
286
  },
267
287
  [ParseWithDependency](input, dependencyValue) {
268
- const derivedParser = options.factory(...dependencyValue);
288
+ let derivedParser;
289
+ try {
290
+ derivedParser = options.factory(...dependencyValue);
291
+ } catch (e) {
292
+ const msg = e instanceof Error ? e.message : String(e);
293
+ return Promise.resolve({
294
+ success: false,
295
+ error: message`Factory error: ${msg}`
296
+ });
297
+ }
269
298
  return Promise.resolve(derivedParser.parse(input));
270
299
  },
271
300
  format(value) {
@@ -310,7 +339,16 @@ function createSyncDerivedParser(sourceId, options) {
310
339
  return derivedParser.parse(input);
311
340
  },
312
341
  [ParseWithDependency](input, dependencyValue) {
313
- const derivedParser = options.factory(dependencyValue);
342
+ let derivedParser;
343
+ try {
344
+ derivedParser = options.factory(dependencyValue);
345
+ } catch (e) {
346
+ const msg = e instanceof Error ? e.message : String(e);
347
+ return {
348
+ success: false,
349
+ error: message`Factory error: ${msg}`
350
+ };
351
+ }
314
352
  return derivedParser.parse(input);
315
353
  },
316
354
  format(value) {
@@ -341,7 +379,16 @@ function createAsyncDerivedParserFromAsyncFactory(sourceId, options) {
341
379
  return derivedParser.parse(input);
342
380
  },
343
381
  [ParseWithDependency](input, dependencyValue) {
344
- const derivedParser = options.factory(dependencyValue);
382
+ let derivedParser;
383
+ try {
384
+ derivedParser = options.factory(dependencyValue);
385
+ } catch (e) {
386
+ const msg = e instanceof Error ? e.message : String(e);
387
+ return Promise.resolve({
388
+ success: false,
389
+ error: message`Factory error: ${msg}`
390
+ });
391
+ }
345
392
  return derivedParser.parse(input);
346
393
  },
347
394
  format(value) {
@@ -372,7 +419,16 @@ function createAsyncDerivedParserFromSyncFactory(sourceId, options) {
372
419
  return Promise.resolve(derivedParser.parse(input));
373
420
  },
374
421
  [ParseWithDependency](input, dependencyValue) {
375
- const derivedParser = options.factory(dependencyValue);
422
+ let derivedParser;
423
+ try {
424
+ derivedParser = options.factory(dependencyValue);
425
+ } catch (e) {
426
+ const msg = e instanceof Error ? e.message : String(e);
427
+ return Promise.resolve({
428
+ success: false,
429
+ error: message`Factory error: ${msg}`
430
+ });
431
+ }
376
432
  return Promise.resolve(derivedParser.parse(input));
377
433
  },
378
434
  format(value) {
@@ -491,6 +547,28 @@ function createPendingDependencySourceState(dependencyId) {
491
547
  */
492
548
  const WrappedDependencySourceMarker = Symbol.for("@optique/core/dependency/WrappedDependencySourceMarker");
493
549
  /**
550
+ * A unique symbol used to indicate that a wrapper transforms the dependency
551
+ * source value. This is used by withDefault to determine whether its default
552
+ * value should be registered as the dependency value.
553
+ *
554
+ * When a wrapper has this marker set to `true`, it means the wrapper transforms
555
+ * the dependency source value (e.g., via map()), so the wrapper's output is NOT
556
+ * a valid dependency source value.
557
+ *
558
+ * @since 0.10.0
559
+ */
560
+ const TransformsDependencyValueMarker = Symbol.for("@optique/core/dependency/TransformsDependencyValueMarker");
561
+ /**
562
+ * Checks if a parser transforms the dependency value (has TransformsDependencyValueMarker).
563
+ *
564
+ * @param parser The parser to check.
565
+ * @returns `true` if the parser transforms the dependency value.
566
+ * @since 0.10.0
567
+ */
568
+ function transformsDependencyValue(parser) {
569
+ return typeof parser === "object" && parser !== null && TransformsDependencyValueMarker in parser && parser[TransformsDependencyValueMarker] === true;
570
+ }
571
+ /**
494
572
  * Checks if a parser wraps a dependency source (has WrappedDependencySourceMarker).
495
573
  *
496
574
  * @param parser The parser to check.
@@ -566,4 +644,4 @@ function formatDependencyError(error) {
566
644
  }
567
645
 
568
646
  //#endregion
569
- export { DeferredParseMarker, DependencyId, DependencyIds, DependencyRegistry, DependencySourceMarker, DependencySourceStateMarker, DerivedValueParserMarker, ParseWithDependency, PendingDependencySourceStateMarker, WrappedDependencySourceMarker, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, formatDependencyError, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource };
647
+ export { DeferredParseMarker, DependencyId, DependencyIds, DependencyRegistry, DependencySourceMarker, DependencySourceStateMarker, DerivedValueParserMarker, ParseWithDependency, PendingDependencySourceStateMarker, TransformsDependencyValueMarker, WrappedDependencySourceMarker, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, formatDependencyError, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource, transformsDependencyValue };
package/dist/index.cjs CHANGED
@@ -23,6 +23,7 @@ exports.ParseWithDependency = require_dependency.ParseWithDependency;
23
23
  exports.PendingDependencySourceStateMarker = require_dependency.PendingDependencySourceStateMarker;
24
24
  exports.RunError = require_facade.RunError;
25
25
  exports.RunParserError = require_facade.RunParserError;
26
+ exports.TransformsDependencyValueMarker = require_dependency.TransformsDependencyValueMarker;
26
27
  exports.WithDefaultError = require_modifiers.WithDefaultError;
27
28
  exports.WrappedDependencySourceMarker = require_dependency.WrappedDependencySourceMarker;
28
29
  exports.argument = require_primitives.argument;
@@ -95,6 +96,7 @@ exports.suggest = require_parser.suggest;
95
96
  exports.suggestAsync = require_parser.suggestAsync;
96
97
  exports.suggestSync = require_parser.suggestSync;
97
98
  exports.text = require_message.text;
99
+ exports.transformsDependencyValue = require_dependency.transformsDependencyValue;
98
100
  exports.tuple = require_constructs.tuple;
99
101
  exports.url = require_valueparser.url;
100
102
  exports.uuid = require_valueparser.uuid;
package/dist/index.d.cts CHANGED
@@ -5,9 +5,9 @@ import { DocEntry, DocFragment, DocFragments, DocPage, DocPageFormatOptions, Doc
5
5
  import { ChoiceOptions, ChoiceOptionsBase, ChoiceOptionsNumber, ChoiceOptionsString, FloatOptions, IntegerOptionsBigInt, IntegerOptionsNumber, LocaleOptions, StringOptions, UrlOptions, Uuid, UuidOptions, ValueParser, ValueParserResult, choice, float, integer, isValueParser, locale, string, url, uuid } from "./valueparser.cjs";
6
6
  import { ConditionalErrorOptions, ConditionalOptions, DuplicateOptionError, LongestMatchErrorOptions, LongestMatchOptions, MergeOptions, NoMatchContext, ObjectErrorOptions, ObjectOptions, OrErrorOptions, OrOptions, TupleOptions, concat, conditional, group, longestMatch, merge, object, or, tuple } from "./constructs.cjs";
7
7
  import { MultipleErrorOptions, MultipleOptions, WithDefaultError, WithDefaultOptions, map, multiple, optional, withDefault } from "./modifiers.cjs";
8
- import { AnyDependencySource, CombineMode, CombinedDependencyMode, DeferredParseMarker, DeferredParseState, DependencyError, DependencyId, DependencyIds, DependencyMode, DependencyRegistry, DependencySource, DependencySourceMarker, DependencySourceState, DependencySourceStateMarker, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, DerivedValueParserMarker, ParseWithDependency, PendingDependencySourceState, PendingDependencySourceStateMarker, ResolvedDependency, WrappedDependencySourceMarker, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, formatDependencyError, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource } from "./dependency.cjs";
8
+ import { AnyDependencySource, CombineMode, CombinedDependencyMode, DeferredParseMarker, DeferredParseState, DependencyError, DependencyId, DependencyIds, DependencyMode, DependencyRegistry, DependencySource, DependencySourceMarker, DependencySourceState, DependencySourceStateMarker, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, DerivedValueParserMarker, ParseWithDependency, PendingDependencySourceState, PendingDependencySourceStateMarker, ResolvedDependency, TransformsDependencyValueMarker, WrappedDependencySourceMarker, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, formatDependencyError, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource, transformsDependencyValue } from "./dependency.cjs";
9
9
  import { ArgumentErrorOptions, ArgumentOptions, CommandErrorOptions, CommandOptions, FlagErrorOptions, FlagOptions, OptionErrorOptions, OptionOptions, OptionState, PassThroughFormat, PassThroughOptions, argument, command, constant, flag, option, passThrough } from "./primitives.cjs";
10
10
  import { CombineModes, DocState, InferMode, InferValue, Mode, ModeIterable, ModeValue, Parser, ParserContext, ParserResult, Result, Suggestion, getDocPage, getDocPageAsync, getDocPageSync, parse, parseAsync, parseSync, suggest, suggestAsync, suggestSync } from "./parser.cjs";
11
11
  import { ShellCompletion, bash, fish, nu, pwsh, zsh } from "./completion.cjs";
12
12
  import { RunError, RunOptions, RunParserError, run, runParser, runParserAsync, runParserSync } from "./facade.cjs";
13
- export { AnyDependencySource, ArgumentErrorOptions, ArgumentOptions, ChoiceOptions, ChoiceOptionsBase, ChoiceOptionsNumber, ChoiceOptionsString, CombineMode, CombineModes, CombinedDependencyMode, CommandErrorOptions, CommandOptions, ConditionalErrorOptions, ConditionalOptions, DeferredParseMarker, DeferredParseState, DependencyError, DependencyId, DependencyIds, DependencyMode, DependencyRegistry, DependencySource, DependencySourceMarker, DependencySourceState, DependencySourceStateMarker, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, DerivedValueParserMarker, DocEntry, DocFragment, DocFragments, DocPage, DocPageFormatOptions, DocSection, DocState, DuplicateOptionError, FlagErrorOptions, FlagOptions, FloatOptions, InferMode, InferValue, IntegerOptionsBigInt, IntegerOptionsNumber, LocaleOptions, LongestMatchErrorOptions, LongestMatchOptions, MergeOptions, Message, MessageFormatOptions, MessageTerm, Mode, ModeIterable, ModeValue, MultipleErrorOptions, MultipleOptions, NoMatchContext, NonEmptyString, ObjectErrorOptions, ObjectOptions, OptionErrorOptions, OptionName, OptionOptions, OptionState, OrErrorOptions, OrOptions, ParseWithDependency, Parser, ParserContext, ParserResult, PassThroughFormat, PassThroughOptions, PendingDependencySourceState, PendingDependencySourceStateMarker, ResolvedDependency, Result, RunError, RunOptions, RunParserError, ShellCompletion, ShowDefaultOptions, StringOptions, Suggestion, TupleOptions, UrlOptions, Usage, UsageFormatOptions, UsageTerm, UsageTermFormatOptions, Uuid, UuidOptions, ValueParser, ValueParserResult, ValueSetOptions, WithDefaultError, WithDefaultOptions, WrappedDependencySourceMarker, argument, bash, choice, command, commandLine, concat, conditional, constant, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, ensureNonEmptyString, envVar, extractArgumentMetavars, extractCommandNames, extractOptionNames, fish, flag, float, formatDependencyError, formatDocPage, formatMessage, formatUsage, formatUsageTerm, getDocPage, getDocPageAsync, getDocPageSync, group, integer, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isNonEmptyString, isPendingDependencySourceState, isValueParser, isWrappedDependencySource, locale, longestMatch, map, merge, message, metavar, multiple, normalizeUsage, nu, object, option, optionName, optionNames, optional, or, parse, parseAsync, parseSync, passThrough, pwsh, run, runParser, runParserAsync, runParserSync, string, suggest, suggestAsync, suggestSync, text, tuple, url, uuid, value, valueSet, values, withDefault, zsh };
13
+ export { AnyDependencySource, ArgumentErrorOptions, ArgumentOptions, ChoiceOptions, ChoiceOptionsBase, ChoiceOptionsNumber, ChoiceOptionsString, CombineMode, CombineModes, CombinedDependencyMode, CommandErrorOptions, CommandOptions, ConditionalErrorOptions, ConditionalOptions, DeferredParseMarker, DeferredParseState, DependencyError, DependencyId, DependencyIds, DependencyMode, DependencyRegistry, DependencySource, DependencySourceMarker, DependencySourceState, DependencySourceStateMarker, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, DerivedValueParserMarker, DocEntry, DocFragment, DocFragments, DocPage, DocPageFormatOptions, DocSection, DocState, DuplicateOptionError, FlagErrorOptions, FlagOptions, FloatOptions, InferMode, InferValue, IntegerOptionsBigInt, IntegerOptionsNumber, LocaleOptions, LongestMatchErrorOptions, LongestMatchOptions, MergeOptions, Message, MessageFormatOptions, MessageTerm, Mode, ModeIterable, ModeValue, MultipleErrorOptions, MultipleOptions, NoMatchContext, NonEmptyString, ObjectErrorOptions, ObjectOptions, OptionErrorOptions, OptionName, OptionOptions, OptionState, OrErrorOptions, OrOptions, ParseWithDependency, Parser, ParserContext, ParserResult, PassThroughFormat, PassThroughOptions, PendingDependencySourceState, PendingDependencySourceStateMarker, ResolvedDependency, Result, RunError, RunOptions, RunParserError, ShellCompletion, ShowDefaultOptions, StringOptions, Suggestion, TransformsDependencyValueMarker, TupleOptions, UrlOptions, Usage, UsageFormatOptions, UsageTerm, UsageTermFormatOptions, Uuid, UuidOptions, ValueParser, ValueParserResult, ValueSetOptions, WithDefaultError, WithDefaultOptions, WrappedDependencySourceMarker, argument, bash, choice, command, commandLine, concat, conditional, constant, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, ensureNonEmptyString, envVar, extractArgumentMetavars, extractCommandNames, extractOptionNames, fish, flag, float, formatDependencyError, formatDocPage, formatMessage, formatUsage, formatUsageTerm, getDocPage, getDocPageAsync, getDocPageSync, group, integer, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isNonEmptyString, isPendingDependencySourceState, isValueParser, isWrappedDependencySource, locale, longestMatch, map, merge, message, metavar, multiple, normalizeUsage, nu, object, option, optionName, optionNames, optional, or, parse, parseAsync, parseSync, passThrough, pwsh, run, runParser, runParserAsync, runParserSync, string, suggest, suggestAsync, suggestSync, text, transformsDependencyValue, tuple, url, uuid, value, valueSet, values, withDefault, zsh };
package/dist/index.d.ts CHANGED
@@ -5,9 +5,9 @@ import { DocEntry, DocFragment, DocFragments, DocPage, DocPageFormatOptions, Doc
5
5
  import { ChoiceOptions, ChoiceOptionsBase, ChoiceOptionsNumber, ChoiceOptionsString, FloatOptions, IntegerOptionsBigInt, IntegerOptionsNumber, LocaleOptions, StringOptions, UrlOptions, Uuid, UuidOptions, ValueParser, ValueParserResult, choice, float, integer, isValueParser, locale, string, url, uuid } from "./valueparser.js";
6
6
  import { ConditionalErrorOptions, ConditionalOptions, DuplicateOptionError, LongestMatchErrorOptions, LongestMatchOptions, MergeOptions, NoMatchContext, ObjectErrorOptions, ObjectOptions, OrErrorOptions, OrOptions, TupleOptions, concat, conditional, group, longestMatch, merge, object, or, tuple } from "./constructs.js";
7
7
  import { MultipleErrorOptions, MultipleOptions, WithDefaultError, WithDefaultOptions, map, multiple, optional, withDefault } from "./modifiers.js";
8
- import { AnyDependencySource, CombineMode, CombinedDependencyMode, DeferredParseMarker, DeferredParseState, DependencyError, DependencyId, DependencyIds, DependencyMode, DependencyRegistry, DependencySource, DependencySourceMarker, DependencySourceState, DependencySourceStateMarker, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, DerivedValueParserMarker, ParseWithDependency, PendingDependencySourceState, PendingDependencySourceStateMarker, ResolvedDependency, WrappedDependencySourceMarker, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, formatDependencyError, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource } from "./dependency.js";
8
+ import { AnyDependencySource, CombineMode, CombinedDependencyMode, DeferredParseMarker, DeferredParseState, DependencyError, DependencyId, DependencyIds, DependencyMode, DependencyRegistry, DependencySource, DependencySourceMarker, DependencySourceState, DependencySourceStateMarker, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, DerivedValueParserMarker, ParseWithDependency, PendingDependencySourceState, PendingDependencySourceStateMarker, ResolvedDependency, TransformsDependencyValueMarker, WrappedDependencySourceMarker, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, formatDependencyError, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource, transformsDependencyValue } from "./dependency.js";
9
9
  import { ArgumentErrorOptions, ArgumentOptions, CommandErrorOptions, CommandOptions, FlagErrorOptions, FlagOptions, OptionErrorOptions, OptionOptions, OptionState, PassThroughFormat, PassThroughOptions, argument, command, constant, flag, option, passThrough } from "./primitives.js";
10
10
  import { CombineModes, DocState, InferMode, InferValue, Mode, ModeIterable, ModeValue, Parser, ParserContext, ParserResult, Result, Suggestion, getDocPage, getDocPageAsync, getDocPageSync, parse, parseAsync, parseSync, suggest, suggestAsync, suggestSync } from "./parser.js";
11
11
  import { ShellCompletion, bash, fish, nu, pwsh, zsh } from "./completion.js";
12
12
  import { RunError, RunOptions, RunParserError, run, runParser, runParserAsync, runParserSync } from "./facade.js";
13
- export { AnyDependencySource, ArgumentErrorOptions, ArgumentOptions, ChoiceOptions, ChoiceOptionsBase, ChoiceOptionsNumber, ChoiceOptionsString, CombineMode, CombineModes, CombinedDependencyMode, CommandErrorOptions, CommandOptions, ConditionalErrorOptions, ConditionalOptions, DeferredParseMarker, DeferredParseState, DependencyError, DependencyId, DependencyIds, DependencyMode, DependencyRegistry, DependencySource, DependencySourceMarker, DependencySourceState, DependencySourceStateMarker, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, DerivedValueParserMarker, DocEntry, DocFragment, DocFragments, DocPage, DocPageFormatOptions, DocSection, DocState, DuplicateOptionError, FlagErrorOptions, FlagOptions, FloatOptions, InferMode, InferValue, IntegerOptionsBigInt, IntegerOptionsNumber, LocaleOptions, LongestMatchErrorOptions, LongestMatchOptions, MergeOptions, Message, MessageFormatOptions, MessageTerm, Mode, ModeIterable, ModeValue, MultipleErrorOptions, MultipleOptions, NoMatchContext, NonEmptyString, ObjectErrorOptions, ObjectOptions, OptionErrorOptions, OptionName, OptionOptions, OptionState, OrErrorOptions, OrOptions, ParseWithDependency, Parser, ParserContext, ParserResult, PassThroughFormat, PassThroughOptions, PendingDependencySourceState, PendingDependencySourceStateMarker, ResolvedDependency, Result, RunError, RunOptions, RunParserError, ShellCompletion, ShowDefaultOptions, StringOptions, Suggestion, TupleOptions, UrlOptions, Usage, UsageFormatOptions, UsageTerm, UsageTermFormatOptions, Uuid, UuidOptions, ValueParser, ValueParserResult, ValueSetOptions, WithDefaultError, WithDefaultOptions, WrappedDependencySourceMarker, argument, bash, choice, command, commandLine, concat, conditional, constant, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, ensureNonEmptyString, envVar, extractArgumentMetavars, extractCommandNames, extractOptionNames, fish, flag, float, formatDependencyError, formatDocPage, formatMessage, formatUsage, formatUsageTerm, getDocPage, getDocPageAsync, getDocPageSync, group, integer, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isNonEmptyString, isPendingDependencySourceState, isValueParser, isWrappedDependencySource, locale, longestMatch, map, merge, message, metavar, multiple, normalizeUsage, nu, object, option, optionName, optionNames, optional, or, parse, parseAsync, parseSync, passThrough, pwsh, run, runParser, runParserAsync, runParserSync, string, suggest, suggestAsync, suggestSync, text, tuple, url, uuid, value, valueSet, values, withDefault, zsh };
13
+ export { AnyDependencySource, ArgumentErrorOptions, ArgumentOptions, ChoiceOptions, ChoiceOptionsBase, ChoiceOptionsNumber, ChoiceOptionsString, CombineMode, CombineModes, CombinedDependencyMode, CommandErrorOptions, CommandOptions, ConditionalErrorOptions, ConditionalOptions, DeferredParseMarker, DeferredParseState, DependencyError, DependencyId, DependencyIds, DependencyMode, DependencyRegistry, DependencySource, DependencySourceMarker, DependencySourceState, DependencySourceStateMarker, DependencyValue, DependencyValues, DeriveAsyncOptions, DeriveFromAsyncOptions, DeriveFromOptions, DeriveFromSyncOptions, DeriveOptions, DeriveSyncOptions, DerivedValueParser, DerivedValueParserMarker, DocEntry, DocFragment, DocFragments, DocPage, DocPageFormatOptions, DocSection, DocState, DuplicateOptionError, FlagErrorOptions, FlagOptions, FloatOptions, InferMode, InferValue, IntegerOptionsBigInt, IntegerOptionsNumber, LocaleOptions, LongestMatchErrorOptions, LongestMatchOptions, MergeOptions, Message, MessageFormatOptions, MessageTerm, Mode, ModeIterable, ModeValue, MultipleErrorOptions, MultipleOptions, NoMatchContext, NonEmptyString, ObjectErrorOptions, ObjectOptions, OptionErrorOptions, OptionName, OptionOptions, OptionState, OrErrorOptions, OrOptions, ParseWithDependency, Parser, ParserContext, ParserResult, PassThroughFormat, PassThroughOptions, PendingDependencySourceState, PendingDependencySourceStateMarker, ResolvedDependency, Result, RunError, RunOptions, RunParserError, ShellCompletion, ShowDefaultOptions, StringOptions, Suggestion, TransformsDependencyValueMarker, TupleOptions, UrlOptions, Usage, UsageFormatOptions, UsageTerm, UsageTermFormatOptions, Uuid, UuidOptions, ValueParser, ValueParserResult, ValueSetOptions, WithDefaultError, WithDefaultOptions, WrappedDependencySourceMarker, argument, bash, choice, command, commandLine, concat, conditional, constant, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, ensureNonEmptyString, envVar, extractArgumentMetavars, extractCommandNames, extractOptionNames, fish, flag, float, formatDependencyError, formatDocPage, formatMessage, formatUsage, formatUsageTerm, getDocPage, getDocPageAsync, getDocPageSync, group, integer, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isNonEmptyString, isPendingDependencySourceState, isValueParser, isWrappedDependencySource, locale, longestMatch, map, merge, message, metavar, multiple, normalizeUsage, nu, object, option, optionName, optionNames, optional, or, parse, parseAsync, parseSync, passThrough, pwsh, run, runParser, runParserAsync, runParserSync, string, suggest, suggestAsync, suggestSync, text, transformsDependencyValue, tuple, url, uuid, value, valueSet, values, withDefault, zsh };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { commandLine, envVar, formatMessage, message, metavar, optionName, optionNames, text, value, valueSet, values } from "./message.js";
2
2
  import { bash, fish, nu, pwsh, zsh } from "./completion.js";
3
- import { DeferredParseMarker, DependencyId, DependencyIds, DependencyRegistry, DependencySourceMarker, DependencySourceStateMarker, DerivedValueParserMarker, ParseWithDependency, PendingDependencySourceStateMarker, WrappedDependencySourceMarker, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, formatDependencyError, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource } from "./dependency.js";
3
+ import { DeferredParseMarker, DependencyId, DependencyIds, DependencyRegistry, DependencySourceMarker, DependencySourceStateMarker, DerivedValueParserMarker, ParseWithDependency, PendingDependencySourceStateMarker, TransformsDependencyValueMarker, WrappedDependencySourceMarker, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, formatDependencyError, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isPendingDependencySourceState, isWrappedDependencySource, transformsDependencyValue } from "./dependency.js";
4
4
  import { extractArgumentMetavars, extractCommandNames, extractOptionNames, formatUsage, formatUsageTerm, normalizeUsage } from "./usage.js";
5
5
  import { DuplicateOptionError, concat, conditional, group, longestMatch, merge, object, or, tuple } from "./constructs.js";
6
6
  import { formatDocPage } from "./doc.js";
@@ -11,4 +11,4 @@ import { argument, command, constant, flag, option, passThrough } from "./primit
11
11
  import { getDocPage, getDocPageAsync, getDocPageSync, parse, parseAsync, parseSync, suggest, suggestAsync, suggestSync } from "./parser.js";
12
12
  import { RunError, RunParserError, run, runParser, runParserAsync, runParserSync } from "./facade.js";
13
13
 
14
- export { DeferredParseMarker, DependencyId, DependencyIds, DependencyRegistry, DependencySourceMarker, DependencySourceStateMarker, DerivedValueParserMarker, DuplicateOptionError, ParseWithDependency, PendingDependencySourceStateMarker, RunError, RunParserError, WithDefaultError, WrappedDependencySourceMarker, argument, bash, choice, command, commandLine, concat, conditional, constant, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, ensureNonEmptyString, envVar, extractArgumentMetavars, extractCommandNames, extractOptionNames, fish, flag, float, formatDependencyError, formatDocPage, formatMessage, formatUsage, formatUsageTerm, getDocPage, getDocPageAsync, getDocPageSync, group, integer, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isNonEmptyString, isPendingDependencySourceState, isValueParser, isWrappedDependencySource, locale, longestMatch, map, merge, message, metavar, multiple, normalizeUsage, nu, object, option, optionName, optionNames, optional, or, parse, parseAsync, parseSync, passThrough, pwsh, run, runParser, runParserAsync, runParserSync, string, suggest, suggestAsync, suggestSync, text, tuple, url, uuid, value, valueSet, values, withDefault, zsh };
14
+ export { DeferredParseMarker, DependencyId, DependencyIds, DependencyRegistry, DependencySourceMarker, DependencySourceStateMarker, DerivedValueParserMarker, DuplicateOptionError, ParseWithDependency, PendingDependencySourceStateMarker, RunError, RunParserError, TransformsDependencyValueMarker, WithDefaultError, WrappedDependencySourceMarker, argument, bash, choice, command, commandLine, concat, conditional, constant, createDeferredParseState, createDependencySourceState, createPendingDependencySourceState, dependency, deriveFrom, deriveFromAsync, deriveFromSync, ensureNonEmptyString, envVar, extractArgumentMetavars, extractCommandNames, extractOptionNames, fish, flag, float, formatDependencyError, formatDocPage, formatMessage, formatUsage, formatUsageTerm, getDocPage, getDocPageAsync, getDocPageSync, group, integer, isDeferredParseState, isDependencySource, isDependencySourceState, isDerivedValueParser, isNonEmptyString, isPendingDependencySourceState, isValueParser, isWrappedDependencySource, locale, longestMatch, map, merge, message, metavar, multiple, normalizeUsage, nu, object, option, optionName, optionNames, optional, or, parse, parseAsync, parseSync, passThrough, pwsh, run, runParser, runParserAsync, runParserSync, string, suggest, suggestAsync, suggestSync, text, transformsDependencyValue, tuple, url, uuid, value, valueSet, values, withDefault, zsh };
@@ -90,6 +90,11 @@ function optional(parser) {
90
90
  }, prefix);
91
91
  for await (const s of suggestions) yield s;
92
92
  }
93
+ const innerHasWrappedDependency = require_dependency.isWrappedDependencySource(parser);
94
+ const innerHasDirectDependency = require_dependency.isPendingDependencySourceState(syncParser.initialState);
95
+ const wrappedDependencyMarker = innerHasWrappedDependency ? { [require_dependency.WrappedDependencySourceMarker]: parser[require_dependency.WrappedDependencySourceMarker] } : innerHasDirectDependency ? { [require_dependency.WrappedDependencySourceMarker]: syncParser.initialState } : {};
96
+ const hasWrappedDependencySource = require_dependency.WrappedDependencySourceMarker in wrappedDependencyMarker;
97
+ const wrappedPendingState = hasWrappedDependencySource ? wrappedDependencyMarker[require_dependency.WrappedDependencySourceMarker] : void 0;
93
98
  return {
94
99
  $mode: parser.$mode,
95
100
  $valueType: [],
@@ -100,15 +105,32 @@ function optional(parser) {
100
105
  terms: parser.usage
101
106
  }],
102
107
  initialState: void 0,
108
+ ...wrappedDependencyMarker,
103
109
  parse(context) {
104
110
  if (isAsync) return parseOptionalStyleAsync(context, parser);
105
111
  return parseOptionalStyleSync(context, syncParser);
106
112
  },
107
113
  complete(state) {
108
- if (typeof state === "undefined") return {
109
- success: true,
110
- value: void 0
111
- };
114
+ if (typeof state === "undefined") {
115
+ if (innerHasWrappedDependency && wrappedPendingState) {
116
+ if (!isAsync) return syncParser.complete([wrappedPendingState]);
117
+ return parser.complete([wrappedPendingState]);
118
+ }
119
+ return {
120
+ success: true,
121
+ value: void 0
122
+ };
123
+ }
124
+ if (Array.isArray(state) && state.length === 1 && require_dependency.isPendingDependencySourceState(state[0])) {
125
+ if (innerHasWrappedDependency) {
126
+ if (!isAsync) return syncParser.complete(state);
127
+ return parser.complete(state);
128
+ }
129
+ return {
130
+ success: true,
131
+ value: void 0
132
+ };
133
+ }
112
134
  if (!isAsync) return syncParser.complete(state[0]);
113
135
  return parser.complete(state[0]);
114
136
  },
@@ -178,7 +200,7 @@ function withDefault(parser, defaultValue, options) {
178
200
  for await (const s of suggestions) yield s;
179
201
  }
180
202
  const innerInitialState = syncParser.initialState;
181
- const wrappedDependencyMarker = require_dependency.isPendingDependencySourceState(innerInitialState) ? { [require_dependency.WrappedDependencySourceMarker]: innerInitialState } : {};
203
+ const wrappedDependencyMarker = require_dependency.isPendingDependencySourceState(innerInitialState) ? { [require_dependency.WrappedDependencySourceMarker]: innerInitialState } : require_dependency.isWrappedDependencySource(parser) ? { [require_dependency.WrappedDependencySourceMarker]: parser[require_dependency.WrappedDependencySourceMarker] } : {};
182
204
  return {
183
205
  $mode: parser.$mode,
184
206
  $valueType: [],
@@ -195,29 +217,108 @@ function withDefault(parser, defaultValue, options) {
195
217
  return parseOptionalStyleSync(context, syncParser);
196
218
  },
197
219
  complete(state) {
198
- if (typeof state === "undefined") try {
199
- const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
200
- return {
201
- success: true,
202
- value
203
- };
204
- } catch (error) {
205
- return {
206
- success: false,
207
- error: error instanceof WithDefaultError ? error.errorMessage : require_message.message`${require_message.text(String(error))}`
208
- };
220
+ if (typeof state === "undefined") {
221
+ if (require_dependency.transformsDependencyValue(parser)) {
222
+ const innerResult = !isAsync ? syncParser.complete(void 0) : parser.complete(void 0);
223
+ const handleInnerResult = (res) => {
224
+ if (require_dependency.isDependencySourceState(res)) try {
225
+ const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
226
+ return require_dependency.createDependencySourceState({
227
+ success: true,
228
+ value
229
+ }, res[require_dependency.DependencyId]);
230
+ } catch (error) {
231
+ return {
232
+ success: false,
233
+ error: error instanceof WithDefaultError ? error.errorMessage : require_message.message`${require_message.text(String(error))}`
234
+ };
235
+ }
236
+ try {
237
+ const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
238
+ return {
239
+ success: true,
240
+ value
241
+ };
242
+ } catch (error) {
243
+ return {
244
+ success: false,
245
+ error: error instanceof WithDefaultError ? error.errorMessage : require_message.message`${require_message.text(String(error))}`
246
+ };
247
+ }
248
+ };
249
+ if (innerResult instanceof Promise) return innerResult.then(handleInnerResult);
250
+ return handleInnerResult(innerResult);
251
+ }
252
+ if (require_dependency.isWrappedDependencySource(parser)) try {
253
+ const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
254
+ const pendingState = parser[require_dependency.WrappedDependencySourceMarker];
255
+ return require_dependency.createDependencySourceState({
256
+ success: true,
257
+ value
258
+ }, pendingState[require_dependency.DependencyId]);
259
+ } catch (error) {
260
+ return {
261
+ success: false,
262
+ error: error instanceof WithDefaultError ? error.errorMessage : require_message.message`${require_message.text(String(error))}`
263
+ };
264
+ }
265
+ try {
266
+ const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
267
+ return {
268
+ success: true,
269
+ value
270
+ };
271
+ } catch (error) {
272
+ return {
273
+ success: false,
274
+ error: error instanceof WithDefaultError ? error.errorMessage : require_message.message`${require_message.text(String(error))}`
275
+ };
276
+ }
209
277
  }
210
- if (require_dependency.isPendingDependencySourceState(state[0])) try {
211
- const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
212
- return require_dependency.createDependencySourceState({
213
- success: true,
214
- value
215
- }, state[0][require_dependency.DependencyId]);
216
- } catch (error) {
217
- return {
218
- success: false,
219
- error: error instanceof WithDefaultError ? error.errorMessage : require_message.message`${require_message.text(String(error))}`
220
- };
278
+ if (require_dependency.isPendingDependencySourceState(state[0])) {
279
+ if (require_dependency.transformsDependencyValue(parser)) {
280
+ const innerResult = !isAsync ? syncParser.complete(state) : parser.complete(state);
281
+ const handleInnerResult = (res) => {
282
+ if (require_dependency.isDependencySourceState(res)) try {
283
+ const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
284
+ return require_dependency.createDependencySourceState({
285
+ success: true,
286
+ value
287
+ }, res[require_dependency.DependencyId]);
288
+ } catch (error) {
289
+ return {
290
+ success: false,
291
+ error: error instanceof WithDefaultError ? error.errorMessage : require_message.message`${require_message.text(String(error))}`
292
+ };
293
+ }
294
+ try {
295
+ const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
296
+ return {
297
+ success: true,
298
+ value
299
+ };
300
+ } catch (error) {
301
+ return {
302
+ success: false,
303
+ error: error instanceof WithDefaultError ? error.errorMessage : require_message.message`${require_message.text(String(error))}`
304
+ };
305
+ }
306
+ };
307
+ if (innerResult instanceof Promise) return innerResult.then(handleInnerResult);
308
+ return handleInnerResult(innerResult);
309
+ }
310
+ try {
311
+ const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
312
+ return require_dependency.createDependencySourceState({
313
+ success: true,
314
+ value
315
+ }, state[0][require_dependency.DependencyId]);
316
+ } catch (error) {
317
+ return {
318
+ success: false,
319
+ error: error instanceof WithDefaultError ? error.errorMessage : require_message.message`${require_message.text(String(error))}`
320
+ };
321
+ }
221
322
  }
222
323
  if (!isAsync) return syncParser.complete(state[0]);
223
324
  return parser.complete(state[0]);
@@ -300,10 +401,15 @@ function map(parser, transform) {
300
401
  };
301
402
  return res;
302
403
  };
404
+ const dependencyMarkers = require_dependency.isWrappedDependencySource(parser) ? {
405
+ [require_dependency.WrappedDependencySourceMarker]: parser[require_dependency.WrappedDependencySourceMarker],
406
+ [require_dependency.TransformsDependencyValueMarker]: true
407
+ } : {};
303
408
  return {
304
409
  ...parser,
305
410
  $valueType: [],
306
411
  complete,
412
+ ...dependencyMarkers,
307
413
  getDocFragments(state, _defaultValue) {
308
414
  return parser.getDocFragments(state, void 0);
309
415
  }
package/dist/modifiers.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { formatMessage, message, text } from "./message.js";
2
- import { DependencyId, WrappedDependencySourceMarker, createDependencySourceState, isPendingDependencySourceState } from "./dependency.js";
2
+ import { DependencyId, TransformsDependencyValueMarker, WrappedDependencySourceMarker, createDependencySourceState, isDependencySourceState, isPendingDependencySourceState, isWrappedDependencySource, transformsDependencyValue } from "./dependency.js";
3
3
 
4
4
  //#region src/modifiers.ts
5
5
  /**
@@ -90,6 +90,11 @@ function optional(parser) {
90
90
  }, prefix);
91
91
  for await (const s of suggestions) yield s;
92
92
  }
93
+ const innerHasWrappedDependency = isWrappedDependencySource(parser);
94
+ const innerHasDirectDependency = isPendingDependencySourceState(syncParser.initialState);
95
+ const wrappedDependencyMarker = innerHasWrappedDependency ? { [WrappedDependencySourceMarker]: parser[WrappedDependencySourceMarker] } : innerHasDirectDependency ? { [WrappedDependencySourceMarker]: syncParser.initialState } : {};
96
+ const hasWrappedDependencySource = WrappedDependencySourceMarker in wrappedDependencyMarker;
97
+ const wrappedPendingState = hasWrappedDependencySource ? wrappedDependencyMarker[WrappedDependencySourceMarker] : void 0;
93
98
  return {
94
99
  $mode: parser.$mode,
95
100
  $valueType: [],
@@ -100,15 +105,32 @@ function optional(parser) {
100
105
  terms: parser.usage
101
106
  }],
102
107
  initialState: void 0,
108
+ ...wrappedDependencyMarker,
103
109
  parse(context) {
104
110
  if (isAsync) return parseOptionalStyleAsync(context, parser);
105
111
  return parseOptionalStyleSync(context, syncParser);
106
112
  },
107
113
  complete(state) {
108
- if (typeof state === "undefined") return {
109
- success: true,
110
- value: void 0
111
- };
114
+ if (typeof state === "undefined") {
115
+ if (innerHasWrappedDependency && wrappedPendingState) {
116
+ if (!isAsync) return syncParser.complete([wrappedPendingState]);
117
+ return parser.complete([wrappedPendingState]);
118
+ }
119
+ return {
120
+ success: true,
121
+ value: void 0
122
+ };
123
+ }
124
+ if (Array.isArray(state) && state.length === 1 && isPendingDependencySourceState(state[0])) {
125
+ if (innerHasWrappedDependency) {
126
+ if (!isAsync) return syncParser.complete(state);
127
+ return parser.complete(state);
128
+ }
129
+ return {
130
+ success: true,
131
+ value: void 0
132
+ };
133
+ }
112
134
  if (!isAsync) return syncParser.complete(state[0]);
113
135
  return parser.complete(state[0]);
114
136
  },
@@ -178,7 +200,7 @@ function withDefault(parser, defaultValue, options) {
178
200
  for await (const s of suggestions) yield s;
179
201
  }
180
202
  const innerInitialState = syncParser.initialState;
181
- const wrappedDependencyMarker = isPendingDependencySourceState(innerInitialState) ? { [WrappedDependencySourceMarker]: innerInitialState } : {};
203
+ const wrappedDependencyMarker = isPendingDependencySourceState(innerInitialState) ? { [WrappedDependencySourceMarker]: innerInitialState } : isWrappedDependencySource(parser) ? { [WrappedDependencySourceMarker]: parser[WrappedDependencySourceMarker] } : {};
182
204
  return {
183
205
  $mode: parser.$mode,
184
206
  $valueType: [],
@@ -195,29 +217,108 @@ function withDefault(parser, defaultValue, options) {
195
217
  return parseOptionalStyleSync(context, syncParser);
196
218
  },
197
219
  complete(state) {
198
- if (typeof state === "undefined") try {
199
- const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
200
- return {
201
- success: true,
202
- value
203
- };
204
- } catch (error) {
205
- return {
206
- success: false,
207
- error: error instanceof WithDefaultError ? error.errorMessage : message`${text(String(error))}`
208
- };
220
+ if (typeof state === "undefined") {
221
+ if (transformsDependencyValue(parser)) {
222
+ const innerResult = !isAsync ? syncParser.complete(void 0) : parser.complete(void 0);
223
+ const handleInnerResult = (res) => {
224
+ if (isDependencySourceState(res)) try {
225
+ const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
226
+ return createDependencySourceState({
227
+ success: true,
228
+ value
229
+ }, res[DependencyId]);
230
+ } catch (error) {
231
+ return {
232
+ success: false,
233
+ error: error instanceof WithDefaultError ? error.errorMessage : message`${text(String(error))}`
234
+ };
235
+ }
236
+ try {
237
+ const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
238
+ return {
239
+ success: true,
240
+ value
241
+ };
242
+ } catch (error) {
243
+ return {
244
+ success: false,
245
+ error: error instanceof WithDefaultError ? error.errorMessage : message`${text(String(error))}`
246
+ };
247
+ }
248
+ };
249
+ if (innerResult instanceof Promise) return innerResult.then(handleInnerResult);
250
+ return handleInnerResult(innerResult);
251
+ }
252
+ if (isWrappedDependencySource(parser)) try {
253
+ const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
254
+ const pendingState = parser[WrappedDependencySourceMarker];
255
+ return createDependencySourceState({
256
+ success: true,
257
+ value
258
+ }, pendingState[DependencyId]);
259
+ } catch (error) {
260
+ return {
261
+ success: false,
262
+ error: error instanceof WithDefaultError ? error.errorMessage : message`${text(String(error))}`
263
+ };
264
+ }
265
+ try {
266
+ const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
267
+ return {
268
+ success: true,
269
+ value
270
+ };
271
+ } catch (error) {
272
+ return {
273
+ success: false,
274
+ error: error instanceof WithDefaultError ? error.errorMessage : message`${text(String(error))}`
275
+ };
276
+ }
209
277
  }
210
- if (isPendingDependencySourceState(state[0])) try {
211
- const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
212
- return createDependencySourceState({
213
- success: true,
214
- value
215
- }, state[0][DependencyId]);
216
- } catch (error) {
217
- return {
218
- success: false,
219
- error: error instanceof WithDefaultError ? error.errorMessage : message`${text(String(error))}`
220
- };
278
+ if (isPendingDependencySourceState(state[0])) {
279
+ if (transformsDependencyValue(parser)) {
280
+ const innerResult = !isAsync ? syncParser.complete(state) : parser.complete(state);
281
+ const handleInnerResult = (res) => {
282
+ if (isDependencySourceState(res)) try {
283
+ const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
284
+ return createDependencySourceState({
285
+ success: true,
286
+ value
287
+ }, res[DependencyId]);
288
+ } catch (error) {
289
+ return {
290
+ success: false,
291
+ error: error instanceof WithDefaultError ? error.errorMessage : message`${text(String(error))}`
292
+ };
293
+ }
294
+ try {
295
+ const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
296
+ return {
297
+ success: true,
298
+ value
299
+ };
300
+ } catch (error) {
301
+ return {
302
+ success: false,
303
+ error: error instanceof WithDefaultError ? error.errorMessage : message`${text(String(error))}`
304
+ };
305
+ }
306
+ };
307
+ if (innerResult instanceof Promise) return innerResult.then(handleInnerResult);
308
+ return handleInnerResult(innerResult);
309
+ }
310
+ try {
311
+ const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
312
+ return createDependencySourceState({
313
+ success: true,
314
+ value
315
+ }, state[0][DependencyId]);
316
+ } catch (error) {
317
+ return {
318
+ success: false,
319
+ error: error instanceof WithDefaultError ? error.errorMessage : message`${text(String(error))}`
320
+ };
321
+ }
221
322
  }
222
323
  if (!isAsync) return syncParser.complete(state[0]);
223
324
  return parser.complete(state[0]);
@@ -300,10 +401,15 @@ function map(parser, transform) {
300
401
  };
301
402
  return res;
302
403
  };
404
+ const dependencyMarkers = isWrappedDependencySource(parser) ? {
405
+ [WrappedDependencySourceMarker]: parser[WrappedDependencySourceMarker],
406
+ [TransformsDependencyValueMarker]: true
407
+ } : {};
303
408
  return {
304
409
  ...parser,
305
410
  $valueType: [],
306
411
  complete,
412
+ ...dependencyMarkers,
307
413
  getDocFragments(state, _defaultValue) {
308
414
  return parser.getDocFragments(state, void 0);
309
415
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optique/core",
3
- "version": "0.10.0-dev.295+b5bcb58e",
3
+ "version": "0.10.0-dev.296+80e4ca45",
4
4
  "description": "Type-safe combinatorial command-line interface parser",
5
5
  "keywords": [
6
6
  "CLI",