@decaf-ts/cli 0.3.5 → 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.
@@ -1,10 +1,18 @@
1
1
  import { Command } from "commander";
2
2
  /**
3
- * @summary Util class to handle CLI functionality from all Decaf modules
4
- * @description CLI handler class
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} [basepath] the base path to look for modules in. defaults to `./`
7
- * @param {string} [crawlLevels] folders to crawl to find modules from the basePath. defaults to 4
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 {@link Command} object
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 loads and registers module from a file
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 path to look for modules
26
- * @param {string} rootPath repo root to find the package.json
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 finds all the cli modules in the basePath via {@link CliWrapper.crawl}
34
- * and loads them
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 crawls the basePath up for 'levels' folders to find a module,eg a {@link CLI_FILE_NAME} named file
40
- * @param {string} basePath the relative base batch to start searching in
41
- * @param {number} [levels] the max number of levels to crawl. defaults to 2
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 runs the given command
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
- * @param {string[]} [args] args to run. defaults to process.argv
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
  }
@@ -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
- * @summary Util class to handle CLI functionality from all Decaf modules
8
- * @description CLI handler class
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} [basepath] the base path to look for modules in. defaults to `./`
11
- * @param {string} [crawlLevels] folders to crawl to find modules from the basePath. defaults to 4
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 {@link Command} object
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.basePath);
39
+ CLIUtils.initialize(this._command, this.rootPath);
29
40
  }
30
41
  return this._command;
31
42
  }
32
43
  /**
33
- * @description loads and registers module from a file
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 path to look for modules
36
- * @param {string} rootPath repo root to find the package.json
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, path.dirname(rootPath));
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 finds all the cli modules in the basePath via {@link CliWrapper.crawl}
60
- * and loads them
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.join(process.cwd(), this.basePath);
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, process.cwd());
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 crawls the basePath up for 'levels' folders to find a module,eg a {@link CLI_FILE_NAME} named file
92
- * @param {string} basePath the relative base batch to start searching in
93
- * @param {number} [levels] the max number of levels to crawl. defaults to 2
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 runs the given command
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
- * @param {string[]} [args] args to run. defaults to process.argv
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
@@ -2,15 +2,23 @@
2
2
  * BIN_CALL_PLACEHOLDER - DO NOT REMOVE
3
3
  */
4
4
  /**
5
- * @description Decaf-ts' CLI entry file
6
- * @summary This file will crawl the current working directory for files called {@link CLI_FILE_NAME}
7
- * within the @decaf-ts namespace and load then as subcommands
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
- * run module command - $ npx decaf <module name> <module command> ...<module command options>
11
- * get module help - $ npx decaf help <module name>;
12
- * list imported modules - $ npx decaf list;
13
- * get cli help - $ npx decaf help;
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
  */
@@ -2,19 +2,27 @@
2
2
  * BIN_CALL_PLACEHOLDER - DO NOT REMOVE
3
3
  */
