politty 0.4.12 → 0.4.14

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.
Files changed (88) hide show
  1. package/README.md +11 -8
  2. package/dist/{arg-registry-BlXeCM4p.d.cts → arg-registry-CkPDokIu.d.ts} +236 -13
  3. package/dist/arg-registry-CkPDokIu.d.ts.map +1 -0
  4. package/dist/{arg-registry-D0MimRYf.d.ts → arg-registry-r5wYN6qd.d.cts} +236 -13
  5. package/dist/arg-registry-r5wYN6qd.d.cts.map +1 -0
  6. package/dist/augment.d.cts +3 -2
  7. package/dist/augment.d.cts.map +1 -1
  8. package/dist/augment.d.ts +3 -2
  9. package/dist/augment.d.ts.map +1 -1
  10. package/dist/completion/index.cjs +1 -2
  11. package/dist/completion/index.d.cts +1 -1
  12. package/dist/completion/index.d.ts +1 -1
  13. package/dist/completion/index.js +1 -2
  14. package/dist/{completion-BADAzqT9.cjs → completion-CAekGYS4.cjs} +24 -14
  15. package/dist/completion-CAekGYS4.cjs.map +1 -0
  16. package/dist/{completion-Dj7ytbLu.js → completion-yHz8Pdr7.js} +23 -13
  17. package/dist/completion-yHz8Pdr7.js.map +1 -0
  18. package/dist/docs/index.cjs +50 -19
  19. package/dist/docs/index.cjs.map +1 -1
  20. package/dist/docs/index.d.cts +1 -2
  21. package/dist/docs/index.d.cts.map +1 -1
  22. package/dist/docs/index.d.ts +1 -2
  23. package/dist/docs/index.d.ts.map +1 -1
  24. package/dist/docs/index.js +50 -19
  25. package/dist/docs/index.js.map +1 -1
  26. package/dist/{index-CBGSQVm9.d.ts → index-BLySW_2k.d.ts} +7 -5
  27. package/dist/index-BLySW_2k.d.ts.map +1 -0
  28. package/dist/{index-f2-VIfCo.d.cts → index-DPswv0Vt.d.cts} +7 -5
  29. package/dist/index-DPswv0Vt.d.cts.map +1 -0
  30. package/dist/index.cjs +3 -3
  31. package/dist/index.d.cts +3 -4
  32. package/dist/index.d.cts.map +1 -1
  33. package/dist/index.d.ts +3 -4
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +3 -3
  36. package/dist/{lazy-B_E2X0KR.cjs → lazy-AGV9Pkt5.cjs} +40 -4
  37. package/dist/lazy-AGV9Pkt5.cjs.map +1 -0
  38. package/dist/{lazy-D6nL_iKJ.js → lazy-DiMJSDMB.js} +34 -4
  39. package/dist/lazy-DiMJSDMB.js.map +1 -0
  40. package/dist/prompt/clack/index.cjs +34 -0
  41. package/dist/prompt/clack/index.cjs.map +1 -0
  42. package/dist/prompt/clack/index.d.cts +18 -0
  43. package/dist/prompt/clack/index.d.cts.map +1 -0
  44. package/dist/prompt/clack/index.d.ts +18 -0
  45. package/dist/prompt/clack/index.d.ts.map +1 -0
  46. package/dist/prompt/clack/index.js +32 -0
  47. package/dist/prompt/clack/index.js.map +1 -0
  48. package/dist/prompt/index.cjs +7 -0
  49. package/dist/prompt/index.d.cts +108 -0
  50. package/dist/prompt/index.d.cts.map +1 -0
  51. package/dist/prompt/index.d.ts +108 -0
  52. package/dist/prompt/index.d.ts.map +1 -0
  53. package/dist/prompt/index.js +3 -0
  54. package/dist/prompt/inquirer/index.cjs +49 -0
  55. package/dist/prompt/inquirer/index.cjs.map +1 -0
  56. package/dist/prompt/inquirer/index.d.cts +18 -0
  57. package/dist/prompt/inquirer/index.d.cts.map +1 -0
  58. package/dist/prompt/inquirer/index.d.ts +18 -0
  59. package/dist/prompt/inquirer/index.d.ts.map +1 -0
  60. package/dist/prompt/inquirer/index.js +47 -0
  61. package/dist/prompt/inquirer/index.js.map +1 -0
  62. package/dist/prompt-BKHqGrFw.js +172 -0
  63. package/dist/prompt-BKHqGrFw.js.map +1 -0
  64. package/dist/prompt-aXfSf27y.cjs +196 -0
  65. package/dist/prompt-aXfSf27y.cjs.map +1 -0
  66. package/dist/{runner-U86FIDHT.cjs → runner-CY5fOsSh.cjs} +90 -38
  67. package/dist/runner-CY5fOsSh.cjs.map +1 -0
  68. package/dist/{runner-Bx2S6_Id.js → runner-DSZw1AsW.js} +90 -38
  69. package/dist/runner-DSZw1AsW.js.map +1 -0
  70. package/dist/{subcommand-router-Bu3YTw_f.js → subcommand-router--EUt6ftA.js} +2 -2
  71. package/dist/{subcommand-router-Bu3YTw_f.js.map → subcommand-router--EUt6ftA.js.map} +1 -1
  72. package/dist/{subcommand-router-BTOzDQnY.cjs → subcommand-router-C9ONv6Nq.cjs} +2 -2
  73. package/dist/{subcommand-router-BTOzDQnY.cjs.map → subcommand-router-C9ONv6Nq.cjs.map} +1 -1
  74. package/package.json +53 -11
  75. package/dist/arg-registry-BlXeCM4p.d.cts.map +0 -1
  76. package/dist/arg-registry-D0MimRYf.d.ts.map +0 -1
  77. package/dist/completion-BADAzqT9.cjs.map +0 -1
  78. package/dist/completion-Dj7ytbLu.js.map +0 -1
  79. package/dist/index-CBGSQVm9.d.ts.map +0 -1
  80. package/dist/index-f2-VIfCo.d.cts.map +0 -1
  81. package/dist/lazy-B_E2X0KR.cjs.map +0 -1
  82. package/dist/lazy-D6nL_iKJ.js.map +0 -1
  83. package/dist/runner-Bx2S6_Id.js.map +0 -1
  84. package/dist/runner-U86FIDHT.cjs.map +0 -1
  85. package/dist/schema-extractor-CAZi3kK1.d.ts +0 -117
  86. package/dist/schema-extractor-CAZi3kK1.d.ts.map +0 -1
  87. package/dist/schema-extractor-D-eGlm4W.d.cts +0 -117
  88. package/dist/schema-extractor-D-eGlm4W.d.cts.map +0 -1
