@rsdk/cli.common 5.7.0-next.2 → 6.0.0-next.0
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/common/metadata.registry.d.ts +19 -0
- package/dist/common/metadata.registry.js +57 -0
- package/dist/common/metadata.registry.js.map +1 -0
- package/dist/common/types.d.ts +32 -0
- package/dist/common/types.js +22 -0
- package/dist/common/types.js.map +1 -0
- package/dist/decorators/command.decorator.d.ts +14 -0
- package/dist/decorators/command.decorator.js +27 -0
- package/dist/decorators/command.decorator.js.map +1 -0
- package/dist/decorators/index.d.ts +5 -0
- package/dist/decorators/index.js +22 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/decorators/option-with-value.decorator.d.ts +13 -0
- package/dist/decorators/option-with-value.decorator.js +26 -0
- package/dist/decorators/option-with-value.decorator.js.map +1 -0
- package/dist/decorators/option.decorator.d.ts +10 -0
- package/dist/decorators/option.decorator.js +23 -0
- package/dist/decorators/option.decorator.js.map +1 -0
- package/dist/decorators/sub-command.decorator.d.ts +9 -0
- package/dist/decorators/sub-command.decorator.js +19 -0
- package/dist/decorators/sub-command.decorator.js.map +1 -0
- package/dist/decorators/variation.decorator.d.ts +10 -0
- package/dist/decorators/variation.decorator.js +20 -0
- package/dist/decorators/variation.decorator.js.map +1 -0
- package/dist/index.d.ts +4 -13
- package/dist/index.js +20 -17
- package/dist/index.js.map +1 -1
- package/dist/runnable.interface.d.ts +11 -0
- package/dist/runnable.interface.js +3 -0
- package/dist/runnable.interface.js.map +1 -0
- package/package.json +5 -5
- package/src/common/metadata.registry.ts +91 -0
- package/src/common/types.ts +57 -0
- package/src/decorators/command.decorator.ts +36 -0
- package/src/decorators/index.ts +5 -0
- package/src/decorators/option-with-value.decorator.ts +30 -0
- package/src/decorators/option.decorator.ts +24 -0
- package/src/decorators/sub-command.decorator.ts +22 -0
- package/src/decorators/variation.decorator.ts +23 -0
- package/src/index.ts +9 -16
- package/src/runnable.interface.ts +11 -0
- package/dist/cmd.core.d.ts +0 -2
- package/dist/cmd.core.js +0 -157
- package/dist/cmd.core.js.map +0 -1
- package/dist/decorators.d.ts +0 -5
- package/dist/decorators.js +0 -58
- package/dist/decorators.js.map +0 -1
- package/dist/env.provider.d.ts +0 -6
- package/dist/env.provider.js +0 -29
- package/dist/env.provider.js.map +0 -1
- package/dist/rsdk/metadata.aggregator.d.ts +0 -6
- package/dist/rsdk/metadata.aggregator.js +0 -17
- package/dist/rsdk/metadata.aggregator.js.map +0 -1
- package/dist/rsdk-json.parser.d.ts +0 -6
- package/dist/rsdk-json.parser.js +0 -21
- package/dist/rsdk-json.parser.js.map +0 -1
- package/dist/types.d.ts +0 -97
- package/dist/types.js +0 -13
- package/dist/types.js.map +0 -1
- package/dist/utils.d.ts +0 -4
- package/dist/utils.js +0 -30
- package/dist/utils.js.map +0 -1
- package/src/cmd.core.ts +0 -221
- package/src/decorators.ts +0 -56
- package/src/env.provider.ts +0 -30
- package/src/rsdk/metadata.aggregator.ts +0 -17
- package/src/rsdk-json.parser.ts +0 -17
- package/src/types.ts +0 -102
- package/src/utils.ts +0 -52
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { CommandMetadata, OptionMetadata, OptionsMetadataMap, RunnableMetadata } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* TODO: Довольно полезная вещь - надо будет вынести из
|
|
4
|
+
* cli в отдельный пакет. Но для этого нужно допустить регистрацию
|
|
5
|
+
* метаданных с нескольких декораторов
|
|
6
|
+
*/
|
|
7
|
+
export declare class MetadataRegistry {
|
|
8
|
+
static getCommand(ctor: Function): CommandMetadata;
|
|
9
|
+
static getRunnable(ctor: Function): RunnableMetadata;
|
|
10
|
+
static getOptions(ctor: Function): OptionsMetadataMap;
|
|
11
|
+
static addOption(ctor: Function, parameterIndex: number, metadata: OptionMetadata): void;
|
|
12
|
+
/**
|
|
13
|
+
* Добавляет к метаданным класса дополнительные метаданные
|
|
14
|
+
* для свойства или параметра метода
|
|
15
|
+
*/
|
|
16
|
+
static addCommand(ctor: object, value: CommandMetadata): void;
|
|
17
|
+
static addRunnable(ctor: object, value: RunnableMetadata): void;
|
|
18
|
+
private static get;
|
|
19
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/ban-types */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.MetadataRegistry = void 0;
|
|
5
|
+
const types_1 = require("./types");
|
|
6
|
+
/**
|
|
7
|
+
* TODO: Довольно полезная вещь - надо будет вынести из
|
|
8
|
+
* cli в отдельный пакет. Но для этого нужно допустить регистрацию
|
|
9
|
+
* метаданных с нескольких декораторов
|
|
10
|
+
*/
|
|
11
|
+
class MetadataRegistry {
|
|
12
|
+
static getCommand(ctor) {
|
|
13
|
+
const metadata = this.get(ctor, types_1.Key.COMMAND);
|
|
14
|
+
if (!(0, types_1.isCommandMetadata)(metadata)) {
|
|
15
|
+
throw new Error('Command metadata not found. Probably you forgot @Cmd decorator.', {
|
|
16
|
+
cause: { ctor },
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
return metadata;
|
|
20
|
+
}
|
|
21
|
+
static getRunnable(ctor) {
|
|
22
|
+
const metadata = this.get(ctor, types_1.Key.COMMAND);
|
|
23
|
+
if (!(0, types_1.isRunnableMetadata)(metadata)) {
|
|
24
|
+
throw new Error('Runnable metadata not found. Probably you forgot to use @SubCommand or @Variation decorator.');
|
|
25
|
+
}
|
|
26
|
+
return metadata;
|
|
27
|
+
}
|
|
28
|
+
static getOptions(ctor) {
|
|
29
|
+
return this.get(ctor, types_1.Key.OPTIONS, new Map());
|
|
30
|
+
}
|
|
31
|
+
static addOption(ctor, parameterIndex, metadata) {
|
|
32
|
+
const optionsMap = this.get(ctor, types_1.Key.OPTIONS, new Map());
|
|
33
|
+
const existing = optionsMap.has(parameterIndex);
|
|
34
|
+
if (existing) {
|
|
35
|
+
throw new Error(`Metadata for option ${ctor}.run [index: ${parameterIndex}] already exists`, {
|
|
36
|
+
cause: { existing, metadata },
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
optionsMap.set(parameterIndex, metadata);
|
|
40
|
+
Reflect.defineMetadata(types_1.Key.OPTIONS, optionsMap, ctor);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Добавляет к метаданным класса дополнительные метаданные
|
|
44
|
+
* для свойства или параметра метода
|
|
45
|
+
*/
|
|
46
|
+
static addCommand(ctor, value) {
|
|
47
|
+
Reflect.defineMetadata(types_1.Key.COMMAND, value, ctor);
|
|
48
|
+
}
|
|
49
|
+
static addRunnable(ctor, value) {
|
|
50
|
+
Reflect.defineMetadata(types_1.Key.COMMAND, value, ctor);
|
|
51
|
+
}
|
|
52
|
+
static get(t, key, defaultValue) {
|
|
53
|
+
return Reflect.getMetadata(key, t) ?? defaultValue;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.MetadataRegistry = MetadataRegistry;
|
|
57
|
+
//# sourceMappingURL=metadata.registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.registry.js","sourceRoot":"","sources":["../../src/common/metadata.registry.ts"],"names":[],"mappings":";AAAA,iDAAiD;;;AAQjD,mCAAqE;AAErE;;;;GAIG;AACH,MAAa,gBAAgB;IAC3B,MAAM,CAAC,UAAU,CAAC,IAAc;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAkB,IAAI,EAAE,WAAG,CAAC,OAAO,CAAC,CAAC;QAE9D,IAAI,CAAC,IAAA,yBAAiB,EAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,iEAAiE,EACjE;gBACE,KAAK,EAAE,EAAE,IAAI,EAAE;aAChB,CACF,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAc;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAmB,IAAI,EAAE,WAAG,CAAC,OAAO,CAAC,CAAC;QAE/D,IAAI,CAAC,IAAA,0BAAkB,EAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CACb,8FAA8F,CAC/F,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,IAAc;QAC9B,OAAO,IAAI,CAAC,GAAG,CAAqB,IAAI,EAAE,WAAG,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,CAAC,SAAS,CACd,IAAc,EACd,cAAsB,EACtB,QAAwB;QAExB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,IAAI,EACJ,WAAG,CAAC,OAAO,EACX,IAAI,GAAG,EAAE,CACV,CAAC;QAEF,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,uBAAuB,IAAI,gBAAgB,cAAc,kBAAkB,EAC3E;gBACE,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;aAC9B,CACF,CAAC;QACJ,CAAC;QAED,UAAU,CAAC,GAAG,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAEzC,OAAO,CAAC,cAAc,CAAC,WAAG,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,UAAU,CAAC,IAAY,EAAE,KAAsB;QACpD,OAAO,CAAC,cAAc,CAAC,WAAG,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAY,EAAE,KAAuB;QACtD,OAAO,CAAC,cAAc,CAAC,WAAG,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IAIO,MAAM,CAAC,GAAG,CAAI,CAAS,EAAE,GAAQ,EAAE,YAAgB;QACzD,OAAO,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,YAAY,CAAC;IACrD,CAAC;CACF;AA3ED,4CA2EC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Constructor, PropertyParser } from '@rsdk/common';
|
|
2
|
+
export declare enum Key {
|
|
3
|
+
COMMAND = "COMMAND",
|
|
4
|
+
OPTIONS = "OPTIONS"
|
|
5
|
+
}
|
|
6
|
+
export type ParameterIndex = number;
|
|
7
|
+
export type PropertyKey = string;
|
|
8
|
+
/**
|
|
9
|
+
* Метаданные для конечной запускаемой команды,
|
|
10
|
+
* команды суффиксом или подкоманды
|
|
11
|
+
*/
|
|
12
|
+
export type RunnableMetadata = {
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
};
|
|
16
|
+
export declare const isRunnableMetadata: (metadata: unknown) => metadata is RunnableMetadata;
|
|
17
|
+
export type CommandMetadata = RunnableMetadata & {
|
|
18
|
+
variations: Constructor[];
|
|
19
|
+
subcommands: Constructor[];
|
|
20
|
+
};
|
|
21
|
+
export declare const isCommandMetadata: (metadata: unknown) => metadata is CommandMetadata;
|
|
22
|
+
export type OptionMetadata<T = any> = {
|
|
23
|
+
name: string;
|
|
24
|
+
description: string;
|
|
25
|
+
alias?: string;
|
|
26
|
+
parser?: PropertyParser<T>;
|
|
27
|
+
defaultValue?: T;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* В таком виде храним метаданные опций по ключу MetaKeys.OPTION
|
|
31
|
+
*/
|
|
32
|
+
export type OptionsMetadataMap = Map<ParameterIndex, OptionMetadata>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isCommandMetadata = exports.isRunnableMetadata = exports.Key = void 0;
|
|
4
|
+
var Key;
|
|
5
|
+
(function (Key) {
|
|
6
|
+
Key["COMMAND"] = "COMMAND";
|
|
7
|
+
Key["OPTIONS"] = "OPTIONS";
|
|
8
|
+
})(Key || (exports.Key = Key = {}));
|
|
9
|
+
const isRunnableMetadata = (metadata) => {
|
|
10
|
+
return (typeof metadata === 'object' &&
|
|
11
|
+
metadata !== null &&
|
|
12
|
+
'name' in metadata &&
|
|
13
|
+
'description' in metadata);
|
|
14
|
+
};
|
|
15
|
+
exports.isRunnableMetadata = isRunnableMetadata;
|
|
16
|
+
const isCommandMetadata = (metadata) => {
|
|
17
|
+
return ((0, exports.isRunnableMetadata)(metadata) &&
|
|
18
|
+
'variations' in metadata &&
|
|
19
|
+
'subcommands' in metadata);
|
|
20
|
+
};
|
|
21
|
+
exports.isCommandMetadata = isCommandMetadata;
|
|
22
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/common/types.ts"],"names":[],"mappings":";;;AAEA,IAAY,GAGX;AAHD,WAAY,GAAG;IACb,0BAAmB,CAAA;IACnB,0BAAmB,CAAA;AACrB,CAAC,EAHW,GAAG,mBAAH,GAAG,QAGd;AAcM,MAAM,kBAAkB,GAAG,CAChC,QAAiB,EACa,EAAE;IAChC,OAAO,CACL,OAAO,QAAQ,KAAK,QAAQ;QAC5B,QAAQ,KAAK,IAAI;QACjB,MAAM,IAAI,QAAQ;QAClB,aAAa,IAAI,QAAQ,CAC1B,CAAC;AACJ,CAAC,CAAC;AATW,QAAA,kBAAkB,sBAS7B;AAOK,MAAM,iBAAiB,GAAG,CAC/B,QAAiB,EACY,EAAE;IAC/B,OAAO,CACL,IAAA,0BAAkB,EAAC,QAAQ,CAAC;QAC5B,YAAY,IAAI,QAAQ;QACxB,aAAa,IAAI,QAAQ,CAC1B,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,iBAAiB,qBAQ5B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Constructor } from '@rsdk/common';
|
|
2
|
+
import type { IRunnable } from '../runnable.interface';
|
|
3
|
+
export type CommandOptions = {
|
|
4
|
+
description: string;
|
|
5
|
+
variations?: Constructor<IRunnable>[];
|
|
6
|
+
subcommands?: Constructor<IRunnable>[];
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Декоратор для определения основной команды CLI.
|
|
10
|
+
* @param name - Имя команды
|
|
11
|
+
* @param description - Описание команды
|
|
12
|
+
* @returns Декоратор класса
|
|
13
|
+
*/
|
|
14
|
+
export declare const Command: (name: string, options: CommandOptions) => ClassDecorator;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Command = void 0;
|
|
4
|
+
const metadata_registry_1 = require("../common/metadata.registry");
|
|
5
|
+
/**
|
|
6
|
+
* Декоратор для определения основной команды CLI.
|
|
7
|
+
* @param name - Имя команды
|
|
8
|
+
* @param description - Описание команды
|
|
9
|
+
* @returns Декоратор класса
|
|
10
|
+
*/
|
|
11
|
+
const Command = (name, options) => {
|
|
12
|
+
return (target) => {
|
|
13
|
+
/**
|
|
14
|
+
* TODO: Поскольку согласно документации typescript, декораторы классов отрабатывают
|
|
15
|
+
* в тот момент, когда декораторы всех методов и их параметров уже отработали,
|
|
16
|
+
* мы можем провести кое-какую валидацию. Подумать, какую именно.
|
|
17
|
+
*/
|
|
18
|
+
metadata_registry_1.MetadataRegistry.addCommand(target, {
|
|
19
|
+
name,
|
|
20
|
+
subcommands: [],
|
|
21
|
+
variations: [],
|
|
22
|
+
...options,
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
exports.Command = Command;
|
|
27
|
+
//# sourceMappingURL=command.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.decorator.js","sourceRoot":"","sources":["../../src/decorators/command.decorator.ts"],"names":[],"mappings":";;;AAEA,mEAA+D;AAS/D;;;;;GAKG;AACI,MAAM,OAAO,GAAG,CACrB,IAAY,EACZ,OAAuB,EACP,EAAE;IAClB,OAAO,CAAC,MAAM,EAAE,EAAE;QAChB;;;;WAIG;QAEH,oCAAgB,CAAC,UAAU,CAAC,MAAM,EAAE;YAClC,IAAI;YACJ,WAAW,EAAE,EAAE;YACf,UAAU,EAAE,EAAE;YACd,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AAlBW,QAAA,OAAO,WAkBlB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./command.decorator"), exports);
|
|
18
|
+
__exportStar(require("./option.decorator"), exports);
|
|
19
|
+
__exportStar(require("./option-with-value.decorator"), exports);
|
|
20
|
+
__exportStar(require("./sub-command.decorator"), exports);
|
|
21
|
+
__exportStar(require("./variation.decorator"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC;AACpC,qDAAmC;AACnC,gEAA8C;AAC9C,0DAAwC;AACxC,wDAAsC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { PropertyParser } from '@rsdk/common';
|
|
2
|
+
import type { OptionMetadata } from '../common/types';
|
|
3
|
+
/**
|
|
4
|
+
* Определяет опцию со значением для команды или подкоманды
|
|
5
|
+
* @param name - Имя опции
|
|
6
|
+
* @param parser - Функция для преобразования строкового значения в нужный тип
|
|
7
|
+
* @param params - Параметры опции
|
|
8
|
+
* @param params.description - Описание опции
|
|
9
|
+
* @param params.alias - Опциональный короткий синоним для опции
|
|
10
|
+
* @param params.defaultValue - Значение по умолчанию
|
|
11
|
+
* @returns Декоратор параметра, добавляющий метаданные опции
|
|
12
|
+
*/
|
|
13
|
+
export declare const ValueOption: <T>(name: string, parser: PropertyParser<T>, params: Omit<OptionMetadata<T>, "name" | "parser">) => ParameterDecorator;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ValueOption = void 0;
|
|
4
|
+
const metadata_registry_1 = require("../common/metadata.registry");
|
|
5
|
+
/**
|
|
6
|
+
* Определяет опцию со значением для команды или подкоманды
|
|
7
|
+
* @param name - Имя опции
|
|
8
|
+
* @param parser - Функция для преобразования строкового значения в нужный тип
|
|
9
|
+
* @param params - Параметры опции
|
|
10
|
+
* @param params.description - Описание опции
|
|
11
|
+
* @param params.alias - Опциональный короткий синоним для опции
|
|
12
|
+
* @param params.defaultValue - Значение по умолчанию
|
|
13
|
+
* @returns Декоратор параметра, добавляющий метаданные опции
|
|
14
|
+
*/
|
|
15
|
+
const ValueOption = (name, parser, params) => {
|
|
16
|
+
const option = {
|
|
17
|
+
name,
|
|
18
|
+
parser,
|
|
19
|
+
...params,
|
|
20
|
+
};
|
|
21
|
+
return (target, _, parameterIndex) => {
|
|
22
|
+
metadata_registry_1.MetadataRegistry.addOption(target.constructor, parameterIndex, option);
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
exports.ValueOption = ValueOption;
|
|
26
|
+
//# sourceMappingURL=option-with-value.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"option-with-value.decorator.js","sourceRoot":"","sources":["../../src/decorators/option-with-value.decorator.ts"],"names":[],"mappings":";;;AAEA,mEAA+D;AAG/D;;;;;;;;;GASG;AACI,MAAM,WAAW,GAAG,CACzB,IAAY,EACZ,MAAyB,EACzB,MAAkD,EAC9B,EAAE;IACtB,MAAM,MAAM,GAAsB;QAChC,IAAI;QACJ,MAAM;QACN,GAAG,MAAM;KACV,CAAC;IAEF,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE;QACnC,oCAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC,CAAC;AACJ,CAAC,CAAC;AAdW,QAAA,WAAW,eActB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { OptionMetadata } from '../common/types';
|
|
2
|
+
/**
|
|
3
|
+
* Определяет флаг-опцию (без значения) для команды или подкоманды
|
|
4
|
+
* @param name - Имя опции
|
|
5
|
+
* @param params - Параметры опции
|
|
6
|
+
* @param params.description - Описание опции
|
|
7
|
+
* @param params.alias - Опциональный короткий синоним для опции
|
|
8
|
+
* @returns Декоратор параметра, добавляющий метаданные опции
|
|
9
|
+
*/
|
|
10
|
+
export declare const Option: (name: string, params: Pick<OptionMetadata<boolean>, "description" | "defaultValue">) => ParameterDecorator;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Option = void 0;
|
|
4
|
+
const metadata_registry_1 = require("../common/metadata.registry");
|
|
5
|
+
/**
|
|
6
|
+
* Определяет флаг-опцию (без значения) для команды или подкоманды
|
|
7
|
+
* @param name - Имя опции
|
|
8
|
+
* @param params - Параметры опции
|
|
9
|
+
* @param params.description - Описание опции
|
|
10
|
+
* @param params.alias - Опциональный короткий синоним для опции
|
|
11
|
+
* @returns Декоратор параметра, добавляющий метаданные опции
|
|
12
|
+
*/
|
|
13
|
+
const Option = (name, params) => {
|
|
14
|
+
const option = {
|
|
15
|
+
name,
|
|
16
|
+
...params,
|
|
17
|
+
};
|
|
18
|
+
return (target, _, parameterIndex) => {
|
|
19
|
+
metadata_registry_1.MetadataRegistry.addOption(target.constructor, parameterIndex, option);
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
exports.Option = Option;
|
|
23
|
+
//# sourceMappingURL=option.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"option.decorator.js","sourceRoot":"","sources":["../../src/decorators/option.decorator.ts"],"names":[],"mappings":";;;AAAA,mEAA+D;AAG/D;;;;;;;GAOG;AACI,MAAM,MAAM,GAAG,CACpB,IAAY,EACZ,MAAqE,EACjD,EAAE;IACtB,MAAM,MAAM,GAA4B;QACtC,IAAI;QACJ,GAAG,MAAM;KACV,CAAC;IAEF,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE;QACnC,oCAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC,CAAC;AACJ,CAAC,CAAC;AAZW,QAAA,MAAM,UAYjB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type SubCommandOptions = {
|
|
2
|
+
description: string;
|
|
3
|
+
};
|
|
4
|
+
/**
|
|
5
|
+
* Декоратор для определения подкоманды CLI
|
|
6
|
+
* @param name - Имя подкоманды
|
|
7
|
+
* @param description - Описание подкоманды
|
|
8
|
+
*/
|
|
9
|
+
export declare const SubCommand: (name: string, options: SubCommandOptions) => ClassDecorator;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SubCommand = void 0;
|
|
4
|
+
const metadata_registry_1 = require("../common/metadata.registry");
|
|
5
|
+
/**
|
|
6
|
+
* Декоратор для определения подкоманды CLI
|
|
7
|
+
* @param name - Имя подкоманды
|
|
8
|
+
* @param description - Описание подкоманды
|
|
9
|
+
*/
|
|
10
|
+
const SubCommand = (name, options) => {
|
|
11
|
+
return (target) => {
|
|
12
|
+
metadata_registry_1.MetadataRegistry.addRunnable(target, {
|
|
13
|
+
name,
|
|
14
|
+
...options,
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
exports.SubCommand = SubCommand;
|
|
19
|
+
//# sourceMappingURL=sub-command.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sub-command.decorator.js","sourceRoot":"","sources":["../../src/decorators/sub-command.decorator.ts"],"names":[],"mappings":";;;AAAA,mEAA+D;AAM/D;;;;GAIG;AACI,MAAM,UAAU,GAAG,CACxB,IAAY,EACZ,OAA0B,EACV,EAAE;IAClB,OAAO,CAAC,MAAM,EAAE,EAAE;QAChB,oCAAgB,CAAC,WAAW,CAAC,MAAM,EAAE;YACnC,IAAI;YACJ,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AAVW,QAAA,UAAU,cAUrB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type VariationOptions = {
|
|
2
|
+
description: string;
|
|
3
|
+
};
|
|
4
|
+
/**
|
|
5
|
+
* Декоратор для определения основной команды CLI.
|
|
6
|
+
* @param name - Имя команды
|
|
7
|
+
* @param description - Описание команды
|
|
8
|
+
* @returns Декоратор класса
|
|
9
|
+
*/
|
|
10
|
+
export declare const CommandVariation: (name: `${string}:${string}`, options: VariationOptions) => ClassDecorator;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CommandVariation = void 0;
|
|
4
|
+
const metadata_registry_1 = require("../common/metadata.registry");
|
|
5
|
+
/**
|
|
6
|
+
* Декоратор для определения основной команды CLI.
|
|
7
|
+
* @param name - Имя команды
|
|
8
|
+
* @param description - Описание команды
|
|
9
|
+
* @returns Декоратор класса
|
|
10
|
+
*/
|
|
11
|
+
const CommandVariation = (name, options) => {
|
|
12
|
+
return (target) => {
|
|
13
|
+
metadata_registry_1.MetadataRegistry.addRunnable(target, {
|
|
14
|
+
name,
|
|
15
|
+
...options,
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
exports.CommandVariation = CommandVariation;
|
|
20
|
+
//# sourceMappingURL=variation.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variation.decorator.js","sourceRoot":"","sources":["../../src/decorators/variation.decorator.ts"],"names":[],"mappings":";;;AAAA,mEAA+D;AAM/D;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,CAC9B,IAA2B,EAC3B,OAAyB,EACT,EAAE;IAClB,OAAO,CAAC,MAAM,EAAE,EAAE;QAChB,oCAAgB,CAAC,WAAW,CAAC,MAAM,EAAE;YACnC,IAAI;YACJ,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AAVW,QAAA,gBAAgB,oBAU3B"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,14 +1,5 @@
|
|
|
1
|
-
import type { Command } from 'commander';
|
|
2
1
|
import 'reflect-metadata';
|
|
3
|
-
export
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
7
|
-
export interface RsdkCliCommand {
|
|
8
|
-
getCommands(): Command[];
|
|
9
|
-
}
|
|
10
|
-
export { Default } from './decorators';
|
|
11
|
-
export { Alias } from './decorators';
|
|
12
|
-
export { Option } from './decorators';
|
|
13
|
-
export { SubCmd } from './decorators';
|
|
14
|
-
export { Cmd } from './decorators';
|
|
2
|
+
export * from './decorators';
|
|
3
|
+
export { IRunnable } from './runnable.interface';
|
|
4
|
+
export { Key, OptionMetadata, PropertyKey, ParameterIndex, } from './common/types';
|
|
5
|
+
export { MetadataRegistry } from './common/metadata.registry';
|
package/dist/index.js
CHANGED
|
@@ -1,21 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
2
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
17
|
+
exports.MetadataRegistry = exports.Key = void 0;
|
|
4
18
|
require("reflect-metadata");
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
Object.defineProperty(exports, "getCommanderCommand", { enumerable: true, get: function () { return cmd_core_1.getCommanderCommand; } });
|
|
11
|
-
var decorators_1 = require("./decorators");
|
|
12
|
-
Object.defineProperty(exports, "Default", { enumerable: true, get: function () { return decorators_1.Default; } });
|
|
13
|
-
var decorators_2 = require("./decorators");
|
|
14
|
-
Object.defineProperty(exports, "Alias", { enumerable: true, get: function () { return decorators_2.Alias; } });
|
|
15
|
-
var decorators_3 = require("./decorators");
|
|
16
|
-
Object.defineProperty(exports, "Option", { enumerable: true, get: function () { return decorators_3.Option; } });
|
|
17
|
-
var decorators_4 = require("./decorators");
|
|
18
|
-
Object.defineProperty(exports, "SubCmd", { enumerable: true, get: function () { return decorators_4.SubCmd; } });
|
|
19
|
-
var decorators_5 = require("./decorators");
|
|
20
|
-
Object.defineProperty(exports, "Cmd", { enumerable: true, get: function () { return decorators_5.Cmd; } });
|
|
19
|
+
__exportStar(require("./decorators"), exports);
|
|
20
|
+
var types_1 = require("./common/types");
|
|
21
|
+
Object.defineProperty(exports, "Key", { enumerable: true, get: function () { return types_1.Key; } });
|
|
22
|
+
var metadata_registry_1 = require("./common/metadata.registry");
|
|
23
|
+
Object.defineProperty(exports, "MetadataRegistry", { enumerable: true, get: function () { return metadata_registry_1.MetadataRegistry; } });
|
|
21
24
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,4BAA0B;AAE1B,+CAA6B;AAI7B,wCAKwB;AAJtB,4FAAA,GAAG,OAAA;AAML,gEAA8D;AAArD,qHAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interface representing a command that can be executed.
|
|
3
|
+
*/
|
|
4
|
+
export interface IRunnable {
|
|
5
|
+
/**
|
|
6
|
+
* Runs the command with the provided arguments.
|
|
7
|
+
* @param args - Arguments passed to the command
|
|
8
|
+
* @returns Promise that resolves when command execution is complete
|
|
9
|
+
*/
|
|
10
|
+
run(...args: any[]): Promise<void>;
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runnable.interface.js","sourceRoot":"","sources":["../src/runnable.interface.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsdk/cli.common",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.0-next.0",
|
|
4
4
|
"description": "Shared types and helpers for build work with cli",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -15,8 +15,9 @@
|
|
|
15
15
|
],
|
|
16
16
|
"license": "Apache License 2.0",
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@rsdk/common": "
|
|
19
|
-
"@rsdk/
|
|
18
|
+
"@rsdk/common": "6.0.0-next.0",
|
|
19
|
+
"@rsdk/common.node": "6.0.0-next.0",
|
|
20
|
+
"@rsdk/logging": "6.0.0-next.0",
|
|
20
21
|
"@sinclair/typebox": "^0.34.9",
|
|
21
22
|
"commander": "^12.1.0",
|
|
22
23
|
"dotenv": "^16.3.1",
|
|
@@ -25,8 +26,7 @@
|
|
|
25
26
|
"yaml": "^2.6.1"
|
|
26
27
|
},
|
|
27
28
|
"peerDependencies": {
|
|
28
|
-
"@rsdk/core": "*",
|
|
29
29
|
"reflect-metadata": "^0.1.12 || ^0.2.0"
|
|
30
30
|
},
|
|
31
|
-
"gitHead": "
|
|
31
|
+
"gitHead": "215cccea23d95118dd8b6af3ce11c6a35ce19c30"
|
|
32
32
|
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/ban-types */
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
CommandMetadata,
|
|
5
|
+
OptionMetadata,
|
|
6
|
+
OptionsMetadataMap,
|
|
7
|
+
RunnableMetadata,
|
|
8
|
+
} from './types';
|
|
9
|
+
import { isCommandMetadata, isRunnableMetadata, Key } from './types';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* TODO: Довольно полезная вещь - надо будет вынести из
|
|
13
|
+
* cli в отдельный пакет. Но для этого нужно допустить регистрацию
|
|
14
|
+
* метаданных с нескольких декораторов
|
|
15
|
+
*/
|
|
16
|
+
export class MetadataRegistry {
|
|
17
|
+
static getCommand(ctor: Function): CommandMetadata {
|
|
18
|
+
const metadata = this.get<CommandMetadata>(ctor, Key.COMMAND);
|
|
19
|
+
|
|
20
|
+
if (!isCommandMetadata(metadata)) {
|
|
21
|
+
throw new Error(
|
|
22
|
+
'Command metadata not found. Probably you forgot @Cmd decorator.',
|
|
23
|
+
{
|
|
24
|
+
cause: { ctor },
|
|
25
|
+
},
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return metadata;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
static getRunnable(ctor: Function): RunnableMetadata {
|
|
33
|
+
const metadata = this.get<RunnableMetadata>(ctor, Key.COMMAND);
|
|
34
|
+
|
|
35
|
+
if (!isRunnableMetadata(metadata)) {
|
|
36
|
+
throw new Error(
|
|
37
|
+
'Runnable metadata not found. Probably you forgot to use @SubCommand or @Variation decorator.',
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return metadata;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
static getOptions(ctor: Function): OptionsMetadataMap {
|
|
45
|
+
return this.get<OptionsMetadataMap>(ctor, Key.OPTIONS, new Map());
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
static addOption(
|
|
49
|
+
ctor: Function,
|
|
50
|
+
parameterIndex: number,
|
|
51
|
+
metadata: OptionMetadata,
|
|
52
|
+
): void {
|
|
53
|
+
const optionsMap = this.get<OptionsMetadataMap>(
|
|
54
|
+
ctor,
|
|
55
|
+
Key.OPTIONS,
|
|
56
|
+
new Map(),
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
const existing = optionsMap.has(parameterIndex);
|
|
60
|
+
if (existing) {
|
|
61
|
+
throw new Error(
|
|
62
|
+
`Metadata for option ${ctor}.run [index: ${parameterIndex}] already exists`,
|
|
63
|
+
{
|
|
64
|
+
cause: { existing, metadata },
|
|
65
|
+
},
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
optionsMap.set(parameterIndex, metadata);
|
|
70
|
+
|
|
71
|
+
Reflect.defineMetadata(Key.OPTIONS, optionsMap, ctor);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Добавляет к метаданным класса дополнительные метаданные
|
|
76
|
+
* для свойства или параметра метода
|
|
77
|
+
*/
|
|
78
|
+
static addCommand(ctor: object, value: CommandMetadata): void {
|
|
79
|
+
Reflect.defineMetadata(Key.COMMAND, value, ctor);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
static addRunnable(ctor: object, value: RunnableMetadata): void {
|
|
83
|
+
Reflect.defineMetadata(Key.COMMAND, value, ctor);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
private static get<T>(t: object, key: Key): T | undefined;
|
|
87
|
+
private static get<T>(t: object, key: Key, defaultValue: T): T;
|
|
88
|
+
private static get<T>(t: object, key: Key, defaultValue?: T): T | undefined {
|
|
89
|
+
return Reflect.getMetadata(key, t) ?? defaultValue;
|
|
90
|
+
}
|
|
91
|
+
}
|