@noravel/command 1.0.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/LICENSE +9 -0
- package/README.md +569 -0
- package/dist/Command.d.ts +27 -0
- package/dist/Command.js +86 -0
- package/dist/Contracts/Command.d.ts +10 -0
- package/dist/Contracts/Command.js +2 -0
- package/dist/Contracts/CommandDefinition.d.ts +7 -0
- package/dist/Contracts/CommandDefinition.js +2 -0
- package/dist/Contracts/InputArgument.d.ts +12 -0
- package/dist/Contracts/InputArgument.js +9 -0
- package/dist/Contracts/InputOption.d.ts +15 -0
- package/dist/Contracts/InputOption.js +10 -0
- package/dist/Detector.d.ts +4 -0
- package/dist/Detector.js +73 -0
- package/dist/Executor.d.ts +4 -0
- package/dist/Executor.js +9 -0
- package/dist/Inputs/InputArgument.d.ts +13 -0
- package/dist/Inputs/InputArgument.js +39 -0
- package/dist/Inputs/InputDefinition.d.ts +11 -0
- package/dist/Inputs/InputDefinition.js +25 -0
- package/dist/Inputs/InputOption.d.ts +18 -0
- package/dist/Inputs/InputOption.js +84 -0
- package/dist/Inputs/Prompt.d.ts +5 -0
- package/dist/Inputs/Prompt.js +178 -0
- package/dist/Kernel.d.ts +15 -0
- package/dist/Kernel.js +88 -0
- package/dist/MakerCommand.d.ts +27 -0
- package/dist/MakerCommand.js +68 -0
- package/dist/Outputs/Helper.d.ts +7 -0
- package/dist/Outputs/Helper.js +61 -0
- package/dist/Outputs/OutputColor.d.ts +18 -0
- package/dist/Outputs/OutputColor.js +53 -0
- package/dist/Outputs/OutputMessage.d.ts +11 -0
- package/dist/Outputs/OutputMessage.js +70 -0
- package/dist/Outputs/ProgressBar/ProgressBar.d.ts +22 -0
- package/dist/Outputs/ProgressBar/ProgressBar.js +98 -0
- package/dist/Outputs/ProgressBar/StatusBar.d.ts +11 -0
- package/dist/Outputs/ProgressBar/StatusBar.js +10 -0
- package/dist/Outputs/ProgressBar/StatusBarFactory.d.ts +5 -0
- package/dist/Outputs/ProgressBar/StatusBarFactory.js +20 -0
- package/dist/Outputs/ProgressBar/StatusBarNormal.d.ts +6 -0
- package/dist/Outputs/ProgressBar/StatusBarNormal.js +19 -0
- package/dist/Outputs/ProgressBar/StatusBarVerbose.d.ts +6 -0
- package/dist/Outputs/ProgressBar/StatusBarVerbose.js +20 -0
- package/dist/Outputs/ProgressBar.d.ts +22 -0
- package/dist/Outputs/ProgressBar.js +123 -0
- package/dist/Parser.d.ts +9 -0
- package/dist/Parser.js +79 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +14 -0
- package/dist/src/Command.d.ts +23 -0
- package/dist/src/Command.js +61 -0
- package/dist/src/Contracts/Command.d.ts +9 -0
- package/dist/src/Contracts/Command.js +2 -0
- package/dist/src/Contracts/InputArgument.d.ts +11 -0
- package/dist/src/Contracts/InputArgument.js +9 -0
- package/dist/src/Contracts/InputOption.d.ts +12 -0
- package/dist/src/Contracts/InputOption.js +10 -0
- package/dist/src/Detector.d.ts +4 -0
- package/dist/src/Detector.js +50 -0
- package/dist/src/Inputs/InputArgument.d.ts +12 -0
- package/dist/src/Inputs/InputArgument.js +36 -0
- package/dist/src/Inputs/InputDefinition.d.ts +11 -0
- package/dist/src/Inputs/InputDefinition.js +25 -0
- package/dist/src/Inputs/InputOption.d.ts +18 -0
- package/dist/src/Inputs/InputOption.js +84 -0
- package/dist/src/Kernel.d.ts +15 -0
- package/dist/src/Kernel.js +87 -0
- package/dist/src/MakerCommand.d.ts +27 -0
- package/dist/src/MakerCommand.js +68 -0
- package/dist/src/Outputs/Helper.d.ts +7 -0
- package/dist/src/Outputs/Helper.js +61 -0
- package/dist/src/Outputs/OutputColor.d.ts +18 -0
- package/dist/src/Outputs/OutputColor.js +53 -0
- package/dist/src/Outputs/OutputMessage.d.ts +11 -0
- package/dist/src/Outputs/OutputMessage.js +144 -0
- package/dist/src/Parser.d.ts +9 -0
- package/dist/src/Parser.js +79 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.js +12 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +35 -0
package/dist/Parser.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import InputArgument from './Inputs/InputArgument';
|
|
2
|
+
import InputOption from './Inputs/InputOption';
|
|
3
|
+
export default class Parser {
|
|
4
|
+
static parse(expression: string): [string, InputArgument[], InputOption[]];
|
|
5
|
+
protected static name(expression: string): string;
|
|
6
|
+
protected static parseArgument(token: string): InputArgument;
|
|
7
|
+
protected static parseOption(token: string): InputOption;
|
|
8
|
+
protected static extractDescription(token: string): [string, string];
|
|
9
|
+
}
|
package/dist/Parser.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
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
|
+
const InputArgument_1 = __importDefault(require("./Inputs/InputArgument"));
|
|
7
|
+
const InputOption_1 = __importDefault(require("./Inputs/InputOption"));
|
|
8
|
+
const InputArgument_2 = require("./Contracts/InputArgument");
|
|
9
|
+
const InputOption_2 = require("./Contracts/InputOption");
|
|
10
|
+
class Parser {
|
|
11
|
+
static parse(expression) {
|
|
12
|
+
const name = Parser.name(expression);
|
|
13
|
+
const _options = [];
|
|
14
|
+
const _arguments = [];
|
|
15
|
+
[...expression.matchAll(/\{\s*(.*?)\s*\}/g)].forEach(match => {
|
|
16
|
+
const optionMatch = match[1].match(/^-{2,}(.*)/);
|
|
17
|
+
if (optionMatch) {
|
|
18
|
+
_options.push(Parser.parseOption(optionMatch[1]));
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
_arguments.push(Parser.parseArgument(match[1]));
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
return [name, _arguments, _options];
|
|
25
|
+
}
|
|
26
|
+
static name(expression) {
|
|
27
|
+
if (!/[^\s]+/.test(expression)) {
|
|
28
|
+
throw new Error('Unable to determine command name from signature');
|
|
29
|
+
}
|
|
30
|
+
return /[^\s]+/.exec(expression)?.[0] ?? '';
|
|
31
|
+
}
|
|
32
|
+
static parseArgument(token) {
|
|
33
|
+
const [name, description] = Parser.extractDescription(token);
|
|
34
|
+
switch (true) {
|
|
35
|
+
case name.endsWith('?*'):
|
|
36
|
+
return new InputArgument_1.default(name.replace(/\?\*$/, ''), InputArgument_2.ARGUMENT_MODE.IS_ARRAY, description);
|
|
37
|
+
case name.endsWith('*'):
|
|
38
|
+
return new InputArgument_1.default(name.replace(/\*$/, ''), InputArgument_2.ARGUMENT_MODE.IS_ARRAY | InputArgument_2.ARGUMENT_MODE.REQUIRED, description);
|
|
39
|
+
case name.endsWith('?'):
|
|
40
|
+
return new InputArgument_1.default(name.replace(/\?$/, ''), InputArgument_2.ARGUMENT_MODE.OPTIONAL, description);
|
|
41
|
+
case /(.+)\=\*(.+)/.test(name):
|
|
42
|
+
let match = /(.+)\=\*(.+)/.exec(name) ?? ['', '', ''];
|
|
43
|
+
return new InputArgument_1.default(match[1], InputArgument_2.ARGUMENT_MODE.IS_ARRAY, description, match[2].split(/,\s?/));
|
|
44
|
+
case /(.+)\=(.+)/.test(name):
|
|
45
|
+
let match2 = /(.+)\=(.+)/.exec(name) ?? ['', '', ''];
|
|
46
|
+
return new InputArgument_1.default(match2[1], InputArgument_2.ARGUMENT_MODE.OPTIONAL, description, match2[2]);
|
|
47
|
+
default:
|
|
48
|
+
return new InputArgument_1.default(name, InputArgument_2.ARGUMENT_MODE.REQUIRED, description);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
static parseOption(token) {
|
|
52
|
+
let [name, description] = Parser.extractDescription(token);
|
|
53
|
+
const matches = name.split(/\s*\|\s*/);
|
|
54
|
+
let shortcut;
|
|
55
|
+
if (matches.length > 1) {
|
|
56
|
+
shortcut = matches[0];
|
|
57
|
+
name = matches[1];
|
|
58
|
+
}
|
|
59
|
+
switch (true) {
|
|
60
|
+
case name.endsWith('='):
|
|
61
|
+
return new InputOption_1.default(name.replace(/\=$/, ''), shortcut, InputOption_2.OPTION_MODE.OPTIONAL, description);
|
|
62
|
+
case name.endsWith('=*'):
|
|
63
|
+
return new InputOption_1.default(name.replace(/\=\*$/, ''), shortcut, InputOption_2.OPTION_MODE.OPTIONAL | InputOption_2.OPTION_MODE.IS_ARRAY, description);
|
|
64
|
+
case /(.+)\=\*(.+)/.test(name):
|
|
65
|
+
let match = /(.+)\=\*(.+)/.exec(name) ?? ['', '', ''];
|
|
66
|
+
return new InputOption_1.default(match[1], shortcut, InputOption_2.OPTION_MODE.OPTIONAL | InputOption_2.OPTION_MODE.IS_ARRAY, description, match[2].split(/,\s?/));
|
|
67
|
+
case /(.+)\=(.+)/.test(name):
|
|
68
|
+
let match2 = /(.+)\=(.+)/.exec(name) ?? ['', '', ''];
|
|
69
|
+
return new InputOption_1.default(match2[1], shortcut, InputOption_2.OPTION_MODE.OPTIONAL, description, match2[2]);
|
|
70
|
+
default:
|
|
71
|
+
return new InputOption_1.default(name, shortcut, InputOption_2.OPTION_MODE.NONE, description);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
static extractDescription(token) {
|
|
75
|
+
const parts = token.trim().split(/\s+:\s+/);
|
|
76
|
+
return parts.length === 2 ? parts : [token, ''];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.default = Parser;
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
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.MakerCommand = exports.Kernel = exports.Executor = exports.Command = void 0;
|
|
7
|
+
const Command_1 = __importDefault(require("./Command"));
|
|
8
|
+
exports.Command = Command_1.default;
|
|
9
|
+
const Kernel_1 = __importDefault(require("./Kernel"));
|
|
10
|
+
exports.Kernel = Kernel_1.default;
|
|
11
|
+
const MakerCommand_1 = __importDefault(require("./MakerCommand"));
|
|
12
|
+
exports.MakerCommand = MakerCommand_1.default;
|
|
13
|
+
const Executor_1 = __importDefault(require("./Executor"));
|
|
14
|
+
exports.Executor = Executor_1.default;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import CommandContract from './Contracts/Command';
|
|
2
|
+
import InputDefinition from './Inputs/InputDefinition';
|
|
3
|
+
import OutputMessage from './Outputs/OutputMessage';
|
|
4
|
+
export default abstract class Command implements CommandContract {
|
|
5
|
+
argv: string[];
|
|
6
|
+
protected signature: string;
|
|
7
|
+
protected name: string;
|
|
8
|
+
protected description: string;
|
|
9
|
+
protected definition: InputDefinition;
|
|
10
|
+
protected inputs: {
|
|
11
|
+
arguments: Record<string, unknown>;
|
|
12
|
+
options: Record<string, unknown>;
|
|
13
|
+
};
|
|
14
|
+
protected output: OutputMessage;
|
|
15
|
+
constructor(argv: string[]);
|
|
16
|
+
bootstrap(): this;
|
|
17
|
+
getName(): string;
|
|
18
|
+
getDescription(): string;
|
|
19
|
+
getArgument(name?: string): unknown;
|
|
20
|
+
getOption(name?: string): unknown;
|
|
21
|
+
showHelp(): void;
|
|
22
|
+
abstract handle(): void;
|
|
23
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
const Parser_1 = __importDefault(require("./Parser"));
|
|
7
|
+
const Detector_1 = __importDefault(require("./Detector"));
|
|
8
|
+
const InputDefinition_1 = __importDefault(require("./Inputs/InputDefinition"));
|
|
9
|
+
const OutputMessage_1 = __importDefault(require("./Outputs/OutputMessage"));
|
|
10
|
+
const Helper_1 = __importDefault(require("./Outputs/Helper"));
|
|
11
|
+
class Command {
|
|
12
|
+
argv;
|
|
13
|
+
signature = '';
|
|
14
|
+
name = '';
|
|
15
|
+
description = '';
|
|
16
|
+
definition;
|
|
17
|
+
inputs = {
|
|
18
|
+
arguments: {},
|
|
19
|
+
options: {},
|
|
20
|
+
};
|
|
21
|
+
output;
|
|
22
|
+
constructor(argv) {
|
|
23
|
+
this.argv = argv;
|
|
24
|
+
this.definition = new InputDefinition_1.default();
|
|
25
|
+
this.output = new OutputMessage_1.default();
|
|
26
|
+
}
|
|
27
|
+
bootstrap() {
|
|
28
|
+
this.signature = this.signature + ' {--h|help : Display help for the given command} {--v|version : Display the version of Noravel Command}';
|
|
29
|
+
const [name, argumentDefinition, optionDefinition] = Parser_1.default.parse(this.signature);
|
|
30
|
+
this.name = name;
|
|
31
|
+
this.definition.setArguments(argumentDefinition);
|
|
32
|
+
this.definition.setOptions(optionDefinition);
|
|
33
|
+
const [_arguments, _options] = Detector_1.default.detect(this.argv.slice(1), this.definition);
|
|
34
|
+
this.inputs.arguments = _arguments;
|
|
35
|
+
this.inputs.options = _options;
|
|
36
|
+
return this;
|
|
37
|
+
}
|
|
38
|
+
getName() {
|
|
39
|
+
return this.name;
|
|
40
|
+
}
|
|
41
|
+
getDescription() {
|
|
42
|
+
return this.description;
|
|
43
|
+
}
|
|
44
|
+
getArgument(name) {
|
|
45
|
+
if (!name) {
|
|
46
|
+
return Object.values(this.inputs.arguments);
|
|
47
|
+
}
|
|
48
|
+
return this.inputs.arguments[name];
|
|
49
|
+
}
|
|
50
|
+
getOption(name) {
|
|
51
|
+
if (!name) {
|
|
52
|
+
return Object.values(this.inputs.options);
|
|
53
|
+
}
|
|
54
|
+
return this.inputs.options[name];
|
|
55
|
+
}
|
|
56
|
+
showHelp() {
|
|
57
|
+
const helper = new Helper_1.default();
|
|
58
|
+
helper.showHelp(this.name, this.description, this.definition);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.default = Command;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ARGUMENT_MODE = void 0;
|
|
4
|
+
var ARGUMENT_MODE;
|
|
5
|
+
(function (ARGUMENT_MODE) {
|
|
6
|
+
ARGUMENT_MODE[ARGUMENT_MODE["REQUIRED"] = 1] = "REQUIRED";
|
|
7
|
+
ARGUMENT_MODE[ARGUMENT_MODE["OPTIONAL"] = 2] = "OPTIONAL";
|
|
8
|
+
ARGUMENT_MODE[ARGUMENT_MODE["IS_ARRAY"] = 4] = "IS_ARRAY";
|
|
9
|
+
})(ARGUMENT_MODE || (exports.ARGUMENT_MODE = ARGUMENT_MODE = {}));
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OPTION_MODE = void 0;
|
|
4
|
+
var OPTION_MODE;
|
|
5
|
+
(function (OPTION_MODE) {
|
|
6
|
+
OPTION_MODE[OPTION_MODE["NONE"] = 1] = "NONE";
|
|
7
|
+
OPTION_MODE[OPTION_MODE["REQUIRED"] = 2] = "REQUIRED";
|
|
8
|
+
OPTION_MODE[OPTION_MODE["OPTIONAL"] = 4] = "OPTIONAL";
|
|
9
|
+
OPTION_MODE[OPTION_MODE["IS_ARRAY"] = 8] = "IS_ARRAY";
|
|
10
|
+
})(OPTION_MODE || (exports.OPTION_MODE = OPTION_MODE = {}));
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class Detector {
|
|
4
|
+
static detect(argv, definition) {
|
|
5
|
+
const _arguments = {};
|
|
6
|
+
const _options = {};
|
|
7
|
+
let i = 0;
|
|
8
|
+
const argumentDefinitions = definition.getArguments();
|
|
9
|
+
while (i < argv.length) {
|
|
10
|
+
if (argv[i].startsWith('-')) {
|
|
11
|
+
let [key, value] = argv[i].split('=');
|
|
12
|
+
const optionDefinition = definition.getOptions(key.replace(/^-{1,2}/, ''));
|
|
13
|
+
const nextIndex = i + 1;
|
|
14
|
+
if (!optionDefinition) {
|
|
15
|
+
i = nextIndex;
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
if (/(.+)\=(.+)/.test(argv[i])) {
|
|
19
|
+
if (optionDefinition.isArray()) {
|
|
20
|
+
value = [...(_options[optionDefinition.getName()] ?? []), value];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else if (argv[nextIndex] === undefined || argv[nextIndex].startsWith('-')) {
|
|
24
|
+
i = nextIndex;
|
|
25
|
+
if (optionDefinition.acceptValue()) {
|
|
26
|
+
value = optionDefinition.getDefault();
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
value = true;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
i = nextIndex;
|
|
34
|
+
value = argv[nextIndex];
|
|
35
|
+
if (optionDefinition.isArray()) {
|
|
36
|
+
value = [...(_options[optionDefinition.getName()] ?? []), argv[nextIndex]];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
_options[optionDefinition.getName()] = value;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
const argumentDefinition = argumentDefinitions.shift();
|
|
43
|
+
_arguments[argumentDefinition?.getName()] = argv[i];
|
|
44
|
+
}
|
|
45
|
+
i++;
|
|
46
|
+
}
|
|
47
|
+
return [_arguments, _options];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.default = Detector;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { InputArgument as InputArgumentContract } from '../Contracts/InputArgument';
|
|
2
|
+
export default class InputArgument implements InputArgumentContract {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
defaultValue?: string | string[] | undefined;
|
|
6
|
+
mode: number;
|
|
7
|
+
constructor(name: string, mode?: number, description?: string, defaultValue?: string | string[] | undefined);
|
|
8
|
+
getName(): string;
|
|
9
|
+
getDescription(): string;
|
|
10
|
+
isRequired(): boolean;
|
|
11
|
+
isArray(): boolean;
|
|
12
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const InputArgument_1 = require("../Contracts/InputArgument");
|
|
4
|
+
class InputArgument {
|
|
5
|
+
name;
|
|
6
|
+
description;
|
|
7
|
+
defaultValue;
|
|
8
|
+
mode;
|
|
9
|
+
constructor(name, mode, description = '', defaultValue) {
|
|
10
|
+
this.name = name;
|
|
11
|
+
this.description = description;
|
|
12
|
+
this.defaultValue = defaultValue;
|
|
13
|
+
if (!mode) {
|
|
14
|
+
this.mode = InputArgument_1.ARGUMENT_MODE.OPTIONAL;
|
|
15
|
+
}
|
|
16
|
+
else if (mode >= 1 && mode <= 7) {
|
|
17
|
+
this.mode = mode;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
throw new Error('Invalid argument mode');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
getName() {
|
|
24
|
+
return this.name;
|
|
25
|
+
}
|
|
26
|
+
getDescription() {
|
|
27
|
+
return this.description;
|
|
28
|
+
}
|
|
29
|
+
isRequired() {
|
|
30
|
+
return (this.mode & InputArgument_1.ARGUMENT_MODE.REQUIRED) === InputArgument_1.ARGUMENT_MODE.REQUIRED;
|
|
31
|
+
}
|
|
32
|
+
isArray() {
|
|
33
|
+
return (this.mode & InputArgument_1.ARGUMENT_MODE.IS_ARRAY) === InputArgument_1.ARGUMENT_MODE.IS_ARRAY;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.default = InputArgument;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import InputArgument from './InputArgument';
|
|
2
|
+
import InputOption from './InputOption';
|
|
3
|
+
export default class InputDefinition {
|
|
4
|
+
_arguments: InputArgument[];
|
|
5
|
+
_options: InputOption[];
|
|
6
|
+
constructor();
|
|
7
|
+
setArguments(data: InputArgument[]): void;
|
|
8
|
+
getArguments(): InputArgument[];
|
|
9
|
+
setOptions(data: InputOption[]): void;
|
|
10
|
+
getOptions(name?: string): InputOption | InputOption[] | undefined;
|
|
11
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class InputDefinition {
|
|
4
|
+
_arguments;
|
|
5
|
+
_options;
|
|
6
|
+
constructor() {
|
|
7
|
+
this._arguments = [];
|
|
8
|
+
this._options = [];
|
|
9
|
+
}
|
|
10
|
+
setArguments(data) {
|
|
11
|
+
this._arguments = data;
|
|
12
|
+
}
|
|
13
|
+
getArguments() {
|
|
14
|
+
return this._arguments;
|
|
15
|
+
}
|
|
16
|
+
setOptions(data) {
|
|
17
|
+
this._options = data;
|
|
18
|
+
}
|
|
19
|
+
getOptions(name) {
|
|
20
|
+
return name
|
|
21
|
+
? this._options.find((option) => option.getName() === name || option.getShortcut() === name)
|
|
22
|
+
: this._options;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.default = InputDefinition;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { InputOption as InputOptionContract } from '../Contracts/InputOption';
|
|
2
|
+
export default class InputOption implements InputOptionContract {
|
|
3
|
+
description: string;
|
|
4
|
+
name: string;
|
|
5
|
+
mode: number;
|
|
6
|
+
shortcut?: string | string[];
|
|
7
|
+
defaultValue?: string | string[];
|
|
8
|
+
constructor(name: string, shortcut?: string | string[], mode?: number, description?: string, defaultValue?: string | string[]);
|
|
9
|
+
getName(): string;
|
|
10
|
+
getShortcut(): string | string[] | undefined;
|
|
11
|
+
getDescription(): string;
|
|
12
|
+
acceptValue(): boolean;
|
|
13
|
+
isRequired(): boolean;
|
|
14
|
+
isOptional(): boolean;
|
|
15
|
+
isArray(): boolean;
|
|
16
|
+
setDefault(defaultValue?: string | string[]): void;
|
|
17
|
+
getDefault(): string | string[] | undefined;
|
|
18
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const InputOption_1 = require("../Contracts/InputOption");
|
|
4
|
+
class InputOption {
|
|
5
|
+
description;
|
|
6
|
+
name;
|
|
7
|
+
mode;
|
|
8
|
+
shortcut;
|
|
9
|
+
defaultValue;
|
|
10
|
+
constructor(name, shortcut, mode, description = '', defaultValue) {
|
|
11
|
+
this.description = description;
|
|
12
|
+
if (name.startsWith('--')) {
|
|
13
|
+
name = name.substring(2);
|
|
14
|
+
}
|
|
15
|
+
if (name == '') {
|
|
16
|
+
throw new Error('An option name cannot be empty.');
|
|
17
|
+
}
|
|
18
|
+
if (shortcut === '' || (Array.isArray(shortcut) && shortcut.length === 0)) {
|
|
19
|
+
shortcut = undefined;
|
|
20
|
+
}
|
|
21
|
+
if (shortcut) {
|
|
22
|
+
if (Array.isArray(shortcut)) {
|
|
23
|
+
shortcut = shortcut.join('|');
|
|
24
|
+
}
|
|
25
|
+
const shortcuts = shortcut
|
|
26
|
+
.replace(/^\-/, '')
|
|
27
|
+
.split(/(\|)-?/)
|
|
28
|
+
.filter(item => item.length > 0);
|
|
29
|
+
shortcut = shortcuts.join('|');
|
|
30
|
+
if (shortcut === '') {
|
|
31
|
+
throw new Error('An option shortcut cannot be empty.');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (!mode) {
|
|
35
|
+
mode = InputOption_1.OPTION_MODE.NONE;
|
|
36
|
+
}
|
|
37
|
+
else if (mode >= InputOption_1.OPTION_MODE.IS_ARRAY << 1 || mode < 1) {
|
|
38
|
+
throw new Error('Invalid option mode');
|
|
39
|
+
}
|
|
40
|
+
this.name = name;
|
|
41
|
+
this.shortcut = shortcut;
|
|
42
|
+
this.mode = mode;
|
|
43
|
+
this.setDefault(defaultValue);
|
|
44
|
+
}
|
|
45
|
+
getName() {
|
|
46
|
+
return this.name;
|
|
47
|
+
}
|
|
48
|
+
getShortcut() {
|
|
49
|
+
return this.shortcut;
|
|
50
|
+
}
|
|
51
|
+
getDescription() {
|
|
52
|
+
return this.description;
|
|
53
|
+
}
|
|
54
|
+
acceptValue() {
|
|
55
|
+
return this.isRequired() || this.isOptional();
|
|
56
|
+
}
|
|
57
|
+
isRequired() {
|
|
58
|
+
return (this.mode & InputOption_1.OPTION_MODE.REQUIRED) === InputOption_1.OPTION_MODE.REQUIRED;
|
|
59
|
+
}
|
|
60
|
+
isOptional() {
|
|
61
|
+
return (this.mode & InputOption_1.OPTION_MODE.OPTIONAL) === InputOption_1.OPTION_MODE.OPTIONAL;
|
|
62
|
+
}
|
|
63
|
+
isArray() {
|
|
64
|
+
return (this.mode & InputOption_1.OPTION_MODE.IS_ARRAY) === InputOption_1.OPTION_MODE.IS_ARRAY;
|
|
65
|
+
}
|
|
66
|
+
setDefault(defaultValue) {
|
|
67
|
+
if ((this.mode & InputOption_1.OPTION_MODE.NONE) === InputOption_1.OPTION_MODE.NONE && defaultValue !== undefined) {
|
|
68
|
+
throw new Error('Cannot set default value when using OPTION_MODE.NONE mode.');
|
|
69
|
+
}
|
|
70
|
+
if (this.isArray()) {
|
|
71
|
+
if (defaultValue === undefined) {
|
|
72
|
+
this.defaultValue = [];
|
|
73
|
+
}
|
|
74
|
+
else if (!Array.isArray(defaultValue)) {
|
|
75
|
+
throw new Error('A default value for an array option must be an array.');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
this.defaultValue = this.acceptValue() ? defaultValue : undefined;
|
|
79
|
+
}
|
|
80
|
+
getDefault() {
|
|
81
|
+
return this.defaultValue;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.default = InputOption;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import CommandContract from './Contracts/Command';
|
|
2
|
+
export default class Kernel {
|
|
3
|
+
registeredCommands: (new (argv: string[]) => CommandContract)[];
|
|
4
|
+
argv: string[];
|
|
5
|
+
name: string;
|
|
6
|
+
private callbackVersion?;
|
|
7
|
+
private color;
|
|
8
|
+
private output;
|
|
9
|
+
constructor(argv?: string[]);
|
|
10
|
+
register(commands: (new (argv: string[]) => CommandContract)[]): this;
|
|
11
|
+
run(): void;
|
|
12
|
+
setCallbackVersion(callback: () => void): this;
|
|
13
|
+
showVersion(): void;
|
|
14
|
+
getVersion(): any;
|
|
15
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
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
|
+
const fs_1 = __importDefault(require("fs"));
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const didyoumean2_1 = __importDefault(require("didyoumean2"));
|
|
9
|
+
const Helper_1 = __importDefault(require("./Outputs/Helper"));
|
|
10
|
+
const OutputColor_1 = __importDefault(require("./Outputs/OutputColor"));
|
|
11
|
+
const OutputMessage_1 = __importDefault(require("./Outputs/OutputMessage"));
|
|
12
|
+
class Kernel {
|
|
13
|
+
registeredCommands = [];
|
|
14
|
+
argv;
|
|
15
|
+
name;
|
|
16
|
+
callbackVersion;
|
|
17
|
+
color;
|
|
18
|
+
output;
|
|
19
|
+
constructor(argv = []) {
|
|
20
|
+
this.argv = argv.slice(2);
|
|
21
|
+
this.name = this.argv[0];
|
|
22
|
+
this.color = OutputColor_1.default;
|
|
23
|
+
this.output = new OutputMessage_1.default();
|
|
24
|
+
}
|
|
25
|
+
register(commands) {
|
|
26
|
+
this.registeredCommands = [...this.registeredCommands, ...commands];
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
run() {
|
|
30
|
+
if (!this.name) {
|
|
31
|
+
const helper = new Helper_1.default();
|
|
32
|
+
helper.showHelpForMain(this.registeredCommands.map((command) => new command(this.argv).bootstrap()));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
let signatures = [];
|
|
36
|
+
if (['--help', '-h'].includes(this.name)) {
|
|
37
|
+
const helper = new Helper_1.default();
|
|
38
|
+
helper.showHelpForMain(this.registeredCommands.map((command) => new command(this.argv).bootstrap()));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (['--version', '-v'].includes(this.name)) {
|
|
42
|
+
this.showVersion();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
for (const command of this.registeredCommands) {
|
|
46
|
+
const commandInstance = new command(this.argv).bootstrap();
|
|
47
|
+
const commandName = commandInstance.getName();
|
|
48
|
+
signatures.push(commandName);
|
|
49
|
+
if (this.name === commandName) {
|
|
50
|
+
if (commandInstance.getOption('help')) {
|
|
51
|
+
commandInstance.showHelp();
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (commandInstance.getOption('version')) {
|
|
55
|
+
this.showVersion();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
commandInstance.handle();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const suggestions = (0, didyoumean2_1.default)(this.name, signatures);
|
|
63
|
+
if (suggestions) {
|
|
64
|
+
this.output.error(`Command "${this.name}" is not defined. Did you mean "${suggestions}"?`);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
this.output.error(`Command "${this.name}" is not defined. Did you mean one of these?`);
|
|
68
|
+
signatures.forEach((signature) => this.output.comment(` ${signature}`));
|
|
69
|
+
}
|
|
70
|
+
setCallbackVersion(callback) {
|
|
71
|
+
this.callbackVersion = callback.bind(this);
|
|
72
|
+
return this;
|
|
73
|
+
}
|
|
74
|
+
showVersion() {
|
|
75
|
+
if (this.callbackVersion) {
|
|
76
|
+
this.callbackVersion();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
console.log('Noravel Command ' + this.color.green(this.getVersion()));
|
|
80
|
+
}
|
|
81
|
+
getVersion() {
|
|
82
|
+
const packageJsonPath = path_1.default.join(__dirname, '../package.json');
|
|
83
|
+
const packageJson = JSON.parse(fs_1.default.readFileSync(packageJsonPath, 'utf-8'));
|
|
84
|
+
return packageJson.version;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.default = Kernel;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import Command from './Command';
|
|
2
|
+
export default class MakerCommand extends Command {
|
|
3
|
+
basePath(dirPath?: string): string;
|
|
4
|
+
fileName(question?: string): Promise<string>;
|
|
5
|
+
makeFile(fileName: string, dirPath: string): void;
|
|
6
|
+
/**
|
|
7
|
+
* Get the message that the file already exists.
|
|
8
|
+
*
|
|
9
|
+
* @returns {string}
|
|
10
|
+
*/
|
|
11
|
+
protected fileAlreadyExists(filePath: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Get the message that the file created successfully.
|
|
14
|
+
*
|
|
15
|
+
* @param {string} filePath
|
|
16
|
+
* @returns {string}
|
|
17
|
+
*/
|
|
18
|
+
protected fileCreatedSuccessfully(filePath: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Get the content of the file.
|
|
21
|
+
*
|
|
22
|
+
* @param {string} fileName
|
|
23
|
+
* @returns {string}
|
|
24
|
+
*/
|
|
25
|
+
protected contentFile(fileName: string): string;
|
|
26
|
+
handle(): Promise<void>;
|
|
27
|
+
}
|