@@ -1,6 +1,5 @@
1
- const require_subcommand_router = require('./subcommand-router-BTOzDQnY.cjs');
2
- const require_lazy = require('./lazy-B_E2X0KR.cjs');
3
- let zod = require("zod");
1
+ const require_subcommand_router = require('./subcommand-router-C9ONv6Nq.cjs');
2
+ const require_lazy = require('./lazy-AGV9Pkt5.cjs');
4
3
  let node_util = require("node:util");
5
4
  let string_width = require("string-width");
6
5
  string_width = require_subcommand_router.__toESM(string_width);
@@ -615,8 +614,8 @@ function renderOptions(command, descriptions = {}, context) {
615
614
  version: descriptions.version ?? defaultBuiltinDescriptions.version
616
615
  };
617
616
  const extracted = require_lazy.getExtractedFields(command);
618
- const hasUserDefinedh = extracted?.fields.some((f) => f.alias === "h" && f.overrideBuiltinAlias === true) ?? false;
619
- const hasUserDefinedH = extracted?.fields.some((f) => f.alias === "H" && f.overrideBuiltinAlias === true) ?? false;
617
+ const hasUserDefinedh = extracted?.fields.some((f) => f.overrideBuiltinAlias === true && require_lazy.getAllAliases(f).includes("h")) ?? false;
618
+ const hasUserDefinedH = extracted?.fields.some((f) => f.overrideBuiltinAlias === true && require_lazy.getAllAliases(f).includes("H")) ?? false;
620
619
  if (hasUserDefinedh) lines.push(formatOption(styles.option("--help"), desc.help));