4
4
  /**
5
- * @description Decaf-ts' CLI entry file
6
- * @summary This file will crawl the current working directory for files called {@link CLI_FILE_NAME}
7
- * within the @decaf-ts namespace and load then as subcommands
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
- * run module command - $ npx decaf <module name> <module command> ...<module command options>
11
- * get module help - $ npx decaf help <module name>;
12
- * list imported modules - $ npx decaf list;
13
- * get cli help - $ npx decaf help;
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 "../CliWrapper";
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Jpbi9jbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLElBQUksVUFBVSxFQUFFO0tBQ2IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7S0FDakIsSUFBSSxDQUFDLEdBQUcsRUFBRTtJQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsc0RBQXNELENBQUMsQ0FBQztBQUN0RSxDQUFDLENBQUM7S0FDRCxLQUFLLENBQUMsQ0FBQyxDQUFVLEVBQUUsRUFBRTtJQUNwQixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCSU5fQ0FMTF9QTEFDRUhPTERFUiAtIERPIE5PVCBSRU1PVkVcbiAqL1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjYWYtdHMnIENMSSBlbnRyeSBmaWxlXG4gKiBAc3VtbWFyeSBUaGlzIGZpbGUgd2lsbCBjcmF3bCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgZmlsZXMgY2FsbGVkIHtAbGluayBDTElfRklMRV9OQU1FfVxuICogd2l0aGluIHRoZSBAZGVjYWYtdHMgbmFtZXNwYWNlIGFuZCBsb2FkIHRoZW4gYXMgc3ViY29tbWFuZHNcbiAqXG4gKiBAZXhhbXBsZVxuICogcnVuIG1vZHVsZSBjb21tYW5kICAgICAtICQgbnB4IGRlY2FmIDxtb2R1bGUgbmFtZT4gPG1vZHVsZSBjb21tYW5kPiAuLi48bW9kdWxlIGNvbW1hbmQgb3B0aW9ucz5cbiAqIGdldCBtb2R1bGUgaGVscCAgICAgICAgLSAkIG5weCBkZWNhZiBoZWxwIDxtb2R1bGUgbmFtZT47XG4gKiBsaXN0IGltcG9ydGVkIG1vZHVsZXMgIC0gJCBucHggZGVjYWYgbGlzdDtcbiAqIGdldCBjbGkgaGVscCAgICAgICAgICAgLSAkIG5weCBkZWNhZiBoZWxwO1xuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Q0xJXG4gKi9cblxuaW1wb3J0IHsgQ2xpV3JhcHBlciB9IGZyb20gXCIuLi9DbGlXcmFwcGVyXCI7XG5uZXcgQ2xpV3JhcHBlcigpXG4gIC5ydW4ocHJvY2Vzcy5hcmd2KVxuICAudGhlbigoKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJUaGFuayB5b3UgZm9yIHVzaW5nIGRlY2FmLXRzJyBjb21tYW5kIGxpbmUgaW50ZXJmYWNlXCIpO1xuICB9KVxuICAuY2F0Y2goKGU6IHVua25vd24pID0+IHtcbiAgICBjb25zb2xlLmVycm9yKGAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IGV9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9KTtcbiJdfQ==
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Jpbi9jbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLDJCQUFzQjtBQUMzQyxJQUFJLFVBQVUsRUFBRTtLQUNiLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0tBQ2pCLElBQUksQ0FBQyxHQUFHLEVBQUU7SUFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7QUFDdEUsQ0FBQyxDQUFDO0tBQ0QsS0FBSyxDQUFDLENBQUMsQ0FBVSxFQUFFLEVBQUU7SUFDcEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQklOX0NBTExfUExBQ0VIT0xERVIgLSBETyBOT1QgUkVNT1ZFXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY2FmLXRzJyBDTEkgZW50cnkgcG9pbnRcbiAqIEBzdW1tYXJ5IFRoaXMgZmlsZSBzZXJ2ZXMgYXMgdGhlIG1haW4gZXhlY3V0YWJsZSBlbnRyeSBwb2ludCBmb3IgdGhlIERlY2FmIENMSS4gSXQgY3JlYXRlcyBhIENsaVdyYXBwZXIgaW5zdGFuY2VcbiAqIGFuZCBydW5zIGl0IHdpdGggdGhlIHByb2Nlc3MgYXJndW1lbnRzLiBUaGUgQ0xJIHdpbGwgY3Jhd2wgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIGZpbGVzIGNhbGxlZFxuICogQ0xJX0ZJTEVfTkFNRSB3aXRoaW4gdGhlIEBkZWNhZi10cyBuYW1lc3BhY2UgYW5kIGxvYWQgdGhlbSBhcyBzdWJjb21tYW5kcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUnVuIGEgbW9kdWxlIGNvbW1hbmRcbiAqICQgbnB4IGRlY2FmIDxtb2R1bGUgbmFtZT4gPG1vZHVsZSBjb21tYW5kPiAuLi48bW9kdWxlIGNvbW1hbmQgb3B0aW9ucz5cbiAqIFxuICogLy8gR2V0IGhlbHAgZm9yIGEgc3BlY2lmaWMgbW9kdWxlXG4gKiAkIG5weCBkZWNhZiBoZWxwIDxtb2R1bGUgbmFtZT5cbiAqIFxuICogLy8gTGlzdCBhbGwgaW1wb3J0ZWQgbW9kdWxlc1xuICogJCBucHggZGVjYWYgbGlzdFxuICogXG4gKiAvLyBHZXQgZ2VuZXJhbCBDTEkgaGVscFxuICogJCBucHggZGVjYWYgaGVscFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Q0xJXG4gKi9cblxuaW1wb3J0IHsgQ2xpV3JhcHBlciB9IGZyb20gXCIuLi9DbGlXcmFwcGVyXCI7XG5uZXcgQ2xpV3JhcHBlcigpXG4gIC5ydW4ocHJvY2Vzcy5hcmd2KVxuICAudGhlbigoKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJUaGFuayB5b3UgZm9yIHVzaW5nIGRlY2FmLXRzJyBjb21tYW5kIGxpbmUgaW50ZXJmYWNlXCIpO1xuICB9KVxuICAuY2F0Y2goKGU6IHVua25vd24pID0+IHtcbiAgICBjb25zb2xlLmVycm9yKGAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IGV9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9KTtcbiJdfQ==
@@ -1,8 +1,8 @@
1
1
  /**
2
- * @description The name for decaf cli modules where each library must export
3
- * a single {@link CliModule}
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
- * @constant
6
- * @memberOf module:CLI.cli
5
+ * @const CLI_FILE_NAME
6
+ * @memberOf module:CLI
7
7
  */
