@decaf-ts/cli 0.3.2 → 0.3.6
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.md +21 -157
- package/README.md +157 -2
- package/dist/cli.cjs +143 -62
- package/dist/cli.esm.cjs +143 -62
- package/lib/CliWrapper.cjs +93 -21
- package/lib/CliWrapper.d.ts +88 -16
- package/lib/bin/cli.cjs +17 -9
- package/lib/bin/cli.d.ts +15 -7
- package/lib/constants.cjs +5 -5
- package/lib/constants.d.ts +4 -4
- package/lib/demo/cli-module.cjs +26 -18
- package/lib/demo/cli-module.d.ts +25 -17
- package/lib/esm/CliWrapper.d.ts +88 -16
- package/lib/esm/CliWrapper.js +95 -23
- package/lib/esm/bin/cli.d.ts +15 -7
- package/lib/esm/bin/cli.js +17 -9
- package/lib/esm/constants.d.ts +4 -4
- package/lib/esm/constants.js +5 -5
- package/lib/esm/demo/cli-module.d.ts +25 -17
- package/lib/esm/demo/cli-module.js +26 -18
- package/lib/esm/index.d.ts +5 -18
- package/lib/esm/index.js +7 -20
- package/lib/esm/types.d.ts +6 -3
- package/lib/esm/types.js +1 -1
- package/lib/esm/utils.d.ts +39 -18
- package/lib/esm/utils.js +42 -20
- package/lib/index.cjs +6 -19
- package/lib/index.d.ts +5 -18
- package/lib/types.cjs +1 -1
- package/lib/types.d.ts +6 -3
- package/lib/utils.cjs +42 -20
- package/lib/utils.d.ts +39 -18
- package/package.json +3 -2
package/lib/CliWrapper.cjs
CHANGED
|
@@ -10,11 +10,19 @@ const path_1 = __importDefault(require("path"));
|
|
|
10
10
|
const constants_1 = require("./constants.cjs");
|
|
11
11
|
const utils_1 = require("./utils.cjs");
|
|
12
12
|
/**
|
|
13
|
-
* @
|
|
14
|
-
* @
|
|
13
|
+
* @description Utility class to handle CLI functionality from all Decaf modules
|
|
14
|
+
* @summary This class provides a wrapper around Commander.js to handle CLI commands from different Decaf modules.
|
|
15
|
+
* It crawls the filesystem to find CLI modules, loads them, and registers their commands.
|
|
15
16
|
*
|
|
16
|
-
* @param {string} [
|
|
17
|
-
* @param {
|
|
17
|
+
* @param {string} [basePath] The base path to look for modules in. Defaults to `./`
|
|
18
|
+
* @param {number} [crawlLevels] Number of folder levels to crawl to find modules from the basePath. Defaults to 4
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Create a new CLI wrapper and run it with custom options
|
|
22
|
+
* const cli = new CliWrapper('./src', 2);
|
|
23
|
+
* cli.run(process.argv).then(() => {
|
|
24
|
+
* console.log('CLI commands executed successfully');
|
|
25
|
+
* });
|
|
18
26
|
*
|
|
19
27
|
* @class CliWrapper
|
|
20
28
|
*/
|
|
@@ -23,26 +31,47 @@ class CliWrapper {
|
|
|
23
31
|
this.basePath = basePath;
|
|
24
32
|
this.crawlLevels = crawlLevels;
|
|
25
33
|
this.modules = {};
|
|
34
|
+
this.rootPath = path_1.default.resolve(__dirname, "..");
|
|
26
35
|
}
|
|
27
36
|
/**
|
|
28
|
-
* @description Retrieves and initializes the
|
|
37
|
+
* @description Retrieves and initializes the Commander Command object
|
|
38
|
+
* @summary Lazy-loads the Command object, initializing it with the package name, description, and version
|
|
39
|
+
* @return {Command} The initialized Command object
|
|
29
40
|
* @private
|
|
30
41
|
*/
|
|
31
42
|
get command() {
|
|
32
43
|
if (!this._command) {
|
|
33
44
|
this._command = new commander_1.Command();
|
|
34
|
-
utils_1.CLIUtils.initialize(this._command, this.
|
|
45
|
+
utils_1.CLIUtils.initialize(this._command, this.rootPath);
|
|
35
46
|
}
|
|
36
47
|
return this._command;
|
|
37
48
|
}
|
|
38
49
|
/**
|
|
39
|
-
* @description
|
|
50
|
+
* @description Loads and registers a module from a file
|
|
51
|
+
* @summary Dynamically imports a CLI module from the specified file path, initializes it, and registers it in the modules collection
|
|
40
52
|
*
|
|
41
|
-
* @param {string} filePath
|
|
42
|
-
* @param {string} rootPath
|
|
43
|
-
* @return {string} the module name
|
|
53
|
+
* @param {string} filePath Path to the module file to load
|
|
54
|
+
* @param {string} rootPath Repository root path to find the package.json
|
|
55
|
+
* @return {Promise<string>} A promise that resolves to the module name
|
|
44
56
|
*
|
|
45
57
|
* @private
|
|
58
|
+
* @mermaid
|
|
59
|
+
* sequenceDiagram
|
|
60
|
+
* participant CliWrapper
|
|
61
|
+
* participant CLIUtils
|
|
62
|
+
* participant Module
|
|
63
|
+
*
|
|
64
|
+
* CliWrapper->>CLIUtils: loadFromFile(filePath)
|
|
65
|
+
* CLIUtils-->>CliWrapper: module
|
|
66
|
+
* CliWrapper->>CliWrapper: Get module name
|
|
67
|
+
* CliWrapper->>Command: new Command()
|
|
68
|
+
* Command-->>CliWrapper: cmd
|
|
69
|
+
* CliWrapper->>CLIUtils: initialize(cmd, path.dirname(rootPath))
|
|
70
|
+
* CliWrapper->>Module: module()
|
|
71
|
+
* Note over CliWrapper,Module: Handle Promise if needed
|
|
72
|
+
* Module-->>CliWrapper: Command instance
|
|
73
|
+
* CliWrapper->>CliWrapper: Store in modules[name]
|
|
74
|
+
* CliWrapper-->>CliWrapper: Return name
|
|
46
75
|
*/
|
|
47
76
|
async load(filePath, rootPath) {
|
|
48
77
|
let name;
|
|
@@ -50,7 +79,7 @@ class CliWrapper {
|
|
|
50
79
|
const module = await utils_1.CLIUtils.loadFromFile(filePath);
|
|
51
80
|
name = module.name;
|
|
52
81
|
const cmd = new commander_1.Command();
|
|
53
|
-
utils_1.CLIUtils.initialize(cmd,
|
|
82
|
+
utils_1.CLIUtils.initialize(cmd, rootPath);
|
|
54
83
|
let m = module();
|
|
55
84
|
if (m instanceof Promise)
|
|
56
85
|
m = await m;
|
|
@@ -62,12 +91,36 @@ class CliWrapper {
|
|
|
62
91
|
return name;
|
|
63
92
|
}
|
|
64
93
|
/**
|
|
65
|
-
* @description
|
|
66
|
-
*
|
|
94
|
+
* @description Finds and loads all CLI modules in the basePath
|
|
95
|
+
* @summary Uses the crawl method to find all CLI modules in the specified base path,
|
|
96
|
+
* then loads and registers each module as a subcommand
|
|
97
|
+
*
|
|
98
|
+
* @return {Promise<void>} A promise that resolves when all modules are loaded
|
|
99
|
+
*
|
|
67
100
|
* @private
|
|
101
|
+
* @mermaid
|
|
102
|
+
* sequenceDiagram
|
|
103
|
+
* participant CliWrapper
|
|
104
|
+
* participant Filesystem
|
|
105
|
+
* participant Module
|
|
106
|
+
*
|
|
107
|
+
* CliWrapper->>Filesystem: Join basePath with cwd
|
|
108
|
+
* CliWrapper->>CliWrapper: crawl(basePath, crawlLevels)
|
|
109
|
+
* CliWrapper-->>CliWrapper: modules[]
|
|
110
|
+
* loop For each module
|
|
111
|
+
* alt Not @decaf-ts/cli
|
|
112
|
+
* CliWrapper->>CliWrapper: load(module, cwd)
|
|
113
|
+
* CliWrapper-->>CliWrapper: name
|
|
114
|
+
* CliWrapper->>CliWrapper: Check if command exists
|
|
115
|
+
* alt Command doesn't exist
|
|
116
|
+
* CliWrapper->>Command: command(name).addCommand(modules[name])
|
|
117
|
+
* end
|
|
118
|
+
* end
|
|
119
|
+
* end
|
|
120
|
+
* CliWrapper->>Console: Log loaded modules
|
|
68
121
|
*/
|
|
69
122
|
async boot() {
|
|
70
|
-
const basePath = path_1.default.
|
|
123
|
+
const basePath = path_1.default.resolve(this.rootPath, this.basePath);
|
|
71
124
|
const modules = this.crawl(basePath, this.crawlLevels);
|
|
72
125
|
for (const module of modules) {
|
|
73
126
|
if (module.includes("@decaf-ts/cli")) {
|
|
@@ -75,7 +128,7 @@ class CliWrapper {
|
|
|
75
128
|
}
|
|
76
129
|
let name;
|
|
77
130
|
try {
|
|
78
|
-
name = await this.load(module,
|
|
131
|
+
name = await this.load(module, this.rootPath);
|
|
79
132
|
}
|
|
80
133
|
catch (e) {
|
|
81
134
|
console.error(e);
|
|
@@ -94,9 +147,13 @@ class CliWrapper {
|
|
|
94
147
|
.join("\n")}`);
|
|
95
148
|
}
|
|
96
149
|
/**
|
|
97
|
-
* @description
|
|
98
|
-
* @
|
|
99
|
-
*
|
|
150
|
+
* @description Recursively searches for CLI module files in the directory structure
|
|
151
|
+
* @summary Crawls the basePath up to the specified number of folder levels to find files named according to CLI_FILE_NAME
|
|
152
|
+
*
|
|
153
|
+
* @param {string} basePath The absolute base path to start searching in
|
|
154
|
+
* @param {number} [levels=2] The maximum number of directory levels to crawl
|
|
155
|
+
* @return {string[]} An array of file paths to CLI modules
|
|
156
|
+
*
|
|
100
157
|
* @private
|
|
101
158
|
*/
|
|
102
159
|
crawl(basePath, levels = 2) {
|
|
@@ -114,9 +171,24 @@ class CliWrapper {
|
|
|
114
171
|
}, []);
|
|
115
172
|
}
|
|
116
173
|
/**
|
|
117
|
-
* @description
|
|
174
|
+
* @description Executes the CLI with the provided arguments
|
|
175
|
+
* @summary Boots the CLI by loading all modules, then parses and executes the command specified in the arguments
|
|
176
|
+
*
|
|
177
|
+
* @param {string[]} [args=process.argv] Command line arguments to parse and execute
|
|
178
|
+
* @return {Promise<void>} A promise that resolves when the command execution is complete
|
|
179
|
+
*
|
|
180
|
+
* @mermaid
|
|
181
|
+
* sequenceDiagram
|
|
182
|
+
* participant Client
|
|
183
|
+
* participant CliWrapper
|
|
184
|
+
* participant Command
|
|
118
185
|
*
|
|
119
|
-
*
|
|
186
|
+
* Client->>CliWrapper: run(args)
|
|
187
|
+
* CliWrapper->>CliWrapper: boot()
|
|
188
|
+
* Note over CliWrapper: Loads all modules
|
|
189
|
+
* CliWrapper->>Command: parseAsync(args)
|
|
190
|
+
* Command-->>CliWrapper: result
|
|
191
|
+
* CliWrapper-->>Client: result
|
|
120
192
|
*/
|
|
121
193
|
async run(args = process.argv) {
|
|
122
194
|
await this.boot();
|
|
@@ -124,4 +196,4 @@ class CliWrapper {
|
|
|
124
196
|
}
|
|
125
197
|
}
|
|
126
198
|
exports.CliWrapper = CliWrapper;
|
|
127
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xpV3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9DbGlXcmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlDQUFvQztBQUNwQyw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLDJDQUE0QztBQUM1QyxtQ0FBbUM7QUFFbkM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFhLFVBQVU7SUFJckIsWUFDVSxXQUFtQixJQUFJLEVBQ3ZCLGNBQWMsQ0FBQztRQURmLGFBQVEsR0FBUixRQUFRLENBQWU7UUFDdkIsZ0JBQVcsR0FBWCxXQUFXLENBQUk7UUFKakIsWUFBTyxHQUE0QixFQUFFLENBQUM7SUFLM0MsQ0FBQztJQUVKOzs7T0FHRztJQUNILElBQVksT0FBTztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxtQkFBTyxFQUFFLENBQUM7WUFDOUIsZ0JBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQWdCLEVBQUUsUUFBZ0I7UUFDbkQsSUFBSSxJQUFJLENBQUM7UUFDVCxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLGdCQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JELElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ25CLE1BQU0sR0FBRyxHQUFHLElBQUksbUJBQU8sRUFBRSxDQUFDO1lBQzFCLGdCQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxjQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDakQsSUFB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Q0FBQyxDQUFDO1lBQzlDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcseUJBQWEsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDVCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBaUIsT0FBTyxDQUFDLElBQUk7UUFDckMsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0Y7QUFsSEQsZ0NBa0hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBDTElfRklMRV9OQU1FIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDTElVdGlscyB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBjbGFzcyB0byBoYW5kbGUgQ0xJIGZ1bmN0aW9uYWxpdHkgZnJvbSBhbGwgRGVjYWYgbW9kdWxlc1xuICogQGRlc2NyaXB0aW9uIENMSSBoYW5kbGVyIGNsYXNzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtiYXNlcGF0aF0gdGhlIGJhc2UgcGF0aCB0byBsb29rIGZvciBtb2R1bGVzIGluLiBkZWZhdWx0cyB0byBgLi9gXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NyYXdsTGV2ZWxzXSBmb2xkZXJzIHRvIGNyYXdsIHRvIGZpbmQgbW9kdWxlcyBmcm9tIHRoZSBiYXNlUGF0aC4gZGVmYXVsdHMgdG8gNFxuICpcbiAqIEBjbGFzcyBDbGlXcmFwcGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBDbGlXcmFwcGVyIHtcbiAgcHJpdmF0ZSBfY29tbWFuZD86IENvbW1hbmQ7XG4gIHByaXZhdGUgbW9kdWxlczogUmVjb3JkPHN0cmluZywgQ29tbWFuZD4gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGJhc2VQYXRoOiBzdHJpbmcgPSBcIi4vXCIsXG4gICAgcHJpdmF0ZSBjcmF3bExldmVscyA9IDRcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGFuZCBpbml0aWFsaXplcyB0aGUge0BsaW5rIENvbW1hbmR9IG9iamVjdFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgY29tbWFuZCgpIHtcbiAgICBpZiAoIXRoaXMuX2NvbW1hbmQpIHtcbiAgICAgIHRoaXMuX2NvbW1hbmQgPSBuZXcgQ29tbWFuZCgpO1xuICAgICAgQ0xJVXRpbHMuaW5pdGlhbGl6ZSh0aGlzLl9jb21tYW5kLCB0aGlzLmJhc2VQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NvbW1hbmQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIGxvYWRzIGFuZCByZWdpc3RlcnMgbW9kdWxlIGZyb20gYSBmaWxlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aCBwYXRoIHRvIGxvb2sgZm9yIG1vZHVsZXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJvb3RQYXRoIHJlcG8gcm9vdCB0byBmaW5kIHRoZSBwYWNrYWdlLmpzb25cbiAgICogQHJldHVybiB7c3RyaW5nfSB0aGUgbW9kdWxlIG5hbWVcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZChmaWxlUGF0aDogc3RyaW5nLCByb290UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgbmFtZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbW9kdWxlID0gYXdhaXQgQ0xJVXRpbHMubG9hZEZyb21GaWxlKGZpbGVQYXRoKTtcbiAgICAgIG5hbWUgPSBtb2R1bGUubmFtZTtcbiAgICAgIGNvbnN0IGNtZCA9IG5ldyBDb21tYW5kKCk7XG4gICAgICBDTElVdGlscy5pbml0aWFsaXplKGNtZCwgcGF0aC5kaXJuYW1lKHJvb3RQYXRoKSk7XG4gICAgICBsZXQgbSA9IG1vZHVsZSgpO1xuICAgICAgaWYgKG0gaW5zdGFuY2VvZiBQcm9taXNlKSBtID0gYXdhaXQgbTtcbiAgICAgIHRoaXMubW9kdWxlc1tuYW1lXSA9IG07XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgZmFpbGVkIHRvIGxvYWQgbW9kdWxlICR7bmFtZSB8fCBcInVubmFtZWRcIn0gdW5kZXIgJHtmaWxlUGF0aH06ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogZX1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gZmluZHMgYWxsIHRoZSBjbGkgbW9kdWxlcyBpbiB0aGUgYmFzZVBhdGggdmlhIHtAbGluayBDbGlXcmFwcGVyLmNyYXdsfVxuICAgKiBhbmQgbG9hZHMgdGhlbVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBib290KCkge1xuICAgIGNvbnN0IGJhc2VQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIHRoaXMuYmFzZVBhdGgpO1xuICAgIGNvbnN0IG1vZHVsZXMgPSB0aGlzLmNyYXdsKGJhc2VQYXRoLCB0aGlzLmNyYXdsTGV2ZWxzKTtcbiAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG4gICAgICBpZiAobW9kdWxlLmluY2x1ZGVzKFwiQGRlY2FmLXRzL2NsaVwiKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBuYW1lOiBzdHJpbmc7XG4gICAgICB0cnkge1xuICAgICAgICBuYW1lID0gYXdhaXQgdGhpcy5sb2FkKG1vZHVsZSwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLmNvbW1hbmQuY29tbWFuZHMuZmluZChcbiAgICAgICAgICAoYykgPT4gKGMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KVtcIl9uYW1lXCJdID09PSBuYW1lXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmNvbW1hbmQuY29tbWFuZChuYW1lKS5hZGRDb21tYW5kKHRoaXMubW9kdWxlc1tuYW1lXSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYGxvYWRlZCBtb2R1bGVzOlxcbiR7T2JqZWN0LmtleXModGhpcy5tb2R1bGVzKVxuICAgICAgICAubWFwKChrKSA9PiBgLSAke2t9YClcbiAgICAgICAgLmpvaW4oXCJcXG5cIil9YFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIGNyYXdscyB0aGUgYmFzZVBhdGggdXAgZm9yICdsZXZlbHMnIGZvbGRlcnMgdG8gZmluZCBhIG1vZHVsZSxlZyBhIHtAbGluayBDTElfRklMRV9OQU1FfSBuYW1lZCBmaWxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCB0aGUgcmVsYXRpdmUgYmFzZSBiYXRjaCB0byBzdGFydCBzZWFyY2hpbmcgaW5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsZXZlbHNdIHRoZSBtYXggbnVtYmVyIG9mIGxldmVscyB0byBjcmF3bC4gZGVmYXVsdHMgdG8gMlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmF3bChiYXNlUGF0aDogc3RyaW5nLCBsZXZlbHM6IG51bWJlciA9IDIpIHtcbiAgICBpZiAobGV2ZWxzIDw9IDApIHJldHVybiBbXTtcbiAgICByZXR1cm4gZnMucmVhZGRpclN5bmMoYmFzZVBhdGgpLnJlZHVjZSgoYWNjdW06IHN0cmluZ1tdLCBmaWxlKSA9PiB7XG4gICAgICBmaWxlID0gcGF0aC5qb2luKGJhc2VQYXRoLCBmaWxlKTtcbiAgICAgIGlmIChmcy5zdGF0U3luYyhmaWxlKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGFjY3VtLnB1c2goLi4udGhpcy5jcmF3bChmaWxlLCBsZXZlbHMgLSAxKSk7XG4gICAgICB9IGVsc2UgaWYgKGZpbGUubWF0Y2gobmV3IFJlZ0V4cChgJHtDTElfRklMRV9OQU1FfS5bY21dP2pzJGAsIFwiZ21cIikpKSB7XG4gICAgICAgIGFjY3VtLnB1c2goZmlsZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBydW5zIHRoZSBnaXZlbiBjb21tYW5kXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthcmdzXSBhcmdzIHRvIHJ1bi4gZGVmYXVsdHMgdG8gcHJvY2Vzcy5hcmd2XG4gICAqL1xuICBhc3luYyBydW4oYXJnczogc3RyaW5nW10gPSBwcm9jZXNzLmFyZ3YpIHtcbiAgICBhd2FpdCB0aGlzLmJvb3QoKTtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kLnBhcnNlQXN5bmMoYXJncyk7XG4gIH1cbn1cbiJdfQ==
|
|
199
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xpV3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9DbGlXcmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlDQUFvQztBQUNwQyw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLCtDQUE0QztBQUM1Qyx1Q0FBbUM7QUFFbkM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFhLFVBQVU7SUFLckIsWUFDVSxXQUFtQixJQUFJLEVBQ3ZCLGNBQWMsQ0FBQztRQURmLGFBQVEsR0FBUixRQUFRLENBQWU7UUFDdkIsZ0JBQVcsR0FBWCxXQUFXLENBQUk7UUFMakIsWUFBTyxHQUE0QixFQUFFLENBQUM7UUFPNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxjQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFZLE9BQU87UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksbUJBQU8sRUFBRSxDQUFDO1lBQzlCLGdCQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTBCRztJQUNLLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBZ0IsRUFBRSxRQUFnQjtRQUNuRCxJQUFJLElBQUksQ0FBQztRQUNULElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDckQsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDbkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxt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QUUsRUFBRSxDQUFDO2dCQUNwQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUMsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyx5QkFBYSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNyRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNULENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW1CRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBaUIsT0FBTyxDQUFDLElBQUk7UUFDckMsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0Y7QUFwTEQsZ0NBb0xDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBDTElfRklMRV9OQU1FIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDTElVdGlscyB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFV0aWxpdHkgY2xhc3MgdG8gaGFuZGxlIENMSSBmdW5jdGlvbmFsaXR5IGZyb20gYWxsIERlY2FmIG1vZHVsZXNcbiAqIEBzdW1tYXJ5IFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZCBDb21tYW5kZXIuanMgdG8gaGFuZGxlIENMSSBjb21tYW5kcyBmcm9tIGRpZmZlcmVudCBEZWNhZiBtb2R1bGVzLlxuICogSXQgY3Jhd2xzIHRoZSBmaWxlc3lzdGVtIHRvIGZpbmQgQ0xJIG1vZHVsZXMsIGxvYWRzIHRoZW0sIGFuZCByZWdpc3RlcnMgdGhlaXIgY29tbWFuZHMuXG4gKiBcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYmFzZVBhdGhdIFRoZSBiYXNlIHBhdGggdG8gbG9vayBmb3IgbW9kdWxlcyBpbi4gRGVmYXVsdHMgdG8gYC4vYFxuICogQHBhcmFtIHtudW1iZXJ9IFtjcmF3bExldmVsc10gTnVtYmVyIG9mIGZvbGRlciBsZXZlbHMgdG8gY3Jhd2wgdG8gZmluZCBtb2R1bGVzIGZyb20gdGhlIGJhc2VQYXRoLiBEZWZhdWx0cyB0byA0XG4gKiBcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBuZXcgQ0xJIHdyYXBwZXIgYW5kIHJ1biBpdCB3aXRoIGN1c3RvbSBvcHRpb25zXG4gKiBjb25zdCBjbGkgPSBuZXcgQ2xpV3JhcHBlcignLi9zcmMnLCAyKTtcbiAqIGNsaS5ydW4ocHJvY2Vzcy5hcmd2KS50aGVuKCgpID0+IHtcbiAqICAgY29uc29sZS5sb2coJ0NMSSBjb21tYW5kcyBleGVjdXRlZCBzdWNjZXNzZnVsbHknKTtcbiAqIH0pO1xuICogXG4gKiBAY2xhc3MgQ2xpV3JhcHBlclxuICovXG5leHBvcnQgY2xhc3MgQ2xpV3JhcHBlciB7XG4gIHByaXZhdGUgX2NvbW1hbmQ/OiBDb21tYW5kO1xuICBwcml2YXRlIG1vZHVsZXM6IFJlY29yZDxzdHJpbmcsIENvbW1hbmQ+ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgcm9vdFBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGJhc2VQYXRoOiBzdHJpbmcgPSBcIi4vXCIsXG4gICAgcHJpdmF0ZSBjcmF3bExldmVscyA9IDRcbiAgKSB7XG4gICAgdGhpcy5yb290UGF0aCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsIFwiLi5cIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhbmQgaW5pdGlhbGl6ZXMgdGhlIENvbW1hbmRlciBDb21tYW5kIG9iamVjdFxuICAgKiBAc3VtbWFyeSBMYXp5LWxvYWRzIHRoZSBDb21tYW5kIG9iamVjdCwgaW5pdGlhbGl6aW5nIGl0IHdpdGggdGhlIHBhY2thZ2UgbmFtZSwgZGVzY3JpcHRpb24sIGFuZCB2ZXJzaW9uXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IFRoZSBpbml0aWFsaXplZCBDb21tYW5kIG9iamVjdFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgY29tbWFuZCgpIHtcbiAgICBpZiAoIXRoaXMuX2NvbW1hbmQpIHtcbiAgICAgIHRoaXMuX2NvbW1hbmQgPSBuZXcgQ29tbWFuZCgpO1xuICAgICAgQ0xJVXRpbHMuaW5pdGlhbGl6ZSh0aGlzLl9jb21tYW5kLCB0aGlzLnJvb3RQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NvbW1hbmQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvYWRzIGFuZCByZWdpc3RlcnMgYSBtb2R1bGUgZnJvbSBhIGZpbGVcbiAgICogQHN1bW1hcnkgRHluYW1pY2FsbHkgaW1wb3J0cyBhIENMSSBtb2R1bGUgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgcGF0aCwgaW5pdGlhbGl6ZXMgaXQsIGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIG1vZHVsZXMgY29sbGVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggUGF0aCB0byB0aGUgbW9kdWxlIGZpbGUgdG8gbG9hZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcm9vdFBhdGggUmVwb3NpdG9yeSByb290IHBhdGggdG8gZmluZCB0aGUgcGFja2FnZS5qc29uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG1vZHVsZSBuYW1lXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaVdyYXBwZXJcbiAgICogICBwYXJ0aWNpcGFudCBDTElVdGlsc1xuICAgKiAgIHBhcnRpY2lwYW50IE1vZHVsZVxuICAgKiAgIFxuICAgKiAgIENsaVdyYXBwZXItPj5DTElVdGlsczogbG9hZEZyb21GaWxlKGZpbGVQYXRoKVxuICAgKiAgIENMSVV0aWxzLS0+PkNsaVdyYXBwZXI6IG1vZHVsZVxuICAgKiAgIENsaVdyYXBwZXItPj5DbGlXcmFwcGVyOiBHZXQgbW9kdWxlIG5hbWVcbiAgICogICBDbGlXcmFwcGVyLT4+Q29tbWFuZDogbmV3IENvbW1hbmQoKVxuICAgKiAgIENvbW1hbmQtLT4+Q2xpV3JhcHBlcjogY21kXG4gICAqICAgQ2xpV3JhcHBlci0+PkNMSVV0aWxzOiBpbml0aWFsaXplKGNtZCwgcGF0aC5kaXJuYW1lKHJvb3RQYXRoKSlcbiAgICogICBDbGlXcmFwcGVyLT4+TW9kdWxlOiBtb2R1bGUoKVxuICAgKiAgIE5vdGUgb3ZlciBDbGlXcmFwcGVyLE1vZHVsZTogSGFuZGxlIFByb21pc2UgaWYgbmVlZGVkXG4gICAqICAgTW9kdWxlLS0+PkNsaVdyYXBwZXI6IENvbW1hbmQgaW5zdGFuY2VcbiAgICogICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogU3RvcmUgaW4gbW9kdWxlc1tuYW1lXVxuICAgKiAgIENsaVdyYXBwZXItLT4+Q2xpV3JhcHBlcjogUmV0dXJuIG5hbWVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZChmaWxlUGF0aDogc3RyaW5nLCByb290UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgbmFtZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbW9kdWxlID0gYXdhaXQgQ0xJVXRpbHMubG9hZEZyb21GaWxlKGZpbGVQYXRoKTtcbiAgICAgIG5hbWUgPSBtb2R1bGUubmFtZTtcbiAgICAgIGNvbnN0IGNtZCA9IG5ldyBDb21tYW5kKCk7XG4gICAgICBDTElVdGlscy5pbml0aWFsaXplKGNtZCwgcm9vdFBhdGgpO1xuICAgICAgbGV0IG0gPSBtb2R1bGUoKTtcbiAgICAgIGlmIChtIGluc3RhbmNlb2YgUHJvbWlzZSkgbSA9IGF3YWl0IG07XG4gICAgICB0aGlzLm1vZHVsZXNbbmFtZV0gPSBtO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGZhaWxlZCB0byBsb2FkIG1vZHVsZSAke25hbWUgfHwgXCJ1bm5hbWVkXCJ9IHVuZGVyICR7ZmlsZVBhdGh9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IGV9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZpbmRzIGFuZCBsb2FkcyBhbGwgQ0xJIG1vZHVsZXMgaW4gdGhlIGJhc2VQYXRoXG4gICAqIEBzdW1tYXJ5IFVzZXMgdGhlIGNyYXdsIG1ldGhvZCB0byBmaW5kIGFsbCBDTEkgbW9kdWxlcyBpbiB0aGUgc3BlY2lmaWVkIGJhc2UgcGF0aCwgXG4gICAqIHRoZW4gbG9hZHMgYW5kIHJlZ2lzdGVycyBlYWNoIG1vZHVsZSBhcyBhIHN1YmNvbW1hbmRcbiAgICogXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG1vZHVsZXMgYXJlIGxvYWRlZFxuICAgKiBcbiAgICogQHByaXZhdGVcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpV3JhcHBlclxuICAgKiAgIHBhcnRpY2lwYW50IEZpbGVzeXN0ZW1cbiAgICogICBwYXJ0aWNpcGFudCBNb2R1bGVcbiAgICogICBcbiAgICogICBDbGlXcmFwcGVyLT4+RmlsZXN5c3RlbTogSm9pbiBiYXNlUGF0aCB3aXRoIGN3ZFxuICAgKiAgIENsaVdyYXBwZXItPj5DbGlXcmFwcGVyOiBjcmF3bChiYXNlUGF0aCwgY3Jhd2xMZXZlbHMpXG4gICAqICAgQ2xpV3JhcHBlci0tPj5DbGlXcmFwcGVyOiBtb2R1bGVzW11cbiAgICogICBsb29wIEZvciBlYWNoIG1vZHVsZVxuICAgKiAgICAgYWx0IE5vdCBAZGVjYWYtdHMvY2xpXG4gICAqICAgICAgIENsaVdyYXBwZXItPj5DbGlXcmFwcGVyOiBsb2FkKG1vZHVsZSwgY3dkKVxuICAgKiAgICAgICBDbGlXcmFwcGVyLS0+PkNsaVdyYXBwZXI6IG5hbWVcbiAgICogICAgICAgQ2xpV3JhcHBlci0+PkNsaVdyYXBwZXI6IENoZWNrIGlmIGNvbW1hbmQgZXhpc3RzXG4gICAqICAgICAgIGFsdCBDb21tYW5kIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgICAgICBDbGlXcmFwcGVyLT4+Q29tbWFuZDogY29tbWFuZChuYW1lKS5hZGRDb21tYW5kKG1vZHVsZXNbbmFtZV0pXG4gICAqICAgICAgIGVuZFxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqICAgQ2xpV3JhcHBlci0+PkNvbnNvbGU6IExvZyBsb2FkZWQgbW9kdWxlc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBib290KCkge1xuICAgIGNvbnN0IGJhc2VQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMucm9vdFBhdGgsIHRoaXMuYmFzZVBhdGgpO1xuICAgIGNvbnN0IG1vZHVsZXMgPSB0aGlzLmNyYXdsKGJhc2VQYXRoLCB0aGlzLmNyYXdsTGV2ZWxzKTtcbiAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG4gICAgICBpZiAobW9kdWxlLmluY2x1ZGVzKFwiQGRlY2FmLXRzL2NsaVwiKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBuYW1lOiBzdHJpbmc7XG4gICAgICB0cnkge1xuICAgICAgICBuYW1lID0gYXdhaXQgdGhpcy5sb2FkKG1vZHVsZSwgdGhpcy5yb290UGF0aCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLmNvbW1hbmQuY29tbWFuZHMuZmluZChcbiAgICAgICAgICAoYykgPT4gKGMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KVtcIl9uYW1lXCJdID09PSBuYW1lXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmNvbW1hbmQuY29tbWFuZChuYW1lKS5hZGRDb21tYW5kKHRoaXMubW9kdWxlc1tuYW1lXSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYGxvYWRlZCBtb2R1bGVzOlxcbiR7T2JqZWN0LmtleXModGhpcy5tb2R1bGVzKVxuICAgICAgICAubWFwKChrKSA9PiBgLSAke2t9YClcbiAgICAgICAgLmpvaW4oXCJcXG5cIil9YFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlY3Vyc2l2ZWx5IHNlYXJjaGVzIGZvciBDTEkgbW9kdWxlIGZpbGVzIGluIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlXG4gICAqIEBzdW1tYXJ5IENyYXdscyB0aGUgYmFzZVBhdGggdXAgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZm9sZGVyIGxldmVscyB0byBmaW5kIGZpbGVzIG5hbWVkIGFjY29yZGluZyB0byBDTElfRklMRV9OQU1FXG4gICAqIFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVBhdGggVGhlIGFic29sdXRlIGJhc2UgcGF0aCB0byBzdGFydCBzZWFyY2hpbmcgaW5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsZXZlbHM9Ml0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGRpcmVjdG9yeSBsZXZlbHMgdG8gY3Jhd2xcbiAgICogQHJldHVybiB7c3RyaW5nW119IEFuIGFycmF5IG9mIGZpbGUgcGF0aHMgdG8gQ0xJIG1vZHVsZXNcbiAgICogXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNyYXdsKGJhc2VQYXRoOiBzdHJpbmcsIGxldmVsczogbnVtYmVyID0gMikge1xuICAgIGlmIChsZXZlbHMgPD0gMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBmcy5yZWFkZGlyU3luYyhiYXNlUGF0aCkucmVkdWNlKChhY2N1bTogc3RyaW5nW10sIGZpbGUpID0+IHtcbiAgICAgIGZpbGUgPSBwYXRoLmpvaW4oYmFzZVBhdGgsIGZpbGUpO1xuICAgICAgaWYgKGZzLnN0YXRTeW5jKGZpbGUpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgYWNjdW0ucHVzaCguLi50aGlzLmNyYXdsKGZpbGUsIGxldmVscyAtIDEpKTtcbiAgICAgIH0gZWxzZSBpZiAoZmlsZS5tYXRjaChuZXcgUmVnRXhwKGAke0NMSV9GSUxFX05BTUV9LltjbV0/anMkYCwgXCJnbVwiKSkpIHtcbiAgICAgICAgYWNjdW0ucHVzaChmaWxlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBbXSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIHRoZSBDTEkgd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzXG4gICAqIEBzdW1tYXJ5IEJvb3RzIHRoZSBDTEkgYnkgbG9hZGluZyBhbGwgbW9kdWxlcywgdGhlbiBwYXJzZXMgYW5kIGV4ZWN1dGVzIHRoZSBjb21tYW5kIHNwZWNpZmllZCBpbiB0aGUgYXJndW1lbnRzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthcmdzPXByb2Nlc3MuYXJndl0gQ29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBwYXJzZSBhbmQgZXhlY3V0ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb21tYW5kIGV4ZWN1dGlvbiBpcyBjb21wbGV0ZVxuICAgKiBcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgQ2xpV3JhcHBlclxuICAgKiAgIHBhcnRpY2lwYW50IENvbW1hbmRcbiAgICogICBcbiAgICogICBDbGllbnQtPj5DbGlXcmFwcGVyOiBydW4oYXJncylcbiAgICogICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogYm9vdCgpXG4gICAqICAgTm90ZSBvdmVyIENsaVdyYXBwZXI6IExvYWRzIGFsbCBtb2R1bGVzXG4gICAqICAgQ2xpV3JhcHBlci0+PkNvbW1hbmQ6IHBhcnNlQXN5bmMoYXJncylcbiAgICogICBDb21tYW5kLS0+PkNsaVdyYXBwZXI6IHJlc3VsdFxuICAgKiAgIENsaVdyYXBwZXItLT4+Q2xpZW50OiByZXN1bHRcbiAgICovXG4gIGFzeW5jIHJ1bihhcmdzOiBzdHJpbmdbXSA9IHByb2Nlc3MuYXJndikge1xuICAgIGF3YWl0IHRoaXMuYm9vdCgpO1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmQucGFyc2VBc3luYyhhcmdzKTtcbiAgfVxufVxuIl19
|
package/lib/CliWrapper.d.ts
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
/**
|
|
3
|
-
* @
|
|
4
|
-
* @
|
|
3
|
+
* @description Utility class to handle CLI functionality from all Decaf modules
|
|
4
|
+
* @summary This class provides a wrapper around Commander.js to handle CLI commands from different Decaf modules.
|
|
5
|
+
* It crawls the filesystem to find CLI modules, loads them, and registers their commands.
|
|
5
6
|
*
|
|
6
|
-
* @param {string} [
|
|
7
|
-
* @param {
|
|
7
|
+
* @param {string} [basePath] The base path to look for modules in. Defaults to `./`
|
|
8
|
+
* @param {number} [crawlLevels] Number of folder levels to crawl to find modules from the basePath. Defaults to 4
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* // Create a new CLI wrapper and run it with custom options
|
|
12
|
+
* const cli = new CliWrapper('./src', 2);
|
|
13
|
+
* cli.run(process.argv).then(() => {
|
|
14
|
+
* console.log('CLI commands executed successfully');
|
|
15
|
+
* });
|
|
8
16
|
*
|
|
9
17
|
* @class CliWrapper
|
|
10
18
|
*/
|
|
@@ -13,39 +21,103 @@ export declare class CliWrapper {
|
|
|
13
21
|
private crawlLevels;
|
|
14
22
|
private _command?;
|
|
15
23
|
private modules;
|
|
24
|
+
private readonly rootPath;
|
|
16
25
|
constructor(basePath?: string, crawlLevels?: number);
|
|
17
26
|
/**
|
|
18
|
-
* @description Retrieves and initializes the
|
|
27
|
+
* @description Retrieves and initializes the Commander Command object
|
|
28
|
+
* @summary Lazy-loads the Command object, initializing it with the package name, description, and version
|
|
29
|
+
* @return {Command} The initialized Command object
|
|
19
30
|
* @private
|
|
20
31
|
*/
|
|
21
32
|
private get command();
|
|
22
33
|
/**
|
|
23
|
-
* @description
|
|
34
|
+
* @description Loads and registers a module from a file
|
|
35
|
+
* @summary Dynamically imports a CLI module from the specified file path, initializes it, and registers it in the modules collection
|
|
24
36
|
*
|
|
25
|
-
* @param {string} filePath
|
|
26
|
-
* @param {string} rootPath
|
|
27
|
-
* @return {string} the module name
|
|
37
|
+
* @param {string} filePath Path to the module file to load
|
|
38
|
+
* @param {string} rootPath Repository root path to find the package.json
|
|
39
|
+
* @return {Promise<string>} A promise that resolves to the module name
|
|
28
40
|
*
|
|
29
41
|
* @private
|
|
42
|
+
* @mermaid
|
|
43
|
+
* sequenceDiagram
|
|
44
|
+
* participant CliWrapper
|
|
45
|
+
* participant CLIUtils
|
|
46
|
+
* participant Module
|
|
47
|
+
*
|
|
48
|
+
* CliWrapper->>CLIUtils: loadFromFile(filePath)
|
|
49
|
+
* CLIUtils-->>CliWrapper: module
|
|
50
|
+
* CliWrapper->>CliWrapper: Get module name
|
|
51
|
+
* CliWrapper->>Command: new Command()
|
|
52
|
+
* Command-->>CliWrapper: cmd
|
|
53
|
+
* CliWrapper->>CLIUtils: initialize(cmd, path.dirname(rootPath))
|
|
54
|
+
* CliWrapper->>Module: module()
|
|
55
|
+
* Note over CliWrapper,Module: Handle Promise if needed
|
|
56
|
+
* Module-->>CliWrapper: Command instance
|
|
57
|
+
* CliWrapper->>CliWrapper: Store in modules[name]
|
|
58
|
+
* CliWrapper-->>CliWrapper: Return name
|
|
30
59
|
*/
|
|
31
60
|
private load;
|
|
32
61
|
/**
|
|
33
|
-
* @description
|
|
34
|
-
*
|
|
62
|
+
* @description Finds and loads all CLI modules in the basePath
|
|
63
|
+
* @summary Uses the crawl method to find all CLI modules in the specified base path,
|
|
64
|
+
* then loads and registers each module as a subcommand
|
|
65
|
+
*
|
|
66
|
+
* @return {Promise<void>} A promise that resolves when all modules are loaded
|
|
67
|
+
*
|
|
35
68
|
* @private
|
|
69
|
+
* @mermaid
|
|
70
|
+
* sequenceDiagram
|
|
71
|
+
* participant CliWrapper
|
|
72
|
+
* participant Filesystem
|
|
73
|
+
* participant Module
|
|
74
|
+
*
|
|
75
|
+
* CliWrapper->>Filesystem: Join basePath with cwd
|
|
76
|
+
* CliWrapper->>CliWrapper: crawl(basePath, crawlLevels)
|
|
77
|
+
* CliWrapper-->>CliWrapper: modules[]
|
|
78
|
+
* loop For each module
|
|
79
|
+
* alt Not @decaf-ts/cli
|
|
80
|
+
* CliWrapper->>CliWrapper: load(module, cwd)
|
|
81
|
+
* CliWrapper-->>CliWrapper: name
|
|
82
|
+
* CliWrapper->>CliWrapper: Check if command exists
|
|
83
|
+
* alt Command doesn't exist
|
|
84
|
+
* CliWrapper->>Command: command(name).addCommand(modules[name])
|
|
85
|
+
* end
|
|
86
|
+
* end
|
|
87
|
+
* end
|
|
88
|
+
* CliWrapper->>Console: Log loaded modules
|
|
36
89
|
*/
|
|
37
90
|
private boot;
|
|
38
91
|
/**
|
|
39
|
-
* @description
|
|
40
|
-
* @
|
|
41
|
-
*
|
|
92
|
+
* @description Recursively searches for CLI module files in the directory structure
|
|
93
|
+
* @summary Crawls the basePath up to the specified number of folder levels to find files named according to CLI_FILE_NAME
|
|
94
|
+
*
|
|
95
|
+
* @param {string} basePath The absolute base path to start searching in
|
|
96
|
+
* @param {number} [levels=2] The maximum number of directory levels to crawl
|
|
97
|
+
* @return {string[]} An array of file paths to CLI modules
|
|
98
|
+
*
|
|
42
99
|
* @private
|
|
43
100
|
*/
|
|
44
101
|
private crawl;
|
|
45
102
|
/**
|
|
46
|
-
* @description
|
|
103
|
+
* @description Executes the CLI with the provided arguments
|
|
104
|
+
* @summary Boots the CLI by loading all modules, then parses and executes the command specified in the arguments
|
|
105
|
+
*
|
|
106
|
+
* @param {string[]} [args=process.argv] Command line arguments to parse and execute
|
|
107
|
+
* @return {Promise<void>} A promise that resolves when the command execution is complete
|
|
108
|
+
*
|
|
109
|
+
* @mermaid
|
|
110
|
+
* sequenceDiagram
|
|
111
|
+
* participant Client
|
|
112
|
+
* participant CliWrapper
|
|
113
|
+
* participant Command
|
|
47
114
|
*
|
|
48
|
-
*
|
|
115
|
+
* Client->>CliWrapper: run(args)
|
|
116
|
+
* CliWrapper->>CliWrapper: boot()
|
|
117
|
+
* Note over CliWrapper: Loads all modules
|
|
118
|
+
* CliWrapper->>Command: parseAsync(args)
|
|
119
|
+
* Command-->>CliWrapper: result
|
|
120
|
+
* CliWrapper-->>Client: result
|
|
49
121
|
*/
|
|
50
122
|
run(args?: string[]): Promise<Command>;
|
|
51
123
|
}
|
package/lib/bin/cli.cjs
CHANGED
|
@@ -4,20 +4,28 @@
|
|
|
4
4
|
* BIN_CALL_PLACEHOLDER - DO NOT REMOVE
|
|
5
5
|
*/
|
|
6
6
|
/**
|
|
7
|
-
* @description Decaf-ts' CLI entry
|
|
8
|
-
* @summary This file
|
|
9
|
-
*
|
|
7
|
+
* @description Decaf-ts' CLI entry point
|
|
8
|
+
* @summary This file serves as the main executable entry point for the Decaf CLI. It creates a CliWrapper instance
|
|
9
|
+
* and runs it with the process arguments. The CLI will crawl the current working directory for files called
|
|
10
|
+
* CLI_FILE_NAME within the @decaf-ts namespace and load them as subcommands.
|
|
10
11
|
*
|
|
11
12
|
* @example
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
13
|
+
* // Run a module command
|
|
14
|
+
* $ npx decaf <module name> <module command> ...<module command options>
|
|
15
|
+
*
|
|
16
|
+
* // Get help for a specific module
|
|
17
|
+
* $ npx decaf help <module name>
|
|
18
|
+
*
|
|
19
|
+
* // List all imported modules
|
|
20
|
+
* $ npx decaf list
|
|
21
|
+
*
|
|
22
|
+
* // Get general CLI help
|
|
23
|
+
* $ npx decaf help
|
|
16
24
|
*
|
|
17
25
|
* @memberOf module:CLI
|
|
18
26
|
*/
|
|
19
27
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
const CliWrapper_1 = require("
|
|
28
|
+
const CliWrapper_1 = require("./../CliWrapper.cjs");
|
|
21
29
|
new CliWrapper_1.CliWrapper()
|
|
22
30
|
.run(process.argv)
|
|
23
31
|
.then(() => {
|
|
@@ -27,4 +35,4 @@ new CliWrapper_1.CliWrapper()
|
|
|
27
35
|
console.error(`${e instanceof Error ? e.message : e}`);
|
|
28
36
|
process.exit(1);
|
|
29
37
|
});
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jpbi9jbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHO0FBQ0g7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOztBQUVILG9EQUEyQztBQUMzQyxJQUFJLHVCQUFVLEVBQUU7S0FDYixHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztLQUNqQixJQUFJLENBQUMsR0FBRyxFQUFFO0lBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0FBQ3RFLENBQUMsQ0FBQztLQUNELEtBQUssQ0FBQyxDQUFDLENBQVUsRUFBRSxFQUFFO0lBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJJTl9DQUxMX1BMQUNFSE9MREVSIC0gRE8gTk9UIFJFTU9WRVxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNhZi10cycgQ0xJIGVudHJ5IHBvaW50XG4gKiBAc3VtbWFyeSBUaGlzIGZpbGUgc2VydmVzIGFzIHRoZSBtYWluIGV4ZWN1dGFibGUgZW50cnkgcG9pbnQgZm9yIHRoZSBEZWNhZiBDTEkuIEl0IGNyZWF0ZXMgYSBDbGlXcmFwcGVyIGluc3RhbmNlXG4gKiBhbmQgcnVucyBpdCB3aXRoIHRoZSBwcm9jZXNzIGFyZ3VtZW50cy4gVGhlIENMSSB3aWxsIGNyYXdsIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciBmaWxlcyBjYWxsZWRcbiAqIENMSV9GSUxFX05BTUUgd2l0aGluIHRoZSBAZGVjYWYtdHMgbmFtZXNwYWNlIGFuZCBsb2FkIHRoZW0gYXMgc3ViY29tbWFuZHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJ1biBhIG1vZHVsZSBjb21tYW5kXG4gKiAkIG5weCBkZWNhZiA8bW9kdWxlIG5hbWU+IDxtb2R1bGUgY29tbWFuZD4gLi4uPG1vZHVsZSBjb21tYW5kIG9wdGlvbnM+XG4gKiBcbiAqIC8vIEdldCBoZWxwIGZvciBhIHNwZWNpZmljIG1vZHVsZVxuICogJCBucHggZGVjYWYgaGVscCA8bW9kdWxlIG5hbWU+XG4gKiBcbiAqIC8vIExpc3QgYWxsIGltcG9ydGVkIG1vZHVsZXNcbiAqICQgbnB4IGRlY2FmIGxpc3RcbiAqIFxuICogLy8gR2V0IGdlbmVyYWwgQ0xJIGhlbHBcbiAqICQgbnB4IGRlY2FmIGhlbHBcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkNMSVxuICovXG5cbmltcG9ydCB7IENsaVdyYXBwZXIgfSBmcm9tIFwiLi4vQ2xpV3JhcHBlclwiO1xubmV3IENsaVdyYXBwZXIoKVxuICAucnVuKHByb2Nlc3MuYXJndilcbiAgLnRoZW4oKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiVGhhbmsgeW91IGZvciB1c2luZyBkZWNhZi10cycgY29tbWFuZCBsaW5lIGludGVyZmFjZVwiKTtcbiAgfSlcbiAgLmNhdGNoKChlOiB1bmtub3duKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihgJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBlfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfSk7XG4iXX0=
|
package/lib/bin/cli.d.ts
CHANGED
|
@@ -2,15 +2,23 @@
|
|
|
2
2
|
* BIN_CALL_PLACEHOLDER - DO NOT REMOVE
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
|
-
* @description Decaf-ts' CLI entry
|
|
6
|
-
* @summary This file
|
|
7
|
-
*
|
|
5
|
+
* @description Decaf-ts' CLI entry point
|
|
6
|
+
* @summary This file serves as the main executable entry point for the Decaf CLI. It creates a CliWrapper instance
|
|
7
|
+
* and runs it with the process arguments. The CLI will crawl the current working directory for files called
|
|
8
|
+
* CLI_FILE_NAME within the @decaf-ts namespace and load them as subcommands.
|
|
8
9
|
*
|
|
9
10
|
* @example
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* // Run a module command
|
|
12
|
+
* $ npx decaf <module name> <module command> ...<module command options>
|
|
13
|
+
*
|
|
14
|
+
* // Get help for a specific module
|
|
15
|
+
* $ npx decaf help <module name>
|
|
16
|
+
*
|
|
17
|
+
* // List all imported modules
|
|
18
|
+
* $ npx decaf list
|
|
19
|
+
*
|
|
20
|
+
* // Get general CLI help
|
|
21
|
+
* $ npx decaf help
|
|
14
22
|
*
|
|
15
23
|
* @memberOf module:CLI
|
|
16
24
|
*/
|
package/lib/constants.cjs
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CLI_FILE_NAME = void 0;
|
|
4
4
|
/**
|
|
5
|
-
* @description The
|
|
6
|
-
* a single
|
|
5
|
+
* @description The filename that identifies Decaf CLI modules
|
|
6
|
+
* @summary The standard filename for CLI module files where each library must export a single CliModule function
|
|
7
7
|
*
|
|
8
|
-
* @
|
|
9
|
-
* @memberOf module:CLI
|
|
8
|
+
* @const CLI_FILE_NAME
|
|
9
|
+
* @memberOf module:CLI
|
|
10
10
|
*/
|
|
11
11
|
exports.CLI_FILE_NAME = "cli-module";
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQTs7Ozs7O0dBTUc7QUFDVSxRQUFBLGFBQWEsR0FBRyxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5pbXBvcnQgeyBDbGlNb2R1bGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUaGUgZmlsZW5hbWUgdGhhdCBpZGVudGlmaWVzIERlY2FmIENMSSBtb2R1bGVzXG4gKiBAc3VtbWFyeSBUaGUgc3RhbmRhcmQgZmlsZW5hbWUgZm9yIENMSSBtb2R1bGUgZmlsZXMgd2hlcmUgZWFjaCBsaWJyYXJ5IG11c3QgZXhwb3J0IGEgc2luZ2xlIENsaU1vZHVsZSBmdW5jdGlvblxuICpcbiAqIEBjb25zdCBDTElfRklMRV9OQU1FXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkNMSVxuICovXG5leHBvcnQgY29uc3QgQ0xJX0ZJTEVfTkFNRSA9IFwiY2xpLW1vZHVsZVwiO1xuIl19
|
package/lib/constants.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @description The
|
|
3
|
-
* a single
|
|
2
|
+
* @description The filename that identifies Decaf CLI modules
|
|
3
|
+
* @summary The standard filename for CLI module files where each library must export a single CliModule function
|
|
4
4
|
*
|
|
5
|
-
* @
|
|
6
|
-
* @memberOf module:CLI
|
|
5
|
+
* @const CLI_FILE_NAME
|
|
6
|
+
* @memberOf module:CLI
|
|
7
7
|
*/
|
|
8
8
|
export declare const CLI_FILE_NAME = "cli-module";
|
package/lib/demo/cli-module.cjs
CHANGED
|
@@ -3,29 +3,37 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.default = demo;
|
|
4
4
|
const commander_1 = require("commander");
|
|
5
5
|
/**
|
|
6
|
-
* @description
|
|
7
|
-
* @summary minimal implementation
|
|
6
|
+
* @description Demo CLI module for Decaf libraries
|
|
7
|
+
* @summary A minimal implementation showing how to extend the Decaf CLI with custom commands.
|
|
8
|
+
* This module demonstrates the pattern for creating CLI modules that can be discovered and loaded by the Decaf CLI.
|
|
8
9
|
*
|
|
9
|
-
*
|
|
10
|
-
* - The name of the returned function will be considered to be the base command;
|
|
11
|
-
* - the command you return will be considered as a subCommand and will not be called directly
|
|
12
|
-
* - Commands must be transpiled under the same ts-configuration as this module
|
|
13
|
-
* (so copy the ts-config of this module to your project. we propose `tsconfig.cli.json`)
|
|
14
|
-
* - Following your build pipeline include `tsc --project tsconfig.cli.json --outDir <dist folder>/cli`
|
|
15
|
-
*
|
|
16
|
-
* Note the extra use of `cli` on the outDir param. this is meant to completely separate
|
|
17
|
-
* the cli code from your source, in case they are transpiled under different ts-configurations
|
|
18
|
-
*
|
|
19
|
-
* @returns {Command} the subCommand to be added to the main decaf CLI
|
|
10
|
+
* @return {Command} The Command object to be added to the main Decaf CLI
|
|
20
11
|
*
|
|
21
12
|
* @function demo
|
|
22
|
-
*
|
|
23
|
-
* @category Command Line Interface
|
|
13
|
+
* @memberOf module:CLI
|
|
24
14
|
*
|
|
25
15
|
* @example
|
|
26
|
-
*
|
|
16
|
+
* // Run the demo command with an argument
|
|
17
|
+
* npx decaf demo command "something something"
|
|
18
|
+
*
|
|
19
|
+
* // Output:
|
|
20
|
+
* // executed demo command with type variable: something something
|
|
21
|
+
*
|
|
22
|
+
* @mermaid
|
|
23
|
+
* sequenceDiagram
|
|
24
|
+
* participant User
|
|
25
|
+
* participant CLI
|
|
26
|
+
* participant DemoModule
|
|
27
|
+
* participant Command
|
|
27
28
|
*
|
|
28
|
-
*
|
|
29
|
+
* User->>CLI: npx decaf demo command "arg"
|
|
30
|
+
* CLI->>DemoModule: Load module
|
|
31
|
+
* DemoModule->>Command: Create command
|
|
32
|
+
* Command->>Command: Configure action
|
|
33
|
+
* Command-->>DemoModule: Return command
|
|
34
|
+
* DemoModule-->>CLI: Return command
|
|
35
|
+
* CLI->>Command: Execute with args
|
|
36
|
+
* Command->>Console: Log output
|
|
29
37
|
*/
|
|
30
38
|
function demo() {
|
|
31
39
|
return new commander_1.Command()
|
|
@@ -35,4 +43,4 @@ function demo() {
|
|
|
35
43
|
console.log(`executed demo command with type variable: ${args}`);
|
|
36
44
|
});
|
|
37
45
|
}
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLW1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZW1vL2NsaS1tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFtQ0EsdUJBT0M7QUExQ0QseUNBQW9DO0FBRXBDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdDRztBQUNILFNBQXdCLElBQUk7SUFDMUIsT0FBTyxJQUFJLG1CQUFPLEVBQUU7U0FDakIsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1NBQ3pCLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQztTQUM3QixNQUFNLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRTtRQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLDZDQUE2QyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlbW8gQ0xJIG1vZHVsZSBmb3IgRGVjYWYgbGlicmFyaWVzXG4gKiBAc3VtbWFyeSBBIG1pbmltYWwgaW1wbGVtZW50YXRpb24gc2hvd2luZyBob3cgdG8gZXh0ZW5kIHRoZSBEZWNhZiBDTEkgd2l0aCBjdXN0b20gY29tbWFuZHMuXG4gKiBUaGlzIG1vZHVsZSBkZW1vbnN0cmF0ZXMgdGhlIHBhdHRlcm4gZm9yIGNyZWF0aW5nIENMSSBtb2R1bGVzIHRoYXQgY2FuIGJlIGRpc2NvdmVyZWQgYW5kIGxvYWRlZCBieSB0aGUgRGVjYWYgQ0xJLlxuICpcbiAqIEByZXR1cm4ge0NvbW1hbmR9IFRoZSBDb21tYW5kIG9iamVjdCB0byBiZSBhZGRlZCB0byB0aGUgbWFpbiBEZWNhZiBDTElcbiAqXG4gKiBAZnVuY3Rpb24gZGVtb1xuICogQG1lbWJlck9mIG1vZHVsZTpDTElcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUnVuIHRoZSBkZW1vIGNvbW1hbmQgd2l0aCBhbiBhcmd1bWVudFxuICogbnB4IGRlY2FmIGRlbW8gY29tbWFuZCBcInNvbWV0aGluZyBzb21ldGhpbmdcIlxuICpcbiAqIC8vIE91dHB1dDpcbiAqIC8vIGV4ZWN1dGVkIGRlbW8gY29tbWFuZCB3aXRoIHR5cGUgdmFyaWFibGU6IHNvbWV0aGluZyBzb21ldGhpbmdcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFVzZXJcbiAqICAgcGFydGljaXBhbnQgQ0xJXG4gKiAgIHBhcnRpY2lwYW50IERlbW9Nb2R1bGVcbiAqICAgcGFydGljaXBhbnQgQ29tbWFuZFxuICpcbiAqICAgVXNlci0+PkNMSTogbnB4IGRlY2FmIGRlbW8gY29tbWFuZCBcImFyZ1wiXG4gKiAgIENMSS0+PkRlbW9Nb2R1bGU6IExvYWQgbW9kdWxlXG4gKiAgIERlbW9Nb2R1bGUtPj5Db21tYW5kOiBDcmVhdGUgY29tbWFuZFxuICogICBDb21tYW5kLT4+Q29tbWFuZDogQ29uZmlndXJlIGFjdGlvblxuICogICBDb21tYW5kLS0+PkRlbW9Nb2R1bGU6IFJldHVybiBjb21tYW5kXG4gKiAgIERlbW9Nb2R1bGUtLT4+Q0xJOiBSZXR1cm4gY29tbWFuZFxuICogICBDTEktPj5Db21tYW5kOiBFeGVjdXRlIHdpdGggYXJnc1xuICogICBDb21tYW5kLT4+Q29uc29sZTogTG9nIG91dHB1dFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZW1vKCk6IENvbW1hbmQge1xuICByZXR1cm4gbmV3IENvbW1hbmQoKVxuICAgIC5jb21tYW5kKFwiY29tbWFuZCA8dHlwZT5cIilcbiAgICAuZGVzY3JpcHRpb24oXCJBIGRlbW8gY29tbWFuZFwiKVxuICAgIC5hY3Rpb24oKGFyZ3M6IHN0cmluZykgPT4ge1xuICAgICAgY29uc29sZS5sb2coYGV4ZWN1dGVkIGRlbW8gY29tbWFuZCB3aXRoIHR5cGUgdmFyaWFibGU6ICR7YXJnc31gKTtcbiAgICB9KTtcbn1cbiJdfQ==
|
package/lib/demo/cli-module.d.ts
CHANGED
|
@@ -1,27 +1,35 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
/**
|
|
3
|
-
* @description
|
|
4
|
-
* @summary minimal implementation
|
|
3
|
+
* @description Demo CLI module for Decaf libraries
|
|
4
|
+
* @summary A minimal implementation showing how to extend the Decaf CLI with custom commands.
|
|
5
|
+
* This module demonstrates the pattern for creating CLI modules that can be discovered and loaded by the Decaf CLI.
|
|
5
6
|
*
|
|
6
|
-
*
|
|
7
|
-
* - The name of the returned function will be considered to be the base command;
|
|
8
|
-
* - the command you return will be considered as a subCommand and will not be called directly
|
|
9
|
-
* - Commands must be transpiled under the same ts-configuration as this module
|
|
10
|
-
* (so copy the ts-config of this module to your project. we propose `tsconfig.cli.json`)
|
|
11
|
-
* - Following your build pipeline include `tsc --project tsconfig.cli.json --outDir <dist folder>/cli`
|
|
12
|
-
*
|
|
13
|
-
* Note the extra use of `cli` on the outDir param. this is meant to completely separate
|
|
14
|
-
* the cli code from your source, in case they are transpiled under different ts-configurations
|
|
15
|
-
*
|
|
16
|
-
* @returns {Command} the subCommand to be added to the main decaf CLI
|
|
7
|
+
* @return {Command} The Command object to be added to the main Decaf CLI
|
|
17
8
|
*
|
|
18
9
|
* @function demo
|
|
19
|
-
*
|
|
20
|
-
* @category Command Line Interface
|
|
10
|
+
* @memberOf module:CLI
|
|
21
11
|
*
|
|
22
12
|
* @example
|
|
23
|
-
*
|
|
13
|
+
* // Run the demo command with an argument
|
|
14
|
+
* npx decaf demo command "something something"
|
|
15
|
+
*
|
|
16
|
+
* // Output:
|
|
17
|
+
* // executed demo command with type variable: something something
|
|
18
|
+
*
|
|
19
|
+
* @mermaid
|
|
20
|
+
* sequenceDiagram
|
|
21
|
+
* participant User
|
|
22
|
+
* participant CLI
|
|
23
|
+
* participant DemoModule
|
|
24
|
+
* participant Command
|
|
24
25
|
*
|
|
25
|
-
*
|
|
26
|
+
* User->>CLI: npx decaf demo command "arg"
|
|
27
|
+
* CLI->>DemoModule: Load module
|
|
28
|
+
* DemoModule->>Command: Create command
|
|
29
|
+
* Command->>Command: Configure action
|
|
30
|
+
* Command-->>DemoModule: Return command
|
|
31
|
+
* DemoModule-->>CLI: Return command
|
|
32
|
+
* CLI->>Command: Execute with args
|
|
33
|
+
* Command->>Console: Log output
|
|
26
34
|
*/
|
|
27
35
|
export default function demo(): Command;
|