@rsdk/cli.common 4.3.0-next.0 → 4.3.0-next.1

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/CHANGELOG.md CHANGED
@@ -3,6 +3,12 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [4.3.0-next.1](https://github.com/R-Vision/rsdk/compare/v4.3.0-next.0...v4.3.0-next.1) (2024-03-21)
7
+
8
+ ### Features
9
+
10
+ * enchanche cli api and announce 4.3 ([#217](https://github.com/R-Vision/rsdk/issues/217)) ([65536bc](https://github.com/R-Vision/rsdk/commit/65536bcd13473790e4be901a44c07e49c2a79cff))
11
+
6
12
  ## [4.3.0-next.0](https://github.com/R-Vision/rsdk/compare/v4.2.5-next.0...v4.3.0-next.0) (2024-03-19)
7
13
 
8
14
  ### Features
package/README.MD ADDED
@@ -0,0 +1,9 @@
1
+ # Cli.common
2
+
3
+ Пакет аггрегирующий в себе все основные интерфейсы касающиеся системы "плагинизации" в cli
4
+
5
+ ## Основные концепции
6
+
7
+ Здесь должны быть:
8
+ - все интерфейсы для взаимодействия лаунчера и пакетов, которые обеспечивают обработку команд
9
+ - стандартные и стандартизированные способы обработки типичных случаев
package/dist/cmd.core.js CHANGED
@@ -4,9 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getCommanderCommand = void 0;
7
+ const logging_1 = require("@rsdk/logging");
7
8
  const commander_1 = require("commander");
8
9
  const lodash_1 = __importDefault(require("lodash"));
10
+ const env_provider_1 = require("./env.provider");
9
11
  const types_1 = require("./types");
12
+ const cliLogger = logging_1.LoggerFactory.create('@rsdk/cli.common');
10
13
  function getRootCommand(globalMetadata) {
11
14
  const v = globalMetadata?.get(types_1.MetaKeys.Core);
12
15
  if (!v) {
@@ -14,15 +17,51 @@ function getRootCommand(globalMetadata) {
14
17
  }
15
18
  return new commander_1.Command(v.name).description(v.description);
16
19
  }
20
+ function createEnvKey(optionMetadata) {
21
+ return lodash_1.default.snakeCase(`${optionMetadata.name}${optionMetadata.strategy === Boolean ? '_enabled' : ''}`).toUpperCase();
22
+ }
17
23
  function createCommandHandler(argMap, handler) {
18
24
  return (__, cmd) => {
19
25
  const opts = cmd.opts();
20
- const normalizedArgList = [...argMap].map(([index, value]) => ({
26
+ const normalizedArgList = [...argMap].map(([index, optionMetadata]) => ({
21
27
  index,
22
- value,
28
+ optionMetadata,
23
29
  }));
24
30
  const sortedArgList = lodash_1.default.sortBy(normalizedArgList, ['index']);
25
- const args = sortedArgList.map(({ value }) => opts[lodash_1.default.camelCase(value.name)]);
31
+ const args = sortedArgList.map(({ optionMetadata }) => {
32
+ cliLogger.trace('handle arg', {
33
+ optionMetadata,
34
+ });
35
+ const key = lodash_1.default.camelCase(optionMetadata.name);
36
+ const v = opts[key];
37
+ const isNotProvided = Object.hasOwn(opts, key);
38
+ const isNotDefaultValue = optionMetadata.defaultValue !== undefined &&
39
+ v !== optionMetadata.defaultValue;
40
+ const envKey = createEnvKey(optionMetadata);
41
+ cliLogger.trace('use env key for option', {
42
+ envKey,
43
+ });
44
+ const envValue = isNotProvided ? env_provider_1.Env.get(envKey) : undefined;
45
+ cliLogger.trace('option value state', {
46
+ isNotProvided,
47
+ isNotDefaultValue,
48
+ envKey,
49
+ envValue,
50
+ optionMetadata,
51
+ });
52
+ if (envValue !== undefined && envValue !== v) {
53
+ cliLogger.warn('Flag value override env value', {
54
+ optionMetadata,
55
+ envKey,
56
+ envValue,
57
+ flagValue: v,
58
+ });
59
+ }
60
+ if (isNotDefaultValue && optionMetadata.parser) {
61
+ return optionMetadata.parser(v ?? envValue);
62
+ }
63
+ return v;
64
+ });
26
65
  handler(...args);
27
66
  };
28
67
  }
@@ -64,7 +103,7 @@ const getCommanderCommand = (cmd) => {
64
103
  const command = new commander_1.Command(subCmdValue.name).description(subCmdValue.description);
65
104
  const argMap = createArgMap(metadata);
66
105
  for (const option of argMap.values()) {
67
- command.option(`--${option.name}${option.strategy === String ? ' <value>' : ''}`, option.description, option.defaultValue);
106
+ command.option(`--${option.name}${option.strategy === String ? ' <value>' : ''}`, `${option.description} [eq ${createEnvKey(option)} in env]`, option.defaultValue);
68
107
  }
69
108
  command.action(createCommandHandler(argMap,
70
109
  // @ts-expect-error потому что не понимает что инстанс это объект у которого есть этот метод
@@ -1 +1 @@
1
- {"version":3,"file":"cmd.core.js","sourceRoot":"","sources":["../src/cmd.core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cmd.core.js","sourceRoot":"","sources":["../src/cmd.core.ts"],"names":[],"mappings":";;;;;;AAAA,2CAA8C;AAC9C,yCAAoC;AACpC,oDAAuB;AAEvB,iDAAqC;AAErC,mCAAmC;AAEnC,MAAM,SAAS,GAAG,uBAAa,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAG3D,SAAS,cAAc,CAAC,cAAmB;IACzC,MAAM,CAAC,GAAG,cAAc,EAAE,GAAG,CAAC,gBAAQ,CAAC,IAAI,CAAC,CAAC;IAE7C,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,OAAO;IACT,CAAC;IACD,OAAO,IAAI,mBAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,YAAY,CAAC,cAA8B;IAClD,OAAO,gBAAC,CAAC,SAAS,CAChB,GAAG,cAAc,CAAC,IAAI,GAAG,cAAc,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CACjF,CAAC,WAAW,EAAE,CAAC;AAClB,CAAC;AAED,SAAS,oBAAoB,CAC3B,MAA2C,EAC3C,OAAgC;IAEhC,OAAO,CAAC,EAAE,EAAE,GAAY,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAExB,MAAM,iBAAiB,GAGjB,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC;YAClD,KAAK;YACL,cAAc;SACf,CAAC,CAAC,CAAC;QACJ,MAAM,aAAa,GACjB,gBAAC,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QAEzC,MAAM,IAAI,GAA2B,aAAa,CAAC,GAAG,CACpD,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE;YACrB,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE;gBAC5B,cAAc;aACf,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,gBAAC,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YAEpB,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAE/C,MAAM,iBAAiB,GACrB,cAAc,CAAC,YAAY,KAAK,SAAS;gBACzC,CAAC,KAAK,cAAc,CAAC,YAAY,CAAC;YAEpC,MAAM,MAAM,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;YAE5C,SAAS,CAAC,KAAK,CAAC,wBAAwB,EAAE;gBACxC,MAAM;aACP,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,kBAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAE7D,SAAS,CAAC,KAAK,CAAC,oBAAoB,EAAE;gBACpC,aAAa;gBACb,iBAAiB;gBACjB,MAAM;gBACN,QAAQ;gBACR,cAAc;aACf,CAAC,CAAC;YAEH,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC7C,SAAS,CAAC,IAAI,CAAC,+BAA+B,EAAE;oBAC9C,cAAc;oBACd,MAAM;oBACN,QAAQ;oBACR,SAAS,EAAE,CAAC;iBACb,CAAC,CAAC;YACL,CAAC;YAED,IAAI,iBAAiB,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;gBAC/C,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC;YAC9C,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC,CACF,CAAC;QAEF,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC;AAWD,SAAS,YAAY,CACnB,QAA6C;IAE7C,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACnC,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,KAAK,gBAAQ,CAAC,KAAK,CAAC;YACpB,KAAK,gBAAQ,CAAC,YAAY,CAAC;YAC3B,KAAK,gBAAQ,CAAC,MAAM;gBAClB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;oBACjC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;oBACrC,GAAG,IAAI,CAAC,KAAK;iBACd,CAAC,CAAC;QACP,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,IAAI,GAAG,EAAkC,CAAC,CAAC;AAChD,CAAC;AAEM,MAAM,mBAAmB,GAAG,CAAC,GAAQ,EAAa,EAAE;IACzD,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,gBAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACtD,IAAI,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,gBAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEjE,MAAM,WAAW,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;IAEnD,MAAM,GAAG,GAAoB,KAAK,CAAC;IAEnC,gEAAgE;IAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAE5C,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,KAAK,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC;QAC1C,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CACpC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,KAAK,gBAAQ,CAAC,MAAM,CAC7C,CAAC;QACF,IAAI,cAAc,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,6BAA6B,EAAE;gBAC7C,KAAK,EAAE;oBACL,cAAc;iBACf;aACF,CAAC,CAAC;QACL,CAAC;QAED,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,mBAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,WAAW,CACvD,WAAW,CAAC,WAAW,CACxB,CAAC;QAEF,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QAEtC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACrC,OAAO,CAAC,MAAM,CACZ,KAAK,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EACjE,GAAG,MAAM,CAAC,WAAW,QAAQ,YAAY,CAAC,MAAM,CAAC,UAAU,EAC3D,MAAM,CAAC,YAAY,CACpB,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,MAAM,CACZ,oBAAoB,CAClB,MAAM;QACN,4FAA4F;QAC5F,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CACrC,CACF,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,WAAW,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AA5DW,QAAA,mBAAmB,uBA4D9B"}
@@ -1,5 +1,5 @@
1
1
  export declare const SubCmd: (name: string, description: string) => MethodDecorator;
2
2
  export declare const Cmd: (name: string, description: string) => ClassDecorator;
3
- export declare const Option: (name: string, description: string, strategy: typeof Boolean | typeof String) => ParameterDecorator;
3
+ export declare const Option: (name: string, description: string, strategy: typeof Boolean | typeof String, parser?: ((v: any) => any) | undefined) => ParameterDecorator;
4
4
  export declare const Alias: (alias: string) => ParameterDecorator;
5
5
  export declare const Default: (v: any) => ParameterDecorator;
@@ -22,7 +22,7 @@ const Cmd = (name, description) => {
22
22
  };
23
23
  };
24
24
  exports.Cmd = Cmd;
25
- const Option = (name, description, strategy) => {
25
+ const Option = (name, description, strategy, parser) => {
26
26
  return (target, propertyKey, parameterIndex) => {
27
27
  (0, utils_1.assertString)(propertyKey);
28
28
  (0, utils_1.defineMetadata)(target, propertyKey, types_1.MetaKeys.Option, {
@@ -30,6 +30,7 @@ const Option = (name, description, strategy) => {
30
30
  description,
31
31
  strategy,
32
32
  parameterIndex,
33
+ parser,
33
34
  });
34
35
  };
35
36
  };
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":";;;AAAA,mCAAmC;AACnC,mCAA2E;AAEpE,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,WAAmB,EAAmB,EAAE;IAC3E,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE;QAC7B,IAAA,oBAAY,EAAC,WAAW,CAAC,CAAC;QAC1B,IAAA,sBAAc,EAAC,MAAM,EAAE,WAAW,EAAE,gBAAQ,CAAC,MAAM,EAAE;YACnD,IAAI;YACJ,WAAW;SACZ,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,MAAM,UAQjB;AACK,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,WAAmB,EAAkB,EAAE;IACvE,OAAO,CAAC,MAAM,EAAE,EAAE;QAChB,IAAA,0BAAkB,EAAC,MAAM,EAAE,gBAAQ,CAAC,IAAI,EAAE;YACxC,IAAI;YACJ,WAAW;SACZ,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AAPW,QAAA,GAAG,OAOd;AAEK,MAAM,MAAM,GAAG,CACpB,IAAY,EACZ,WAAmB,EACnB,QAAwC,EACpB,EAAE;IACtB,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE;QAC7C,IAAA,oBAAY,EAAC,WAAW,CAAC,CAAC;QAC1B,IAAA,sBAAc,EAAC,MAAM,EAAE,WAAW,EAAE,gBAAQ,CAAC,MAAM,EAAE;YACnD,IAAI;YACJ,WAAW;YACX,QAAQ;YACR,cAAc;SACf,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AAdW,QAAA,MAAM,UAcjB;AACK,MAAM,KAAK,GAAG,CAAC,KAAa,EAAsB,EAAE;IACzD,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE;QAC7C,IAAA,oBAAY,EAAC,WAAW,CAAC,CAAC;QAC1B,IAAA,sBAAc,EAAC,MAAM,EAAE,WAAW,EAAE,gBAAQ,CAAC,KAAK,EAAE;YAClD,KAAK;YACL,cAAc;SACf,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,KAAK,SAQhB;AACK,MAAM,OAAO,GAAG,CAAC,CAAM,EAAsB,EAAE;IACpD,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE;QAC7C,IAAA,oBAAY,EAAC,WAAW,CAAC,CAAC;QAC1B,IAAA,sBAAc,EAAC,MAAM,EAAE,WAAW,EAAE,gBAAQ,CAAC,YAAY,EAAE;YACzD,YAAY,EAAE,CAAC;YACf,cAAc;SACf,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,OAAO,WAQlB"}
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":";;;AAAA,mCAAmC;AACnC,mCAA2E;AAEpE,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,WAAmB,EAAmB,EAAE;IAC3E,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE;QAC7B,IAAA,oBAAY,EAAC,WAAW,CAAC,CAAC;QAC1B,IAAA,sBAAc,EAAC,MAAM,EAAE,WAAW,EAAE,gBAAQ,CAAC,MAAM,EAAE;YACnD,IAAI;YACJ,WAAW;SACZ,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,MAAM,UAQjB;AACK,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,WAAmB,EAAkB,EAAE;IACvE,OAAO,CAAC,MAAM,EAAE,EAAE;QAChB,IAAA,0BAAkB,EAAC,MAAM,EAAE,gBAAQ,CAAC,IAAI,EAAE;YACxC,IAAI;YACJ,WAAW;SACZ,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AAPW,QAAA,GAAG,OAOd;AAEK,MAAM,MAAM,GAAG,CACpB,IAAY,EACZ,WAAmB,EACnB,QAAwC,EACxC,MAAwB,EACJ,EAAE;IACtB,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE;QAC7C,IAAA,oBAAY,EAAC,WAAW,CAAC,CAAC;QAC1B,IAAA,sBAAc,EAAC,MAAM,EAAE,WAAW,EAAE,gBAAQ,CAAC,MAAM,EAAE;YACnD,IAAI;YACJ,WAAW;YACX,QAAQ;YACR,cAAc;YACd,MAAM;SACP,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AAhBW,QAAA,MAAM,UAgBjB;AACK,MAAM,KAAK,GAAG,CAAC,KAAa,EAAsB,EAAE;IACzD,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE;QAC7C,IAAA,oBAAY,EAAC,WAAW,CAAC,CAAC;QAC1B,IAAA,sBAAc,EAAC,MAAM,EAAE,WAAW,EAAE,gBAAQ,CAAC,KAAK,EAAE;YAClD,KAAK;YACL,cAAc;SACf,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,KAAK,SAQhB;AACK,MAAM,OAAO,GAAG,CAAC,CAAM,EAAsB,EAAE;IACpD,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE;QAC7C,IAAA,oBAAY,EAAC,WAAW,CAAC,CAAC;QAC1B,IAAA,sBAAc,EAAC,MAAM,EAAE,WAAW,EAAE,gBAAQ,CAAC,YAAY,EAAE;YACzD,YAAY,EAAE,CAAC;YACf,cAAc;SACf,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,OAAO,WAQlB"}
@@ -1,5 +1,4 @@
1
- export declare class EnvProvider {
2
- static parse(key: string): string | undefined;
3
- private static parsed;
4
- private static parseEnv;
1
+ export declare class Env {
2
+ static get(key: string): string | undefined;
3
+ static get<V = string>(key: string, parser: (v: string | undefined) => V): V;
5
4
  }
@@ -3,26 +3,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.EnvProvider = void 0;
7
- const dotenv_1 = __importDefault(require("dotenv"));
8
- class EnvProvider {
9
- static parse(key) {
10
- return process.env[key] ?? EnvProvider.parseEnv()[key];
11
- }
12
- static parsed;
13
- static parseEnv() {
14
- if (EnvProvider.parsed) {
15
- return EnvProvider.parsed;
16
- }
17
- const parsed = dotenv_1.default.config();
18
- if (parsed.error) {
19
- throw new Error('Error read config', {
20
- cause: parsed.error,
21
- });
6
+ exports.Env = void 0;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ class Env {
9
+ static get(key, parser) {
10
+ const preparedKey = lodash_1.default.snakeCase(key).toUpperCase();
11
+ const v = process.env[preparedKey];
12
+ if (parser) {
13
+ return parser(v);
22
14
  }
23
- EnvProvider.parsed = parsed.parsed;
24
- return EnvProvider.parsed;
15
+ return v;
25
16
  }
26
17
  }
27
- exports.EnvProvider = EnvProvider;
18
+ exports.Env = Env;
28
19
  //# sourceMappingURL=env.provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"env.provider.js","sourceRoot":"","sources":["../src/env.provider.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAE5B,MAAa,WAAW;IACtB,MAAM,CAAC,KAAK,CAAC,GAAW;QACtB,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;IAEO,MAAM,CAAC,MAAM,CAA2B;IAExC,MAAM,CAAC,QAAQ;QACrB,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;YACvB,OAAO,WAAW,CAAC,MAAM,CAAC;QAC5B,CAAC;QACD,MAAM,MAAM,GAAG,gBAAM,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,EAAE;gBACnC,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC,CAAC;QACL,CAAC;QACD,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,MAAO,CAAC;QACpC,OAAO,WAAW,CAAC,MAAM,CAAC;IAC5B,CAAC;CACF;AApBD,kCAoBC"}
1
+ {"version":3,"file":"env.provider.js","sourceRoot":"","sources":["../src/env.provider.ts"],"names":[],"mappings":";;;;;;AAAA,oDAAuB;AAEvB,MAAa,GAAG;IAGd,MAAM,CAAC,GAAG,CACR,GAAW,EACX,MAAqC;QAErC,MAAM,WAAW,GAAG,gBAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QACnD,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACnC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;CACF;AAdD,kBAcC"}
package/dist/index.d.ts CHANGED
@@ -3,7 +3,6 @@ import 'reflect-metadata';
3
3
  export { getMetadataByPredict } from './rsdk/metadata.aggregator';
4
4
  export { RsdkJson } from './types';
5
5
  export { RsdkJsonParser } from './rsdk-json.parser';
6
- export { EnvProvider } from './env.provider';
7
6
  export { getCommanderCommand } from './cmd.core';
8
7
  export interface RsdkCliCommand {
9
8
  getCommands(): Command[];
package/dist/index.js CHANGED
@@ -1,13 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Cmd = exports.SubCmd = exports.Option = exports.Alias = exports.Default = exports.getCommanderCommand = exports.EnvProvider = exports.RsdkJsonParser = exports.getMetadataByPredict = void 0;
3
+ exports.Cmd = exports.SubCmd = exports.Option = exports.Alias = exports.Default = exports.getCommanderCommand = exports.RsdkJsonParser = exports.getMetadataByPredict = void 0;
4
4
  require("reflect-metadata");
5
5
  var metadata_aggregator_1 = require("./rsdk/metadata.aggregator");
6
6
  Object.defineProperty(exports, "getMetadataByPredict", { enumerable: true, get: function () { return metadata_aggregator_1.getMetadataByPredict; } });
7
7
  var rsdk_json_parser_1 = require("./rsdk-json.parser");
8
8
  Object.defineProperty(exports, "RsdkJsonParser", { enumerable: true, get: function () { return rsdk_json_parser_1.RsdkJsonParser; } });
9
- var env_provider_1 = require("./env.provider");
10
- Object.defineProperty(exports, "EnvProvider", { enumerable: true, get: function () { return env_provider_1.EnvProvider; } });
11
9
  var cmd_core_1 = require("./cmd.core");
12
10
  Object.defineProperty(exports, "getCommanderCommand", { enumerable: true, get: function () { return cmd_core_1.getCommanderCommand; } });
13
11
  var decorators_1 = require("./decorators");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,4BAA0B;AAE1B,kEAAkE;AAAzD,2HAAA,oBAAoB,OAAA;AAI7B,uDAAoD;AAA3C,kHAAA,cAAc,OAAA;AAEvB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AAEpB,uCAAiD;AAAxC,+GAAA,mBAAmB,OAAA;AAM5B,2CAAuC;AAA9B,qGAAA,OAAO,OAAA;AAChB,2CAAqC;AAA5B,mGAAA,KAAK,OAAA;AACd,2CAAsC;AAA7B,oGAAA,MAAM,OAAA;AACf,2CAAsC;AAA7B,oGAAA,MAAM,OAAA;AACf,2CAAmC;AAA1B,iGAAA,GAAG,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,4BAA0B;AAE1B,kEAAkE;AAAzD,2HAAA,oBAAoB,OAAA;AAI7B,uDAAoD;AAA3C,kHAAA,cAAc,OAAA;AAEvB,uCAAiD;AAAxC,+GAAA,mBAAmB,OAAA;AAM5B,2CAAuC;AAA9B,qGAAA,OAAO,OAAA;AAChB,2CAAqC;AAA5B,mGAAA,KAAK,OAAA;AACd,2CAAsC;AAA7B,oGAAA,MAAM,OAAA;AACf,2CAAsC;AAA7B,oGAAA,MAAM,OAAA;AACf,2CAAmC;AAA1B,iGAAA,GAAG,OAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsdk/cli.common",
3
- "version": "4.3.0-next.0",
3
+ "version": "4.3.0-next.1",
4
4
  "description": "Shared types and helpers for build work with cli",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -15,8 +15,8 @@
15
15
  ],
16
16
  "license": "Apache License 2.0",
17
17
  "dependencies": {
18
- "@rsdk/common": "^4.3.0-next.0",
19
- "@rsdk/logging": "^4.3.0-next.0",
18
+ "@rsdk/common": "^4.3.0-next.1",
19
+ "@rsdk/logging": "^4.3.0-next.1",
20
20
  "@sinclair/typebox": "^0.32.13",
21
21
  "commander": "^12.0.0",
22
22
  "dotenv": "^16.3.1",
@@ -26,8 +26,8 @@
26
26
  "yaml": "^2.3.1"
27
27
  },
28
28
  "peerDependencies": {
29
- "@rsdk/core": "^4.3.0-next.0",
29
+ "@rsdk/core": "^4.3.0-next.1",
30
30
  "reflect-metadata": "^0.1.12 || ^0.2.0"
31
31
  },
32
- "gitHead": "68619cc6fc60db01568eede7df182d9882e857dd"
32
+ "gitHead": "da58041323f3145aa436e02774d36d44606c1217"
33
33
  }
package/src/cmd.core.ts CHANGED
@@ -1,9 +1,13 @@
1
+ import { LoggerFactory } from '@rsdk/logging';
1
2
  import { Command } from 'commander';
2
3
  import _ from 'lodash';
3
4
 
5
+ import { Env } from './env.provider';
4
6
  import type { CoreMetadataMap } from './types';
5
7
  import { MetaKeys } from './types';
6
8
 
9
+ const cliLogger = LoggerFactory.create('@rsdk/cli.common');
10
+
7
11
  type ParameterIndex = number;
8
12
  function getRootCommand(globalMetadata: any): Command | undefined {
9
13
  const v = globalMetadata?.get(MetaKeys.Core);
@@ -14,6 +18,12 @@ function getRootCommand(globalMetadata: any): Command | undefined {
14
18
  return new Command(v.name).description(v.description);
15
19
  }
16
20
 
21
+ function createEnvKey(optionMetadata: OptionMetadata): string {
22
+ return _.snakeCase(
23
+ `${optionMetadata.name}${optionMetadata.strategy === Boolean ? '_enabled' : ''}`,
24
+ ).toUpperCase();
25
+ }
26
+
17
27
  function createCommandHandler(
18
28
  argMap: Map<ParameterIndex, OptionMetadata>,
19
29
  handler: (...args: any[]) => any,
@@ -21,19 +31,60 @@ function createCommandHandler(
21
31
  return (__, cmd: Command) => {
22
32
  const opts = cmd.opts();
23
33
 
24
- const normalizedArgList: { index: number; value: any }[] = [...argMap].map(
25
- ([index, value]) => ({
26
- index,
27
- value,
28
- }),
29
- );
30
- const sortedArgList: { index: any; value: any }[] = _.sortBy(
31
- normalizedArgList,
32
- ['index'],
33
- );
34
+ const normalizedArgList: {
35
+ index: number;
36
+ optionMetadata: OptionMetadata;
37
+ }[] = [...argMap].map(([index, optionMetadata]) => ({
38
+ index,
39
+ optionMetadata,
40
+ }));
41
+ const sortedArgList: { index: any; optionMetadata: OptionMetadata }[] =
42
+ _.sortBy(normalizedArgList, ['index']);
34
43
 
35
44
  const args: (string | undefined)[] = sortedArgList.map(
36
- ({ value }) => opts[_.camelCase(value.name)],
45
+ ({ optionMetadata }) => {
46
+ cliLogger.trace('handle arg', {
47
+ optionMetadata,
48
+ });
49
+ const key = _.camelCase(optionMetadata.name);
50
+ const v = opts[key];
51
+
52
+ const isNotProvided = Object.hasOwn(opts, key);
53
+
54
+ const isNotDefaultValue =
55
+ optionMetadata.defaultValue !== undefined &&
56
+ v !== optionMetadata.defaultValue;
57
+
58
+ const envKey = createEnvKey(optionMetadata);
59
+
60
+ cliLogger.trace('use env key for option', {
61
+ envKey,
62
+ });
63
+
64
+ const envValue = isNotProvided ? Env.get(envKey) : undefined;
65
+
66
+ cliLogger.trace('option value state', {
67
+ isNotProvided,
68
+ isNotDefaultValue,
69
+ envKey,
70
+ envValue,
71
+ optionMetadata,
72
+ });
73
+
74
+ if (envValue !== undefined && envValue !== v) {
75
+ cliLogger.warn('Flag value override env value', {
76
+ optionMetadata,
77
+ envKey,
78
+ envValue,
79
+ flagValue: v,
80
+ });
81
+ }
82
+
83
+ if (isNotDefaultValue && optionMetadata.parser) {
84
+ return optionMetadata.parser(v ?? envValue);
85
+ }
86
+ return v;
87
+ },
37
88
  );
38
89
 
39
90
  handler(...args);
@@ -45,6 +96,7 @@ type OptionMetadata = {
45
96
  description: string;
46
97
  alias?: string;
47
98
  defaultValue?: string | boolean;
99
+ parser?: (v: any) => any;
48
100
  strategy: BooleanConstructor | StringConstructor;
49
101
  };
50
102
 
@@ -104,7 +156,7 @@ export const getCommanderCommand = (cmd: any): Command[] => {
104
156
  for (const option of argMap.values()) {
105
157
  command.option(
106
158
  `--${option.name}${option.strategy === String ? ' <value>' : ''}`,
107
- option.description,
159
+ `${option.description} [eq ${createEnvKey(option)} in env]`,
108
160
  option.defaultValue,
109
161
  );
110
162
  }
package/src/decorators.ts CHANGED
@@ -23,6 +23,7 @@ export const Option = (
23
23
  name: string,
24
24
  description: string,
25
25
  strategy: typeof Boolean | typeof String,
26
+ parser?: (v: any) => any,
26
27
  ): ParameterDecorator => {
27
28
  return (target, propertyKey, parameterIndex) => {
28
29
  assertString(propertyKey);
@@ -31,6 +32,7 @@ export const Option = (
31
32
  description,
32
33
  strategy,
33
34
  parameterIndex,
35
+ parser,
34
36
  });
35
37
  };
36
38
  };
@@ -1,23 +1,17 @@
1
- import dotenv from 'dotenv';
1
+ import _ from 'lodash';
2
2
 
3
- export class EnvProvider {
4
- static parse(key: string): string | undefined {
5
- return process.env[key] ?? EnvProvider.parseEnv()[key];
6
- }
7
-
8
- private static parsed: dotenv.DotenvParseOutput;
9
-
10
- private static parseEnv(): dotenv.DotenvParseOutput {
11
- if (EnvProvider.parsed) {
12
- return EnvProvider.parsed;
13
- }
14
- const parsed = dotenv.config();
15
- if (parsed.error) {
16
- throw new Error('Error read config', {
17
- cause: parsed.error,
18
- });
3
+ export class Env {
4
+ static get(key: string): string | undefined;
5
+ static get<V = string>(key: string, parser: (v: string | undefined) => V): V;
6
+ static get<V = string>(
7
+ key: string,
8
+ parser?: (v: string | undefined) => V,
9
+ ): V | undefined | string {
10
+ const preparedKey = _.snakeCase(key).toUpperCase();
11
+ const v = process.env[preparedKey];
12
+ if (parser) {
13
+ return parser(v);
19
14
  }
20
- EnvProvider.parsed = parsed.parsed!;
21
- return EnvProvider.parsed;
15
+ return v;
22
16
  }
23
17
  }
package/src/index.ts CHANGED
@@ -8,8 +8,6 @@ export { RsdkJson } from './types';
8
8
 
9
9
  export { RsdkJsonParser } from './rsdk-json.parser';
10
10
 
11
- export { EnvProvider } from './env.provider';
12
-
13
11
  export { getCommanderCommand } from './cmd.core';
14
12
 
15
13
  export interface RsdkCliCommand {