@pristine-ts/cli 2.0.17 → 2.0.18
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.
- package/dist/lib/cjs/cli.configuration-keys.js +6 -0
- package/dist/lib/cjs/cli.configuration-keys.js.map +1 -1
- package/dist/lib/cjs/cli.module.js +13 -0
- package/dist/lib/cjs/cli.module.js.map +1 -1
- package/dist/lib/cjs/errors/cli-error-code.enum.js +10 -0
- package/dist/lib/cjs/errors/cli-error-code.enum.js.map +1 -1
- package/dist/lib/cjs/interfaces/command-parameter-choice.interface.js +3 -0
- package/dist/lib/cjs/interfaces/command-parameter-choice.interface.js.map +1 -0
- package/dist/lib/cjs/interfaces/command-parameter-choices-context.interface.js +3 -0
- package/dist/lib/cjs/interfaces/command-parameter-choices-context.interface.js.map +1 -0
- package/dist/lib/cjs/interfaces/command-parameter-choices-provider.interface.js +3 -0
- package/dist/lib/cjs/interfaces/command-parameter-choices-provider.interface.js.map +1 -0
- package/dist/lib/cjs/interfaces/interfaces.js +3 -0
- package/dist/lib/cjs/interfaces/interfaces.js.map +1 -1
- package/dist/lib/cjs/reporters/cli-error.reporter.js +11 -3
- package/dist/lib/cjs/reporters/cli-error.reporter.js.map +1 -1
- package/dist/lib/cjs/services/command-argument-error-formatter.js +146 -0
- package/dist/lib/cjs/services/command-argument-error-formatter.js.map +1 -0
- package/dist/lib/cjs/services/command-argument-resolver.js +1 -1
- package/dist/lib/cjs/services/command-argument-resolver.js.map +1 -1
- package/dist/lib/cjs/services/command-options-resolver.js +30 -37
- package/dist/lib/cjs/services/command-options-resolver.js.map +1 -1
- package/dist/lib/cjs/services/command-parameter-prompter.js +118 -38
- package/dist/lib/cjs/services/command-parameter-prompter.js.map +1 -1
- package/dist/lib/cjs/services/command-usage-renderer.js +81 -0
- package/dist/lib/cjs/services/command-usage-renderer.js.map +1 -0
- package/dist/lib/cjs/services/program-name-resolver.js +98 -0
- package/dist/lib/cjs/services/program-name-resolver.js.map +1 -0
- package/dist/lib/cjs/services/services.js +3 -0
- package/dist/lib/cjs/services/services.js.map +1 -1
- package/dist/lib/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/lib/cjs/types/command-parameter-choices-list.type.js +3 -0
- package/dist/lib/cjs/types/command-parameter-choices-list.type.js.map +1 -0
- package/dist/lib/cjs/types/command-parameter-choices-resolver.type.js +3 -0
- package/dist/lib/cjs/types/command-parameter-choices-resolver.type.js.map +1 -0
- package/dist/lib/cjs/types/command-parameter-choices.type.js +3 -0
- package/dist/lib/cjs/types/command-parameter-choices.type.js.map +1 -0
- package/dist/lib/cjs/types/types.js +3 -0
- package/dist/lib/cjs/types/types.js.map +1 -1
- package/dist/lib/esm/cli.configuration-keys.js +6 -0
- package/dist/lib/esm/cli.configuration-keys.js.map +1 -1
- package/dist/lib/esm/cli.module.js +13 -0
- package/dist/lib/esm/cli.module.js.map +1 -1
- package/dist/lib/esm/errors/cli-error-code.enum.js +10 -0
- package/dist/lib/esm/errors/cli-error-code.enum.js.map +1 -1
- package/dist/lib/esm/interfaces/command-parameter-choice.interface.js +2 -0
- package/dist/lib/esm/interfaces/command-parameter-choice.interface.js.map +1 -0
- package/dist/lib/esm/interfaces/command-parameter-choices-context.interface.js +2 -0
- package/dist/lib/esm/interfaces/command-parameter-choices-context.interface.js.map +1 -0
- package/dist/lib/esm/interfaces/command-parameter-choices-provider.interface.js +2 -0
- package/dist/lib/esm/interfaces/command-parameter-choices-provider.interface.js.map +1 -0
- package/dist/lib/esm/interfaces/interfaces.js +3 -0
- package/dist/lib/esm/interfaces/interfaces.js.map +1 -1
- package/dist/lib/esm/reporters/cli-error.reporter.js +11 -3
- package/dist/lib/esm/reporters/cli-error.reporter.js.map +1 -1
- package/dist/lib/esm/services/command-argument-error-formatter.js +143 -0
- package/dist/lib/esm/services/command-argument-error-formatter.js.map +1 -0
- package/dist/lib/esm/services/command-argument-resolver.js +1 -1
- package/dist/lib/esm/services/command-argument-resolver.js.map +1 -1
- package/dist/lib/esm/services/command-options-resolver.js +31 -38
- package/dist/lib/esm/services/command-options-resolver.js.map +1 -1
- package/dist/lib/esm/services/command-parameter-prompter.js +120 -40
- package/dist/lib/esm/services/command-parameter-prompter.js.map +1 -1
- package/dist/lib/esm/services/command-usage-renderer.js +78 -0
- package/dist/lib/esm/services/command-usage-renderer.js.map +1 -0
- package/dist/lib/esm/services/program-name-resolver.js +62 -0
- package/dist/lib/esm/services/program-name-resolver.js.map +1 -0
- package/dist/lib/esm/services/services.js +3 -0
- package/dist/lib/esm/services/services.js.map +1 -1
- package/dist/lib/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/lib/esm/types/command-parameter-choices-list.type.js +2 -0
- package/dist/lib/esm/types/command-parameter-choices-list.type.js.map +1 -0
- package/dist/lib/esm/types/command-parameter-choices-resolver.type.js +2 -0
- package/dist/lib/esm/types/command-parameter-choices-resolver.type.js.map +1 -0
- package/dist/lib/esm/types/command-parameter-choices.type.js +2 -0
- package/dist/lib/esm/types/command-parameter-choices.type.js.map +1 -0
- package/dist/lib/esm/types/types.js +3 -0
- package/dist/lib/esm/types/types.js.map +1 -1
- package/dist/types/cli.configuration-keys.d.ts +7 -0
- package/dist/types/errors/cli-error-code.enum.d.ts +10 -0
- package/dist/types/interfaces/command-parameter-choice.interface.d.ts +14 -0
- package/dist/types/interfaces/command-parameter-choices-context.interface.d.ts +17 -0
- package/dist/types/interfaces/command-parameter-choices-provider.interface.d.ts +20 -0
- package/dist/types/interfaces/interfaces.d.ts +3 -0
- package/dist/types/options/command-parameter.options.d.ts +30 -0
- package/dist/types/services/command-argument-error-formatter.d.ts +64 -0
- package/dist/types/services/command-options-resolver.d.ts +23 -13
- package/dist/types/services/command-parameter-prompter.d.ts +60 -31
- package/dist/types/services/command-usage-renderer.d.ts +35 -0
- package/dist/types/services/program-name-resolver.d.ts +21 -0
- package/dist/types/services/services.d.ts +3 -0
- package/dist/types/types/command-parameter-choices-list.type.d.ts +6 -0
- package/dist/types/types/command-parameter-choices-resolver.type.d.ts +9 -0
- package/dist/types/types/command-parameter-choices.type.d.ts +19 -0
- package/dist/types/types/types.d.ts +3 -0
- package/package.json +12 -12
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-parameter-choices-list.type.js","sourceRoot":"","sources":["../../../../src/types/command-parameter-choices-list.type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-parameter-choices-resolver.type.js","sourceRoot":"","sources":["../../../../src/types/command-parameter-choices-resolver.type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-parameter-choices.type.js","sourceRoot":"","sources":["../../../../src/types/command-parameter-choices.type.ts"],"names":[],"mappings":""}
|
|
@@ -16,5 +16,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./command-event.type"), exports);
|
|
18
18
|
__exportStar(require("./command-event-response.type"), exports);
|
|
19
|
+
__exportStar(require("./command-parameter-choices-list.type"), exports);
|
|
20
|
+
__exportStar(require("./command-parameter-choices-resolver.type"), exports);
|
|
21
|
+
__exportStar(require("./command-parameter-choices.type"), exports);
|
|
19
22
|
__exportStar(require("./start-repl-event-response.type"), exports);
|
|
20
23
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/types/types.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,gEAA8C;AAC9C,mEAAiD"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/types/types.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,gEAA8C;AAC9C,wEAAsD;AACtD,4EAA0D;AAC1D,mEAAiD;AACjD,mEAAiD"}
|
|
@@ -17,5 +17,11 @@ export const CliConfigurationKeys = {
|
|
|
17
17
|
* input is not an interactive terminal, regardless of this value.
|
|
18
18
|
*/
|
|
19
19
|
InteractiveParameters: "pristine.cli.interactiveParameters",
|
|
20
|
+
/**
|
|
21
|
+
* Explicit program name shown in generated `Usage:` lines (e.g. `myapp`). Optional: when unset,
|
|
22
|
+
* the CLI derives the name from `argv[1]`, falling back to `pristine`. Set it for launch shapes
|
|
23
|
+
* where `argv[1]` isn't the friendly name (e.g. `node dist/bin/cli.cjs`).
|
|
24
|
+
*/
|
|
25
|
+
BinName: "pristine.cli.binName",
|
|
20
26
|
};
|
|
21
27
|
//# sourceMappingURL=cli.configuration-keys.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.configuration-keys.js","sourceRoot":"","sources":["../../../src/cli.configuration-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC;;;;;OAKG;IACH,qBAAqB,EAAE,oCAAoC;
|
|
1
|
+
{"version":3,"file":"cli.configuration-keys.js","sourceRoot":"","sources":["../../../src/cli.configuration-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC;;;;;OAKG;IACH,qBAAqB,EAAE,oCAAoC;IAE3D;;;;OAIG;IACH,OAAO,EAAE,sBAAsB;CACvB,CAAC"}
|
|
@@ -44,6 +44,19 @@ export const CliModule = {
|
|
|
44
44
|
new BooleanResolver(new EnvironmentVariableResolver("PRISTINE_CLI_INTERACTIVE_PARAMETERS")),
|
|
45
45
|
],
|
|
46
46
|
},
|
|
47
|
+
/**
|
|
48
|
+
* Program name shown in generated `Usage:` lines. Defaults to empty so `ProgramNameResolver`
|
|
49
|
+
* falls back to `basename(argv[1])` (then `pristine`); set it (here, in `pristine.config.ts`,
|
|
50
|
+
* or via the env var) to force a name.
|
|
51
|
+
*/
|
|
52
|
+
{
|
|
53
|
+
parameterName: CliConfigurationKeys.BinName,
|
|
54
|
+
isRequired: false,
|
|
55
|
+
defaultValue: "",
|
|
56
|
+
defaultResolvers: [
|
|
57
|
+
new EnvironmentVariableResolver("PRISTINE_CLI_BIN_NAME"),
|
|
58
|
+
],
|
|
59
|
+
},
|
|
47
60
|
],
|
|
48
61
|
importModules: [
|
|
49
62
|
CoreModule,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.module.js","sourceRoot":"","sources":["../../../src/cli.module.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAC,gBAAgB,EAAC,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAC,aAAa,EAAE,oBAAoB,EAAE,cAAc,EAAE,YAAY,EAAC,MAAM,sBAAsB,CAAC;AACvG,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAC,mBAAmB,EAAC,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAC,eAAe,EAAE,2BAA2B,EAAC,MAAM,4BAA4B,CAAC;AACxF,OAAO,EAAC,oBAAoB,EAAC,MAAM,0BAA0B,CAAC;AAE9D,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAE9B,yFAAyF;AACzF,yFAAyF;AACzF,mFAAmF;AACnF,oFAAoF;AACpF,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,SAAS,GAAoB;IACxC,OAAO,EAAE,gBAAgB;IACzB,wBAAwB,EAAE;QACxB;;;;;WAKG;QACH;YACE,aAAa,EAAE,oBAAoB,CAAC,qBAAqB;YACzD,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI;YAClB,gBAAgB,EAAE;gBAChB,IAAI,eAAe,CAAC,IAAI,2BAA2B,CAAC,qCAAqC,CAAC,CAAC;aAC5F;SACF;KACF;IACD,aAAa,EAAE;QACb,UAAU;QACV,iBAAiB;QACjB,aAAa;QACb,qFAAqF;QACrF,iFAAiF;QACjF,mFAAmF;QACnF,qFAAqF;QACrF,0FAA0F;QAC1F,mBAAmB;QACnB,gBAAgB;KACjB;IACD;;;;;;;;;;;;;;;;OAgBG;IACH,cAAc,EAAE;QACd,CAAC,oBAAoB,GAAG,0BAA0B,CAAC,EAAE,cAAc,CAAC,MAAM;QAC1E,CAAC,oBAAoB,GAAG,gCAAgC,CAAC,EAAE,YAAY,CAAC,IAAI;KAC7E;CACF,CAAA"}
|
|
1
|
+
{"version":3,"file":"cli.module.js","sourceRoot":"","sources":["../../../src/cli.module.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAC,gBAAgB,EAAC,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAC,aAAa,EAAE,oBAAoB,EAAE,cAAc,EAAE,YAAY,EAAC,MAAM,sBAAsB,CAAC;AACvG,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAC,mBAAmB,EAAC,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAC,eAAe,EAAE,2BAA2B,EAAC,MAAM,4BAA4B,CAAC;AACxF,OAAO,EAAC,oBAAoB,EAAC,MAAM,0BAA0B,CAAC;AAE9D,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAE9B,yFAAyF;AACzF,yFAAyF;AACzF,mFAAmF;AACnF,oFAAoF;AACpF,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,SAAS,GAAoB;IACxC,OAAO,EAAE,gBAAgB;IACzB,wBAAwB,EAAE;QACxB;;;;;WAKG;QACH;YACE,aAAa,EAAE,oBAAoB,CAAC,qBAAqB;YACzD,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI;YAClB,gBAAgB,EAAE;gBAChB,IAAI,eAAe,CAAC,IAAI,2BAA2B,CAAC,qCAAqC,CAAC,CAAC;aAC5F;SACF;QACD;;;;WAIG;QACH;YACE,aAAa,EAAE,oBAAoB,CAAC,OAAO;YAC3C,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,EAAE;YAChB,gBAAgB,EAAE;gBAChB,IAAI,2BAA2B,CAAC,uBAAuB,CAAC;aACzD;SACF;KACF;IACD,aAAa,EAAE;QACb,UAAU;QACV,iBAAiB;QACjB,aAAa;QACb,qFAAqF;QACrF,iFAAiF;QACjF,mFAAmF;QACnF,qFAAqF;QACrF,0FAA0F;QAC1F,mBAAmB;QACnB,gBAAgB;KACjB;IACD;;;;;;;;;;;;;;;;OAgBG;IACH,cAAc,EAAE;QACd,CAAC,oBAAoB,GAAG,0BAA0B,CAAC,EAAE,cAAc,CAAC,MAAM;QAC1E,CAAC,oBAAoB,GAAG,gCAAgC,CAAC,EAAE,YAAY,CAAC,IAAI;KAC7E;CACF,CAAA"}
|
|
@@ -10,6 +10,16 @@ export var CliErrorCode;
|
|
|
10
10
|
CliErrorCode["CommandNotFound"] = "COMMAND_NOT_FOUND";
|
|
11
11
|
CliErrorCode["ArgumentMappingFailed"] = "ARGUMENT_MAPPING_FAILED";
|
|
12
12
|
CliErrorCode["ArgumentValidationFailed"] = "ARGUMENT_VALIDATION_FAILED";
|
|
13
|
+
/**
|
|
14
|
+
* A required command-line argument was missing. Reported with the command's `Usage:` synopsis
|
|
15
|
+
* (exit 64). Distinct from a value supplied but invalid (`InvalidArgument`).
|
|
16
|
+
*/
|
|
17
|
+
CliErrorCode["MissingRequiredArgument"] = "MISSING_REQUIRED_ARGUMENT";
|
|
18
|
+
/**
|
|
19
|
+
* A supplied command-line argument failed validation. Reported as a clean
|
|
20
|
+
* `Invalid <flag> '<value>'. …` line (exit 64).
|
|
21
|
+
*/
|
|
22
|
+
CliErrorCode["InvalidArgument"] = "INVALID_ARGUMENT";
|
|
13
23
|
/**
|
|
14
24
|
* Two `@commandParameter` properties on the same options class resolve to the same flag.
|
|
15
25
|
* A programming error in the command's options definition, not bad user input.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-error-code.enum.js","sourceRoot":"","sources":["../../../../src/errors/cli-error-code.enum.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"cli-error-code.enum.js","sourceRoot":"","sources":["../../../../src/errors/cli-error-code.enum.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAN,IAAY,YA4BX;AA5BD,WAAY,YAAY;IACtB,qDAA8C,CAAA;IAC9C,iEAAoD,CAAA;IACpD,uEAAuD,CAAA;IAEvD;;;OAGG;IACH,qEAAqD,CAAA;IAErD;;;OAGG;IACH,oDAAoC,CAAA;IAEpC;;;OAGG;IACH,gFAAgE,CAAA;IAEhE;;;OAGG;IACH,oDAAoC,CAAA;AACtC,CAAC,EA5BW,YAAY,KAAZ,YAAY,QA4BvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-parameter-choice.interface.js","sourceRoot":"","sources":["../../../../src/interfaces/command-parameter-choice.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-parameter-choices-context.interface.js","sourceRoot":"","sources":["../../../../src/interfaces/command-parameter-choices-context.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-parameter-choices-provider.interface.js","sourceRoot":"","sources":["../../../../src/interfaces/command-parameter-choices-provider.interface.ts"],"names":[],"mappings":""}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
export * from "./command.interface";
|
|
2
|
+
export * from "./command-parameter-choice.interface";
|
|
3
|
+
export * from "./command-parameter-choices-context.interface";
|
|
4
|
+
export * from "./command-parameter-choices-provider.interface";
|
|
2
5
|
export * from "./terminal-key.interface";
|
|
3
6
|
//# sourceMappingURL=interfaces.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../src/interfaces/interfaces.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../src/interfaces/interfaces.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,sCAAsC,CAAC;AACrD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,0BAA0B,CAAC"}
|
|
@@ -47,14 +47,22 @@ let CliErrorReporter = class CliErrorReporter {
|
|
|
47
47
|
* `process.exit`. The bin script wraps `bootstrap().catch(err => process.exit(reporter.report(err)))`.
|
|
48
48
|
*/
|
|
49
49
|
report(error) {
|
|
50
|
-
var _a, _b;
|
|
50
|
+
var _a, _b, _c;
|
|
51
51
|
const e = PristineError.from(error);
|
|
52
52
|
const isDev = this.environmentManager.getEnvironment() === PristineEnvironment.Development;
|
|
53
53
|
const isUserError = e.options.kind !== PristineErrorKind.SystemError;
|
|
54
|
+
// Plain mode: the message is already a fully formatted, user-facing block (a command's
|
|
55
|
+
// `Usage:` synopsis, an `Invalid <flag> …` line). Print it verbatim — no `✗ CODE:` envelope,
|
|
56
|
+
// no `details` rendering — and return its exit code. Honored for user errors only; a
|
|
57
|
+
// SystemError is never surfaced verbatim in production.
|
|
58
|
+
if (e.options.plain === true && isUserError) {
|
|
59
|
+
this.write(`${e.message}\n`);
|
|
60
|
+
return (_a = e.options.exitCode) !== null && _a !== void 0 ? _a : ExitCode.Error;
|
|
61
|
+
}
|
|
54
62
|
// Headline: in production, system errors get a generic message so we don't dump
|
|
55
63
|
// internal-bug messages to the user. User errors always show their own message.
|
|
56
64
|
const headline = isUserError || isDev ? e.message : "Internal Error";
|
|
57
|
-
const code = (
|
|
65
|
+
const code = (_b = e.options.code) !== null && _b !== void 0 ? _b : "ERROR";
|
|
58
66
|
this.write(`✗ ${code}: ${headline}\n`);
|
|
59
67
|
// Details: per-error-class structured fields. Surfaced for user errors always, for
|
|
60
68
|
// system errors only in dev (helps debugging without leaking in prod CI logs).
|
|
@@ -81,7 +89,7 @@ let CliErrorReporter = class CliErrorReporter {
|
|
|
81
89
|
}
|
|
82
90
|
// Exit code fallback: ExitCode.Error (1) for user errors, ExitCode.Software (70)
|
|
83
91
|
// for system errors. Both follow sysexits.h conventions.
|
|
84
|
-
return (
|
|
92
|
+
return (_c = e.options.exitCode) !== null && _c !== void 0 ? _c : (isUserError ? ExitCode.Error : ExitCode.Software);
|
|
85
93
|
}
|
|
86
94
|
/**
|
|
87
95
|
* Wraps `process.stderr.write` so a broken stderr (closed pipe, etc.) doesn't itself
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-error.reporter.js","sourceRoot":"","sources":["../../../../src/reporters/cli-error.reporter.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli-error.reporter.js","sourceRoot":"","sources":["../../../../src/reporters/cli-error.reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var CommandArgumentErrorFormatter_1;
|
|
11
|
+
import { injectable } from "tsyringe";
|
|
12
|
+
import { moduleScoped, UsageError } from "@pristine-ts/common";
|
|
13
|
+
import { PropertyMetadata } from "@pristine-ts/metadata";
|
|
14
|
+
import { CliModuleKeyname } from "../cli.module.keyname";
|
|
15
|
+
import { CliDecoratorMetadataKeynameEnum } from "../enums/cli-decorator-metadata-keyname.enum";
|
|
16
|
+
import { CliErrorCode } from "../errors/cli-error-code.enum";
|
|
17
|
+
import { CommandUsageRenderer } from "./command-usage-renderer";
|
|
18
|
+
/**
|
|
19
|
+
* Turns `@pristine-ts/class-validator`'s raw per-property validation output into a single,
|
|
20
|
+
* clean, user-facing `UsageError` (exit 64, rendered verbatim via `options.plain`) instead of
|
|
21
|
+
* a `[CONSTRAINT_KEY]`-prefixed dump:
|
|
22
|
+
*
|
|
23
|
+
* - if any *required* parameter is missing → the command's `Usage:` synopsis, so the user
|
|
24
|
+
* sees what to pass (and not a wall of "is not a string" noise for an absent value);
|
|
25
|
+
* - otherwise (values present but invalid) → one line per offending value: the parameter's
|
|
26
|
+
* `errorMessage` (verbatim, `%value%`/`%flag%` filled), or a generated
|
|
27
|
+
* `Invalid <flag> '<value>'. <validator message>` with the constraint-key prefix and
|
|
28
|
+
* definedness noise stripped.
|
|
29
|
+
*
|
|
30
|
+
* Returns the error rather than throwing it, so the resolver keeps the `throw` (clean control
|
|
31
|
+
* flow) and tests can assert on the built error directly.
|
|
32
|
+
*/
|
|
33
|
+
let CommandArgumentErrorFormatter = CommandArgumentErrorFormatter_1 = class CommandArgumentErrorFormatter {
|
|
34
|
+
constructor(usageRenderer) {
|
|
35
|
+
this.usageRenderer = usageRenderer;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Builds the `UsageError` for a set of validation errors. `mapped` is the (failed) options
|
|
39
|
+
* instance — read to get each property's effective value and to tell "missing" (undefined /
|
|
40
|
+
* empty) from "present but invalid".
|
|
41
|
+
*/
|
|
42
|
+
buildValidationError(optionsType, mapped, validationErrors, context) {
|
|
43
|
+
const missing = validationErrors.filter((error) => this.isMissing(mapped[error.property]));
|
|
44
|
+
if (missing.length > 0) {
|
|
45
|
+
return new UsageError(this.usageRenderer.render(optionsType, context.commandName, context.binName), {
|
|
46
|
+
code: CliErrorCode.MissingRequiredArgument,
|
|
47
|
+
plain: true,
|
|
48
|
+
details: { missing: missing.map((error) => this.flagFor(optionsType, error.property)).join(", ") },
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
const lines = validationErrors.map((error) => this.invalidLine(optionsType, mapped, error));
|
|
52
|
+
return new UsageError(lines.join("\n"), {
|
|
53
|
+
code: CliErrorCode.InvalidArgument,
|
|
54
|
+
plain: true,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/** A value counts as "missing" when it never arrived — undefined/null or an empty string. */
|
|
58
|
+
isMissing(value) {
|
|
59
|
+
return value === undefined || value === null || value === "";
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* One line for an offending value. A parameter's `errorMessage` is the *entire* line, used
|
|
63
|
+
* verbatim (with `%value%`/`%flag%` filled); otherwise we generate
|
|
64
|
+
* `Invalid <flag> '<value>'. <validator message>`. Sensitive parameters never echo the value
|
|
65
|
+
* (it is `<hidden>`, even inside a custom template).
|
|
66
|
+
* @private
|
|
67
|
+
*/
|
|
68
|
+
invalidLine(optionsType, mapped, error) {
|
|
69
|
+
var _a;
|
|
70
|
+
const options = this.optionsFor(optionsType, error.property);
|
|
71
|
+
const flag = (_a = options === null || options === void 0 ? void 0 : options.flag) !== null && _a !== void 0 ? _a : error.property;
|
|
72
|
+
const sensitive = (options === null || options === void 0 ? void 0 : options.sensitive) === true;
|
|
73
|
+
const value = sensitive ? "<hidden>" : String(mapped[error.property]);
|
|
74
|
+
if (options === null || options === void 0 ? void 0 : options.errorMessage) {
|
|
75
|
+
return options.errorMessage.replace(/%value%/g, value).replace(/%flag%/g, flag);
|
|
76
|
+
}
|
|
77
|
+
const reason = this.validatorMessage(error);
|
|
78
|
+
return sensitive ? `Invalid ${flag}. ${reason}` : `Invalid ${flag} '${value}'. ${reason}`;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The validator's own message for a present-but-invalid value: the first *semantic* constraint
|
|
82
|
+
* message (definedness noise dropped), falling back to the first message present.
|
|
83
|
+
* @private
|
|
84
|
+
*/
|
|
85
|
+
validatorMessage(error) {
|
|
86
|
+
var _a, _b;
|
|
87
|
+
const messages = this.constraintMessages(error);
|
|
88
|
+
return (_b = (_a = messages.semantic) !== null && _a !== void 0 ? _a : messages.fallback) !== null && _b !== void 0 ? _b : "Invalid value.";
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Splits an error's constraint messages into the first *semantic* one (not a definedness
|
|
92
|
+
* constraint) and a plain first-seen fallback. Reads `@pristine-ts/class-validator`'s
|
|
93
|
+
* `{keyname, message}` constraint objects defensively.
|
|
94
|
+
* @private
|
|
95
|
+
*/
|
|
96
|
+
constraintMessages(error) {
|
|
97
|
+
let semantic;
|
|
98
|
+
let fallback;
|
|
99
|
+
for (const keyname in error.constraints) {
|
|
100
|
+
const message = this.extractMessage(error.constraints[keyname]);
|
|
101
|
+
if (message === undefined) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (fallback === undefined) {
|
|
105
|
+
fallback = message;
|
|
106
|
+
}
|
|
107
|
+
if (semantic === undefined && CommandArgumentErrorFormatter_1.DefinednessConstraints.has(keyname.toUpperCase()) === false) {
|
|
108
|
+
semantic = message;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return { semantic, fallback };
|
|
112
|
+
}
|
|
113
|
+
/** Pulls the human message out of a `{keyname, message}` constraint (or a bare string). */
|
|
114
|
+
extractMessage(constraint) {
|
|
115
|
+
if (typeof constraint === "string") {
|
|
116
|
+
return constraint;
|
|
117
|
+
}
|
|
118
|
+
if (constraint && typeof constraint === "object" && typeof constraint.message === "string") {
|
|
119
|
+
return constraint.message;
|
|
120
|
+
}
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
optionsFor(optionsType, propertyKey) {
|
|
124
|
+
return PropertyMetadata.getMetadata(optionsType.prototype, propertyKey, CliDecoratorMetadataKeynameEnum.CommandParameter);
|
|
125
|
+
}
|
|
126
|
+
flagFor(optionsType, propertyKey) {
|
|
127
|
+
var _a, _b;
|
|
128
|
+
return (_b = (_a = this.optionsFor(optionsType, propertyKey)) === null || _a === void 0 ? void 0 : _a.flag) !== null && _b !== void 0 ? _b : propertyKey;
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Constraint keynames that only trip because a value is *absent*. For a present-but-invalid
|
|
133
|
+
* value these never fire, so we drop them and surface the semantic constraint (e.g.
|
|
134
|
+
* `MATCHES`) the user actually needs — never "is not a string" for a value they gave.
|
|
135
|
+
*/
|
|
136
|
+
CommandArgumentErrorFormatter.DefinednessConstraints = new Set(["IS_DEFINED", "IS_NOT_EMPTY", "IS_STRING"]);
|
|
137
|
+
CommandArgumentErrorFormatter = CommandArgumentErrorFormatter_1 = __decorate([
|
|
138
|
+
injectable(),
|
|
139
|
+
moduleScoped(CliModuleKeyname),
|
|
140
|
+
__metadata("design:paramtypes", [CommandUsageRenderer])
|
|
141
|
+
], CommandArgumentErrorFormatter);
|
|
142
|
+
export { CommandArgumentErrorFormatter };
|
|
143
|
+
//# sourceMappingURL=command-argument-error-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-argument-error-formatter.js","sourceRoot":"","sources":["../../../../src/services/command-argument-error-formatter.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,UAAU,CAAC;AAEpC,OAAO,EAAC,YAAY,EAAE,UAAU,EAAC,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAC,+BAA+B,EAAC,MAAM,8CAA8C,CAAC;AAE7F,OAAO,EAAC,YAAY,EAAC,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAC,oBAAoB,EAAC,MAAM,0BAA0B,CAAC;AAE9D;;;;;;;;;;;;;;GAcG;AAGI,IAAM,6BAA6B,qCAAnC,MAAM,6BAA6B;IAQxC,YACmB,aAAmC;QAAnC,kBAAa,GAAb,aAAa,CAAsB;IAEtD,CAAC;IAED;;;;OAIG;IACH,oBAAoB,CAClB,WAAkC,EAClC,MAA2B,EAC3B,gBAAuB,EACvB,OAA+C;QAE/C,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC3F,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;gBAClG,IAAI,EAAE,YAAY,CAAC,uBAAuB;gBAC1C,KAAK,EAAE,IAAI;gBACX,OAAO,EAAE,EAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAC;aACjG,CAAC,CAAC;QACL,CAAC;QAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5F,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACtC,IAAI,EAAE,YAAY,CAAC,eAAe;YAClC,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;IACL,CAAC;IAED,6FAA6F;IACrF,SAAS,CAAC,KAAU;QAC1B,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;IAC/D,CAAC;IAED;;;;;;OAMG;IACK,WAAW,CAAC,WAAkC,EAAE,MAA2B,EAAE,KAAU;;QAC7F,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,mCAAI,KAAK,CAAC,QAAQ,CAAC;QAC7C,MAAM,SAAS,GAAG,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,MAAK,IAAI,CAAC;QAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEtE,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAAY,EAAE,CAAC;YAC1B,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC5C,OAAO,SAAS,CAAC,CAAC,CAAC,WAAW,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,KAAK,KAAK,MAAM,MAAM,EAAE,CAAC;IAC5F,CAAC;IAED;;;;OAIG;IACK,gBAAgB,CAAC,KAAU;;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAChD,OAAO,MAAA,MAAA,QAAQ,CAAC,QAAQ,mCAAI,QAAQ,CAAC,QAAQ,mCAAI,gBAAgB,CAAC;IACpE,CAAC;IAED;;;;;OAKG;IACK,kBAAkB,CAAC,KAAU;QACnC,IAAI,QAA4B,CAAC;QACjC,IAAI,QAA4B,CAAC;QAEjC,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YAChE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,SAAS;YACX,CAAC;YACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,QAAQ,GAAG,OAAO,CAAC;YACrB,CAAC;YACD,IAAI,QAAQ,KAAK,SAAS,IAAI,+BAA6B,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;gBACxH,QAAQ,GAAG,OAAO,CAAC;YACrB,CAAC;QACH,CAAC;QAED,OAAO,EAAC,QAAQ,EAAE,QAAQ,EAAC,CAAC;IAC9B,CAAC;IAED,2FAA2F;IACnF,cAAc,CAAC,UAAe;QACpC,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YACnC,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC3F,OAAO,UAAU,CAAC,OAAO,CAAC;QAC5B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,UAAU,CAAC,WAAkC,EAAE,WAAmB;QACxE,OAAO,gBAAgB,CAAC,WAAW,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,EAAE,+BAA+B,CAAC,gBAAgB,CAAC,CAAC;IAC5H,CAAC;IAEO,OAAO,CAAC,WAAkC,EAAE,WAAmB;;QACrE,OAAO,MAAA,MAAA,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,WAAW,CAAC,0CAAE,IAAI,mCAAI,WAAW,CAAC;IACxE,CAAC;;AAtHD;;;;GAIG;AACqB,oDAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC,AAAvD,CAAwD;AAN3F,6BAA6B;IAFzC,UAAU,EAAE;IACZ,YAAY,CAAC,gBAAgB,CAAC;qCAUK,oBAAoB;GAT3C,6BAA6B,CAwHzC"}
|
|
@@ -46,7 +46,7 @@ let CommandArgumentResolver = class CommandArgumentResolver {
|
|
|
46
46
|
if (command.optionsType === null) {
|
|
47
47
|
return rawArgs;
|
|
48
48
|
}
|
|
49
|
-
return this.commandOptionsResolver.resolve(command.optionsType, rawArgs);
|
|
49
|
+
return this.commandOptionsResolver.resolve(command.optionsType, rawArgs, { commandName: command.name });
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
52
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-argument-resolver.js","sourceRoot":"","sources":["../../../../src/services/command-argument-resolver.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,UAAU,CAAC;AACpC,OAAO,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAC,sBAAsB,EAAC,MAAM,4BAA4B,CAAC;AAElE;;;;;;;;;;GAUG;AAGI,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAClC,YACmB,sBAA8C;QAA9C,2BAAsB,GAAtB,sBAAsB,CAAwB;IAEjE,CAAC;IAED;;;;;OAKG;IACG,OAAO,CAAC,OAA8B,EAAE,OAAY;;YACxD,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;gBACjC,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,OAAO,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"command-argument-resolver.js","sourceRoot":"","sources":["../../../../src/services/command-argument-resolver.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,UAAU,CAAC;AACpC,OAAO,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAC,sBAAsB,EAAC,MAAM,4BAA4B,CAAC;AAElE;;;;;;;;;;GAUG;AAGI,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAClC,YACmB,sBAA8C;QAA9C,2BAAsB,GAAtB,sBAAsB,CAAwB;IAEjE,CAAC;IAED;;;;;OAKG;IACG,OAAO,CAAC,OAA8B,EAAE,OAAY;;YACxD,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;gBACjC,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,OAAO,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,EAAE,EAAC,WAAW,EAAE,OAAO,CAAC,IAAI,EAAC,CAAC,CAAC;QACxG,CAAC;KAAA;CACF,CAAA;AAlBY,uBAAuB;IAFnC,UAAU,EAAE;IACZ,YAAY,CAAC,gBAAgB,CAAC;qCAGc,sBAAsB;GAFtD,uBAAuB,CAkBnC"}
|
|
@@ -17,21 +17,23 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
17
17
|
});
|
|
18
18
|
};
|
|
19
19
|
import { injectable } from "tsyringe";
|
|
20
|
-
import { moduleScoped, UsageError
|
|
20
|
+
import { moduleScoped, UsageError } from "@pristine-ts/common";
|
|
21
21
|
import { Validator } from "@pristine-ts/class-validator";
|
|
22
22
|
import { AutoDataMappingBuilderOptions, DataMapper } from "@pristine-ts/data-mapping";
|
|
23
23
|
import { CliModuleKeyname } from "../cli.module.keyname";
|
|
24
24
|
import { CliErrorCode } from "../errors/cli-error-code.enum";
|
|
25
25
|
import { CommandParameterPrompter } from "./command-parameter-prompter";
|
|
26
|
+
import { CommandArgumentErrorFormatter } from "./command-argument-error-formatter";
|
|
27
|
+
import { ProgramNameResolver } from "./program-name-resolver";
|
|
26
28
|
/**
|
|
27
29
|
* Resolves a typed, validated options instance from raw arguments: it fills any missing
|
|
28
|
-
* `@commandParameter` values by prompting, maps the result onto a real `optionsType`
|
|
29
|
-
*
|
|
30
|
-
*
|
|
30
|
+
* `@commandParameter` values by prompting, maps the result onto a real `optionsType` instance
|
|
31
|
+
* (prototype + decorator metadata intact, so `class-validator` finds its rules), and validates
|
|
32
|
+
* it.
|
|
31
33
|
*
|
|
32
|
-
* This is the reusable core behind command dispatch — `CommandArgumentResolver` delegates
|
|
33
|
-
*
|
|
34
|
-
*
|
|
34
|
+
* This is the reusable core behind command dispatch — `CommandArgumentResolver` delegates here
|
|
35
|
+
* — exposed so commands and dynamic flows can fill an options class from prompts on demand,
|
|
36
|
+
* including ones not tied to a registered command:
|
|
35
37
|
*
|
|
36
38
|
* ```ts
|
|
37
39
|
* constructor(private readonly optionsResolver: CommandOptionsResolver) {}
|
|
@@ -39,22 +41,29 @@ import { CommandParameterPrompter } from "./command-parameter-prompter";
|
|
|
39
41
|
* const options = await this.optionsResolver.resolve(MyOptions, {region: "us"});
|
|
40
42
|
* ```
|
|
41
43
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
+
* Argument problems throw a `UsageError` (exit 64): mapping failures directly, and validation
|
|
45
|
+
* failures via `CommandArgumentErrorFormatter`, which renders a clean `Usage:` synopsis (for a
|
|
46
|
+
* missing required value) or `Invalid <flag> '<value>'. …` lines (for a supplied-but-invalid
|
|
47
|
+
* value) rather than a raw constraint dump.
|
|
44
48
|
*/
|
|
45
49
|
let CommandOptionsResolver = class CommandOptionsResolver {
|
|
46
|
-
constructor(validator, dataMapper, commandParameterPrompter) {
|
|
50
|
+
constructor(validator, dataMapper, commandParameterPrompter, argumentErrorFormatter, programNameResolver) {
|
|
47
51
|
this.validator = validator;
|
|
48
52
|
this.dataMapper = dataMapper;
|
|
49
53
|
this.commandParameterPrompter = commandParameterPrompter;
|
|
54
|
+
this.argumentErrorFormatter = argumentErrorFormatter;
|
|
55
|
+
this.programNameResolver = programNameResolver;
|
|
50
56
|
}
|
|
51
57
|
/**
|
|
52
|
-
* Prompts for any missing parameters declared on `optionsType`, then maps `rawArgs` (plus
|
|
53
|
-
*
|
|
54
|
-
*
|
|
58
|
+
* Prompts for any missing parameters declared on `optionsType`, then maps `rawArgs` (plus the
|
|
59
|
+
* prompted answers) onto a real instance and validates it. `rawArgs` seeds the values already
|
|
60
|
+
* known — anything absent that carries a `question` is asked for interactively.
|
|
61
|
+
* `context.commandName` is woven into the `Usage:` line shown when a required value is missing
|
|
62
|
+
* (defaults to a neutral placeholder for direct, command-less callers).
|
|
55
63
|
*/
|
|
56
64
|
resolve(optionsType_1) {
|
|
57
|
-
return __awaiter(this, arguments, void 0, function* (optionsType, rawArgs = {}) {
|
|
65
|
+
return __awaiter(this, arguments, void 0, function* (optionsType, rawArgs = {}, context = {}) {
|
|
66
|
+
var _a;
|
|
58
67
|
const preparedArgs = yield this.commandParameterPrompter.fillMissingParameters(optionsType, rawArgs);
|
|
59
68
|
let mapped;
|
|
60
69
|
try {
|
|
@@ -73,29 +82,11 @@ let CommandOptionsResolver = class CommandOptionsResolver {
|
|
|
73
82
|
if (validationErrors.length === 0) {
|
|
74
83
|
return mapped;
|
|
75
84
|
}
|
|
76
|
-
//
|
|
77
|
-
//
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
for (const constraintKey in error.constraints) {
|
|
82
|
-
// `@pristine-ts/class-validator` stores constraints as `{keyname, message}` objects
|
|
83
|
-
// rather than the plain strings vanilla class-validator uses. Extract the message
|
|
84
|
-
// when present, falling back to JSON for unknown shapes so we never print
|
|
85
|
-
// `[object Object]`.
|
|
86
|
-
const constraint = error.constraints[constraintKey];
|
|
87
|
-
const message = typeof constraint === "string"
|
|
88
|
-
? constraint
|
|
89
|
-
: (constraint && typeof constraint === "object" && typeof constraint.message === "string")
|
|
90
|
-
? constraint.message
|
|
91
|
-
: JSON.stringify(constraint);
|
|
92
|
-
messages.push(`[${constraintKey}] ${message}`);
|
|
93
|
-
}
|
|
94
|
-
failures[error.property] = messages;
|
|
95
|
-
}
|
|
96
|
-
throw new ValidationError("Argument validation failed", {
|
|
97
|
-
code: CliErrorCode.ArgumentValidationFailed,
|
|
98
|
-
details: failures,
|
|
85
|
+
// Hand the raw class-validator output to the formatter, which classifies missing vs invalid
|
|
86
|
+
// and produces a clean, plain-rendered `UsageError` (exit 64).
|
|
87
|
+
throw this.argumentErrorFormatter.buildValidationError(optionsType, mapped, validationErrors, {
|
|
88
|
+
commandName: (_a = context.commandName) !== null && _a !== void 0 ? _a : "<command>",
|
|
89
|
+
binName: this.programNameResolver.resolve(),
|
|
99
90
|
});
|
|
100
91
|
});
|
|
101
92
|
}
|
|
@@ -105,7 +96,9 @@ CommandOptionsResolver = __decorate([
|
|
|
105
96
|
moduleScoped(CliModuleKeyname),
|
|
106
97
|
__metadata("design:paramtypes", [Validator,
|
|
107
98
|
DataMapper,
|
|
108
|
-
CommandParameterPrompter
|
|
99
|
+
CommandParameterPrompter,
|
|
100
|
+
CommandArgumentErrorFormatter,
|
|
101
|
+
ProgramNameResolver])
|
|
109
102
|
], CommandOptionsResolver);
|
|
110
103
|
export { CommandOptionsResolver };
|
|
111
104
|
//# sourceMappingURL=command-options-resolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-options-resolver.js","sourceRoot":"","sources":["../../../../src/services/command-options-resolver.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,UAAU,CAAC;AAEpC,OAAO,EAAC,YAAY,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"command-options-resolver.js","sourceRoot":"","sources":["../../../../src/services/command-options-resolver.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,UAAU,CAAC;AAEpC,OAAO,EAAC,YAAY,EAAE,UAAU,EAAC,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAC,SAAS,EAAC,MAAM,8BAA8B,CAAC;AACvD,OAAO,EAAC,6BAA6B,EAAE,UAAU,EAAC,MAAM,2BAA2B,CAAC;AACpF,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAC,YAAY,EAAC,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAC,wBAAwB,EAAC,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAC,6BAA6B,EAAC,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAC,mBAAmB,EAAC,MAAM,yBAAyB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;GAoBG;AAGI,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IACjC,YACmB,SAAoB,EACpB,UAAsB,EACtB,wBAAkD,EAClD,sBAAqD,EACrD,mBAAwC;QAJxC,cAAS,GAAT,SAAS,CAAW;QACpB,eAAU,GAAV,UAAU,CAAY;QACtB,6BAAwB,GAAxB,wBAAwB,CAA0B;QAClD,2BAAsB,GAAtB,sBAAsB,CAA+B;QACrD,wBAAmB,GAAnB,mBAAmB,CAAqB;IAE3D,CAAC;IAED;;;;;;OAMG;IACG,OAAO;6DAAI,WAAgC,EAAE,UAA+B,EAAE,EAAE,UAAkC,EAAE;;YACxH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,qBAAqB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAErG,IAAI,MAAS,CAAC;YACd,IAAI,CAAC;gBACH,mFAAmF;gBACnF,mFAAmF;gBACnF,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,6BAA6B,CAAC,EAAC,aAAa,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC;YAC9H,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,UAAU,CAClB,+BAA+B,WAAW,CAAC,IAAI,MAAO,KAAe,CAAC,OAAO,EAAE,EAC/E;oBACE,IAAI,EAAE,YAAY,CAAC,qBAAqB;oBACxC,KAAK,EAAE,KAAc;oBACrB,OAAO,EAAE,EAAC,UAAU,EAAE,WAAW,CAAC,IAAI,EAAC;iBACxC,CACF,CAAC;YACJ,CAAC;YAED,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC/D,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,4FAA4F;YAC5F,+DAA+D;YAC/D,MAAM,IAAI,CAAC,sBAAsB,CAAC,oBAAoB,CAAC,WAAW,EAAE,MAA6B,EAAE,gBAAgB,EAAE;gBACnH,WAAW,EAAE,MAAA,OAAO,CAAC,WAAW,mCAAI,WAAW;gBAC/C,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE;aAC5C,CAAC,CAAC;QACL,CAAC;KAAA;CACF,CAAA;AAhDY,sBAAsB;IAFlC,UAAU,EAAE;IACZ,YAAY,CAAC,gBAAgB,CAAC;qCAGC,SAAS;QACR,UAAU;QACI,wBAAwB;QAC1B,6BAA6B;QAChC,mBAAmB;GANhD,sBAAsB,CAgDlC"}
|