@rickosborne/clamp 2025.1.7

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 (96) hide show
  1. package/README.md +216 -0
  2. package/cjs/index.js +27 -0
  3. package/cjs/index.js.map +1 -0
  4. package/cjs/package.json +6 -0
  5. package/cjs/ts/boolean-param.js +45 -0
  6. package/cjs/ts/boolean-param.js.map +1 -0
  7. package/cjs/ts/command-params.js +160 -0
  8. package/cjs/ts/command-params.js.map +1 -0
  9. package/cjs/ts/common.js +3 -0
  10. package/cjs/ts/common.js.map +1 -0
  11. package/cjs/ts/date-param.js +38 -0
  12. package/cjs/ts/date-param.js.map +1 -0
  13. package/cjs/ts/file-param.js +43 -0
  14. package/cjs/ts/file-param.js.map +1 -0
  15. package/cjs/ts/help-for-param.js +33 -0
  16. package/cjs/ts/help-for-param.js.map +1 -0
  17. package/cjs/ts/label-for-param.js +18 -0
  18. package/cjs/ts/label-for-param.js.map +1 -0
  19. package/cjs/ts/number-param.js +56 -0
  20. package/cjs/ts/number-param.js.map +1 -0
  21. package/cjs/ts/param-handler.js +28 -0
  22. package/cjs/ts/param-handler.js.map +1 -0
  23. package/cjs/ts/string-param.js +34 -0
  24. package/cjs/ts/string-param.js.map +1 -0
  25. package/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  26. package/esm/index.js +11 -0
  27. package/esm/index.js.map +1 -0
  28. package/esm/package.json +6 -0
  29. package/esm/ts/boolean-param.js +40 -0
  30. package/esm/ts/boolean-param.js.map +1 -0
  31. package/esm/ts/command-params.js +154 -0
  32. package/esm/ts/command-params.js.map +1 -0
  33. package/esm/ts/common.js +2 -0
  34. package/esm/ts/common.js.map +1 -0
  35. package/esm/ts/date-param.js +32 -0
  36. package/esm/ts/date-param.js.map +1 -0
  37. package/esm/ts/file-param.js +37 -0
  38. package/esm/ts/file-param.js.map +1 -0
  39. package/esm/ts/help-for-param.js +29 -0
  40. package/esm/ts/help-for-param.js.map +1 -0
  41. package/esm/ts/label-for-param.js +13 -0
  42. package/esm/ts/label-for-param.js.map +1 -0
  43. package/esm/ts/number-param.js +51 -0
  44. package/esm/ts/number-param.js.map +1 -0
  45. package/esm/ts/param-handler.js +23 -0
  46. package/esm/ts/param-handler.js.map +1 -0
  47. package/esm/ts/string-param.js +28 -0
  48. package/esm/ts/string-param.js.map +1 -0
  49. package/esm/tsconfig.module.tsbuildinfo +1 -0
  50. package/package.json +51 -0
  51. package/tsdoc-metadata.json +11 -0
  52. package/types/index.d.ts +11 -0
  53. package/types/index.d.ts.map +1 -0
  54. package/types/index.js +27 -0
  55. package/types/index.js.map +1 -0
  56. package/types/ts/boolean-param.d.ts +50 -0
  57. package/types/ts/boolean-param.d.ts.map +1 -0
  58. package/types/ts/boolean-param.js +44 -0
  59. package/types/ts/boolean-param.js.map +1 -0
  60. package/types/ts/command-params.d.ts +44 -0
  61. package/types/ts/command-params.d.ts.map +1 -0
  62. package/types/ts/command-params.js +158 -0
  63. package/types/ts/command-params.js.map +1 -0
  64. package/types/ts/common.d.ts +63 -0
  65. package/types/ts/common.d.ts.map +1 -0
  66. package/types/ts/common.js +3 -0
  67. package/types/ts/common.js.map +1 -0
  68. package/types/ts/date-param.d.ts +34 -0
  69. package/types/ts/date-param.d.ts.map +1 -0
  70. package/types/ts/date-param.js +37 -0
  71. package/types/ts/date-param.js.map +1 -0
  72. package/types/ts/file-param.d.ts +50 -0
  73. package/types/ts/file-param.d.ts.map +1 -0
  74. package/types/ts/file-param.js +42 -0
  75. package/types/ts/file-param.js.map +1 -0
  76. package/types/ts/help-for-param.d.ts +6 -0
  77. package/types/ts/help-for-param.d.ts.map +1 -0
  78. package/types/ts/help-for-param.js +33 -0
  79. package/types/ts/help-for-param.js.map +1 -0
  80. package/types/ts/label-for-param.d.ts +6 -0
  81. package/types/ts/label-for-param.d.ts.map +1 -0
  82. package/types/ts/label-for-param.js +17 -0
  83. package/types/ts/label-for-param.js.map +1 -0
  84. package/types/ts/number-param.d.ts +43 -0
  85. package/types/ts/number-param.d.ts.map +1 -0
  86. package/types/ts/number-param.js +56 -0
  87. package/types/ts/number-param.js.map +1 -0
  88. package/types/ts/param-handler.d.ts +6 -0
  89. package/types/ts/param-handler.d.ts.map +1 -0
  90. package/types/ts/param-handler.js +27 -0
  91. package/types/ts/param-handler.js.map +1 -0
  92. package/types/ts/string-param.d.ts +30 -0
  93. package/types/ts/string-param.d.ts.map +1 -0
  94. package/types/ts/string-param.js +33 -0
  95. package/types/ts/string-param.js.map +1 -0
  96. package/types/tsconfig.types.tsbuildinfo +1 -0
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.numberParamHandler = exports.isNumberParam = exports.parseNumberArg = void 0;
4
+ const label_for_param_js_1 = require("./label-for-param.js");
5
+ /**
6
+ * Convert a text argument to a number.
7
+ * @internal
8
+ */
9
+ const parseNumberArg = (text, param) => {
10
+ const num = param.integer === true ? parseInt(text, param.radix) : parseFloat(text);
11
+ if (param.minimum != null && num < param.minimum) {
12
+ throw new RangeError(`${(0, label_for_param_js_1.labelForParam)(param)}: minimum=${param.minimum}`);
13
+ }
14
+ if (param.maximum != null && num > param.maximum) {
15
+ throw new RangeError(`${(0, label_for_param_js_1.labelForParam)(param)}: maximum=${param.minimum}`);
16
+ }
17
+ return parseFloat(text);
18
+ };
19
+ exports.parseNumberArg = parseNumberArg;
20
+ /**
21
+ * @internal
22
+ */
23
+ const isNumberParam = (param) => {
24
+ return param.type === Number;
25
+ };
26
+ exports.isNumberParam = isNumberParam;
27
+ /**
28
+ * @internal
29
+ */
30
+ exports.numberParamHandler = {
31
+ matchesParam: exports.isNumberParam,
32
+ parseArg: exports.parseNumberArg,
33
+ placeholderForParam(param) {
34
+ if (param.placeholder != null) {
35
+ return param.placeholder;
36
+ }
37
+ let range;
38
+ if (param.minimum != null && param.maximum != null) {
39
+ range = `:[${param.minimum},${param.maximum}]`;
40
+ }
41
+ else if (param.minimum != null) {
42
+ range = `≥${param.minimum}`;
43
+ }
44
+ else if (param.maximum != null) {
45
+ range = `≤${param.maximum}`;
46
+ }
47
+ else {
48
+ range = "";
49
+ }
50
+ if (param.integer) {
51
+ return `(int${range})`;
52
+ }
53
+ return `(number${range})`;
54
+ },
55
+ };
56
+ //# sourceMappingURL=number-param.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number-param.js","sourceRoot":"","sources":["../../../ts/number-param.ts"],"names":[],"mappings":";;;AACA,6DAAqD;AA+BrD;;;GAGG;AACI,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,KAAyB,EAAU,EAAE;IACjF,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpF,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAClD,MAAM,IAAI,UAAU,CAAC,GAAG,IAAA,kCAAa,EAAC,KAAK,CAAC,aAAa,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAClD,MAAM,IAAI,UAAU,CAAC,GAAG,IAAA,kCAAa,EAAC,KAAK,CAAC,aAAa,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC,CAAC;AATW,QAAA,cAAc,kBASzB;AAEF;;GAEG;AACI,MAAM,aAAa,GAAG,CAAC,KAAwB,EAA+B,EAAE;IACtF,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;AAC9B,CAAC,CAAC;AAFW,QAAA,aAAa,iBAExB;AAEF;;GAEG;AACU,QAAA,kBAAkB,GAA6C;IAC3E,YAAY,EAAE,qBAAa;IAC3B,QAAQ,EAAE,sBAAc;IACxB,mBAAmB,CAAC,KAAyB;QAC5C,IAAI,KAAK,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC,WAAW,CAAC;QAC1B,CAAC;QACD,IAAI,KAAa,CAAC;QAClB,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YACpD,KAAK,GAAG,KAAK,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC;QAChD,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YAClC,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC7B,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YAClC,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC7B,CAAC;aAAM,CAAC;YACP,KAAK,GAAG,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,OAAO,KAAK,GAAG,CAAC;QACxB,CAAC;QACD,OAAO,UAAU,KAAK,GAAG,CAAC;IAC3B,CAAC;CACD,CAAC"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findParamHandler = void 0;
4
+ const boolean_param_js_1 = require("./boolean-param.js");
5
+ const date_param_js_1 = require("./date-param.js");
6
+ const file_param_js_1 = require("./file-param.js");
7
+ const number_param_js_1 = require("./number-param.js");
8
+ const string_param_js_1 = require("./string-param.js");
9
+ const paramHandlers = [
10
+ string_param_js_1.stringParamHandler,
11
+ boolean_param_js_1.booleanParamHandler,
12
+ number_param_js_1.numberParamHandler,
13
+ file_param_js_1.fileParamHandler,
14
+ date_param_js_1.dateParamHandler,
15
+ ];
16
+ /**
17
+ * @internal
18
+ */
19
+ const findParamHandler = (param) => {
20
+ var _a;
21
+ const paramHandler = paramHandlers.find((ph) => ph.matchesParam(param));
22
+ if (paramHandler == null) {
23
+ throw new TypeError(`Unknown parameter type: ${(_a = param.type) === null || _a === void 0 ? void 0 : _a.toString()}`);
24
+ }
25
+ return paramHandler;
26
+ };
27
+ exports.findParamHandler = findParamHandler;
28
+ //# sourceMappingURL=param-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"param-handler.js","sourceRoot":"","sources":["../../../ts/param-handler.ts"],"names":[],"mappings":";;;AAAA,yDAAyD;AAEzD,mDAAmD;AACnD,mDAAmD;AACnD,uDAAuD;AACvD,uDAAuD;AAEvD,MAAM,aAAa,GAA+C;IACjE,oCAAkB;IAClB,sCAAmB;IACnB,oCAAkB;IAClB,gCAAgB;IAChB,gCAAgB;CAChB,CAAC;AAEF;;GAEG;AACI,MAAM,gBAAgB,GAAG,CAA8B,KAAQ,EAA4B,EAAE;;IACnG,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAW,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAyC,CAAC;IACzH,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,SAAS,CAAC,2BAA4B,MAAA,KAAK,CAAC,IAAI,0CAAE,QAAQ,EAAG,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,YAAY,CAAC;AACrB,CAAC,CAAC;AANW,QAAA,gBAAgB,oBAM3B"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stringParamHandler = exports.isStringParam = exports.parseStringArg = void 0;
4
+ /**
5
+ * Transform a string argument before returning it.
6
+ * @internal
7
+ */
8
+ const parseStringArg = (text, param) => {
9
+ let s = text;
10
+ if (param.trim === true) {
11
+ s = s.trim();
12
+ }
13
+ return s;
14
+ };
15
+ exports.parseStringArg = parseStringArg;
16
+ /**
17
+ * @internal
18
+ */
19
+ const isStringParam = (param) => {
20
+ return param.type === String || param.type == null;
21
+ };
22
+ exports.isStringParam = isStringParam;
23
+ /**
24
+ * @internal
25
+ */
26
+ exports.stringParamHandler = {
27
+ matchesParam: exports.isStringParam,
28
+ parseArg: exports.parseStringArg,
29
+ placeholderForParam(param) {
30
+ var _a;
31
+ return (_a = param.placeholder) !== null && _a !== void 0 ? _a : "(text)";
32
+ },
33
+ };
34
+ //# sourceMappingURL=string-param.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-param.js","sourceRoot":"","sources":["../../../ts/string-param.ts"],"names":[],"mappings":";;;AAkBA;;;GAGG;AACI,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,KAAyB,EAAU,EAAE;IACjF,IAAI,CAAC,GAAG,IAAI,CAAC;IACb,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACzB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IACD,OAAO,CAAC,CAAC;AACV,CAAC,CAAC;AANW,QAAA,cAAc,kBAMzB;AAEF;;GAEG;AACI,MAAM,aAAa,GAAG,CAAC,KAAwB,EAA+B,EAAE;IACtF,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC;AACpD,CAAC,CAAC;AAFW,QAAA,aAAa,iBAExB;AAEF;;GAEG;AACU,QAAA,kBAAkB,GAA6C;IAC3E,YAAY,EAAE,qBAAa;IAC3B,QAAQ,EAAE,sBAAc;IACxB,mBAAmB,CAAC,KAAyB;;QAC5C,OAAO,MAAA,KAAK,CAAC,WAAW,mCAAI,QAAQ,CAAC;IACtC,CAAC;CACD,CAAC"}
@@ -0,0 +1 @@
1
+ {"root":["../../index.ts","../../ts/boolean-param.ts","../../ts/command-params.ts","../../ts/common.ts","../../ts/date-param.ts","../../ts/file-param.ts","../../ts/help-for-param.ts","../../ts/label-for-param.ts","../../ts/number-param.ts","../../ts/param-handler.ts","../../ts/string-param.ts"],"version":"5.7.2"}
package/esm/index.js ADDED
@@ -0,0 +1,11 @@
1
+ export * from "./ts/boolean-param.js";
2
+ export * from "./ts/command-params.js";
3
+ export * from "./ts/common.js";
4
+ export * from "./ts/date-param.js";
5
+ export * from "./ts/file-param.js";
6
+ export * from "./ts/help-for-param.js";
7
+ export * from "./ts/label-for-param.js";
8
+ export * from "./ts/number-param.js";
9
+ export * from "./ts/param-handler.js";
10
+ export * from "./ts/string-param.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,6 @@
1
+ {
2
+ "engines": {
3
+ "node": ">=16"
4
+ },
5
+ "type": "module"
6
+ }
@@ -0,0 +1,40 @@
1
+ import { labelForParam } from "./label-for-param.js";
2
+ /**
3
+ * Default possible values for true.
4
+ * @internal
5
+ */
6
+ export const TRUES = Object.freeze(["t", "true", "1", "y", "yes"]);
7
+ // noinspection SpellCheckingInspection
8
+ /**
9
+ * Default possible values for false.
10
+ * @internal
11
+ */
12
+ export const FALSES = Object.freeze(["f", "false", "0", "n", "no"]);
13
+ /**
14
+ * @internal
15
+ */
16
+ export const parseBooleanArg = (text, param) => {
17
+ const lower = text.toLocaleLowerCase();
18
+ const trueValues = param.trues ?? TRUES;
19
+ if (trueValues.includes(lower)) {
20
+ return true;
21
+ }
22
+ const falseValues = param.falses ?? FALSES;
23
+ if (falseValues.includes(lower)) {
24
+ return false;
25
+ }
26
+ throw new RangeError(`${labelForParam(param)}: invalid value`);
27
+ };
28
+ /**
29
+ * @internal
30
+ */
31
+ export const booleanParamHandler = {
32
+ matchesParam(param) {
33
+ return param.type === Boolean;
34
+ },
35
+ parseArg: parseBooleanArg,
36
+ placeholderForParam() {
37
+ return undefined;
38
+ },
39
+ };
40
+ //# sourceMappingURL=boolean-param.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boolean-param.js","sourceRoot":"","sources":["../../../ts/boolean-param.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD;;;GAGG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAE,CAAC,CAAC;AAErE,uCAAuC;AACvC;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAE,CAAC,CAAC;AAkCtE;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,KAA0B,EAAW,EAAE;IACpF,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;IACxC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC;IAC3C,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACd,CAAC;IACD,MAAM,IAAI,UAAU,CAAC,GAAI,aAAa,CAAC,KAAK,CAAE,iBAAiB,CAAC,CAAC;AAClE,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAA+C;IAC9E,YAAY,CAAC,KAAwB;QACpC,OAAO,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;IAC/B,CAAC;IACD,QAAQ,EAAE,eAAe;IACzB,mBAAmB;QAClB,OAAO,SAAS,CAAC;IAClB,CAAC;CACD,CAAC"}
@@ -0,0 +1,154 @@
1
+ import { assertDefined } from "@rickosborne/guard";
2
+ import { FALSES, TRUES } from "./boolean-param.js";
3
+ import { labelForParam } from "./label-for-param.js";
4
+ import { findParamHandler } from "./param-handler.js";
5
+ const toReturnType = (text, param) => {
6
+ const paramHandler = findParamHandler(param);
7
+ const parser = (param.parse ?? paramHandler.parseArg);
8
+ if (parser != null) {
9
+ return parser(text, param);
10
+ }
11
+ throw new Error(`Unhandled param type: ${String(param.type)}`);
12
+ };
13
+ /**
14
+ * Parse the (maybe-given) command-line arguments according to the
15
+ * given param specs and construct a return type of the converted values.
16
+ */
17
+ export const commandParams = (spec, { args = process.argv.slice(2), ignoreUnknown, onError, } = {}) => {
18
+ const result = {};
19
+ const positionals = Object.entries(spec)
20
+ .filter(([, s]) => s.positional === true)
21
+ .map(([key, s]) => ({ key, spec: s }));
22
+ if (positionals.length > 1) {
23
+ throw new Error(`Too many positionals: ${positionals.map(({ key }) => key).join(" ")}`);
24
+ }
25
+ const positional = positionals.shift();
26
+ let onlyPositionalsRemain = false;
27
+ try {
28
+ while (args.length > 0) {
29
+ const arg = args.shift();
30
+ let param;
31
+ let resultKey;
32
+ let typedValue;
33
+ if (arg === "--" && !onlyPositionalsRemain) {
34
+ onlyPositionalsRemain = true;
35
+ continue;
36
+ }
37
+ if (onlyPositionalsRemain || !arg.startsWith("-")) {
38
+ if (positional == null) {
39
+ // noinspection ExceptionCaughtLocallyJS
40
+ throw new Error(`Unexpected positional: ${JSON.stringify(arg)}`);
41
+ }
42
+ param = positional.spec;
43
+ resultKey = positional.key;
44
+ typedValue = toReturnType(arg, positional.spec);
45
+ }
46
+ else {
47
+ let no = false;
48
+ let name;
49
+ if (arg.startsWith("--no-")) {
50
+ name = arg.substring(5);
51
+ no = true;
52
+ }
53
+ else if (arg.startsWith("--")) {
54
+ name = arg.substring(2);
55
+ }
56
+ else if (arg.startsWith("-no-")) {
57
+ name = arg.substring(4);
58
+ no = true;
59
+ }
60
+ else {
61
+ name = arg.substring(1);
62
+ }
63
+ let suffix;
64
+ if (name.includes("=")) {
65
+ [name, suffix] = name.split("=", 2);
66
+ }
67
+ const specs = Object.entries(spec)
68
+ .filter(([n, s]) => "name" in s && s.name === name || ("names" in s && (s.names?.includes(name) ?? false)) || n === name);
69
+ if (specs.length < 1) {
70
+ if (ignoreUnknown) {
71
+ continue;
72
+ }
73
+ // noinspection ExceptionCaughtLocallyJS
74
+ throw new Error(`Unexpected arg: ${JSON.stringify(name)}`);
75
+ }
76
+ if (specs.length > 1) {
77
+ // noinspection ExceptionCaughtLocallyJS
78
+ throw new Error(`More than one matching spec: ${name}`);
79
+ }
80
+ [resultKey, param] = specs[0];
81
+ assertDefined(param, `param: ${name}`);
82
+ let stringValue;
83
+ if (param.type === Boolean) {
84
+ if (no) {
85
+ if (suffix != null) {
86
+ // noinspection ExceptionCaughtLocallyJS
87
+ throw new Error(`Combo of "no" plus "=" does not make any sense for ${labelForParam(param)}`);
88
+ }
89
+ stringValue = param.falseText ?? param.falses?.[0] ?? FALSES[0];
90
+ }
91
+ else {
92
+ stringValue = suffix ?? param.trueText ?? param.trues?.[0] ?? TRUES[0];
93
+ }
94
+ }
95
+ else if (no) {
96
+ // noinspection ExceptionCaughtLocallyJS
97
+ throw new Error(`"no" does not make sense for ${labelForParam(param)}`);
98
+ }
99
+ else {
100
+ stringValue = suffix ?? args.shift();
101
+ }
102
+ assertDefined(stringValue, () => `value for ${labelForParam(param)}`);
103
+ typedValue = toReturnType(stringValue, param);
104
+ }
105
+ if (param == null || resultKey == null) {
106
+ if (ignoreUnknown) {
107
+ continue;
108
+ }
109
+ // noinspection ExceptionCaughtLocallyJS
110
+ throw new Error(`Unexpected arg: ${JSON.stringify(arg)}`);
111
+ }
112
+ assertDefined(typedValue, `typedValue for ${resultKey}`);
113
+ const existing = result[resultKey];
114
+ if (param.multiple === true) {
115
+ const values = existing ?? [];
116
+ if (!Array.isArray(values)) {
117
+ // noinspection ExceptionCaughtLocallyJS
118
+ throw new Error(`Expected an array: ${resultKey}`);
119
+ }
120
+ result[resultKey] ??= values;
121
+ values.push(typedValue);
122
+ }
123
+ else {
124
+ if (existing != null) {
125
+ // noinspection ExceptionCaughtLocallyJS
126
+ throw new Error(`Too many ${labelForParam(param)}: ${JSON.stringify(existing)} ${JSON.stringify(arg)}`);
127
+ }
128
+ result[resultKey] = typedValue;
129
+ }
130
+ }
131
+ const requiredKeys = Object.entries(spec)
132
+ .filter(([, s]) => s.optional !== true)
133
+ .map(([key]) => key);
134
+ const missing = requiredKeys.filter((key) => !(key in result));
135
+ if (missing.length > 0) {
136
+ const message = missing.map((key) => labelForParam(spec[key])).join(" ");
137
+ // noinspection ExceptionCaughtLocallyJS
138
+ throw new Error(`Missing required params: ${message}`);
139
+ }
140
+ }
141
+ catch (err) {
142
+ const error = err instanceof Error ? err : new Error("Unknown error");
143
+ if (onError != null) {
144
+ onError(error);
145
+ return undefined;
146
+ }
147
+ else {
148
+ console.error(error.message);
149
+ process.exit(1);
150
+ }
151
+ }
152
+ return result;
153
+ };
154
+ //# sourceMappingURL=command-params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-params.js","sourceRoot":"","sources":["../../../ts/command-params.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../ts/common.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import { parseLocalDate } from "@rickosborne/foundation";
2
+ import { labelForParam } from "./label-for-param.js";
3
+ /**
4
+ * @internal
5
+ */
6
+ export const parseDateArg = (text, param) => {
7
+ const date = parseLocalDate(text, param);
8
+ if (param.minimum != null && date < param.minimum) {
9
+ throw new RangeError(`${labelForParam(param)}: minimum=${param.minimum.toISOString()}`);
10
+ }
11
+ if (param.maximum != null && date > param.maximum) {
12
+ throw new RangeError(`${labelForParam(param)}: maximum=${param.maximum.toISOString()}`);
13
+ }
14
+ return date;
15
+ };
16
+ /**
17
+ * @internal
18
+ */
19
+ export const isDateParam = (param) => {
20
+ return param.type === Date;
21
+ };
22
+ /**
23
+ * @internal
24
+ */
25
+ export const dateParamHandler = {
26
+ matchesParam: isDateParam,
27
+ parseArg: parseDateArg,
28
+ placeholderForParam(param) {
29
+ return param.placeholder ?? param.time ? "(datetime)" : "(date)";
30
+ },
31
+ };
32
+ //# sourceMappingURL=date-param.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-param.js","sourceRoot":"","sources":["../../../ts/date-param.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEpF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAsBrD;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,KAAuB,EAAQ,EAAE;IAC3E,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QACnD,MAAM,IAAI,UAAU,CAAC,GAAI,aAAa,CAAC,KAAK,CAAE,aAAc,KAAK,CAAC,OAAO,CAAC,WAAW,EAAG,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QACnD,MAAM,IAAI,UAAU,CAAC,GAAI,aAAa,CAAC,KAAK,CAAE,aAAc,KAAK,CAAC,OAAO,CAAC,WAAW,EAAG,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAwB,EAA6B,EAAE;IAClF,OAAO,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;AAC5B,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAyC;IACrE,YAAY,EAAE,WAAW;IACzB,QAAQ,EAAE,YAAY;IACtB,mBAAmB,CAAC,KAAuB;QAC1C,OAAO,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClE,CAAC;CACD,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { statsForFile } from "@rickosborne/term";
2
+ import * as path from "node:path";
3
+ /**
4
+ * Validate and transform the argument before it is returned.
5
+ * @internal
6
+ */
7
+ export const parseFileArg = (text, param) => {
8
+ let filePath = text;
9
+ if (param.path != null && !filePath.startsWith(param.path)) {
10
+ filePath = path.join(param.path, filePath);
11
+ }
12
+ const stats = statsForFile(filePath);
13
+ const exists = stats != null;
14
+ if (param.existing !== undefined) {
15
+ if (exists !== param.existing) {
16
+ throw new Error(`File ${exists ? "exists" : "does not exist"}: ${filePath}`);
17
+ }
18
+ }
19
+ return { filePath, stats };
20
+ };
21
+ /**
22
+ * @internal
23
+ */
24
+ export const isFileParam = (param) => {
25
+ return param.type === "file";
26
+ };
27
+ /**
28
+ * @internal
29
+ */
30
+ export const fileParamHandler = {
31
+ matchesParam: isFileParam,
32
+ parseArg: parseFileArg,
33
+ placeholderForParam(param) {
34
+ return param.placeholder ?? "(path)";
35
+ },
36
+ };
37
+ //# sourceMappingURL=file-param.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-param.js","sourceRoot":"","sources":["../../../ts/file-param.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAuClC;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,KAAuB,EAAW,EAAE;IAC9E,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,IAAI,IAAI,CAAC;IAC7B,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,MAAM,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,QAAS,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAiB,KAAM,QAAS,EAAE,CAAC,CAAC;QAClF,CAAC;IACF,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAwB,EAA6B,EAAE;IAClF,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;AAC9B,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAA4C;IACxE,YAAY,EAAE,WAAW;IACzB,QAAQ,EAAE,YAAY;IACtB,mBAAmB,CAAC,KAAuB;QAC1C,OAAO,KAAK,CAAC,WAAW,IAAI,QAAQ,CAAC;IACtC,CAAC;CACD,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { findParamHandler } from "./param-handler.js";
2
+ /**
3
+ * @internal
4
+ */
5
+ export const helpForParam = (names, param) => {
6
+ const { help } = param;
7
+ if (help == null) {
8
+ return undefined;
9
+ }
10
+ const handler = findParamHandler(param);
11
+ const placeholder = handler.placeholderForParam(param);
12
+ const lines = [];
13
+ for (const name of names.slice().sort()) {
14
+ let line = " ";
15
+ if (name.length === 1) {
16
+ line = line.concat("-", name);
17
+ }
18
+ else {
19
+ line = line.concat("--", name);
20
+ }
21
+ if (placeholder != null) {
22
+ line = line.concat(" ", placeholder);
23
+ }
24
+ lines.push(line);
25
+ }
26
+ lines.push(" ".concat(help));
27
+ return lines.join("\n");
28
+ };
29
+ //# sourceMappingURL=help-for-param.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help-for-param.js","sourceRoot":"","sources":["../../../ts/help-for-param.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAe,EAAE,KAAmB,EAAsB,EAAE;IACxF,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACvB,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;QACzC,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACP,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YACzB,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACtC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @internal
3
+ */
4
+ export const labelForParam = (param) => {
5
+ if (param.positional === true) {
6
+ return "...";
7
+ }
8
+ const names = param.names ?? param.name == null ? [] : [param.name];
9
+ return names
10
+ .map((name) => (name.length === 1 ? "-" : "--").concat(name))
11
+ .join("|");
12
+ };
13
+ //# sourceMappingURL=label-for-param.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label-for-param.js","sourceRoot":"","sources":["../../../ts/label-for-param.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAmB,EAAU,EAAE;IAC5D,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,IAAI,CAAE,CAAC;IACtE,OAAO,KAAK;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SAC5D,IAAI,CAAC,GAAG,CAAC,CAAC;AACb,CAAC,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { labelForParam } from "./label-for-param.js";
2
+ /**
3
+ * Convert a text argument to a number.
4
+ * @internal
5
+ */
6
+ export const parseNumberArg = (text, param) => {
7
+ const num = param.integer === true ? parseInt(text, param.radix) : parseFloat(text);
8
+ if (param.minimum != null && num < param.minimum) {
9
+ throw new RangeError(`${labelForParam(param)}: minimum=${param.minimum}`);
10
+ }
11
+ if (param.maximum != null && num > param.maximum) {
12
+ throw new RangeError(`${labelForParam(param)}: maximum=${param.minimum}`);
13
+ }
14
+ return parseFloat(text);
15
+ };
16
+ /**
17
+ * @internal
18
+ */
19
+ export const isNumberParam = (param) => {
20
+ return param.type === Number;
21
+ };
22
+ /**
23
+ * @internal
24
+ */
25
+ export const numberParamHandler = {
26
+ matchesParam: isNumberParam,
27
+ parseArg: parseNumberArg,
28
+ placeholderForParam(param) {
29
+ if (param.placeholder != null) {
30
+ return param.placeholder;
31
+ }
32
+ let range;
33
+ if (param.minimum != null && param.maximum != null) {
34
+ range = `:[${param.minimum},${param.maximum}]`;
35
+ }
36
+ else if (param.minimum != null) {
37
+ range = `≥${param.minimum}`;
38
+ }
39
+ else if (param.maximum != null) {
40
+ range = `≤${param.maximum}`;
41
+ }
42
+ else {
43
+ range = "";
44
+ }
45
+ if (param.integer) {
46
+ return `(int${range})`;
47
+ }
48
+ return `(number${range})`;
49
+ },
50
+ };
51
+ //# sourceMappingURL=number-param.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number-param.js","sourceRoot":"","sources":["../../../ts/number-param.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA+BrD;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,KAAyB,EAAU,EAAE;IACjF,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpF,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAClD,MAAM,IAAI,UAAU,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,aAAa,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAClD,MAAM,IAAI,UAAU,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,aAAa,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAwB,EAA+B,EAAE;IACtF,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;AAC9B,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA6C;IAC3E,YAAY,EAAE,aAAa;IAC3B,QAAQ,EAAE,cAAc;IACxB,mBAAmB,CAAC,KAAyB;QAC5C,IAAI,KAAK,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC,WAAW,CAAC;QAC1B,CAAC;QACD,IAAI,KAAa,CAAC;QAClB,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YACpD,KAAK,GAAG,KAAK,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC;QAChD,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YAClC,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC7B,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YAClC,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC7B,CAAC;aAAM,CAAC;YACP,KAAK,GAAG,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,OAAO,KAAK,GAAG,CAAC;QACxB,CAAC;QACD,OAAO,UAAU,KAAK,GAAG,CAAC;IAC3B,CAAC;CACD,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { booleanParamHandler } from "./boolean-param.js";
2
+ import { dateParamHandler } from "./date-param.js";
3
+ import { fileParamHandler } from "./file-param.js";
4
+ import { numberParamHandler } from "./number-param.js";
5
+ import { stringParamHandler } from "./string-param.js";
6
+ const paramHandlers = [
7
+ stringParamHandler,
8
+ booleanParamHandler,
9
+ numberParamHandler,
10
+ fileParamHandler,
11
+ dateParamHandler,
12
+ ];
13
+ /**
14
+ * @internal
15
+ */
16
+ export const findParamHandler = (param) => {
17
+ const paramHandler = paramHandlers.find((ph) => ph.matchesParam(param));
18
+ if (paramHandler == null) {
19
+ throw new TypeError(`Unknown parameter type: ${param.type?.toString()}`);
20
+ }
21
+ return paramHandler;
22
+ };
23
+ //# sourceMappingURL=param-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"param-handler.js","sourceRoot":"","sources":["../../../ts/param-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,aAAa,GAA+C;IACjE,kBAAkB;IAClB,mBAAmB;IACnB,kBAAkB;IAClB,gBAAgB;IAChB,gBAAgB;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAA8B,KAAQ,EAA4B,EAAE;IACnG,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAW,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAyC,CAAC;IACzH,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,SAAS,CAAC,2BAA4B,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAG,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,YAAY,CAAC;AACrB,CAAC,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Transform a string argument before returning it.
3
+ * @internal
4
+ */
5
+ export const parseStringArg = (text, param) => {
6
+ let s = text;
7
+ if (param.trim === true) {
8
+ s = s.trim();
9
+ }
10
+ return s;
11
+ };
12
+ /**
13
+ * @internal
14
+ */
15
+ export const isStringParam = (param) => {
16
+ return param.type === String || param.type == null;
17
+ };
18
+ /**
19
+ * @internal
20
+ */
21
+ export const stringParamHandler = {
22
+ matchesParam: isStringParam,
23
+ parseArg: parseStringArg,
24
+ placeholderForParam(param) {
25
+ return param.placeholder ?? "(text)";
26
+ },
27
+ };
28
+ //# sourceMappingURL=string-param.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-param.js","sourceRoot":"","sources":["../../../ts/string-param.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,KAAyB,EAAU,EAAE;IACjF,IAAI,CAAC,GAAG,IAAI,CAAC;IACb,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACzB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IACD,OAAO,CAAC,CAAC;AACV,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAwB,EAA+B,EAAE;IACtF,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC;AACpD,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA6C;IAC3E,YAAY,EAAE,aAAa;IAC3B,QAAQ,EAAE,cAAc;IACxB,mBAAmB,CAAC,KAAyB;QAC5C,OAAO,KAAK,CAAC,WAAW,IAAI,QAAQ,CAAC;IACtC,CAAC;CACD,CAAC"}
@@ -0,0 +1 @@
1
+ {"root":["../../index.ts","../../ts/boolean-param.ts","../../ts/command-params.ts","../../ts/common.ts","../../ts/date-param.ts","../../ts/file-param.ts","../../ts/help-for-param.ts","../../ts/label-for-param.ts","../../ts/number-param.ts","../../ts/param-handler.ts","../../ts/string-param.ts"],"version":"5.7.2"}