@decaf-ts/cli 0.3.5 → 0.3.7

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