621
620
  else lines.push(formatOption(`${styles.option("-h")}, ${styles.option("--help")}`, desc.help));
622
621
  if (hasUserDefinedH) lines.push(formatOption(styles.option("--help-all"), desc.helpAll));
@@ -739,13 +738,25 @@ function renderUnionOptions(extracted, _command, lines) {
739
738
  */
740
739
  function formatFlags(opt) {
741
740
  const parts = [];
742
- if (opt.alias) parts.push(styles.option(`-${opt.alias}`));
741
+ if (opt.alias) {
742
+ for (const alias of opt.alias) if (alias.length === 1) parts.push(styles.option(`-${alias}`));
743
+ }
743
744
  let longFlag = styles.option(`--${opt.cliName}`);
744
745
  if (opt.type !== "boolean") {
745
746
  const placeholder = opt.placeholder ?? opt.cliName.toUpperCase();
746
747
  longFlag += ` ${styles.placeholder(`<${placeholder}>`)}`;
747
748
  }
748
749
  parts.push(longFlag);
750
+ if (opt.alias) {
751
+ for (const alias of opt.alias) if (alias.length > 1) {
752
+ let longAlias = styles.option(`--${alias}`);
753
+ if (opt.type !== "boolean") {
754
+ const placeholder = opt.placeholder ?? opt.cliName.toUpperCase();
755
+ longAlias += ` ${styles.placeholder(`<${placeholder}>`)}`;
756
+ }
757
+ parts.push(longAlias);
758
+ }
759
+ }
749
760
  return parts.join(", ");
750
761
  }
751
762
  /**
@@ -1001,22 +1012,36 @@ function checkDuplicateAliases(extracted, commandPath) {
1001
1012
  const errors = [];
1002
1013
  const seenAliases = /* @__PURE__ */ new Map();
1003
1014
  const fieldNames = new Set(extracted.fields.map((f) => f.name));
1004
- for (const field of extracted.fields) {
1005
- if (!field.alias) continue;
1006
- if (fieldNames.has(field.alias)) errors.push({
1007
- commandPath,
1008
- type: "duplicate_alias",
1009
- message: `Alias "${field.alias}" for field "${field.name}" conflicts with existing field name "${field.alias}".`,
1010
- field: field.name
1011
- });
1012
- const existingField = seenAliases.get(field.alias);
1013
- if (existingField) errors.push({
1015
+ const cliNames = new Set(extracted.fields.map((f) => f.cliName));
1016
+ const registerAlias = (alias, fieldName, isDerived) => {
1017
+ if (fieldNames.has(alias) || cliNames.has(alias)) errors.push({
1014
1018
  commandPath,
1015
1019
  type: "duplicate_alias",
1016
- message: `Duplicate alias "${field.alias}" detected. Both "${existingField}" and "${field.name}" use the same alias.`,
1017
- field: field.name
1020
+ message: `Alias "${alias}" for field "${fieldName}" conflicts with existing field name or CLI name "${alias}".`,
1021
+ field: fieldName
1018
1022
  });
1019
- seenAliases.set(field.alias, field.name);
1023
+ const existingField = seenAliases.get(alias);
1024
+ if (existingField && existingField !== fieldName) {
1025
+ const qualifier = isDerived ? " (derived camelCase variant)" : "";
1026
+ errors.push({
1027
+ commandPath,
1028
+ type: "duplicate_alias",
1029
+ message: `Duplicate alias "${alias}"${qualifier} detected. Both "${existingField}" and "${fieldName}" use the same alias.`,
1030
+ field: fieldName
1031
+ });
1032
+ }
1033
+ seenAliases.set(alias, fieldName);
1034
+ };
1035
+ for (const field of extracted.fields) {
1036
+ const allAliases = require_lazy.getAllAliases(field);
1037
+ if (allAliases.length === 0) continue;
1038
+ for (const alias of allAliases) {
1039
+ registerAlias(alias, field.name, false);
1040
+ if (alias.length > 1 && alias.includes("-")) {
1041
+ const camelVariant = require_lazy.toCamelCase(alias);
1042
+ if (camelVariant !== alias && !fieldNames.has(camelVariant)) registerAlias(camelVariant, field.name, true);
1043
+ }
1044
+ }
1020
1045
  }
1021
1046
  return errors;
1022
1047
  }
@@ -1057,12 +1082,15 @@ function checkPositionalConfig(extracted, commandPath) {
1057
1082
  */
1058
1083
  function checkReservedAliases(extracted, commandPath) {
1059
1084
  const errors = [];
1060
- for (const field of extracted.fields) if ((field.alias === "h" || field.alias === "H") && field.overrideBuiltinAlias !== true) errors.push({
1061
- commandPath,
1062
- type: "reserved_alias",
1063
- message: `Alias "${field.alias}" is reserved for --${field.alias === "h" ? "help" : "help-all"}.`,
1064
- field: field.name
1065
- });
1085
+ for (const field of extracted.fields) {
1086
+ if (field.overrideBuiltinAlias === true) continue;
1087
+ for (const alias of require_lazy.getAllAliases(field)) if (alias === "h" || alias === "H") errors.push({
1088
+ commandPath,
1089
+ type: "reserved_alias",
1090
+ message: `Alias "${alias}" is reserved for --${alias === "h" ? "help" : "help-all"}.`,
1091
+ field: field.name
1092
+ });
1093
+ }
1066
1094
  return errors;
1067
1095
  }
1068
1096
  /**
@@ -1126,8 +1154,9 @@ function validateReservedAliases(extracted, _hasSubCommands) {
1126
1154
  const errors = checkReservedAliases(extracted, []);
1127
1155
  if (errors.length > 0) {
1128
1156
  const field = errors[0].field ?? "unknown";
1129
- const alias = extracted.fields.find((f) => f.name === field)?.alias ?? "h";
1130
- throw new ReservedAliasError(`Alias "${alias}" is reserved for --${alias === "h" ? "help" : "help-all"}. To override this, set { alias: "${alias}", overrideBuiltinAlias: true } for "${field}".`);
1157
+ const found = extracted.fields.find((f) => f.name === field);
1158
+ const alias = (found ? require_lazy.getAllAliases(found) : []).find((a) => a === "h" || a === "H") ?? "h";
1159
+ throw new ReservedAliasError(`Alias "${alias}" is reserved for --${alias === "h" ? "help" : "help-all"}. To override this, set { overrideBuiltinAlias: true } for "${field}" and keep the alias where it is currently defined (in alias or hiddenAlias).`);
1131
1160
  }
1132
1161
  }
1133
1162
  /**
@@ -1372,7 +1401,13 @@ function buildParserOptions(extracted) {
1372
1401
  for (const field of extracted.fields) definedNames.add(field.name);
1373
1402
  for (const field of extracted.fields) {
1374
1403
  if (field.cliName !== field.name) aliasMap.set(field.cliName, field.name);
1375
- if (field.alias) aliasMap.set(field.alias, field.name);
1404
+ for (const alias of require_lazy.getAllAliases(field)) {
1405
+ aliasMap.set(alias, field.name);
1406
+ if (alias.length > 1 && alias.includes("-")) {
1407
+ const camelAlias = require_lazy.toCamelCase(alias);
1408
+ if (camelAlias !== alias && !definedNames.has(camelAlias) && !aliasMap.has(camelAlias)) aliasMap.set(camelAlias, field.name);
1409
+ }
1410
+ }
1376
1411
  const camelVariant = require_lazy.toCamelCase(field.name);
1377
1412
  if (camelVariant !== field.name && !definedNames.has(camelVariant) && !aliasMap.has(camelVariant)) aliasMap.set(camelVariant, field.name);
1378
1413
  if (field.type === "boolean") booleanFlags.add(field.name);
@@ -1414,12 +1449,14 @@ function mergeWithPositionals(parsed, extracted) {
1414
1449
  */
1415
1450
  function buildGlobalFlagLookup(globalExtracted) {
1416
1451
  const { aliasMap = /* @__PURE__ */ new Map(), booleanFlags = /* @__PURE__ */ new Set() } = buildParserOptions(globalExtracted);
1452
+ const shortAliases = /* @__PURE__ */ new Set();
1453
+ for (const field of globalExtracted.fields) for (const alias of require_lazy.getAllAliases(field)) if (alias.length === 1) shortAliases.add(alias);
1417
1454
  return {
1418
1455
  aliasMap,
1419
1456
  booleanFlags,
1420
1457
  flagNames: new Set(globalExtracted.fields.map((f) => f.name)),
1421
1458
  cliNames: new Set(globalExtracted.fields.map((f) => f.cliName)),
1422
- aliases: new Set(globalExtracted.fields.filter((f) => f.alias).map((f) => f.alias))
1459
+ aliases: shortAliases
1423
1460
  };
1424
1461
  }
1425
1462
  /**
@@ -1605,8 +1642,8 @@ function parseArgs(argv, command, options = {}) {
1605
1642
  if (options.globalExtracted) validateCrossSchemaCollisions(options.globalExtracted, extracted);
1606
1643
  }
1607
1644
  }
1608
- const hasUserDefinedH = extracted?.fields.some((f) => f.alias === "H" && f.overrideBuiltinAlias === true) ?? false;
1609
- const hasUserDefinedh = extracted?.fields.some((f) => f.alias === "h" && f.overrideBuiltinAlias === true) ?? false;
1645
+ const hasUserDefinedH = extracted?.fields.some((f) => f.overrideBuiltinAlias === true && require_lazy.getAllAliases(f).includes("H")) ?? false;
1646
+ const hasUserDefinedh = extracted?.fields.some((f) => f.overrideBuiltinAlias === true && require_lazy.getAllAliases(f).includes("h")) ?? false;
1610
1647
  const helpAllRequested = argv.includes("--help-all") || !hasUserDefinedH && argv.includes("-H");
1611
1648
  const helpRequested = !helpAllRequested && (argv.includes("--help") || !hasUserDefinedh && argv.includes("-h"));
1612
1649
  const versionRequested = argv.includes("--version");
@@ -1653,11 +1690,12 @@ function parseArgs(argv, command, options = {}) {
1653
1690
  }
1654
1691
  const knownFlags = new Set(extracted.fields.map((f) => f.name));
1655
1692
  const knownCliNames = new Set(extracted.fields.map((f) => f.cliName));
1656
- const knownAliases = new Set(extracted.fields.filter((f) => f.alias).map((f) => f.alias));
1693
+ const knownAliases = /* @__PURE__ */ new Set();
1694
+ for (const f of extracted.fields) for (const alias of require_lazy.getAllAliases(f)) knownAliases.add(alias);
1657
1695
  if (options.globalExtracted) for (const f of options.globalExtracted.fields) {
1658
1696
  knownFlags.add(f.name);
1659
1697
  knownCliNames.add(f.cliName);
1660
- if (f.alias) knownAliases.add(f.alias);
1698
+ for (const alias of require_lazy.getAllAliases(f)) knownAliases.add(alias);
1661
1699
  }
1662
1700
  const unknownFlags = [];
1663
1701
  for (const key of Object.keys(parsed.options)) if (!knownFlags.has(key) && !knownCliNames.has(key) && !knownAliases.has(key)) unknownFlags.push(key);
@@ -1695,8 +1733,9 @@ function parseGlobalArgs(tokens, globalExtracted) {
1695
1733
  */
1696
1734
  function separateGlobalArgs(argv, globalExtracted, localExtracted) {
1697
1735
  const lookup = buildGlobalFlagLookup(globalExtracted);
1736
+ const localFieldNames = new Set(localExtracted?.fields.map((f) => f.name) ?? []);
1698
1737
  const localCliNames = new Set(localExtracted?.fields.map((f) => f.cliName) ?? []);
1699
- const localAliases = new Set(localExtracted?.fields.filter((f) => f.alias).map((f) => f.alias) ?? []);
1738
+ const localAliasMapKeys = localExtracted ? new Set(buildParserOptions(localExtracted).aliasMap?.keys() ?? []) : /* @__PURE__ */ new Set();
1700
1739
  const globalTokens = [];
1701
1740
  const commandTokens = [];
1702
1741
  for (let i = 0; i < argv.length; i++) {
@@ -1708,7 +1747,7 @@ function separateGlobalArgs(argv, globalExtracted, localExtracted) {
1708
1747
  if (arg.startsWith("--")) {
1709
1748
  const { resolvedName, withoutDashes, isNegated, isGlobal } = resolveGlobalLongOption(arg, lookup);
1710
1749
  const flagName = isNegated ? withoutDashes.slice(3) : withoutDashes;
1711
- const isLocalCollision = localCliNames.has(withoutDashes) || localCliNames.has(flagName);
1750
+ const isLocalCollision = localFieldNames.has(withoutDashes) || localFieldNames.has(flagName) || localCliNames.has(withoutDashes) || localCliNames.has(flagName) || localAliasMapKeys.has(withoutDashes) || localAliasMapKeys.has(flagName);
1712
1751
  if (isGlobal && !isLocalCollision) {
1713
1752
  i += collectGlobalFlag(argv, i, resolvedName, isNegated, lookup.booleanFlags, globalTokens) - 1;
1714
1753
  continue;
@@ -1717,7 +1756,7 @@ function separateGlobalArgs(argv, globalExtracted, localExtracted) {
1717
1756
  const withoutDash = arg.includes("=") ? arg.slice(1, arg.indexOf("=")) : arg.slice(1);
1718
1757
  if (withoutDash.length === 1) {
1719
1758
  const resolvedName = lookup.aliasMap.get(withoutDash) ?? withoutDash;
1720
- if ((lookup.aliases.has(withoutDash) || lookup.flagNames.has(resolvedName)) && !localAliases.has(withoutDash)) {
1759
+ if ((lookup.aliases.has(withoutDash) || lookup.flagNames.has(resolvedName)) && !localAliasMapKeys.has(withoutDash)) {
1721
1760
  i += collectGlobalFlag(argv, i, resolvedName, false, lookup.booleanFlags, globalTokens) - 1;
1722
1761
  continue;
1723
1762
  }
@@ -1983,6 +2022,7 @@ async function runMain(command, options = {}) {
1983
2022
  handleSignals: true,
1984
2023
  logger: options.logger,
1985
2024
  globalArgs: options.globalArgs,
2025
+ prompt: options.prompt,
1986
2026
  _globalExtracted: globalExtracted,
1987
2027
  _globalCleanup: options.cleanup,
1988
2028
  _context: {
@@ -2127,6 +2167,10 @@ async function runCommandInternal(command, argv, options = {}) {
2127
2167
  }
2128
2168
  }
2129
2169
  }
2170
+ if (options.prompt) {
2171
+ const resolved = await options.prompt(accumulatedGlobalArgs, options._globalExtracted);
2172
+ Object.assign(accumulatedGlobalArgs, resolved);
2173
+ }
2130
2174
  const globalValidation = validateArgs(accumulatedGlobalArgs, options.globalArgs);
2131
2175
  if (!globalValidation.success) {
2132
2176
  collector?.stop();
@@ -2150,7 +2194,15 @@ async function runCommandInternal(command, argv, options = {}) {
2150
2194
  globalCleanup: options._globalCleanup
2151
2195
  });
2152
2196
  }
2153
- const validationResult = validateArgs(parseResult.rawArgs, command.args);
2197
+ let argsToValidate = parseResult.rawArgs;
2198
+ if (options.prompt && parseResult.extractedFields) {
2199
+ const resolved = await options.prompt(argsToValidate, parseResult.extractedFields);
2200
+ argsToValidate = {
2201
+ ...argsToValidate,
2202
+ ...resolved
2203
+ };
2204
+ }
2205
+ const validationResult = validateArgs(argsToValidate, command.args);
2154
2206
  if (!validationResult.success) {
2155
2207
  collector?.stop();
2156
2208
  return {
@@ -2368,4 +2420,4 @@ Object.defineProperty(exports, 'validateReservedAliases', {
2368
2420
  return validateReservedAliases;
2369
2421
  }
2370
2422
  });
2371
- //# sourceMappingURL=runner-U86FIDHT.cjs.map
2423
+ //# sourceMappingURL=runner-CY5fOsSh.cjs.map