@rsdk/cli.core 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/README.MD +1 -1
- package/dist/cli.d.ts +17 -19
- package/dist/cli.js +37 -29
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/loaders/implementations/index.d.ts +2 -0
- package/dist/loaders/implementations/index.js +19 -0
- package/dist/loaders/implementations/index.js.map +1 -0
- package/dist/loaders/implementations/local-path.loader.d.ts +9 -0
- package/dist/loaders/implementations/local-path.loader.js +49 -0
- package/dist/loaders/implementations/local-path.loader.js.map +1 -0
- package/dist/loaders/implementations/pkg.loader.d.ts +11 -0
- package/dist/loaders/implementations/pkg.loader.js +31 -0
- package/dist/loaders/implementations/pkg.loader.js.map +1 -0
- package/dist/loaders/index.d.ts +1 -0
- package/dist/loaders/index.js +18 -0
- package/dist/loaders/index.js.map +1 -0
- package/dist/loaders/loader.interface.d.ts +5 -0
- package/dist/loaders/loader.interface.js +3 -0
- package/dist/loaders/loader.interface.js.map +1 -0
- package/dist/resolvers/command.resolver.d.ts +27 -0
- package/dist/resolvers/command.resolver.js +81 -0
- package/dist/resolvers/command.resolver.js.map +1 -0
- package/dist/resolvers/options.resolver.d.ts +35 -0
- package/dist/resolvers/options.resolver.js +80 -0
- package/dist/resolvers/options.resolver.js.map +1 -0
- package/jest.config.js +1 -0
- package/jest.config.unit.js +1 -0
- package/package.json +19 -6
- package/src/cli.ts +52 -38
- package/src/index.ts +11 -3
- package/src/loaders/implementations/index.ts +2 -0
- package/src/loaders/implementations/local-path.loader.ts +53 -0
- package/src/loaders/implementations/pkg.loader.ts +33 -0
- package/src/loaders/index.ts +1 -0
- package/src/loaders/loader.interface.ts +6 -0
- package/src/resolvers/command.resolver.ts +103 -0
- package/src/resolvers/options.resolver.ts +92 -0
- package/test/cli.spec.ts +131 -0
- package/test/commands/command.single.ts +30 -0
- package/test/commands/command.with-all.ts +93 -0
- package/test/commands/command.with-subcommands.ts +55 -0
- package/test/commands/command.with-variations.ts +55 -0
- package/test/commands/js/command.single.js +47 -0
- package/test/commands-resolver.spec.ts +125 -0
- package/test/loaders.spec.ts +61 -0
- package/test/options-resolver.spec.ts +119 -0
package/README.MD
CHANGED
|
@@ -12,4 +12,4 @@
|
|
|
12
12
|
|
|
13
13
|
## Интерфейс взаимодействия
|
|
14
14
|
|
|
15
|
-
Основной интерфейс взаимодействия с пакетом команды обеспечивается через `
|
|
15
|
+
Основной интерфейс взаимодействия с пакетом команды обеспечивается через `IRunnable` из пакета `@rsdk/cli.common`
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,21 +1,19 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ILogger } from '@rsdk/logging';
|
|
2
|
+
import type { Command } from 'commander';
|
|
3
|
+
export interface CliOptions {
|
|
4
|
+
plugins?: (string | {
|
|
5
|
+
command: any;
|
|
6
|
+
cmd: string;
|
|
7
|
+
})[];
|
|
8
|
+
discoverPlugins?: boolean;
|
|
9
|
+
cliPackageName: string;
|
|
10
|
+
}
|
|
2
11
|
export declare class Cli {
|
|
3
|
-
readonly
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
} | undefined;
|
|
11
|
-
constructor(opts?: {
|
|
12
|
-
plugins?: (string | {
|
|
13
|
-
command: RsdkCliCommand;
|
|
14
|
-
cmd: string;
|
|
15
|
-
})[];
|
|
16
|
-
discoverPlugins?: boolean;
|
|
17
|
-
cliPackageName: string;
|
|
18
|
-
} | undefined);
|
|
19
|
-
handle(argv: string[]): Promise<void>;
|
|
20
|
-
private getCmdPackageName;
|
|
12
|
+
private readonly program;
|
|
13
|
+
private readonly logger;
|
|
14
|
+
private readonly opts?;
|
|
15
|
+
constructor(program: Command, logger: ILogger, opts?: CliOptions | undefined);
|
|
16
|
+
handle(arg: string | undefined): Promise<void>;
|
|
17
|
+
private loadCommand;
|
|
18
|
+
private isLocalPath;
|
|
21
19
|
}
|
package/dist/cli.js
CHANGED
|
@@ -1,44 +1,52 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Cli = void 0;
|
|
4
|
-
const
|
|
4
|
+
const cli_common_1 = require("@rsdk/cli.common");
|
|
5
|
+
const common_1 = require("@rsdk/common");
|
|
6
|
+
const env_1 = require("@rsdk/env");
|
|
7
|
+
const command_resolver_1 = require("./resolvers/command.resolver");
|
|
8
|
+
const options_resolver_1 = require("./resolvers/options.resolver");
|
|
9
|
+
const loaders_1 = require("./loaders");
|
|
5
10
|
class Cli {
|
|
11
|
+
program;
|
|
12
|
+
logger;
|
|
6
13
|
opts;
|
|
7
|
-
constructor(opts) {
|
|
14
|
+
constructor(program, logger, opts) {
|
|
15
|
+
this.program = program;
|
|
16
|
+
this.logger = logger;
|
|
8
17
|
this.opts = opts;
|
|
9
18
|
}
|
|
10
|
-
async handle(
|
|
11
|
-
const rsdkCommand = argv.slice(2)[0];
|
|
12
|
-
if (!rsdkCommand || rsdkCommand.startsWith('-')) {
|
|
13
|
-
commander_1.program.parse();
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
const cmd = rsdkCommand.split(':')[0];
|
|
17
|
-
const rsdkCliCommandName = this.getCmdPackageName(cmd);
|
|
18
|
-
let rsdkCliCommand;
|
|
19
|
+
async handle(arg) {
|
|
19
20
|
try {
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
if (!arg || arg.startsWith('-')) {
|
|
22
|
+
await this.program.parseAsync();
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const env = new env_1.Env();
|
|
26
|
+
const optionsResolver = new options_resolver_1.OptionsResolver(env, this.logger);
|
|
27
|
+
const commandResolver = new command_resolver_1.CommandResolver(optionsResolver, this.logger);
|
|
28
|
+
const command = await this.loadCommand(arg);
|
|
29
|
+
const { subcommands, variations } = cli_common_1.MetadataRegistry.getCommand(command);
|
|
30
|
+
this.program.addCommand(commandResolver.resolve(command, subcommands));
|
|
31
|
+
for (const command of variations || []) {
|
|
32
|
+
this.program.addCommand(commandResolver.resolve(command));
|
|
33
|
+
}
|
|
34
|
+
await this.program.parseAsync();
|
|
22
35
|
}
|
|
23
36
|
catch (error) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
cause: error,
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
if (!('Cmd' in rsdkCliCommand)) {
|
|
30
|
-
throw new Error('Invalid cli cmd package', {
|
|
31
|
-
cause: { rsdkCliCommand, rsdkCliCommandName },
|
|
32
|
-
});
|
|
37
|
+
common_1.Assert.isError(error);
|
|
38
|
+
this.logger.error(error);
|
|
33
39
|
}
|
|
34
|
-
const cmds = rsdkCliCommand.Cmd.getCommands();
|
|
35
|
-
for (const cmd of cmds) {
|
|
36
|
-
commander_1.program.addCommand(cmd);
|
|
37
|
-
}
|
|
38
|
-
commander_1.program.parse();
|
|
39
40
|
}
|
|
40
|
-
|
|
41
|
-
|
|
41
|
+
async loadCommand(rsdkCommand) {
|
|
42
|
+
const [cmd] = rsdkCommand.split(':');
|
|
43
|
+
const loader = this.isLocalPath(cmd)
|
|
44
|
+
? new loaders_1.LocalPathLoader()
|
|
45
|
+
: new loaders_1.PkgLoader(this.opts?.cliPackageName);
|
|
46
|
+
return await loader.load(cmd);
|
|
47
|
+
}
|
|
48
|
+
isLocalPath(cmd) {
|
|
49
|
+
return cmd.startsWith('./') || cmd.startsWith('/') || cmd.includes('\\');
|
|
42
50
|
}
|
|
43
51
|
}
|
|
44
52
|
exports.Cli = Cli;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AACA,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AACA,iDAAoD;AACpD,yCAAwD;AACxD,mCAAgC;AAIhC,mEAA+D;AAC/D,mEAA+D;AAC/D,uCAAuD;AAQvD,MAAa,GAAG;IAEK;IACA;IACA;IAHnB,YACmB,OAAgB,EAChB,MAAe,EACf,IAAiB;QAFjB,YAAO,GAAP,OAAO,CAAS;QAChB,WAAM,GAAN,MAAM,CAAS;QACf,SAAI,GAAJ,IAAI,CAAa;IACjC,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,GAAuB;QAClC,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,SAAG,EAAE,CAAC;YACtB,MAAM,eAAe,GAAG,IAAI,kCAAe,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9D,MAAM,eAAe,GAAG,IAAI,kCAAe,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAE1E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAE5C,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,6BAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAEzE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;YAEvE,KAAK,MAAM,OAAO,IAAI,UAAU,IAAI,EAAE,EAAE,CAAC;gBACvC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5D,CAAC;YAED,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,WAAmB;QAEnB,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAErC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;YAClC,CAAC,CAAC,IAAI,yBAAe,EAAE;YACvB,CAAC,CAAC,IAAI,mBAAS,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAE7C,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAEO,WAAW,CAAC,GAAW;QAC7B,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3E,CAAC;CACF;AAlDD,kBAkDC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import type { RsdkCliCommand } from '@rsdk/cli.common';
|
|
2
1
|
import './reconfigure-logger';
|
|
2
|
+
/**
|
|
3
|
+
* Выполняет команду
|
|
4
|
+
*/
|
|
3
5
|
export declare const execute: (opts?: {
|
|
4
6
|
plugins?: (string | {
|
|
5
|
-
command:
|
|
7
|
+
command: any;
|
|
6
8
|
cmd: string;
|
|
7
9
|
})[];
|
|
8
10
|
discoverPlugins?: boolean;
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.execute = void 0;
|
|
7
|
+
const logging_1 = require("@rsdk/logging");
|
|
8
|
+
const commander_1 = require("commander");
|
|
7
9
|
const node_path_1 = __importDefault(require("node:path"));
|
|
8
10
|
require("./reconfigure-logger");
|
|
9
11
|
const cli_1 = require("./cli");
|
|
@@ -13,10 +15,15 @@ const getCliPackageName = () => {
|
|
|
13
15
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
14
16
|
return require(node_path_1.default.join(node_path_1.default.dirname(require.main.filename), 'package.json')).name;
|
|
15
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* Выполняет команду
|
|
20
|
+
*/
|
|
16
21
|
const execute = async (opts) => {
|
|
17
22
|
const cliPackageName = opts?.scope ?? getCliPackageName();
|
|
18
23
|
process.title = cliPackageName.split('/')[0].slice(1);
|
|
19
|
-
|
|
24
|
+
const logger = logging_1.LoggerFactory.create(cliPackageName);
|
|
25
|
+
const cli = new cli_1.Cli(commander_1.program, logger, { ...opts, cliPackageName });
|
|
26
|
+
await cli.handle(process.argv.at(2));
|
|
20
27
|
};
|
|
21
28
|
exports.execute = execute;
|
|
22
29
|
//# 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,2CAA8C;AAC9C,yCAAoC;AACpC,0DAA6B;AAE7B,gCAA8B;AAE9B,+BAA4B;AAE5B,+EAA+E;AAC/E,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC;AACnC,MAAM,iBAAiB,GAAG,GAAW,EAAE;IACrC,8DAA8D;IAC9D,OAAO,OAAO,CACZ,mBAAI,CAAC,IAAI,CAAC,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAK,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAChE,CAAC,IAAI,CAAC;AACT,CAAC,CAAC;AAEF;;GAEG;AACI,MAAM,OAAO,GAAG,KAAK,EAAE,IAI7B,EAAiB,EAAE;IAClB,MAAM,cAAc,GAAG,IAAI,EAAE,KAAK,IAAI,iBAAiB,EAAE,CAAC;IAE1D,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEtD,MAAM,MAAM,GAAG,uBAAa,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,IAAI,SAAG,CAAC,mBAAO,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;IAElE,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC,CAAC;AAbW,QAAA,OAAO,WAalB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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("./local-path.loader"), exports);
|
|
18
|
+
__exportStar(require("./pkg.loader"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/loaders/implementations/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC;AACpC,+CAA6B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Constructor } from '@rsdk/common';
|
|
2
|
+
import type { ICommandLoader } from '../loader.interface';
|
|
3
|
+
/**
|
|
4
|
+
* Загружает команды из файла
|
|
5
|
+
*/
|
|
6
|
+
export declare class LocalPathLoader implements ICommandLoader {
|
|
7
|
+
load(filename: string): Promise<Constructor>;
|
|
8
|
+
private registerTsNode;
|
|
9
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LocalPathLoader = void 0;
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
+
/**
|
|
9
|
+
* Загружает команды из файла
|
|
10
|
+
*/
|
|
11
|
+
class LocalPathLoader {
|
|
12
|
+
async load(filename) {
|
|
13
|
+
const resolvedPath = node_path_1.default.isAbsolute(filename)
|
|
14
|
+
? filename
|
|
15
|
+
: node_path_1.default.resolve(process.cwd(), filename);
|
|
16
|
+
try {
|
|
17
|
+
// Регистрируем ts-node до импорта файла
|
|
18
|
+
if (resolvedPath.endsWith('.ts')) {
|
|
19
|
+
this.registerTsNode(resolvedPath);
|
|
20
|
+
}
|
|
21
|
+
const { default: command } = await require(resolvedPath);
|
|
22
|
+
return command;
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
throw new Error(`Error loading command from file: ${resolvedPath}`, {
|
|
26
|
+
cause: error,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
registerTsNode(resolvedPath) {
|
|
31
|
+
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
32
|
+
const tsnode = require('ts-node');
|
|
33
|
+
const typescript = require('typescript');
|
|
34
|
+
/* eslint-enable @typescript-eslint/no-var-requires */
|
|
35
|
+
// Ищем ближайший tsconfig.json
|
|
36
|
+
const tsconfigPath = typescript.findConfigFile(node_path_1.default.dirname(resolvedPath), typescript.sys.fileExists);
|
|
37
|
+
tsnode.register({
|
|
38
|
+
transpileOnly: true, // Для более быстрой компиляции
|
|
39
|
+
project: tsconfigPath || undefined, // Используем найденный tsconfig или undefined
|
|
40
|
+
compilerOptions: {
|
|
41
|
+
// Базовые опции, которые будут перезаписаны настройками из tsconfig
|
|
42
|
+
module: 'commonjs',
|
|
43
|
+
target: 'es2017',
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.LocalPathLoader = LocalPathLoader;
|
|
49
|
+
//# sourceMappingURL=local-path.loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-path.loader.js","sourceRoot":"","sources":["../../../src/loaders/implementations/local-path.loader.ts"],"names":[],"mappings":";;;;;;AACA,0DAA6B;AAI7B;;GAEG;AACH,MAAa,eAAe;IAC1B,KAAK,CAAC,IAAI,CAAC,QAAgB;QACzB,MAAM,YAAY,GAAG,mBAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC5C,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QAE1C,IAAI,CAAC;YACH,wCAAwC;YACxC,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YACpC,CAAC;YAED,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;YAEzD,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,oCAAoC,YAAY,EAAE,EAAE;gBAClE,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,YAAoB;QACzC,uDAAuD;QACvD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;QACzC,sDAAsD;QAEtD,+BAA+B;QAC/B,MAAM,YAAY,GAAG,UAAU,CAAC,cAAc,CAC5C,mBAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAC1B,UAAU,CAAC,GAAG,CAAC,UAAU,CAC1B,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC;YACd,aAAa,EAAE,IAAI,EAAE,+BAA+B;YACpD,OAAO,EAAE,YAAY,IAAI,SAAS,EAAE,8CAA8C;YAClF,eAAe,EAAE;gBACf,oEAAoE;gBACpE,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,QAAQ;aACjB;SACF,CAAC,CAAC;IACL,CAAC;CACF;AA5CD,0CA4CC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { IRunnable } from '@rsdk/cli.common';
|
|
2
|
+
import type { Constructor } from '@rsdk/common';
|
|
3
|
+
import type { ICommandLoader } from '../loader.interface';
|
|
4
|
+
/**
|
|
5
|
+
* Загружает команды из пакета
|
|
6
|
+
*/
|
|
7
|
+
export declare class PkgLoader implements ICommandLoader {
|
|
8
|
+
private readonly cliPackageName?;
|
|
9
|
+
constructor(cliPackageName?: string | undefined);
|
|
10
|
+
load(cmd: string): Promise<Constructor<IRunnable>>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PkgLoader = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Загружает команды из пакета
|
|
6
|
+
*/
|
|
7
|
+
class PkgLoader {
|
|
8
|
+
cliPackageName;
|
|
9
|
+
constructor(cliPackageName) {
|
|
10
|
+
this.cliPackageName = cliPackageName;
|
|
11
|
+
}
|
|
12
|
+
async load(cmd) {
|
|
13
|
+
/* Пример вызова из консоли:
|
|
14
|
+
* $ rsdk init
|
|
15
|
+
* где:
|
|
16
|
+
* cliPackageName = '@rsdk/cli'
|
|
17
|
+
* cmd = 'init'
|
|
18
|
+
* pkg = '@rsdk/cli.cmd.init'
|
|
19
|
+
*/
|
|
20
|
+
const pkg = [this.cliPackageName, 'cmd', cmd].join('.');
|
|
21
|
+
try {
|
|
22
|
+
const { default: command } = await require(pkg);
|
|
23
|
+
return command;
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
throw new Error(`Error loading package, try install it: yarn add -D ${pkg}`, { cause: error });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.PkgLoader = PkgLoader;
|
|
31
|
+
//# sourceMappingURL=pkg.loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkg.loader.js","sourceRoot":"","sources":["../../../src/loaders/implementations/pkg.loader.ts"],"names":[],"mappings":";;;AAKA;;GAEG;AACH,MAAa,SAAS;IACS;IAA7B,YAA6B,cAAuB;QAAvB,mBAAc,GAAd,cAAc,CAAS;IAAG,CAAC;IAExD,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB;;;;;;WAMG;QACH,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAExD,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;YAEhD,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,sDAAsD,GAAG,EAAE,EAC3D,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAxBD,8BAwBC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './implementations';
|
|
@@ -0,0 +1,18 @@
|
|
|
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("./implementations"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/loaders/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.interface.js","sourceRoot":"","sources":["../../src/loaders/loader.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { IRunnable } from '@rsdk/cli.common';
|
|
2
|
+
import type { Constructor } from '@rsdk/common';
|
|
3
|
+
import type { ILogger } from '@rsdk/logging';
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import type { OptionsResolver } from './options.resolver';
|
|
6
|
+
/**
|
|
7
|
+
* Класс для преобразования классов команд в стиле rsdk в объекты Commander.Command.
|
|
8
|
+
* Обрабатывает метаданные команд, опций и подкоманд,
|
|
9
|
+
* создавая соответствующую структуру.
|
|
10
|
+
*/
|
|
11
|
+
export declare class CommandResolver {
|
|
12
|
+
private readonly optionsResolver;
|
|
13
|
+
private readonly logger;
|
|
14
|
+
constructor(optionsResolver: OptionsResolver, logger: ILogger);
|
|
15
|
+
/**
|
|
16
|
+
* Преобразует класс с декоратором @Cmd в объект Commander.Command.
|
|
17
|
+
* Создает команду с опциями и подкомандами на основе метаданных класса.
|
|
18
|
+
*
|
|
19
|
+
* @param {Type} ctor - Конструктор класса команды
|
|
20
|
+
* @returns {Command} Объект Commander.Command с настроенными опциями и подкомандами
|
|
21
|
+
* @throws {Error} Если не найдены метаданные команды (отсутствует декоратор @Cmd)
|
|
22
|
+
*/
|
|
23
|
+
resolve(ctor: Constructor<IRunnable>, subcommands?: Constructor<IRunnable>[]): Command;
|
|
24
|
+
private createCommand;
|
|
25
|
+
private createHandler;
|
|
26
|
+
private assertNoParams;
|
|
27
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CommandResolver = void 0;
|
|
7
|
+
const cli_common_1 = require("@rsdk/cli.common");
|
|
8
|
+
const commander_1 = require("commander");
|
|
9
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
10
|
+
/**
|
|
11
|
+
* Класс для преобразования классов команд в стиле rsdk в объекты Commander.Command.
|
|
12
|
+
* Обрабатывает метаданные команд, опций и подкоманд,
|
|
13
|
+
* создавая соответствующую структуру.
|
|
14
|
+
*/
|
|
15
|
+
class CommandResolver {
|
|
16
|
+
optionsResolver;
|
|
17
|
+
logger;
|
|
18
|
+
constructor(optionsResolver, logger) {
|
|
19
|
+
this.optionsResolver = optionsResolver;
|
|
20
|
+
this.logger = logger;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Преобразует класс с декоратором @Cmd в объект Commander.Command.
|
|
24
|
+
* Создает команду с опциями и подкомандами на основе метаданных класса.
|
|
25
|
+
*
|
|
26
|
+
* @param {Type} ctor - Конструктор класса команды
|
|
27
|
+
* @returns {Command} Объект Commander.Command с настроенными опциями и подкомандами
|
|
28
|
+
* @throws {Error} Если не найдены метаданные команды (отсутствует декоратор @Cmd)
|
|
29
|
+
*/
|
|
30
|
+
resolve(ctor, subcommands = []) {
|
|
31
|
+
this.logger.trace('resolving command', { ctor });
|
|
32
|
+
this.assertNoParams(ctor);
|
|
33
|
+
const command = this.createCommand(ctor);
|
|
34
|
+
for (const subcommand of subcommands) {
|
|
35
|
+
command.addCommand(this.createCommand(subcommand));
|
|
36
|
+
}
|
|
37
|
+
return command;
|
|
38
|
+
}
|
|
39
|
+
createCommand(ctor) {
|
|
40
|
+
// Duplication
|
|
41
|
+
const commandMetadata = cli_common_1.MetadataRegistry.getRunnable(ctor);
|
|
42
|
+
const instance = Reflect.construct(ctor, []);
|
|
43
|
+
if (typeof instance['run'] !== 'function') {
|
|
44
|
+
throw new TypeError('Command must implement "run" method');
|
|
45
|
+
}
|
|
46
|
+
const { name, description } = commandMetadata;
|
|
47
|
+
const command = new commander_1.Command(name).description(description);
|
|
48
|
+
const options = cli_common_1.MetadataRegistry.getOptions(ctor);
|
|
49
|
+
for (const option of options.values()) {
|
|
50
|
+
const envKey = this.optionsResolver.createEnvKey(option);
|
|
51
|
+
const optionName = `--${option.name}${option.parser ? ' <value>' : ''}`;
|
|
52
|
+
const optionDescription = `${option.description} [eq ${envKey} in env]`;
|
|
53
|
+
command.option(optionName, optionDescription, option.defaultValue);
|
|
54
|
+
}
|
|
55
|
+
command.action(this.createHandler(options, instance['run'].bind(instance)));
|
|
56
|
+
return command;
|
|
57
|
+
}
|
|
58
|
+
createHandler(optionsByIndex, method) {
|
|
59
|
+
return (__, cmd) => {
|
|
60
|
+
/* Преобразуем опции в массив аргументов для вызова метода:
|
|
61
|
+
* 1. Конвертируем Map в массив пар [индекс, метаданные]
|
|
62
|
+
* 2. Получаем значения опций через OptionsResolver
|
|
63
|
+
* (с учетом приоритета источников)
|
|
64
|
+
* 3. Сортируем по индексу для правильного порядка аргументов
|
|
65
|
+
*/
|
|
66
|
+
const args = (0, lodash_1.default)([...optionsByIndex])
|
|
67
|
+
.map(([index, metadata]) => ({ index, metadata }))
|
|
68
|
+
.sortBy((x) => x.index)
|
|
69
|
+
.map((x) => this.optionsResolver.resolve(x.metadata, cmd.opts()));
|
|
70
|
+
return method(...args.value());
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
assertNoParams(ctor) {
|
|
74
|
+
const paramTypes = Reflect.getMetadata('design:paramtypes', ctor);
|
|
75
|
+
if (paramTypes?.length > 0) {
|
|
76
|
+
throw new Error('Command constructor must have no parameters');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.CommandResolver = CommandResolver;
|
|
81
|
+
//# sourceMappingURL=command.resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.resolver.js","sourceRoot":"","sources":["../../src/resolvers/command.resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { OptionMetadata } from '@rsdk/cli.common';
|
|
2
|
+
import type { Env } from '@rsdk/env';
|
|
3
|
+
import type { ILogger } from '@rsdk/logging';
|
|
4
|
+
import type { OptionValues } from 'commander';
|
|
5
|
+
/**
|
|
6
|
+
* Класс для разрешения значений опций командной строки.
|
|
7
|
+
* Обрабатывает значения из трех источников: переменные окружения, флаги командной строки и значения по умолчанию.
|
|
8
|
+
*/
|
|
9
|
+
export declare class OptionsResolver {
|
|
10
|
+
private readonly env;
|
|
11
|
+
private readonly logger;
|
|
12
|
+
constructor(env: Env, logger: ILogger);
|
|
13
|
+
/**
|
|
14
|
+
* Разрешает значение опции командной строки на основе метаданных и переданных параметров.
|
|
15
|
+
* Проверяет три источника значений в порядке приоритета:
|
|
16
|
+
* 1. Переменные окружения
|
|
17
|
+
* 2. Флаги командной строки
|
|
18
|
+
* 3. Значения по умолчанию
|
|
19
|
+
*
|
|
20
|
+
* Такой приоритет выбран для удобства конфигурирования в разных окружениях:
|
|
21
|
+
* - В локальной разработке проблем с ENV обычно не возникает
|
|
22
|
+
* - В Kubernetes удобнее редактировать ConfigMap, чем Deployment
|
|
23
|
+
* @param {OptionMetadata} optionMetadata - Метаданные опции, содержащие имя, парсер и значение по умолчанию
|
|
24
|
+
* @param {OptionValues} passedOptions - Объект с переданными опциями командной строки
|
|
25
|
+
* @returns {any} Разрешенное значение опции
|
|
26
|
+
*/
|
|
27
|
+
resolve(optionMetadata: OptionMetadata, passedOptions: OptionValues): any;
|
|
28
|
+
/**
|
|
29
|
+
* Создает ключ переменной окружения на основе метаданных опции.
|
|
30
|
+
*
|
|
31
|
+
* @param {OptionMetadata} optionMetadata - Метаданные опции, содержащие имя и стратегию.
|
|
32
|
+
* @returns {string} Ключ переменной окружения в формате верхнего регистра с подчеркиванием.
|
|
33
|
+
*/
|
|
34
|
+
createEnvKey(optionMetadata: OptionMetadata): string;
|
|
35
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.OptionsResolver = void 0;
|
|
7
|
+
const common_1 = require("@rsdk/common");
|
|
8
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
9
|
+
/**
|
|
10
|
+
* Класс для разрешения значений опций командной строки.
|
|
11
|
+
* Обрабатывает значения из трех источников: переменные окружения, флаги командной строки и значения по умолчанию.
|
|
12
|
+
*/
|
|
13
|
+
class OptionsResolver {
|
|
14
|
+
env;
|
|
15
|
+
logger;
|
|
16
|
+
constructor(env, logger) {
|
|
17
|
+
this.env = env;
|
|
18
|
+
this.logger = logger;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Разрешает значение опции командной строки на основе метаданных и переданных параметров.
|
|
22
|
+
* Проверяет три источника значений в порядке приоритета:
|
|
23
|
+
* 1. Переменные окружения
|
|
24
|
+
* 2. Флаги командной строки
|
|
25
|
+
* 3. Значения по умолчанию
|
|
26
|
+
*
|
|
27
|
+
* Такой приоритет выбран для удобства конфигурирования в разных окружениях:
|
|
28
|
+
* - В локальной разработке проблем с ENV обычно не возникает
|
|
29
|
+
* - В Kubernetes удобнее редактировать ConfigMap, чем Deployment
|
|
30
|
+
* @param {OptionMetadata} optionMetadata - Метаданные опции, содержащие имя, парсер и значение по умолчанию
|
|
31
|
+
* @param {OptionValues} passedOptions - Объект с переданными опциями командной строки
|
|
32
|
+
* @returns {any} Разрешенное значение опции
|
|
33
|
+
*/
|
|
34
|
+
resolve(optionMetadata, passedOptions) {
|
|
35
|
+
this.logger.trace('handle arg', { optionMetadata });
|
|
36
|
+
const parser = optionMetadata.parser ?? new common_1.BoolParser();
|
|
37
|
+
// Находим значение переменной окружения
|
|
38
|
+
const envKey = this.createEnvKey(optionMetadata);
|
|
39
|
+
const variable = this.env.optional(envKey, parser);
|
|
40
|
+
// Находим значение переданное в виде флага
|
|
41
|
+
const optsKey = lodash_1.default.camelCase(optionMetadata.name);
|
|
42
|
+
const isPassed = Object.hasOwn(passedOptions, optsKey);
|
|
43
|
+
const valueFromFlag = passedOptions[optsKey];
|
|
44
|
+
if (variable) {
|
|
45
|
+
if (isPassed) {
|
|
46
|
+
this.logger.warn(`Environment variable ${envKey} overrides command flags`);
|
|
47
|
+
}
|
|
48
|
+
// Возвращаем значение переменной окружения
|
|
49
|
+
return variable.value;
|
|
50
|
+
}
|
|
51
|
+
this.logger.trace(`Environment variable ${envKey} not provided`);
|
|
52
|
+
if (isPassed) {
|
|
53
|
+
this.logger.trace(`Use flag value: ${valueFromFlag}`, {
|
|
54
|
+
key: optsKey,
|
|
55
|
+
opts: passedOptions,
|
|
56
|
+
});
|
|
57
|
+
return parser.parse(valueFromFlag);
|
|
58
|
+
}
|
|
59
|
+
const defaultValue = optionMetadata.defaultValue;
|
|
60
|
+
this.logger.trace(`Use default value: ${defaultValue}`, {
|
|
61
|
+
key: optsKey,
|
|
62
|
+
opts: passedOptions,
|
|
63
|
+
});
|
|
64
|
+
/**
|
|
65
|
+
* undefined - вполне нормально значение по умолчанию
|
|
66
|
+
*/
|
|
67
|
+
return defaultValue === undefined ? undefined : parser.parse(defaultValue);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Создает ключ переменной окружения на основе метаданных опции.
|
|
71
|
+
*
|
|
72
|
+
* @param {OptionMetadata} optionMetadata - Метаданные опции, содержащие имя и стратегию.
|
|
73
|
+
* @returns {string} Ключ переменной окружения в формате верхнего регистра с подчеркиванием.
|
|
74
|
+
*/
|
|
75
|
+
createEnvKey(optionMetadata) {
|
|
76
|
+
return common_1.Case.toUpperSnake(`${optionMetadata.name}${optionMetadata.parser ? '' : '_enabled'}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.OptionsResolver = OptionsResolver;
|
|
80
|
+
//# sourceMappingURL=options.resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.resolver.js","sourceRoot":"","sources":["../../src/resolvers/options.resolver.ts"],"names":[],"mappings":";;;;;;AACA,yCAAgD;AAIhD,oDAAuB;AAEvB;;;GAGG;AACH,MAAa,eAAe;IAEP;IACA;IAFnB,YACmB,GAAQ,EACR,MAAe;QADf,QAAG,GAAH,GAAG,CAAK;QACR,WAAM,GAAN,MAAM,CAAS;IAC/B,CAAC;IAEJ;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,cAA8B,EAAE,aAA2B;QACjE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,IAAI,IAAI,mBAAU,EAAE,CAAC;QAEzD,wCAAwC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAEnD,2CAA2C;QAC3C,MAAM,OAAO,GAAG,gBAAC,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAE7C,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,wBAAwB,MAAM,0BAA0B,CACzD,CAAC;YACJ,CAAC;YAED,2CAA2C;YAC3C,OAAO,QAAQ,CAAC,KAAK,CAAC;QACxB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,MAAM,eAAe,CAAC,CAAC;QAEjE,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,aAAa,EAAE,EAAE;gBACpD,GAAG,EAAE,OAAO;gBACZ,IAAI,EAAE,aAAa;aACpB,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,YAAY,GAAG,cAAc,CAAC,YAAY,CAAC;QAEjD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,YAAY,EAAE,EAAE;YACtD,GAAG,EAAE,OAAO;YACZ,IAAI,EAAE,aAAa;SACpB,CAAC,CAAC;QAEH;;WAEG;QACH,OAAO,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC7E,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,cAA8B;QACzC,OAAO,aAAI,CAAC,YAAY,CACtB,GAAG,cAAc,CAAC,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CACnE,CAAC;IACJ,CAAC;CACF;AAhFD,0CAgFC"}
|
package/jest.config.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('@rsdk/jest/jest.config');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('@rsdk/jest/jest.config.unit');
|