8
8
  export declare const CLI_FILE_NAME = "cli-module";
@@ -1,9 +1,9 @@
1
1
  /**
2
- * @description The name for decaf cli modules where each library must export
3
- * a single {@link CliModule}
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
- * @constant
6
- * @memberOf module:CLI.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuaW1wb3J0IHsgQ2xpTW9kdWxlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVGhlIG5hbWUgZm9yIGRlY2FmIGNsaSBtb2R1bGVzIHdoZXJlIGVhY2ggbGlicmFyeSBtdXN0IGV4cG9ydFxuICogYSBzaW5nbGUge0BsaW5rIENsaU1vZHVsZX1cbiAqXG4gKiBAY29uc3RhbnRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Q0xJLmNsaVxuICovXG5leHBvcnQgY29uc3QgQ0xJX0ZJTEVfTkFNRSA9IFwiY2xpLW1vZHVsZVwiO1xuIl19
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuaW1wb3J0IHsgQ2xpTW9kdWxlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVGhlIGZpbGVuYW1lIHRoYXQgaWRlbnRpZmllcyBEZWNhZiBDTEkgbW9kdWxlc1xuICogQHN1bW1hcnkgVGhlIHN0YW5kYXJkIGZpbGVuYW1lIGZvciBDTEkgbW9kdWxlIGZpbGVzIHdoZXJlIGVhY2ggbGlicmFyeSBtdXN0IGV4cG9ydCBhIHNpbmdsZSBDbGlNb2R1bGUgZnVuY3Rpb25cbiAqXG4gKiBAY29uc3QgQ0xJX0ZJTEVfTkFNRVxuICogQG1lbWJlck9mIG1vZHVsZTpDTElcbiAqL1xuZXhwb3J0IGNvbnN0IENMSV9GSUxFX05BTUUgPSBcImNsaS1tb2R1bGVcIjtcbiJdfQ==
@@ -1,27 +1,35 @@
1
1
  import { Command } from "commander";
2
2
  /**
3
- * @description demo CLI module for libraries
4
- * @summary minimal implementation on how to extend the decaf-ts cli
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
- * - the function must be ***exported by default***!;
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
- * `npx decaf demo command "something something" `
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
- * will output `executed demo command with type variable: something something`
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 demo CLI module for libraries
4
- * @summary minimal implementation on how to extend the decaf-ts cli
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
- * - the function must be ***exported by default***!;
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
- * `npx decaf demo command "something something" `
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
- * will output `executed demo command with type variable: something something`
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLW1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZW1vL2NsaS1tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVwQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sVUFBVSxJQUFJO0lBQzFCLE9BQU8sSUFBSSxPQUFPLEVBQUU7U0FDakIsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1NBQ3pCLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQztTQUM3QixNQUFNLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRTtRQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLDZDQUE2QyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIGRlbW8gQ0xJIG1vZHVsZSBmb3IgbGlicmFyaWVzXG4gKiBAc3VtbWFyeSBtaW5pbWFsIGltcGxlbWVudGF0aW9uIG9uIGhvdyB0byBleHRlbmQgdGhlIGRlY2FmLXRzIGNsaVxuICpcbiAqIC0gdGhlIGZ1bmN0aW9uIG11c3QgYmUgKioqZXhwb3J0ZWQgYnkgZGVmYXVsdCoqKiE7XG4gKiAtIFRoZSBuYW1lIG9mIHRoZSByZXR1cm5lZCBmdW5jdGlvbiB3aWxsIGJlIGNvbnNpZGVyZWQgdG8gYmUgdGhlIGJhc2UgY29tbWFuZDtcbiAqIC0gdGhlIGNvbW1hbmQgeW91IHJldHVybiB3aWxsIGJlIGNvbnNpZGVyZWQgYXMgYSBzdWJDb21tYW5kIGFuZCB3aWxsIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHlcbiAqIC0gQ29tbWFuZHMgbXVzdCBiZSB0cmFuc3BpbGVkIHVuZGVyIHRoZSBzYW1lIHRzLWNvbmZpZ3VyYXRpb24gYXMgdGhpcyBtb2R1bGVcbiAqIChzbyBjb3B5IHRoZSB0cy1jb25maWcgb2YgdGhpcyBtb2R1bGUgdG8geW91ciBwcm9qZWN0LiB3ZSBwcm9wb3NlIGB0c2NvbmZpZy5jbGkuanNvbmApXG4gKiAtIEZvbGxvd2luZyB5b3VyIGJ1aWxkIHBpcGVsaW5lIGluY2x1ZGUgYHRzYyAtLXByb2plY3QgdHNjb25maWcuY2xpLmpzb24gLS1vdXREaXIgPGRpc3QgZm9sZGVyPi9jbGlgXG4gKlxuICogTm90ZSB0aGUgZXh0cmEgdXNlIG9mIGBjbGlgIG9uIHRoZSBvdXREaXIgcGFyYW0uIHRoaXMgaXMgbWVhbnQgdG8gY29tcGxldGVseSBzZXBhcmF0ZVxuICogdGhlIGNsaSBjb2RlIGZyb20geW91ciBzb3VyY2UsIGluIGNhc2UgdGhleSBhcmUgdHJhbnNwaWxlZCB1bmRlciBkaWZmZXJlbnQgdHMtY29uZmlndXJhdGlvbnNcbiAqXG4gKiBAcmV0dXJucyB7Q29tbWFuZH0gdGhlIHN1YkNvbW1hbmQgdG8gYmUgYWRkZWQgdG8gdGhlIG1haW4gZGVjYWYgQ0xJXG4gKlxuICogQGZ1bmN0aW9uIGRlbW9cbiAqXG4gKiBAY2F0ZWdvcnkgQ29tbWFuZCBMaW5lIEludGVyZmFjZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgbnB4IGRlY2FmIGRlbW8gY29tbWFuZCBcInNvbWV0aGluZyBzb21ldGhpbmdcIiBgXG4gKlxuICogd2lsbCBvdXRwdXQgYGV4ZWN1dGVkIGRlbW8gY29tbWFuZCB3aXRoIHR5cGUgdmFyaWFibGU6IHNvbWV0aGluZyBzb21ldGhpbmdgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlbW8oKTogQ29tbWFuZCB7XG4gIHJldHVybiBuZXcgQ29tbWFuZCgpXG4gICAgLmNvbW1hbmQoXCJjb21tYW5kIDx0eXBlPlwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkEgZGVtbyBjb21tYW5kXCIpXG4gICAgLmFjdGlvbigoYXJnczogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhgZXhlY3V0ZWQgZGVtbyBjb21tYW5kIHdpdGggdHlwZSB2YXJpYWJsZTogJHthcmdzfWApO1xuICAgIH0pO1xufVxuIl19
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLW1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZW1vL2NsaS1tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVwQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFDSCxNQUFNLENBQUMsT0FBTyxVQUFVLElBQUk7SUFDMUIsT0FBTyxJQUFJLE9BQU8sRUFBRTtTQUNqQixPQUFPLENBQUMsZ0JBQWdCLENBQUM7U0FDekIsV0FBVyxDQUFDLGdCQUFnQixDQUFDO1NBQzdCLE1BQU0sQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFO1FBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkNBQTZDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVtbyBDTEkgbW9kdWxlIGZvciBEZWNhZiBsaWJyYXJpZXNcbiAqIEBzdW1tYXJ5IEEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiBzaG93aW5nIGhvdyB0byBleHRlbmQgdGhlIERlY2FmIENMSSB3aXRoIGN1c3RvbSBjb21tYW5kcy5cbiAqIFRoaXMgbW9kdWxlIGRlbW9uc3RyYXRlcyB0aGUgcGF0dGVybiBmb3IgY3JlYXRpbmcgQ0xJIG1vZHVsZXMgdGhhdCBjYW4gYmUgZGlzY292ZXJlZCBhbmQgbG9hZGVkIGJ5IHRoZSBEZWNhZiBDTEkuXG4gKlxuICogQHJldHVybiB7Q29tbWFuZH0gVGhlIENvbW1hbmQgb2JqZWN0IHRvIGJlIGFkZGVkIHRvIHRoZSBtYWluIERlY2FmIENMSVxuICpcbiAqIEBmdW5jdGlvbiBkZW1vXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkNMSVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSdW4gdGhlIGRlbW8gY29tbWFuZCB3aXRoIGFuIGFyZ3VtZW50XG4gKiBucHggZGVjYWYgZGVtbyBjb21tYW5kIFwic29tZXRoaW5nIHNvbWV0aGluZ1wiXG4gKlxuICogLy8gT3V0cHV0OlxuICogLy8gZXhlY3V0ZWQgZGVtbyBjb21tYW5kIHdpdGggdHlwZSB2YXJpYWJsZTogc29tZXRoaW5nIHNvbWV0aGluZ1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVXNlclxuICogICBwYXJ0aWNpcGFudCBDTElcbiAqICAgcGFydGljaXBhbnQgRGVtb01vZHVsZVxuICogICBwYXJ0aWNpcGFudCBDb21tYW5kXG4gKlxuICogICBVc2VyLT4+Q0xJOiBucHggZGVjYWYgZGVtbyBjb21tYW5kIFwiYXJnXCJcbiAqICAgQ0xJLT4+RGVtb01vZHVsZTogTG9hZCBtb2R1bGVcbiAqICAgRGVtb01vZHVsZS0+PkNvbW1hbmQ6IENyZWF0ZSBjb21tYW5kXG4gKiAgIENvbW1hbmQtPj5Db21tYW5kOiBDb25maWd1cmUgYWN0aW9uXG4gKiAgIENvbW1hbmQtLT4+RGVtb01vZHVsZTogUmV0dXJuIGNvbW1hbmRcbiAqICAgRGVtb01vZHVsZS0tPj5DTEk6IFJldHVybiBjb21tYW5kXG4gKiAgIENMSS0+PkNvbW1hbmQ6IEV4ZWN1dGUgd2l0aCBhcmdzXG4gKiAgIENvbW1hbmQtPj5Db25zb2xlOiBMb2cgb3V0cHV0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlbW8oKTogQ29tbWFuZCB7XG4gIHJldHVybiBuZXcgQ29tbWFuZCgpXG4gICAgLmNvbW1hbmQoXCJjb21tYW5kIDx0eXBlPlwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkEgZGVtbyBjb21tYW5kXCIpXG4gICAgLmFjdGlvbigoYXJnczogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhgZXhlY3V0ZWQgZGVtbyBjb21tYW5kIHdpdGggdHlwZSB2YXJpYWJsZTogJHthcmdzfWApO1xuICAgIH0pO1xufVxuIl19