@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/esm/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/esm/CliWrapper.js
CHANGED
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import fs from "fs";
|
|
3
3
|
import path from "path";
|
|
4
|
-
import { CLI_FILE_NAME } from "./constants";
|
|
5
|
-
import { CLIUtils } from "./utils";
|
|
4
|
+
import { CLI_FILE_NAME } from "./constants.js";
|
|
5
|
+
import { CLIUtils } from "./utils.js";
|
|
6
6
|
/**
|
|
7
|
-
* @
|
|
8
|
-
* @
|
|
7
|
+
* @description Utility class to handle CLI functionality from all Decaf modules
|
|
8
|
+
* @summary This class provides a wrapper around Commander.js to handle CLI commands from different Decaf modules.
|
|
9
|
+
* It crawls the filesystem to find CLI modules, loads them, and registers their commands.
|
|
9
10
|
*
|
|
10
|
-
* @param {string} [
|
|
11
|
-
* @param {
|
|
11
|
+
* @param {string} [basePath] The base path to look for modules in. Defaults to `./`
|
|
12
|
+
* @param {number} [crawlLevels] Number of folder levels to crawl to find modules from the basePath. Defaults to 4
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // Create a new CLI wrapper and run it with custom options
|
|
16
|
+
* const cli = new CliWrapper('./src', 2);
|
|
17
|
+
* cli.run(process.argv).then(() => {
|
|
18
|
+
* console.log('CLI commands executed successfully');
|
|
19
|
+
* });
|
|
12
20
|
*
|
|
13
21
|
* @class CliWrapper
|
|
14
22
|
*/
|
|
@@ -17,26 +25,47 @@ export class CliWrapper {
|
|
|
17
25
|
this.basePath = basePath;
|
|
18
26
|
this.crawlLevels = crawlLevels;
|
|
19
27
|
this.modules = {};
|
|
28
|
+
this.rootPath = path.resolve(__dirname, "..");
|
|
20
29
|
}
|
|
21
30
|
/**
|
|
22
|
-
* @description Retrieves and initializes the
|
|
31
|
+
* @description Retrieves and initializes the Commander Command object
|
|
32
|
+
* @summary Lazy-loads the Command object, initializing it with the package name, description, and version
|
|
33
|
+
* @return {Command} The initialized Command object
|
|
23
34
|
* @private
|
|
24
35
|
*/
|
|
25
36
|
get command() {
|
|
26
37
|
if (!this._command) {
|
|
27
38
|
this._command = new Command();
|
|
28
|
-
CLIUtils.initialize(this._command, this.
|
|
39
|
+
CLIUtils.initialize(this._command, this.rootPath);
|
|
29
40
|
}
|
|
30
41
|
return this._command;
|
|
31
42
|
}
|
|
32
43
|
/**
|
|
33
|
-
* @description
|
|
44
|
+
* @description Loads and registers a module from a file
|
|
45
|
+
* @summary Dynamically imports a CLI module from the specified file path, initializes it, and registers it in the modules collection
|
|
34
46
|
*
|
|
35
|
-
* @param {string} filePath
|
|
36
|
-
* @param {string} rootPath
|
|
37
|
-
* @return {string} the module name
|
|
47
|
+
* @param {string} filePath Path to the module file to load
|
|
48
|
+
* @param {string} rootPath Repository root path to find the package.json
|
|
49
|
+
* @return {Promise<string>} A promise that resolves to the module name
|
|
38
50
|
*
|
|
39
51
|
* @private
|
|
52
|
+
* @mermaid
|
|
53
|
+
* sequenceDiagram
|
|
54
|
+
* participant CliWrapper
|
|
55
|
+
* participant CLIUtils
|
|
56
|
+
* participant Module
|
|
57
|
+
*
|
|
58
|
+
* CliWrapper->>CLIUtils: loadFromFile(filePath)
|
|
59
|
+
* CLIUtils-->>CliWrapper: module
|
|
60
|
+
* CliWrapper->>CliWrapper: Get module name
|
|
61
|
+
* CliWrapper->>Command: new Command()
|
|
62
|
+
* Command-->>CliWrapper: cmd
|
|
63
|
+
* CliWrapper->>CLIUtils: initialize(cmd, path.dirname(rootPath))
|
|
64
|
+
* CliWrapper->>Module: module()
|
|
65
|
+
* Note over CliWrapper,Module: Handle Promise if needed
|
|
66
|
+
* Module-->>CliWrapper: Command instance
|
|
67
|
+
* CliWrapper->>CliWrapper: Store in modules[name]
|
|
68
|
+
* CliWrapper-->>CliWrapper: Return name
|
|
40
69
|
*/
|
|
41
70
|
async load(filePath, rootPath) {
|
|
42
71
|
let name;
|
|
@@ -44,7 +73,7 @@ export class CliWrapper {
|
|
|
44
73
|
const module = await CLIUtils.loadFromFile(filePath);
|
|
45
74
|
name = module.name;
|
|
46
75
|
const cmd = new Command();
|
|
47
|
-
CLIUtils.initialize(cmd,
|
|
76
|
+
CLIUtils.initialize(cmd, rootPath);
|
|
48
77
|
let m = module();
|
|
49
78
|
if (m instanceof Promise)
|
|
50
79
|
m = await m;
|
|
@@ -56,12 +85,36 @@ export class CliWrapper {
|
|
|
56
85
|
return name;
|
|
57
86
|
}
|
|
58
87
|
/**
|
|
59
|
-
* @description
|
|
60
|
-
*
|
|
88
|
+
* @description Finds and loads all CLI modules in the basePath
|
|
89
|
+
* @summary Uses the crawl method to find all CLI modules in the specified base path,
|
|
90
|
+
* then loads and registers each module as a subcommand
|
|
91
|
+
*
|
|
92
|
+
* @return {Promise<void>} A promise that resolves when all modules are loaded
|
|
93
|
+
*
|
|
61
94
|
* @private
|
|
95
|
+
* @mermaid
|
|
96
|
+
* sequenceDiagram
|
|
97
|
+
* participant CliWrapper
|
|
98
|
+
* participant Filesystem
|
|
99
|
+
* participant Module
|
|
100
|
+
*
|
|
101
|
+
* CliWrapper->>Filesystem: Join basePath with cwd
|
|
102
|
+
* CliWrapper->>CliWrapper: crawl(basePath, crawlLevels)
|
|
103
|
+
* CliWrapper-->>CliWrapper: modules[]
|
|
104
|
+
* loop For each module
|
|
105
|
+
* alt Not @decaf-ts/cli
|
|
106
|
+
* CliWrapper->>CliWrapper: load(module, cwd)
|
|
107
|
+
* CliWrapper-->>CliWrapper: name
|
|
108
|
+
* CliWrapper->>CliWrapper: Check if command exists
|
|
109
|
+
* alt Command doesn't exist
|
|
110
|
+
* CliWrapper->>Command: command(name).addCommand(modules[name])
|
|
111
|
+
* end
|
|
112
|
+
* end
|
|
113
|
+
* end
|
|
114
|
+
* CliWrapper->>Console: Log loaded modules
|
|
62
115
|
*/
|
|
63
116
|
async boot() {
|
|
64
|
-
const basePath = path.
|
|
117
|
+
const basePath = path.resolve(this.rootPath, this.basePath);
|
|
65
118
|
const modules = this.crawl(basePath, this.crawlLevels);
|
|
66
119
|
for (const module of modules) {
|
|
67
120
|
if (module.includes("@decaf-ts/cli")) {
|
|
@@ -69,7 +122,7 @@ export class CliWrapper {
|
|
|
69
122
|
}
|
|
70
123
|
let name;
|
|
71
124
|
try {
|
|
72
|
-
name = await this.load(module,
|
|
125
|
+
name = await this.load(module, this.rootPath);
|
|
73
126
|
}
|
|
74
127
|
catch (e) {
|
|
75
128
|
console.error(e);
|
|
@@ -88,9 +141,13 @@ export class CliWrapper {
|
|
|
88
141
|
.join("\n")}`);
|
|
89
142
|
}
|
|
90
143
|
/**
|
|
91
|
-
* @description
|
|
92
|
-
* @
|
|
93
|
-
*
|
|
144
|
+
* @description Recursively searches for CLI module files in the directory structure
|
|
145
|
+
* @summary Crawls the basePath up to the specified number of folder levels to find files named according to CLI_FILE_NAME
|
|
146
|
+
*
|
|
147
|
+
* @param {string} basePath The absolute base path to start searching in
|
|
148
|
+
* @param {number} [levels=2] The maximum number of directory levels to crawl
|
|
149
|
+
* @return {string[]} An array of file paths to CLI modules
|
|
150
|
+
*
|
|
94
151
|
* @private
|
|
95
152
|
*/
|
|
96
153
|
crawl(basePath, levels = 2) {
|
|
@@ -108,13 +165,28 @@ export class CliWrapper {
|
|
|
108
165
|
}, []);
|
|
109
166
|
}
|
|
110
167
|
/**
|
|
111
|
-
* @description
|
|
168
|
+
* @description Executes the CLI with the provided arguments
|
|
169
|
+
* @summary Boots the CLI by loading all modules, then parses and executes the command specified in the arguments
|
|
170
|
+
*
|
|
171
|
+
* @param {string[]} [args=process.argv] Command line arguments to parse and execute
|
|
172
|
+
* @return {Promise<void>} A promise that resolves when the command execution is complete
|
|
173
|
+
*
|
|
174
|
+
* @mermaid
|
|
175
|
+
* sequenceDiagram
|
|
176
|
+
* participant Client
|
|
177
|
+
* participant CliWrapper
|
|
178
|
+
* participant Command
|
|
112
179
|
*
|
|
113
|
-
*
|
|
180
|
+
* Client->>CliWrapper: run(args)
|
|
181
|
+
* CliWrapper->>CliWrapper: boot()
|
|
182
|
+
* Note over CliWrapper: Loads all modules
|
|
183
|
+
* CliWrapper->>Command: parseAsync(args)
|
|
184
|
+
* Command-->>CliWrapper: result
|
|
185
|
+
* CliWrapper-->>Client: result
|
|
114
186
|
*/
|
|
115
187
|
async run(args = process.argv) {
|
|
116
188
|
await this.boot();
|
|
117
189
|
return this.command.parseAsync(args);
|
|
118
190
|
}
|
|
119
191
|
}
|
|
120
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xpV3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9DbGlXcmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFbkM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sVUFBVTtJQUlyQixZQUNVLFdBQW1CLElBQUksRUFDdkIsY0FBYyxDQUFDO1FBRGYsYUFBUSxHQUFSLFFBQVEsQ0FBZTtRQUN2QixnQkFBVyxHQUFYLFdBQVcsQ0FBSTtRQUpqQixZQUFPLEdBQTRCLEVBQUUsQ0FBQztJQUszQyxDQUFDO0lBRUo7OztPQUdHO0lBQ0gsSUFBWSxPQUFPO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzlCLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQWdCLEVBQUUsUUFBZ0I7UUFDbkQsSUFBSSxJQUFJLENBQUM7UUFDVCxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDckQsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDbkIsTUFB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SUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDcEMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsYUFBYSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNyRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNULENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFpQixPQUFPLENBQUMsSUFBSTtRQUNyQyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgQ0xJX0ZJTEVfTkFNRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ0xJVXRpbHMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgY2xhc3MgdG8gaGFuZGxlIENMSSBmdW5jdGlvbmFsaXR5IGZyb20gYWxsIERlY2FmIG1vZHVsZXNcbiAqIEBkZXNjcmlwdGlvbiBDTEkgaGFuZGxlciBjbGFzc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYmFzZXBhdGhdIHRoZSBiYXNlIHBhdGggdG8gbG9vayBmb3IgbW9kdWxlcyBpbi4gZGVmYXVsdHMgdG8gYC4vYFxuICogQHBhcmFtIHtzdHJpbmd9IFtjcmF3bExldmVsc10gZm9sZGVycyB0byBjcmF3bCB0byBmaW5kIG1vZHVsZXMgZnJvbSB0aGUgYmFzZVBhdGguIGRlZmF1bHRzIHRvIDRcbiAqXG4gKiBAY2xhc3MgQ2xpV3JhcHBlclxuICovXG5leHBvcnQgY2xhc3MgQ2xpV3JhcHBlciB7XG4gIHByaXZhdGUgX2NvbW1hbmQ/OiBDb21tYW5kO1xuICBwcml2YXRlIG1vZHVsZXM6IFJlY29yZDxzdHJpbmcsIENvbW1hbmQ+ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiYXNlUGF0aDogc3RyaW5nID0gXCIuL1wiLFxuICAgIHByaXZhdGUgY3Jhd2xMZXZlbHMgPSA0XG4gICkge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhbmQgaW5pdGlhbGl6ZXMgdGhlIHtAbGluayBDb21tYW5kfSBvYmplY3RcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0IGNvbW1hbmQoKSB7XG4gICAgaWYgKCF0aGlzLl9jb21tYW5kKSB7XG4gICAgICB0aGlzLl9jb21tYW5kID0gbmV3IENvbW1hbmQoKTtcbiAgICAgIENMSVV0aWxzLmluaXRpYWxpemUodGhpcy5fY29tbWFuZCwgdGhpcy5iYXNlUGF0aCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb21tYW5kO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBsb2FkcyBhbmQgcmVnaXN0ZXJzIG1vZHVsZSBmcm9tIGEgZmlsZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggcGF0aCB0byBsb29rIGZvciBtb2R1bGVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByb290UGF0aCByZXBvIHJvb3QgdG8gZmluZCB0aGUgcGFja2FnZS5qc29uXG4gICAqIEByZXR1cm4ge3N0cmluZ30gdGhlIG1vZHVsZSBuYW1lXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWQoZmlsZVBhdGg6IHN0cmluZywgcm9vdFBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IG5hbWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IENMSVV0aWxzLmxvYWRGcm9tRmlsZShmaWxlUGF0aCk7XG4gICAgICBuYW1lID0gbW9kdWxlLm5hbWU7XG4gICAgICBjb25zdCBjbWQgPSBuZXcgQ29tbWFuZCgpO1xuICAgICAgQ0xJVXRpbHMuaW5pdGlhbGl6ZShjbWQsIHBhdGguZGlybmFtZShyb290UGF0aCkpO1xuICAgICAgbGV0IG0gPSBtb2R1bGUoKTtcbiAgICAgIGlmIChtIGluc3RhbmNlb2YgUHJvbWlzZSkgbSA9IGF3YWl0IG07XG4gICAgICB0aGlzLm1vZHVsZXNbbmFtZV0gPSBtO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGZhaWxlZCB0byBsb2FkIG1vZHVsZSAke25hbWUgfHwgXCJ1bm5hbWVkXCJ9IHVuZGVyICR7ZmlsZVBhdGh9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IGV9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIGZpbmRzIGFsbCB0aGUgY2xpIG1vZHVsZXMgaW4gdGhlIGJhc2VQYXRoIHZpYSB7QGxpbmsgQ2xpV3JhcHBlci5jcmF3bH1cbiAgICogYW5kIGxvYWRzIHRoZW1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYm9vdCgpIHtcbiAgICBjb25zdCBiYXNlUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCB0aGlzLmJhc2VQYXRoKTtcbiAgICBjb25zdCBtb2R1bGVzID0gdGhpcy5jcmF3bChiYXNlUGF0aCwgdGhpcy5jcmF3bExldmVscyk7XG4gICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuICAgICAgaWYgKG1vZHVsZS5pbmNsdWRlcyhcIkBkZWNhZi10cy9jbGlcIikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsZXQgbmFtZTogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmFtZSA9IGF3YWl0IHRoaXMubG9hZChtb2R1bGUsIHByb2Nlc3MuY3dkKCkpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5jb21tYW5kLmNvbW1hbmRzLmZpbmQoXG4gICAgICAgICAgKGMpID0+IChjIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPilbXCJfbmFtZVwiXSA9PT0gbmFtZVxuICAgICAgICApXG4gICAgICApXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5jb21tYW5kLmNvbW1hbmQobmFtZSkuYWRkQ29tbWFuZCh0aGlzLm1vZHVsZXNbbmFtZV0pO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBsb2FkZWQgbW9kdWxlczpcXG4ke09iamVjdC5rZXlzKHRoaXMubW9kdWxlcylcbiAgICAgICAgLm1hcCgoaykgPT4gYC0gJHtrfWApXG4gICAgICAgIC5qb2luKFwiXFxuXCIpfWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBjcmF3bHMgdGhlIGJhc2VQYXRoIHVwIGZvciAnbGV2ZWxzJyBmb2xkZXJzIHRvIGZpbmQgYSBtb2R1bGUsZWcgYSB7QGxpbmsgQ0xJX0ZJTEVfTkFNRX0gbmFtZWQgZmlsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVBhdGggdGhlIHJlbGF0aXZlIGJhc2UgYmF0Y2ggdG8gc3RhcnQgc2VhcmNoaW5nIGluXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGV2ZWxzXSB0aGUgbWF4IG51bWJlciBvZiBsZXZlbHMgdG8gY3Jhd2wuIGRlZmF1bHRzIHRvIDJcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY3Jhd2woYmFzZVBhdGg6IHN0cmluZywgbGV2ZWxzOiBudW1iZXIgPSAyKSB7XG4gICAgaWYgKGxldmVscyA8PSAwKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGZzLnJlYWRkaXJTeW5jKGJhc2VQYXRoKS5yZWR1Y2UoKGFjY3VtOiBzdHJpbmdbXSwgZmlsZSkgPT4ge1xuICAgICAgZmlsZSA9IHBhdGguam9pbihiYXNlUGF0aCwgZmlsZSk7XG4gICAgICBpZiAoZnMuc3RhdFN5bmMoZmlsZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBhY2N1bS5wdXNoKC4uLnRoaXMuY3Jhd2woZmlsZSwgbGV2ZWxzIC0gMSkpO1xuICAgICAgfSBlbHNlIGlmIChmaWxlLm1hdGNoKG5ldyBSZWdFeHAoYCR7Q0xJX0ZJTEVfTkFNRX0uW2NtXT9qcyRgLCBcImdtXCIpKSkge1xuICAgICAgICBhY2N1bS5wdXNoKGZpbGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gcnVucyB0aGUgZ2l2ZW4gY29tbWFuZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJnc10gYXJncyB0byBydW4uIGRlZmF1bHRzIHRvIHByb2Nlc3MuYXJndlxuICAgKi9cbiAgYXN5bmMgcnVuKGFyZ3M6IHN0cmluZ1tdID0gcHJvY2Vzcy5hcmd2KSB7XG4gICAgYXdhaXQgdGhpcy5ib290KCk7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZC5wYXJzZUFzeW5jKGFyZ3MpO1xuICB9XG59XG4iXX0=
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xpV3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9DbGlXcmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQUUsYUFBYSxFQUFFLHVCQUFvQjtBQUM1QyxPQUFPLEVBQUUsUUFBUSxFQUFFLG1CQUFnQjtBQUVuQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBS3JCLFlBQ1UsV0FBbUIsSUFBSSxFQUN2QixjQUFjLENBQUM7UUFEZixhQUFRLEdBQVIsUUFBUSxDQUFlO1FBQ3ZCLGdCQUFXLEdBQVgsV0FBVyxDQUFJO1FBTGpCLFlBQU8sR0FBNEIsRUFBRSxDQUFDO1FBTzVDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBWSxPQUFPO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzlCLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BMEJHO0lBQ0ssS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFnQixFQUFFLFFBQWdCO1FBQ25ELElBQUksSUFBSSxDQUFDO1FBQ1QsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcs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QUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDakMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQ3BDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QyxDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLGFBQWEsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDVCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkc7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQWlCLE9BQU8sQ0FBQyxJQUFJO1FBQ3JDLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBDTElfRklMRV9OQU1FIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDTElVdGlscyB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFV0aWxpdHkgY2xhc3MgdG8gaGFuZGxlIENMSSBmdW5jdGlvbmFsaXR5IGZyb20gYWxsIERlY2FmIG1vZHVsZXNcbiAqIEBzdW1tYXJ5IFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZCBDb21tYW5kZXIuanMgdG8gaGFuZGxlIENMSSBjb21tYW5kcyBmcm9tIGRpZmZlcmVudCBEZWNhZiBtb2R1bGVzLlxuICogSXQgY3Jhd2xzIHRoZSBmaWxlc3lzdGVtIHRvIGZpbmQgQ0xJIG1vZHVsZXMsIGxvYWRzIHRoZW0sIGFuZCByZWdpc3RlcnMgdGhlaXIgY29tbWFuZHMuXG4gKiBcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYmFzZVBhdGhdIFRoZSBiYXNlIHBhdGggdG8gbG9vayBmb3IgbW9kdWxlcyBpbi4gRGVmYXVsdHMgdG8gYC4vYFxuICogQHBhcmFtIHtudW1iZXJ9IFtjcmF3bExldmVsc10gTnVtYmVyIG9mIGZvbGRlciBsZXZlbHMgdG8gY3Jhd2wgdG8gZmluZCBtb2R1bGVzIGZyb20gdGhlIGJhc2VQYXRoLiBEZWZhdWx0cyB0byA0XG4gKiBcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBuZXcgQ0xJIHdyYXBwZXIgYW5kIHJ1biBpdCB3aXRoIGN1c3RvbSBvcHRpb25zXG4gKiBjb25zdCBjbGkgPSBuZXcgQ2xpV3JhcHBlcignLi9zcmMnLCAyKTtcbiAqIGNsaS5ydW4ocHJvY2Vzcy5hcmd2KS50aGVuKCgpID0+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/esm/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/esm/bin/cli.js
CHANGED
|
@@ -2,19 +2,27 @@
|
|
|
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
|
*/
|
|
17
|
-
import { CliWrapper } from "
|
|
25
|
+
import { CliWrapper } from "./../CliWrapper.js";
|
|
18
26
|
new CliWrapper()
|
|
19
27
|
.run(process.argv)
|
|
20
28
|
.then(() => {
|
|
@@ -24,4 +32,4 @@ new CliWrapper()
|
|
|
24
32
|
console.error(`${e instanceof Error ? e.message : e}`);
|
|
25
33
|
process.exit(1);
|
|
26
34
|
});
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Jpbi9jbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLDJCQUFzQjtBQUMzQyxJQUFJLFVBQVUsRUFBRTtLQUNiLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0tBQ2pCLElBQUksQ0FBQyxHQUFHLEVBQUU7SUFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7QUFDdEUsQ0FBQyxDQUFDO0tBQ0QsS0FBSyxDQUFDLENBQUMsQ0FBVSxFQUFFLEVBQUU7SUFDcEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQklOX0NBTExfUExBQ0VIT0xERVIgLSBETyBOT1QgUkVNT1ZFXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY2FmLXRzJyBDTEkgZW50cnkgcG9pbnRcbiAqIEBzdW1tYXJ5IFRoaXMgZmlsZSBzZXJ2ZXMgYXMgdGhlIG1haW4gZXhlY3V0YWJsZSBlbnRyeSBwb2ludCBmb3IgdGhlIERlY2FmIENMSS4gSXQgY3JlYXRlcyBhIENsaVdyYXBwZXIgaW5zdGFuY2VcbiAqIGFuZCBydW5zIGl0IHdpdGggdGhlIHByb2Nlc3MgYXJndW1lbnRzLiBUaGUgQ0xJIHdpbGwgY3Jhd2wgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIGZpbGVzIGNhbGxlZFxuICogQ0xJX0ZJTEVfTkFNRSB3aXRoaW4gdGhlIEBkZWNhZi10cyBuYW1lc3BhY2UgYW5kIGxvYWQgdGhlbSBhcyBzdWJjb21tYW5kcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUnVuIGEgbW9kdWxlIGNvbW1hbmRcbiAqICQgbnB4IGRlY2FmIDxtb2R1bGUgbmFtZT4gPG1vZHVsZSBjb21tYW5kPiAuLi48bW9kdWxlIGNvbW1hbmQgb3B0aW9ucz5cbiAqIFxuICogLy8gR2V0IGhlbHAgZm9yIGEgc3BlY2lmaWMgbW9kdWxlXG4gKiAkIG5weCBkZWNhZiBoZWxwIDxtb2R1bGUgbmFtZT5cbiAqIFxuICogLy8gTGlzdCBhbGwgaW1wb3J0ZWQgbW9kdWxlc1xuICogJCBucHggZGVjYWYgbGlzdFxuICogXG4gKiAvLyBHZXQgZ2VuZXJhbCBDTEkgaGVscFxuICogJCBucHggZGVjYWYgaGVscFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Q0xJXG4gKi9cblxuaW1wb3J0IHsgQ2xpV3JhcHBlciB9IGZyb20gXCIuLi9DbGlXcmFwcGVyXCI7XG5uZXcgQ2xpV3JhcHBlcigpXG4gIC5ydW4ocHJvY2Vzcy5hcmd2KVxuICAudGhlbigoKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJUaGFuayB5b3UgZm9yIHVzaW5nIGRlY2FmLXRzJyBjb21tYW5kIGxpbmUgaW50ZXJmYWNlXCIpO1xuICB9KVxuICAuY2F0Y2goKGU6IHVua25vd24pID0+IHtcbiAgICBjb25zb2xlLmVycm9yKGAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IGV9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9KTtcbiJdfQ==
|
package/lib/esm/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/esm/constants.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
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 const CLI_FILE_NAME = "cli-module";
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuaW1wb3J0IHsgQ2xpTW9kdWxlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVGhlIGZpbGVuYW1lIHRoYXQgaWRlbnRpZmllcyBEZWNhZiBDTEkgbW9kdWxlc1xuICogQHN1bW1hcnkgVGhlIHN0YW5kYXJkIGZpbGVuYW1lIGZvciBDTEkgbW9kdWxlIGZpbGVzIHdoZXJlIGVhY2ggbGlicmFyeSBtdXN0IGV4cG9ydCBhIHNpbmdsZSBDbGlNb2R1bGUgZnVuY3Rpb25cbiAqXG4gKiBAY29uc3QgQ0xJX0ZJTEVfTkFNRVxuICogQG1lbWJlck9mIG1vZHVsZTpDTElcbiAqL1xuZXhwb3J0IGNvbnN0IENMSV9GSUxFX05BTUUgPSBcImNsaS1tb2R1bGVcIjtcbiJdfQ==
|
|
@@ -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;
|
|
@@ -1,28 +1,36 @@
|
|
|
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() {
|
|
28
36
|
return new Command()
|
|
@@ -32,4 +40,4 @@ export default function demo() {
|
|
|
32
40
|
console.log(`executed demo command with type variable: ${args}`);
|
|
33
41
|
});
|
|
34
42
|
}
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLW1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZW1vL2NsaS1tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVwQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFDSCxNQUFNLENBQUMsT0FBTyxVQUFVLElBQUk7SUFDMUIsT0FBTyxJQUFJLE9BQU8sRUFBRTtTQUNqQixPQUFPLENBQUMsZ0JBQWdCLENBQUM7U0FDekIsV0FBVyxDQUFDLGdCQUFnQixDQUFDO1NBQzdCLE1BQU0sQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFO1FBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkNBQTZDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVtbyBDTEkgbW9kdWxlIGZvciBEZWNhZiBsaWJyYXJpZXNcbiAqIEBzdW1tYXJ5IEEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiBzaG93aW5nIGhvdyB0byBleHRlbmQgdGhlIERlY2FmIENMSSB3aXRoIGN1c3RvbSBjb21tYW5kcy5cbiAqIFRoaXMgbW9kdWxlIGRlbW9uc3RyYXRlcyB0aGUgcGF0dGVybiBmb3IgY3JlYXRpbmcgQ0xJIG1vZHVsZXMgdGhhdCBjYW4gYmUgZGlzY292ZXJlZCBhbmQgbG9hZGVkIGJ5IHRoZSBEZWNhZiBDTEkuXG4gKlxuICogQHJldHVybiB7Q29tbWFuZH0gVGhlIENvbW1hbmQgb2JqZWN0IHRvIGJlIGFkZGVkIHRvIHRoZSBtYWluIERlY2FmIENMSVxuICpcbiAqIEBmdW5jdGlvbiBkZW1vXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkNMSVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSdW4gdGhlIGRlbW8gY29tbWFuZCB3aXRoIGFuIGFyZ3VtZW50XG4gKiBucHggZGVjYWYgZGVtbyBjb21tYW5kIFwic29tZXRoaW5nIHNvbWV0aGluZ1wiXG4gKlxuICogLy8gT3V0cHV0OlxuICogLy8gZXhlY3V0ZWQgZGVtbyBjb21tYW5kIHdpdGggdHlwZSB2YXJpYWJsZTogc29tZXRoaW5nIHNvbWV0aGluZ1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVXNlclxuICogICBwYXJ0aWNpcGFudCBDTElcbiAqICAgcGFydGljaXBhbnQgRGVtb01vZHVsZVxuICogICBwYXJ0aWNpcGFudCBDb21tYW5kXG4gKlxuICogICBVc2VyLT4+Q0xJOiBucHggZGVjYWYgZGVtbyBjb21tYW5kIFwiYXJnXCJcbiAqICAgQ0xJLT4+RGVtb01vZHVsZTogTG9hZCBtb2R1bGVcbiAqICAgRGVtb01vZHVsZS0+PkNvbW1hbmQ6IENyZWF0ZSBjb21tYW5kXG4gKiAgIENvbW1hbmQtPj5Db21tYW5kOiBDb25maWd1cmUgYWN0aW9uXG4gKiAgIENvbW1hbmQtLT4+RGVtb01vZHVsZTogUmV0dXJuIGNvbW1hbmRcbiAqICAgRGVtb01vZHVsZS0tPj5DTEk6IFJldHVybiBjb21tYW5kXG4gKiAgIENMSS0+PkNvbW1hbmQ6IEV4ZWN1dGUgd2l0aCBhcmdzXG4gKiAgIENvbW1hbmQtPj5Db25zb2xlOiBMb2cgb3V0cHV0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlbW8oKTogQ29tbWFuZCB7XG4gIHJldHVybiBuZXcgQ29tbWFuZCgpXG4gICAgLmNvbW1hbmQoXCJjb21tYW5kIDx0eXBlPlwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkEgZGVtbyBjb21tYW5kXCIpXG4gICAgLmFjdGlvbigoYXJnczogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhgZXhlY3V0ZWQgZGVtbyBjb21tYW5kIHdpdGggdHlwZSB2YXJpYWJsZTogJHthcmdzfWApO1xuICAgIH0pO1xufVxuIl19
|