@rsdk/cli.core 4.3.1-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 ADDED
@@ -0,0 +1,8 @@
1
+ # Change Log
2
+
3
+ All notable changes to this project will be documented in this file.
4
+ See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
+
6
+ ## [4.3.1-next.1](https://github.com/R-Vision/rsdk/compare/v4.3.1-next.0...v4.3.1-next.1) (2024-03-25)
7
+
8
+ **Note:** Version bump only for package @rsdk/cli.core
package/README.MD ADDED
@@ -0,0 +1,15 @@
1
+ # Cli
2
+
3
+ Лаунчер для rsdk команд
4
+
5
+ ## Concepts
6
+
7
+ При вызове `rsdk <command>` лаунчер попытается найти пакет соответствующий этой команде (алгоритм поиска описан ниже) и/или предложит его установить, после чего делегирует обработку команды этому пакету.
8
+
9
+ ## Алгоритм поиска пакета
10
+
11
+ Из названия команды берется первая подстрока до двоеточия - `:`, этот фрагмент команды используется в названии команды `@rsdk/cli.cmd.<trimmed>`
12
+
13
+ ## Интерфейс взаимодействия
14
+
15
+ Основной интерфейс взаимодействия с пакетом команды обеспечивается через `RsdkCliCommand` из пакета `@rsdk/cli.common`
package/TODO.MD ADDED
@@ -0,0 +1,5 @@
1
+ # To do
2
+
3
+ [ ] list all installed commands
4
+ [ ] list all available commands (maybe over npm view + default commands from rsdk packages)
5
+ [ ] installing cmd.* packages different version, not only the same as `@rsdk/cli` package
package/dist/cli.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import type { ResolveResult } from '@parcel/package-manager/lib/types';
2
+ import type { RsdkCliCommand } from '@rsdk/cli.common';
3
+ export declare class Cli {
4
+ readonly opts?: {
5
+ plugins?: (string | {
6
+ command: RsdkCliCommand;
7
+ cmd: string;
8
+ })[];
9
+ discoverPlugins?: boolean;
10
+ } | undefined;
11
+ constructor(opts?: {
12
+ plugins?: (string | {
13
+ command: RsdkCliCommand;
14
+ cmd: string;
15
+ })[];
16
+ discoverPlugins?: boolean;
17
+ } | undefined);
18
+ installCmdPackage(cmdPackage: string): Promise<void>;
19
+ resolveCmdPackage(cmdPackage: string): Promise<ResolveResult>;
20
+ getRsdkCommand(cmd: string): Promise<RsdkCliCommand | undefined>;
21
+ handle(argv: string[]): Promise<void>;
22
+ }
package/dist/cli.js ADDED
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Cli = void 0;
4
+ const fs_1 = require("@parcel/fs");
5
+ const package_manager_1 = require("@parcel/package-manager");
6
+ const commander_1 = require("commander");
7
+ const enquirer_1 = require("enquirer");
8
+ const node_path_1 = require("node:path");
9
+ const exception_1 = require("./exception");
10
+ const package_loader_1 = require("./package.loader");
11
+ class Cli {
12
+ opts;
13
+ constructor(opts) {
14
+ this.opts = opts;
15
+ }
16
+ async installCmdPackage(cmdPackage) {
17
+ const packageManager = new package_manager_1.NodePackageManager(new fs_1.NodeFS(), (0, node_path_1.resolve)());
18
+ await package_loader_1.PackageLoader.installPackage(packageManager, cmdPackage);
19
+ }
20
+ async resolveCmdPackage(cmdPackage) {
21
+ const packageManager = new package_manager_1.NodePackageManager(new fs_1.NodeFS(), (0, node_path_1.resolve)());
22
+ return await packageManager.resolve(cmdPackage, (0, node_path_1.resolve)(), null);
23
+ }
24
+ async getRsdkCommand(cmd) {
25
+ const cmdPackage = '@rsdk/cli.cmd.' + cmd;
26
+ try {
27
+ const resolvedPackage = await this.resolveCmdPackage(cmdPackage);
28
+ return package_loader_1.PackageLoader.getEntry(resolvedPackage.resolved);
29
+ }
30
+ catch (error) {
31
+ if (!(error instanceof Error)) {
32
+ throw error;
33
+ }
34
+ if (this.opts?.discoverPlugins === false) {
35
+ throw error;
36
+ }
37
+ const response = await (0, enquirer_1.prompt)({
38
+ type: 'confirm',
39
+ name: 'isInstall',
40
+ message: 'Install ' + cmdPackage + ' package?',
41
+ initial: true,
42
+ });
43
+ if (!response.isInstall) {
44
+ console.log('Install was aborted');
45
+ return;
46
+ }
47
+ try {
48
+ await this.installCmdPackage(cmdPackage);
49
+ }
50
+ catch (error) {
51
+ if (!(error instanceof Error)) {
52
+ throw error;
53
+ }
54
+ exception_1.FailedToInstall.assertError(error, cmdPackage);
55
+ throw error;
56
+ }
57
+ const resolvedPackage = await this.resolveCmdPackage(cmdPackage);
58
+ return package_loader_1.PackageLoader.getEntry(resolvedPackage.resolved);
59
+ }
60
+ }
61
+ async handle(argv) {
62
+ const rsdkCommand = argv.slice(2)[0];
63
+ if (!rsdkCommand || rsdkCommand.startsWith('-')) {
64
+ commander_1.program.parse();
65
+ return;
66
+ }
67
+ const cmd = rsdkCommand.split(':')[0];
68
+ const rsdkCliCommand = await this.getRsdkCommand(cmd);
69
+ if (!rsdkCliCommand) {
70
+ throw new Error('rsdk cli command not found');
71
+ }
72
+ const cmds = rsdkCliCommand.getCommands();
73
+ for (const cmd of cmds) {
74
+ commander_1.program.addCommand(cmd);
75
+ }
76
+ commander_1.program.parse();
77
+ }
78
+ }
79
+ exports.Cli = Cli;
80
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare class FailedToInstall extends Error {
2
+ constructor(packageName: string, cause?: any);
3
+ static assertError(error: Error, packageName: string): void;
4
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FailedToInstall = void 0;
4
+ class FailedToInstall extends Error {
5
+ constructor(packageName, cause) {
6
+ super('Failed to install ' + packageName, {
7
+ cause: {
8
+ packageName,
9
+ cause,
10
+ },
11
+ });
12
+ this.name = this.constructor.name;
13
+ }
14
+ static assertError(error, packageName) {
15
+ const isFailedToInstall = error.message.startsWith('Failed to install');
16
+ if (isFailedToInstall) {
17
+ throw new FailedToInstall(packageName, error);
18
+ }
19
+ }
20
+ }
21
+ exports.FailedToInstall = FailedToInstall;
22
+ //# sourceMappingURL=exception.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exception.js","sourceRoot":"","sources":["../src/exception.ts"],"names":[],"mappings":";;;AAAA,MAAa,eAAgB,SAAQ,KAAK;IACxC,YAAY,WAAmB,EAAE,KAAW;QAC1C,KAAK,CAAC,oBAAoB,GAAG,WAAW,EAAE;YACxC,KAAK,EAAE;gBACL,WAAW;gBACX,KAAK;aACN;SACF,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,KAAY,EAAE,WAAmB;QAClD,MAAM,iBAAiB,GAAI,KAAK,CAAC,OAAkB,CAAC,UAAU,CAC5D,mBAAmB,CACpB,CAAC;QACF,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,IAAI,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;CACF;AAnBD,0CAmBC"}
@@ -0,0 +1,9 @@
1
+ import type { RsdkCliCommand } from '@rsdk/cli.common';
2
+ import './reconfigure-logger';
3
+ export declare const execute: (opts?: {
4
+ plugins?: (string | {
5
+ command: RsdkCliCommand;
6
+ cmd: string;
7
+ })[];
8
+ discoverPlugins?: boolean;
9
+ }) => Promise<void>;
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.execute = void 0;
4
+ require("./reconfigure-logger");
5
+ const cli_1 = require("./cli");
6
+ // TODO: сделать более понятным, переиспользуемым, консистентным и контролируем
7
+ process.env.RSDK_CLI_MODE = 'true';
8
+ process.title = 'rsdk';
9
+ const execute = async (opts) => {
10
+ await new cli_1.Cli(opts).handle(process.argv);
11
+ };
12
+ exports.execute = execute;
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,gCAA8B;AAE9B,+BAA4B;AAE5B,+EAA+E;AAC/E,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC;AAEnC,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC;AAChB,MAAM,OAAO,GAAG,KAAK,EAAE,IAG7B,EAAiB,EAAE;IAClB,MAAM,IAAI,SAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC,CAAC;AALW,QAAA,OAAO,WAKlB"}
@@ -0,0 +1,6 @@
1
+ import type { PackageManager } from '@parcel/package-manager';
2
+ import type { RsdkCliCommand } from '@rsdk/cli.common';
3
+ export declare class PackageLoader {
4
+ static getEntry(cmdPackageName: string): RsdkCliCommand;
5
+ static installPackage(packageManager: PackageManager, cmdPackage: string): Promise<void>;
6
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PackageLoader = void 0;
4
+ const node_path_1 = require("node:path");
5
+ class PackageLoader {
6
+ static getEntry(cmdPackageName) {
7
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
8
+ return require(cmdPackageName).Cmd;
9
+ }
10
+ static async installPackage(packageManager, cmdPackage) {
11
+ const cliPackageJsonPath = require.resolve('../package.json', {
12
+ paths: [__dirname],
13
+ });
14
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
15
+ const cliPackageJson = require(cliPackageJsonPath);
16
+ // @ts-expect-error not declared method
17
+ await packageManager.install([
18
+ {
19
+ name: cmdPackage,
20
+ semVer: cliPackageJson.version,
21
+ },
22
+ ], (0, node_path_1.resolve)(''), {
23
+ saveDev: true,
24
+ });
25
+ }
26
+ }
27
+ exports.PackageLoader = PackageLoader;
28
+ //# sourceMappingURL=package.loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.loader.js","sourceRoot":"","sources":["../src/package.loader.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AAEpC,MAAa,aAAa;IACxB,MAAM,CAAC,QAAQ,CAAC,cAAsB;QACpC,8DAA8D;QAC9D,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,cAAc,CACzB,cAA8B,EAC9B,UAAkB;QAElB,MAAM,kBAAkB,GAAW,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE;YACpE,KAAK,EAAE,CAAC,SAAS,CAAC;SACnB,CAAC,CAAC;QAEH,8DAA8D;QAC9D,MAAM,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAEnD,uCAAuC;QACvC,MAAM,cAAc,CAAC,OAAO,CAC1B;YACE;gBACE,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,cAAc,CAAC,OAAO;aAC/B;SACF,EACD,IAAA,mBAAO,EAAC,EAAE,CAAC,EACX;YACE,OAAO,EAAE,IAAI;SACd,CACF,CAAC;IACJ,CAAC;CACF;AA/BD,sCA+BC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * TODO: написать корректную работу с логгером, с учетом того что она может (уже используется вне DI) и может аффектить tracing
3
+ */
4
+ import { LogLevel } from '@rsdk/logging';
5
+ export declare const logLevelFromEnv: LogLevel | undefined;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /**
3
+ * TODO: написать корректную работу с логгером, с учетом того что она может (уже используется вне DI) и может аффектить tracing
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.logLevelFromEnv = void 0;
7
+ const logging_1 = require("@rsdk/logging");
8
+ exports.logLevelFromEnv = logging_1.LogLevel[(process.env.LOG_LEVEL ?? 'info')];
9
+ logging_1.LoggerFactory.reconfigure({
10
+ level: exports.logLevelFromEnv ?? logging_1.LogLevel.info,
11
+ });
12
+ //# sourceMappingURL=reconfigure-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconfigure-logger.js","sourceRoot":"","sources":["../src/reconfigure-logger.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,2CAAwD;AAE3C,QAAA,eAAe,GAAG,kBAAQ,CACrC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAa,CACtB,CAAC;AAE1B,uBAAa,CAAC,WAAW,CAAC;IACxB,KAAK,EAAE,uBAAe,IAAI,kBAAQ,CAAC,IAAI;CACxC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@rsdk/cli.core",
3
+ "version": "4.3.1-next.1",
4
+ "description": "entry package to cli functions",
5
+ "main": "dist/index.js",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "keywords": [
10
+ "rsdk",
11
+ "cli"
12
+ ],
13
+ "license": "Apache License 2.0",
14
+ "dependencies": {
15
+ "@parcel/core": "^2.11.0",
16
+ "@parcel/fs": "^2.11.0",
17
+ "@parcel/package-manager": "^2.11.0",
18
+ "@sinclair/typebox": "^0.32.13",
19
+ "commander": "^12.0.0",
20
+ "dotenv": "^16.3.1",
21
+ "enquirer": "^2.4.1",
22
+ "kafkajs": "^2.2.4",
23
+ "listr2": "^6.6.1",
24
+ "yaml": "^2.3.1"
25
+ },
26
+ "peerDependencies": {
27
+ "@rsdk/cli.cmd.kafka": "^4.3.1-next.1",
28
+ "@rsdk/cli.common": "^4.3.1-next.1",
29
+ "@rsdk/logging": "^4.3.1-next.1"
30
+ },
31
+ "gitHead": "79ad5e9c5f25719390d866add5ef49c5f513485c"
32
+ }
package/src/cli.ts ADDED
@@ -0,0 +1,94 @@
1
+ import { NodeFS } from '@parcel/fs';
2
+ import { NodePackageManager } from '@parcel/package-manager';
3
+ import type { ResolveResult } from '@parcel/package-manager/lib/types';
4
+ import type { RsdkCliCommand } from '@rsdk/cli.common';
5
+ import { program } from 'commander';
6
+ import { prompt } from 'enquirer';
7
+ import { resolve } from 'node:path';
8
+
9
+ import { FailedToInstall } from './exception';
10
+ import { PackageLoader } from './package.loader';
11
+
12
+ export class Cli {
13
+ constructor(
14
+ readonly opts?: {
15
+ plugins?: (string | { command: RsdkCliCommand; cmd: string })[];
16
+ discoverPlugins?: boolean;
17
+ },
18
+ ) {}
19
+
20
+ async installCmdPackage(cmdPackage: string): Promise<void> {
21
+ const packageManager = new NodePackageManager(new NodeFS(), resolve());
22
+
23
+ await PackageLoader.installPackage(packageManager, cmdPackage);
24
+ }
25
+
26
+ async resolveCmdPackage(cmdPackage: string): Promise<ResolveResult> {
27
+ const packageManager = new NodePackageManager(new NodeFS(), resolve());
28
+
29
+ return await packageManager.resolve(cmdPackage, resolve(), null);
30
+ }
31
+
32
+ async getRsdkCommand(cmd: string): Promise<RsdkCliCommand | undefined> {
33
+ const cmdPackage = '@rsdk/cli.cmd.' + cmd;
34
+
35
+ try {
36
+ const resolvedPackage = await this.resolveCmdPackage(cmdPackage);
37
+
38
+ return PackageLoader.getEntry(resolvedPackage.resolved);
39
+ } catch (error) {
40
+ if (!(error instanceof Error)) {
41
+ throw error;
42
+ }
43
+ if (this.opts?.discoverPlugins === false) {
44
+ throw error;
45
+ }
46
+ const response = await prompt<{ isInstall: boolean }>({
47
+ type: 'confirm',
48
+ name: 'isInstall',
49
+ message: 'Install ' + cmdPackage + ' package?',
50
+ initial: true,
51
+ });
52
+
53
+ if (!response.isInstall) {
54
+ console.log('Install was aborted');
55
+ return;
56
+ }
57
+ try {
58
+ await this.installCmdPackage(cmdPackage);
59
+ } catch (error: any) {
60
+ if (!(error instanceof Error)) {
61
+ throw error;
62
+ }
63
+ FailedToInstall.assertError(error, cmdPackage);
64
+ throw error;
65
+ }
66
+
67
+ const resolvedPackage = await this.resolveCmdPackage(cmdPackage);
68
+
69
+ return PackageLoader.getEntry(resolvedPackage.resolved);
70
+ }
71
+ }
72
+
73
+ async handle(argv: string[]): Promise<void> {
74
+ const rsdkCommand = argv.slice(2)[0];
75
+
76
+ if (!rsdkCommand || rsdkCommand.startsWith('-')) {
77
+ program.parse();
78
+ return;
79
+ }
80
+ const cmd = rsdkCommand.split(':')[0];
81
+
82
+ const rsdkCliCommand = await this.getRsdkCommand(cmd);
83
+ if (!rsdkCliCommand) {
84
+ throw new Error('rsdk cli command not found');
85
+ }
86
+ const cmds = rsdkCliCommand.getCommands();
87
+
88
+ for (const cmd of cmds) {
89
+ program.addCommand(cmd);
90
+ }
91
+
92
+ program.parse();
93
+ }
94
+ }
@@ -0,0 +1,20 @@
1
+ export class FailedToInstall extends Error {
2
+ constructor(packageName: string, cause?: any) {
3
+ super('Failed to install ' + packageName, {
4
+ cause: {
5
+ packageName,
6
+ cause,
7
+ },
8
+ });
9
+ this.name = this.constructor.name;
10
+ }
11
+
12
+ static assertError(error: Error, packageName: string): void {
13
+ const isFailedToInstall = (error.message as string).startsWith(
14
+ 'Failed to install',
15
+ );
16
+ if (isFailedToInstall) {
17
+ throw new FailedToInstall(packageName, error);
18
+ }
19
+ }
20
+ }
package/src/index.ts ADDED
@@ -0,0 +1,16 @@
1
+ import type { RsdkCliCommand } from '@rsdk/cli.common';
2
+
3
+ import './reconfigure-logger';
4
+
5
+ import { Cli } from './cli';
6
+
7
+ // TODO: сделать более понятным, переиспользуемым, консистентным и контролируем
8
+ process.env.RSDK_CLI_MODE = 'true';
9
+
10
+ process.title = 'rsdk';
11
+ export const execute = async (opts?: {
12
+ plugins?: (string | { command: RsdkCliCommand; cmd: string })[];
13
+ discoverPlugins?: boolean;
14
+ }): Promise<void> => {
15
+ await new Cli(opts).handle(process.argv);
16
+ };
@@ -0,0 +1,36 @@
1
+ import type { PackageManager } from '@parcel/package-manager';
2
+ import type { RsdkCliCommand } from '@rsdk/cli.common';
3
+ import { resolve } from 'node:path';
4
+
5
+ export class PackageLoader {
6
+ static getEntry(cmdPackageName: string): RsdkCliCommand {
7
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
8
+ return require(cmdPackageName).Cmd;
9
+ }
10
+
11
+ static async installPackage(
12
+ packageManager: PackageManager,
13
+ cmdPackage: string,
14
+ ): Promise<void> {
15
+ const cliPackageJsonPath: string = require.resolve('../package.json', {
16
+ paths: [__dirname],
17
+ });
18
+
19
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
20
+ const cliPackageJson = require(cliPackageJsonPath);
21
+
22
+ // @ts-expect-error not declared method
23
+ await packageManager.install(
24
+ [
25
+ {
26
+ name: cmdPackage,
27
+ semVer: cliPackageJson.version,
28
+ },
29
+ ],
30
+ resolve(''),
31
+ {
32
+ saveDev: true,
33
+ },
34
+ );
35
+ }
36
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * TODO: написать корректную работу с логгером, с учетом того что она может (уже используется вне DI) и может аффектить tracing
3
+ */
4
+
5
+ import { LoggerFactory, LogLevel } from '@rsdk/logging';
6
+
7
+ export const logLevelFromEnv = LogLevel[
8
+ (process.env.LOG_LEVEL ?? 'info') as LogLevel
9
+ ] as LogLevel | undefined;
10
+
11
+ LoggerFactory.reconfigure({
12
+ level: logLevelFromEnv ?? LogLevel.info,
13
+ });
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "exclude": [
4
+ "node_modules",
5
+ "dist",
6
+ "test",
7
+ "**/*.spec.ts",
8
+ "**/*.test.ts",
9
+ "**/*.test.e2e.ts",
10
+ "**/*.test.manual-e2e.ts",
11
+ ]
12
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "@rsdk/tsconfig/base.json",
3
+ "compilerOptions": {
4
+ "declaration": true,
5
+ "outDir": "dist"
6
+ }
7
+ }