@decaf-ts/cli 0.3.7 → 0.3.9

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.
Files changed (45) hide show
  1. package/README.md +23 -3
  2. package/dist/cli.cjs +2 -326
  3. package/dist/cli.cjs.map +1 -0
  4. package/dist/cli.js +2 -0
  5. package/dist/cli.js.map +1 -0
  6. package/lib/CliWrapper.cjs +107 -2
  7. package/lib/CliWrapper.d.ts +3 -0
  8. package/lib/CliWrapper.js.map +1 -0
  9. package/lib/bin/cli.cjs +1 -1
  10. package/lib/bin/cli.js.map +1 -0
  11. package/lib/constants.cjs +1 -1
  12. package/lib/constants.js.map +1 -0
  13. package/lib/demo/cli-module.cjs +1 -1
  14. package/lib/demo/cli-module.js.map +1 -0
  15. package/lib/esm/CliWrapper.d.ts +3 -0
  16. package/lib/esm/CliWrapper.js +107 -2
  17. package/lib/esm/CliWrapper.js.map +1 -0
  18. package/lib/esm/bin/cli.js +1 -1
  19. package/lib/esm/bin/cli.js.map +1 -0
  20. package/lib/esm/constants.js +1 -1
  21. package/lib/esm/constants.js.map +1 -0
  22. package/lib/esm/demo/cli-module.js +1 -1
  23. package/lib/esm/demo/cli-module.js.map +1 -0
  24. package/lib/esm/index.d.ts +0 -7
  25. package/lib/esm/index.js +1 -8
  26. package/lib/esm/index.js.map +1 -0
  27. package/lib/esm/types.js +1 -1
  28. package/lib/esm/types.js.map +1 -0
  29. package/lib/esm/utils.js +1 -1
  30. package/lib/esm/utils.js.map +1 -0
  31. package/lib/esm/version.d.ts +14 -0
  32. package/lib/esm/version.js +17 -0
  33. package/lib/esm/version.js.map +1 -0
  34. package/lib/index.cjs +1 -9
  35. package/lib/index.d.ts +0 -7
  36. package/lib/index.js.map +1 -0
  37. package/lib/types.cjs +1 -1
  38. package/lib/types.js.map +1 -0
  39. package/lib/utils.cjs +1 -1
  40. package/lib/utils.js.map +1 -0
  41. package/lib/version.cjs +20 -0
  42. package/lib/version.d.ts +14 -0
  43. package/lib/version.js.map +1 -0
  44. package/package.json +17 -23
  45. package/dist/cli.esm.cjs +0 -321
package/README.md CHANGED
@@ -1,10 +1,9 @@
1
- ![Banner](./workdocs/assets/Banner.png)
1
+ ![Banner](./workdocs/assets/decaf-logo.svg)
2
2
 
3
3
  ## Decaf-ts CLI
4
4
 
5
5
  A modular command-line interface framework for Decaf-ts that dynamically discovers and loads CLI modules from different packages. The CLI provides a unified entry point (`decaf`) for executing commands from various Decaf modules, making it easy to extend with new functionality without modifying the core CLI code.
6
6
 
7
-
8
7
  ![Licence](https://img.shields.io/github/license/decaf-ts/cli.svg?style=plastic)
9
8
  ![GitHub language count](https://img.shields.io/github/languages/count/decaf-ts/cli?style=plastic)
10
9
  ![GitHub top language](https://img.shields.io/github/languages/top/decaf-ts/cli?style=plastic)
@@ -34,6 +33,9 @@ A modular command-line interface framework for Decaf-ts that dynamically discove
34
33
 
35
34
  Documentation available [here](https://decaf-ts.github.io/cli/)
36
35
 
36
+ Minimal size: 1.6 KB kb gzipped
37
+
38
+
37
39
  ### Description
38
40
 
39
41
  The Decaf-ts CLI is a powerful and extensible command-line interface framework designed to provide a unified entry point for all Decaf-ts modules. It enables developers to create modular CLI commands that can be discovered and executed through a single command-line tool.
@@ -200,6 +202,24 @@ npx decaf demo command "hello world"
200
202
  ```
201
203
 
202
204
 
205
+ ## Coding Principles
206
+
207
+ - group similar functionality in folders (analog to namespaces but without any namespace declaration)
208
+ - one class per file;
209
+ - one interface per file (unless interface is just used as a type);
210
+ - group types as other interfaces in a types.ts file per folder;
211
+ - group constants or enums in a constants.ts file per folder;
212
+ - group decorators in a decorators.ts file per folder;
213
+ - always import from the specific file, never from a folder or index file (exceptions for dependencies on other packages);
214
+ - prefer the usage of established design patters where applicable:
215
+ - Singleton (can be an anti-pattern. use with care);
216
+ - factory;
217
+ - observer;
218
+ - strategy;
219
+ - builder;
220
+ - etc;
221
+
222
+
203
223
  ### Related
204
224
 
205
225
  [![decaf-ts](https://github-readme-stats.vercel.app/api/pin/?username=decaf-ts&repo=decaf-ts)](https://github.com/decaf-ts/decaf-ts)
@@ -244,4 +264,4 @@ So if you can, if this project in any way. either by learning something or simpl
244
264
 
245
265
  This project is released under the [MIT License](./LICENSE.md).
246
266
 
247
- By developers, for developers...
267
+ By developers, for developers...
package/dist/cli.cjs CHANGED
@@ -1,326 +1,2 @@
1
- (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('commander'), require('fs'), require('path')) :
3
- typeof define === 'function' && define.amd ? define(['exports', 'commander', 'fs', 'path'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.cli = {}, global.commander, global.fs, global.path));
5
- })(this, (function (exports, commander, fs, path) { 'use strict';
6
-
7
- /**
8
- * @description The filename that identifies Decaf CLI modules
9
- * @summary The standard filename for CLI module files where each library must export a single CliModule function
10
- *
11
- * @const CLI_FILE_NAME
12
- * @memberOf module:CLI
13
- */
14
- const CLI_FILE_NAME = "cli-module";
15
-
16
- /**
17
- * @description Utility class for CLI operations
18
- * @summary A static utility class that provides methods for loading modules, retrieving package information, and initializing CLI commands
19
- *
20
- * @example
21
- * // Initialize a Command object with package information
22
- * const command = new Command();
23
- * CLIUtils.initialize(command, './path/to/package');
24
- *
25
- * // Load a CLI module from a file
26
- * const module = await CLIUtils.loadFromFile('./path/to/cli-module.js');
27
- *
28
- * @class CLIUtils
29
- */
30
- class CLIUtils {
31
- /**
32
- * @description Dynamically imports a module file
33
- * @summary Loads a JavaScript file and returns it as a CliModule, handling both ESM and CommonJS formats
34
- *
35
- * @param {string} path The file path to the module to load
36
- * @return {Promise<CliModule>} A promise that resolves to the loaded CliModule
37
- */
38
- static async loadFromFile(path) {
39
- try {
40
- return CLIUtils.normalizeImport(import(path));
41
- }
42
- catch (e) {
43
- throw new Error(`Failed to load from ${path}: ${e instanceof Error ? e.message : e}`);
44
- }
45
- }
46
- /**
47
- * @description Normalizes module imports to handle both ESM and CommonJS formats
48
- * @summary Properly imports JavaScript files regardless of their module format by handling the ESM wrapper for CommonJS modules
49
- *
50
- * @template T The type of the imported module
51
- * @param {Promise<T>} importPromise The promise returned by the dynamic import
52
- * @return {Promise<T>} A promise that resolves to the normalized module
53
- * @private
54
- */
55
- static async normalizeImport(importPromise) {
56
- // CommonJS's `module.exports` is wrapped as `default` in ESModule.
57
- return importPromise.then((m) => (m.default || m));
58
- }
59
- /**
60
- * @description Initializes a Command object with package information
61
- * @summary Sets up a Commander Command object with the package name, description, and version from the package.json file
62
- *
63
- * @param {Command} command The Command object to initialize
64
- * @param {string} [basePath] The base path where the package.json file is located, defaults to the current working directory
65
- * @return {void}
66
- */
67
- static initialize(command, basePath) {
68
- const name = CLIUtils.packageName(basePath);
69
- command
70
- .name(name)
71
- .description(`Runs ${name} related commands`)
72
- .version(CLIUtils.packageVersion(basePath));
73
- }
74
- /**
75
- * @description Retrieves and parses the package.json file
76
- * @summary Reads the package.json file from the specified path and parses it into a JavaScript object
77
- *
78
- * @param {string} basePath The base path where the package.json file is located
79
- * @return {Record<string, unknown>} The parsed package.json content as an object
80
- * @private
81
- */
82
- static getPackage(basePath) {
83
- try {
84
- return JSON.parse(fs.readFileSync(path.join(basePath, "package.json"), "utf8"));
85
- }
86
- catch (e) {
87
- throw new Error(`Unable to read version from ${basePath}: ${e}`);
88
- }
89
- }
90
- /**
91
- * @description Returns the version from package.json
92
- * @summary Retrieves the version field from the package.json file at the specified path
93
- *
94
- * @param {string} basePath The base path where the package.json file is located
95
- * @return {string} The package version string
96
- */
97
- static packageVersion(basePath) {
98
- return CLIUtils.getPackage(basePath)["version"];
99
- }
100
- /**
101
- * @description Returns the name from package.json
102
- * @summary Retrieves the name field from the package.json file at the specified path and extracts the package name without the scope
103
- *
104
- * @param {string} basePath The base path where the package.json file is located
105
- * @return {string} The package name without the scope (e.g., "cli" from "@decaf-ts/cli")
106
- */
107
- static packageName(basePath) {
108
- const name = CLIUtils.getPackage(basePath)["name"].split("/");
109
- return name[name.length - 1];
110
- }
111
- }
112
-
113
- /**
114
- * @description Utility class to handle CLI functionality from all Decaf modules
115
- * @summary This class provides a wrapper around Commander.js to handle CLI commands from different Decaf modules.
116
- * It crawls the filesystem to find CLI modules, loads them, and registers their commands.
117
- *
118
- * @param {string} [basePath] The base path to look for modules in. Defaults to `./`
119
- * @param {number} [crawlLevels] Number of folder levels to crawl to find modules from the basePath. Defaults to 4
120
- *
121
- * @example
122
- * // Create a new CLI wrapper and run it with custom options
123
- * const cli = new CliWrapper('./src', 2);
124
- * cli.run(process.argv).then(() => {
125
- * console.log('CLI commands executed successfully');
126
- * });
127
- *
128
- * @class CliWrapper
129
- */
130
- class CliWrapper {
131
- constructor(basePath = "./", crawlLevels = 4) {
132
- this.basePath = basePath;
133
- this.crawlLevels = crawlLevels;
134
- this.modules = {};
135
- this.rootPath = path.resolve(__dirname, "..");
136
- }
137
- /**
138
- * @description Retrieves and initializes the Commander Command object
139
- * @summary Lazy-loads the Command object, initializing it with the package name, description, and version
140
- * @return {Command} The initialized Command object
141
- * @private
142
- */
143
- get command() {
144
- if (!this._command) {
145
- this._command = new commander.Command();
146
- CLIUtils.initialize(this._command, this.rootPath);
147
- }
148
- return this._command;
149
- }
150
- /**
151
- * @description Loads and registers a module from a file
152
- * @summary Dynamically imports a CLI module from the specified file path, initializes it, and registers it in the modules collection
153
- *
154
- * @param {string} filePath Path to the module file to load
155
- * @param {string} rootPath Repository root path to find the package.json
156
- * @return {Promise<string>} A promise that resolves to the module name
157
- *
158
- * @private
159
- * @mermaid
160
- * sequenceDiagram
161
- * participant CliWrapper
162
- * participant CLIUtils
163
- * participant Module
164
- *
165
- * CliWrapper->>CLIUtils: loadFromFile(filePath)
166
- * CLIUtils-->>CliWrapper: module
167
- * CliWrapper->>CliWrapper: Get module name
168
- * CliWrapper->>Command: new Command()
169
- * Command-->>CliWrapper: cmd
170
- * CliWrapper->>CLIUtils: initialize(cmd, path.dirname(rootPath))
171
- * CliWrapper->>Module: module()
172
- * Note over CliWrapper,Module: Handle Promise if needed
173
- * Module-->>CliWrapper: Command instance
174
- * CliWrapper->>CliWrapper: Store in modules[name]
175
- * CliWrapper-->>CliWrapper: Return name
176
- */
177
- async load(filePath, rootPath) {
178
- let name;
179
- try {
180
- const module = await CLIUtils.loadFromFile(filePath);
181
- name = module.name;
182
- const cmd = new commander.Command();
183
- CLIUtils.initialize(cmd, rootPath);
184
- let m = module();
185
- if (m instanceof Promise)
186
- m = await m;
187
- this.modules[name] = m;
188
- }
189
- catch (e) {
190
- throw new Error(`failed to load module ${name || "unnamed"} under ${filePath}: ${e instanceof Error ? e.message : e}`);
191
- }
192
- return name;
193
- }
194
- /**
195
- * @description Finds and loads all CLI modules in the basePath
196
- * @summary Uses the crawl method to find all CLI modules in the specified base path,
197
- * then loads and registers each module as a subcommand
198
- *
199
- * @return {Promise<void>} A promise that resolves when all modules are loaded
200
- *
201
- * @private
202
- * @mermaid
203
- * sequenceDiagram
204
- * participant CliWrapper
205
- * participant Filesystem
206
- * participant Module
207
- *
208
- * CliWrapper->>Filesystem: Join basePath with cwd
209
- * CliWrapper->>CliWrapper: crawl(basePath, crawlLevels)
210
- * CliWrapper-->>CliWrapper: modules[]
211
- * loop For each module
212
- * alt Not @decaf-ts/cli
213
- * CliWrapper->>CliWrapper: load(module, cwd)
214
- * CliWrapper-->>CliWrapper: name
215
- * CliWrapper->>CliWrapper: Check if command exists
216
- * alt Command doesn't exist
217
- * CliWrapper->>Command: command(name).addCommand(modules[name])
218
- * end
219
- * end
220
- * end
221
- * CliWrapper->>Console: Log loaded modules
222
- */
223
- async boot() {
224
- const basePath = path.resolve(this.rootPath, this.basePath);
225
- const modules = this.crawl(basePath, this.crawlLevels);
226
- for (const module of modules) {
227
- if (module.includes("@decaf-ts/cli")) {
228
- continue;
229
- }
230
- let name;
231
- try {
232
- name = await this.load(module, this.rootPath);
233
- }
234
- catch (e) {
235
- console.error(e);
236
- continue;
237
- }
238
- if (!this.command.commands.find((c) => c["_name"] === name))
239
- try {
240
- this.command.command(name).addCommand(this.modules[name]);
241
- }
242
- catch (e) {
243
- console.error(e);
244
- }
245
- }
246
- console.log(`loaded modules:\n${Object.keys(this.modules)
247
- .map((k) => `- ${k}`)
248
- .join("\n")}`);
249
- }
250
- /**
251
- * @description Recursively searches for CLI module files in the directory structure
252
- * @summary Crawls the basePath up to the specified number of folder levels to find files named according to CLI_FILE_NAME
253
- *
254
- * @param {string} basePath The absolute base path to start searching in
255
- * @param {number} [levels=2] The maximum number of directory levels to crawl
256
- * @return {string[]} An array of file paths to CLI modules
257
- *
258
- * @private
259
- */
260
- crawl(basePath, levels = 2) {
261
- if (levels <= 0)
262
- return [];
263
- return fs.readdirSync(basePath).reduce((accum, file) => {
264
- file = path.join(basePath, file);
265
- if (fs.statSync(file).isDirectory()) {
266
- accum.push(...this.crawl(file, levels - 1));
267
- }
268
- else if (file.match(new RegExp(`${CLI_FILE_NAME}.[cm]?js$`, "gm"))) {
269
- accum.push(file);
270
- }
271
- return accum;
272
- }, []);
273
- }
274
- /**
275
- * @description Executes the CLI with the provided arguments
276
- * @summary Boots the CLI by loading all modules, then parses and executes the command specified in the arguments
277
- *
278
- * @param {string[]} [args=process.argv] Command line arguments to parse and execute
279
- * @return {Promise<void>} A promise that resolves when the command execution is complete
280
- *
281
- * @mermaid
282
- * sequenceDiagram
283
- * participant Client
284
- * participant CliWrapper
285
- * participant Command
286
- *
287
- * Client->>CliWrapper: run(args)
288
- * CliWrapper->>CliWrapper: boot()
289
- * Note over CliWrapper: Loads all modules
290
- * CliWrapper->>Command: parseAsync(args)
291
- * Command-->>CliWrapper: result
292
- * CliWrapper-->>Client: result
293
- */
294
- async run(args = process.argv) {
295
- await this.boot();
296
- return this.command.parseAsync(args);
297
- }
298
- }
299
-
300
- /**
301
- * @description Decaf-ts' CLI module
302
- * @summary This file will crawl the current working directory for files called {@link CLI_FILE_NAME}
303
- * within the @decaf-ts namespace and load them as subcommands. It serves as the main entry point
304
- * for the CLI functionality, exporting the CliWrapper class and VERSION constant.
305
- *
306
- * @example
307
- * run module command - $ npx decaf <module name> <module command> ...<module command options>
308
- * get module help - $ npx decaf help <module name>;
309
- * list imported modules - $ npx decaf list;
310
- * get cli help - $ npx decaf help;
311
- *
312
- * @module CLI
313
- */
314
- /**
315
- * @description Stores the current package version
316
- * @summary A constant that holds the version string of the package, which is replaced during build
317
- * @const VERSION
318
- * @memberOf module:CLI
319
- */
320
- const VERSION = "0.3.6";
321
-
322
- exports.CliWrapper = CliWrapper;
323
- exports.VERSION = VERSION;
324
-
325
- }));
326
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9DbGlXcmFwcGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmltcG9ydCB7IENsaU1vZHVsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRoZSBmaWxlbmFtZSB0aGF0IGlkZW50aWZpZXMgRGVjYWYgQ0xJIG1vZHVsZXNcbiAqIEBzdW1tYXJ5IFRoZSBzdGFuZGFyZCBmaWxlbmFtZSBmb3IgQ0xJIG1vZHVsZSBmaWxlcyB3aGVyZSBlYWNoIGxpYnJhcnkgbXVzdCBleHBvcnQgYSBzaW5nbGUgQ2xpTW9kdWxlIGZ1bmN0aW9uXG4gKlxuICogQGNvbnN0IENMSV9GSUxFX05BTUVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Q0xJXG4gKi9cbmV4cG9ydCBjb25zdCBDTElfRklMRV9OQU1FID0gXCJjbGktbW9kdWxlXCI7XG4iLCJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IENsaU1vZHVsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFV0aWxpdHkgY2xhc3MgZm9yIENMSSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBBIHN0YXRpYyB1dGlsaXR5IGNsYXNzIHRoYXQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgbG9hZGluZyBtb2R1bGVzLCByZXRyaWV2aW5nIHBhY2thZ2UgaW5mb3JtYXRpb24sIGFuZCBpbml0aWFsaXppbmcgQ0xJIGNvbW1hbmRzXG4gKiBcbiAqIEBleGFtcGxlXG4gKiAvLyBJbml0aWFsaXplIGEgQ29tbWFuZCBvYmplY3Qgd2l0aCBwYWNrYWdlIGluZm9ybWF0aW9uXG4gKiBjb25zdCBjb21tYW5kID0gbmV3IENvbW1hbmQoKTtcbiAqIENMSVV0aWxzLmluaXRpYWxpemUoY29tbWFuZCwgJy4vcGF0aC90by9wYWNrYWdlJyk7XG4gKiBcbiAqIC8vIExvYWQgYSBDTEkgbW9kdWxlIGZyb20gYSBmaWxlXG4gKiBjb25zdCBtb2R1bGUgPSBhd2FpdCBDTElVdGlscy5sb2FkRnJvbUZpbGUoJy4vcGF0aC90by9jbGktbW9kdWxlLmpzJyk7XG4gKiBcbiAqIEBjbGFzcyBDTElVdGlsc1xuICovXG5leHBvcnQgY2xhc3MgQ0xJVXRpbHMge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIER5bmFtaWNhbGx5IGltcG9ydHMgYSBtb2R1bGUgZmlsZVxuICAgKiBAc3VtbWFyeSBMb2FkcyBhIEphdmFTY3JpcHQgZmlsZSBhbmQgcmV0dXJucyBpdCBhcyBhIENsaU1vZHVsZSwgaGFuZGxpbmcgYm90aCBFU00gYW5kIENvbW1vbkpTIGZvcm1hdHNcbiAgICogXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBmaWxlIHBhdGggdG8gdGhlIG1vZHVsZSB0byBsb2FkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q2xpTW9kdWxlPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGxvYWRlZCBDbGlNb2R1bGVcbiAgICovXG4gIHN0YXRpYyBhc3luYyBsb2FkRnJvbUZpbGUocGF0aDogc3RyaW5nKTogUHJvbWlzZTxDbGlNb2R1bGU+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIENMSVV0aWxzLm5vcm1hbGl6ZUltcG9ydChpbXBvcnQocGF0aCkpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBsb2FkIGZyb20gJHtwYXRofTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBlfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3JtYWxpemVzIG1vZHVsZSBpbXBvcnRzIHRvIGhhbmRsZSBib3RoIEVTTSBhbmQgQ29tbW9uSlMgZm9ybWF0c1xuICAgKiBAc3VtbWFyeSBQcm9wZXJseSBpbXBvcnRzIEphdmFTY3JpcHQgZmlsZXMgcmVnYXJkbGVzcyBvZiB0aGVpciBtb2R1bGUgZm9ybWF0IGJ5IGhhbmRsaW5nIHRoZSBFU00gd3JhcHBlciBmb3IgQ29tbW9uSlMgbW9kdWxlc1xuICAgKlxuICAgKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgaW1wb3J0ZWQgbW9kdWxlXG4gICAqIEBwYXJhbSB7UHJvbWlzZTxUPn0gaW1wb3J0UHJvbWlzZSBUaGUgcHJvbWlzZSByZXR1cm5lZCBieSB0aGUgZHluYW1pYyBpbXBvcnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxUPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5vcm1hbGl6ZWQgbW9kdWxlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgbm9ybWFsaXplSW1wb3J0PFQ+KGltcG9ydFByb21pc2U6IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAvLyBDb21tb25KUydzIGBtb2R1bGUuZXhwb3J0c2AgaXMgd3JhcHBlZCBhcyBgZGVmYXVsdGAgaW4gRVNNb2R1bGUuXG4gICAgcmV0dXJuIGltcG9ydFByb21pc2UudGhlbihcbiAgICAgIChtOiB1bmtub3duKSA9PiAoKG0gYXMgeyBkZWZhdWx0OiBUIH0pLmRlZmF1bHQgfHwgbSkgYXMgVFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIGEgQ29tbWFuZCBvYmplY3Qgd2l0aCBwYWNrYWdlIGluZm9ybWF0aW9uXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgYSBDb21tYW5kZXIgQ29tbWFuZCBvYmplY3Qgd2l0aCB0aGUgcGFja2FnZSBuYW1lLCBkZXNjcmlwdGlvbiwgYW5kIHZlcnNpb24gZnJvbSB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjb21tYW5kIFRoZSBDb21tYW5kIG9iamVjdCB0byBpbml0aWFsaXplXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYmFzZVBhdGhdIFRoZSBiYXNlIHBhdGggd2hlcmUgdGhlIHBhY2thZ2UuanNvbiBmaWxlIGlzIGxvY2F0ZWQsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgaW5pdGlhbGl6ZShjb21tYW5kOiBDb21tYW5kLCBiYXNlUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgbmFtZSA9IENMSVV0aWxzLnBhY2thZ2VOYW1lKGJhc2VQYXRoKTtcbiAgICBjb21tYW5kXG4gICAgICAubmFtZShuYW1lKVxuICAgICAgLmRlc2NyaXB0aW9uKGBSdW5zICR7bmFtZX0gcmVsYXRlZCBjb21tYW5kc2ApXG4gICAgICAudmVyc2lvbihDTElVdGlscy5wYWNrYWdlVmVyc2lvbihiYXNlUGF0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYW5kIHBhcnNlcyB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIHBhY2thZ2UuanNvbiBmaWxlIGZyb20gdGhlIHNwZWNpZmllZCBwYXRoIGFuZCBwYXJzZXMgaXQgaW50byBhIEphdmFTY3JpcHQgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYmFzZSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBUaGUgcGFyc2VkIHBhY2thZ2UuanNvbiBjb250ZW50IGFzIGFuIG9iamVjdFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UGFja2FnZShiYXNlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihiYXNlUGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmOFwiKVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZWFkIHZlcnNpb24gZnJvbSAke2Jhc2VQYXRofTogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvblxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIHZlcnNpb24gZmllbGQgZnJvbSB0aGUgcGFja2FnZS5qc29uIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYmFzZSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhY2thZ2UgdmVyc2lvbiBzdHJpbmdcbiAgICovXG4gIHN0YXRpYyBwYWNrYWdlVmVyc2lvbihiYXNlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQ0xJVXRpbHMuZ2V0UGFja2FnZShiYXNlUGF0aClbXCJ2ZXJzaW9uXCJdIGFzIHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgbmFtZSBmcm9tIHBhY2thZ2UuanNvblxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIG5hbWUgZmllbGQgZnJvbSB0aGUgcGFja2FnZS5qc29uIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoIGFuZCBleHRyYWN0cyB0aGUgcGFja2FnZSBuYW1lIHdpdGhvdXQgdGhlIHNjb3BlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYmFzZSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhY2thZ2UgbmFtZSB3aXRob3V0IHRoZSBzY29wZSAoZS5nLiwgXCJjbGlcIiBmcm9tIFwiQGRlY2FmLXRzL2NsaVwiKVxuICAgKi9cbiAgc3RhdGljIHBhY2thZ2VOYW1lKGJhc2VQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSAoQ0xJVXRpbHMuZ2V0UGFja2FnZShiYXNlUGF0aClbXCJuYW1lXCJdIGFzIHN0cmluZykuc3BsaXQoXCIvXCIpO1xuICAgIHJldHVybiBuYW1lW25hbWUubGVuZ3RoIC0gMV07XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgQ0xJX0ZJTEVfTkFNRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ0xJVXRpbHMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBVdGlsaXR5IGNsYXNzIHRvIGhhbmRsZSBDTEkgZnVuY3Rpb25hbGl0eSBmcm9tIGFsbCBEZWNhZiBtb2R1bGVzXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgd3JhcHBlciBhcm91bmQgQ29tbWFuZGVyLmpzIHRvIGhhbmRsZSBDTEkgY29tbWFuZHMgZnJvbSBkaWZmZXJlbnQgRGVjYWYgbW9kdWxlcy5cbiAqIEl0IGNyYXdscyB0aGUgZmlsZXN5c3RlbSB0byBmaW5kIENMSSBtb2R1bGVzLCBsb2FkcyB0aGVtLCBhbmQgcmVnaXN0ZXJzIHRoZWlyIGNvbW1hbmRzLlxuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VQYXRoXSBUaGUgYmFzZSBwYXRoIHRvIGxvb2sgZm9yIG1vZHVsZXMgaW4uIERlZmF1bHRzIHRvIGAuL2BcbiAqIEBwYXJhbSB7bnVtYmVyfSBbY3Jhd2xMZXZlbHNdIE51bWJlciBvZiBmb2xkZXIgbGV2ZWxzIHRvIGNyYXdsIHRvIGZpbmQgbW9kdWxlcyBmcm9tIHRoZSBiYXNlUGF0aC4gRGVmYXVsdHMgdG8gNFxuICogXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgbmV3IENMSSB3cmFwcGVyIGFuZCBydW4gaXQgd2l0aCBjdXN0b20gb3B0aW9uc1xuICogY29uc3QgY2xpID0gbmV3IENsaVdyYXBwZXIoJy4vc3JjJywgMik7XG4gKiBjbGkucnVuKHByb2Nlc3MuYXJndikudGhlbigoKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKCdDTEkgY29tbWFuZHMgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gKiB9KTtcbiAqIFxuICogQGNsYXNzIENsaVdyYXBwZXJcbiAqL1xuZXhwb3J0IGNsYXNzIENsaVdyYXBwZXIge1xuICBwcml2YXRlIF9jb21tYW5kPzogQ29tbWFuZDtcbiAgcHJpdmF0ZSBtb2R1bGVzOiBSZWNvcmQ8c3RyaW5nLCBDb21tYW5kPiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3RQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiYXNlUGF0aDogc3RyaW5nID0gXCIuL1wiLFxuICAgIHByaXZhdGUgY3Jhd2xMZXZlbHMgPSA0XG4gICkge1xuICAgIHRoaXMucm9vdFBhdGggPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcIi4uXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYW5kIGluaXRpYWxpemVzIHRoZSBDb21tYW5kZXIgQ29tbWFuZCBvYmplY3RcbiAgICogQHN1bW1hcnkgTGF6eS1sb2FkcyB0aGUgQ29tbWFuZCBvYmplY3QsIGluaXRpYWxpemluZyBpdCB3aXRoIHRoZSBwYWNrYWdlIG5hbWUsIGRlc2NyaXB0aW9uLCBhbmQgdmVyc2lvblxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBUaGUgaW5pdGlhbGl6ZWQgQ29tbWFuZCBvYmplY3RcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0IGNvbW1hbmQoKSB7XG4gICAgaWYgKCF0aGlzLl9jb21tYW5kKSB7XG4gICAgICB0aGlzLl9jb21tYW5kID0gbmV3IENvbW1hbmQoKTtcbiAgICAgIENMSVV0aWxzLmluaXRpYWxpemUodGhpcy5fY29tbWFuZCwgdGhpcy5yb290UGF0aCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb21tYW5kO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2FkcyBhbmQgcmVnaXN0ZXJzIGEgbW9kdWxlIGZyb20gYSBmaWxlXG4gICAqIEBzdW1tYXJ5IER5bmFtaWNhbGx5IGltcG9ydHMgYSBDTEkgbW9kdWxlIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlIHBhdGgsIGluaXRpYWxpemVzIGl0LCBhbmQgcmVnaXN0ZXJzIGl0IGluIHRoZSBtb2R1bGVzIGNvbGxlY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoIFBhdGggdG8gdGhlIG1vZHVsZSBmaWxlIHRvIGxvYWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJvb3RQYXRoIFJlcG9zaXRvcnkgcm9vdCBwYXRoIHRvIGZpbmQgdGhlIHBhY2thZ2UuanNvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBtb2R1bGUgbmFtZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGlXcmFwcGVyXG4gICAqICAgcGFydGljaXBhbnQgQ0xJVXRpbHNcbiAgICogICBwYXJ0aWNpcGFudCBNb2R1bGVcbiAgICogICBcbiAgICogICBDbGlXcmFwcGVyLT4+Q0xJVXRpbHM6IGxvYWRGcm9tRmlsZShmaWxlUGF0aClcbiAgICogICBDTElVdGlscy0tPj5DbGlXcmFwcGVyOiBtb2R1bGVcbiAgICogICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogR2V0IG1vZHVsZSBuYW1lXG4gICAqICAgQ2xpV3JhcHBlci0+PkNvbW1hbmQ6IG5ldyBDb21tYW5kKClcbiAgICogICBDb21tYW5kLS0+PkNsaVdyYXBwZXI6IGNtZFxuICAgKiAgIENsaVdyYXBwZXItPj5DTElVdGlsczogaW5pdGlhbGl6ZShjbWQsIHBhdGguZGlybmFtZShyb290UGF0aCkpXG4gICAqICAgQ2xpV3JhcHBlci0+Pk1vZHVsZTogbW9kdWxlKClcbiAgICogICBOb3RlIG92ZXIgQ2xpV3JhcHBlcixNb2R1bGU6IEhhbmRsZSBQcm9taXNlIGlmIG5lZWRlZFxuICAgKiAgIE1vZHVsZS0tPj5DbGlXcmFwcGVyOiBDb21tYW5kIGluc3RhbmNlXG4gICAqICAgQ2xpV3JhcHBlci0+PkNsaVdyYXBwZXI6IFN0b3JlIGluIG1vZHVsZXNbbmFtZV1cbiAgICogICBDbGlXcmFwcGVyLS0+PkNsaVdyYXBwZXI6IFJldHVybiBuYW1lXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWQoZmlsZVBhdGg6IHN0cmluZywgcm9vdFBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IG5hbWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IENMSVV0aWxzLmxvYWRGcm9tRmlsZShmaWxlUGF0aCk7XG4gICAgICBuYW1lID0gbW9kdWxlLm5hbWU7XG4gICAgICBjb25zdCBjbWQgPSBuZXcgQ29tbWFuZCgpO1xuICAgICAgQ0xJVXRpbHMuaW5pdGlhbGl6ZShjbWQsIHJvb3RQYXRoKTtcbiAgICAgIGxldCBtID0gbW9kdWxlKCk7XG4gICAgICBpZiAobSBpbnN0YW5jZW9mIFByb21pc2UpIG0gPSBhd2FpdCBtO1xuICAgICAgdGhpcy5tb2R1bGVzW25hbWVdID0gbTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBmYWlsZWQgdG8gbG9hZCBtb2R1bGUgJHtuYW1lIHx8IFwidW5uYW1lZFwifSB1bmRlciAke2ZpbGVQYXRofTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaW5kcyBhbmQgbG9hZHMgYWxsIENMSSBtb2R1bGVzIGluIHRoZSBiYXNlUGF0aFxuICAgKiBAc3VtbWFyeSBVc2VzIHRoZSBjcmF3bCBtZXRob2QgdG8gZmluZCBhbGwgQ0xJIG1vZHVsZXMgaW4gdGhlIHNwZWNpZmllZCBiYXNlIHBhdGgsIFxuICAgKiB0aGVuIGxvYWRzIGFuZCByZWdpc3RlcnMgZWFjaCBtb2R1bGUgYXMgYSBzdWJjb21tYW5kXG4gICAqIFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBtb2R1bGVzIGFyZSBsb2FkZWRcbiAgICogXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaVdyYXBwZXJcbiAgICogICBwYXJ0aWNpcGFudCBGaWxlc3lzdGVtXG4gICAqICAgcGFydGljaXBhbnQgTW9kdWxlXG4gICAqICAgXG4gICAqICAgQ2xpV3JhcHBlci0+PkZpbGVzeXN0ZW06IEpvaW4gYmFzZVBhdGggd2l0aCBjd2RcbiAgICogICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogY3Jhd2woYmFzZVBhdGgsIGNyYXdsTGV2ZWxzKVxuICAgKiAgIENsaVdyYXBwZXItLT4+Q2xpV3JhcHBlcjogbW9kdWxlc1tdXG4gICAqICAgbG9vcCBGb3IgZWFjaCBtb2R1bGVcbiAgICogICAgIGFsdCBOb3QgQGRlY2FmLXRzL2NsaVxuICAgKiAgICAgICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogbG9hZChtb2R1bGUsIGN3ZClcbiAgICogICAgICAgQ2xpV3JhcHBlci0tPj5DbGlXcmFwcGVyOiBuYW1lXG4gICAqICAgICAgIENsaVdyYXBwZXItPj5DbGlXcmFwcGVyOiBDaGVjayBpZiBjb21tYW5kIGV4aXN0c1xuICAgKiAgICAgICBhbHQgQ29tbWFuZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICAgICAgQ2xpV3JhcHBlci0+PkNvbW1hbmQ6IGNvbW1hbmQobmFtZSkuYWRkQ29tbWFuZChtb2R1bGVzW25hbWVdKVxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIENsaVdyYXBwZXItPj5Db25zb2xlOiBMb2cgbG9hZGVkIG1vZHVsZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYm9vdCgpIHtcbiAgICBjb25zdCBiYXNlUGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLnJvb3RQYXRoLCB0aGlzLmJhc2VQYXRoKTtcbiAgICBjb25zdCBtb2R1bGVzID0gdGhpcy5jcmF3bChiYXNlUGF0aCwgdGhpcy5jcmF3bExldmVscyk7XG4gICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuICAgICAgaWYgKG1vZHVsZS5pbmNsdWRlcyhcIkBkZWNhZi10cy9jbGlcIikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsZXQgbmFtZTogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmFtZSA9IGF3YWl0IHRoaXMubG9hZChtb2R1bGUsIHRoaXMucm9vdFBhdGgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5jb21tYW5kLmNvbW1hbmRzLmZpbmQoXG4gICAgICAgICAgKGMpID0+IChjIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPilbXCJfbmFtZVwiXSA9PT0gbmFtZVxuICAgICAgICApXG4gICAgICApXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5jb21tYW5kLmNvbW1hbmQobmFtZSkuYWRkQ29tbWFuZCh0aGlzLm1vZHVsZXNbbmFtZV0pO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBsb2FkZWQgbW9kdWxlczpcXG4ke09iamVjdC5rZXlzKHRoaXMubW9kdWxlcylcbiAgICAgICAgLm1hcCgoaykgPT4gYC0gJHtrfWApXG4gICAgICAgIC5qb2luKFwiXFxuXCIpfWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWN1cnNpdmVseSBzZWFyY2hlcyBmb3IgQ0xJIG1vZHVsZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZVxuICAgKiBAc3VtbWFyeSBDcmF3bHMgdGhlIGJhc2VQYXRoIHVwIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGZvbGRlciBsZXZlbHMgdG8gZmluZCBmaWxlcyBuYW1lZCBhY2NvcmRpbmcgdG8gQ0xJX0ZJTEVfTkFNRVxuICAgKiBcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQYXRoIFRoZSBhYnNvbHV0ZSBiYXNlIHBhdGggdG8gc3RhcnQgc2VhcmNoaW5nIGluXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGV2ZWxzPTJdIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkaXJlY3RvcnkgbGV2ZWxzIHRvIGNyYXdsXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBmaWxlIHBhdGhzIHRvIENMSSBtb2R1bGVzXG4gICAqIFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmF3bChiYXNlUGF0aDogc3RyaW5nLCBsZXZlbHM6IG51bWJlciA9IDIpIHtcbiAgICBpZiAobGV2ZWxzIDw9IDApIHJldHVybiBbXTtcbiAgICByZXR1cm4gZnMucmVhZGRpclN5bmMoYmFzZVBhdGgpLnJlZHVjZSgoYWNjdW06IHN0cmluZ1tdLCBmaWxlKSA9PiB7XG4gICAgICBmaWxlID0gcGF0aC5qb2luKGJhc2VQYXRoLCBmaWxlKTtcbiAgICAgIGlmIChmcy5zdGF0U3luYyhmaWxlKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGFjY3VtLnB1c2goLi4udGhpcy5jcmF3bChmaWxlLCBsZXZlbHMgLSAxKSk7XG4gICAgICB9IGVsc2UgaWYgKGZpbGUubWF0Y2gobmV3IFJlZ0V4cChgJHtDTElfRklMRV9OQU1FfS5bY21dP2pzJGAsIFwiZ21cIikpKSB7XG4gICAgICAgIGFjY3VtLnB1c2goZmlsZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyB0aGUgQ0xJIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50c1xuICAgKiBAc3VtbWFyeSBCb290cyB0aGUgQ0xJIGJ5IGxvYWRpbmcgYWxsIG1vZHVsZXMsIHRoZW4gcGFyc2VzIGFuZCBleGVjdXRlcyB0aGUgY29tbWFuZCBzcGVjaWZpZWQgaW4gdGhlIGFyZ3VtZW50c1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncz1wcm9jZXNzLmFyZ3ZdIENvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gcGFyc2UgYW5kIGV4ZWN1dGVcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29tbWFuZCBleGVjdXRpb24gaXMgY29tcGxldGVcbiAgICogXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IENsaVdyYXBwZXJcbiAgICogICBwYXJ0aWNpcGFudCBDb21tYW5kXG4gICAqICAgXG4gICAqICAgQ2xpZW50LT4+Q2xpV3JhcHBlcjogcnVuKGFyZ3MpXG4gICAqICAgQ2xpV3JhcHBlci0+PkNsaVdyYXBwZXI6IGJvb3QoKVxuICAgKiAgIE5vdGUgb3ZlciBDbGlXcmFwcGVyOiBMb2FkcyBhbGwgbW9kdWxlc1xuICAgKiAgIENsaVdyYXBwZXItPj5Db21tYW5kOiBwYXJzZUFzeW5jKGFyZ3MpXG4gICAqICAgQ29tbWFuZC0tPj5DbGlXcmFwcGVyOiByZXN1bHRcbiAgICogICBDbGlXcmFwcGVyLS0+PkNsaWVudDogcmVzdWx0XG4gICAqL1xuICBhc3luYyBydW4oYXJnczogc3RyaW5nW10gPSBwcm9jZXNzLmFyZ3YpIHtcbiAgICBhd2FpdCB0aGlzLmJvb3QoKTtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kLnBhcnNlQXN5bmMoYXJncyk7XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gXCIuL0NsaVdyYXBwZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjYWYtdHMnIENMSSBtb2R1bGVcbiAqIEBzdW1tYXJ5IFRoaXMgZmlsZSB3aWxsIGNyYXdsIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciBmaWxlcyBjYWxsZWQge0BsaW5rIENMSV9GSUxFX05BTUV9XG4gKiB3aXRoaW4gdGhlIEBkZWNhZi10cyBuYW1lc3BhY2UgYW5kIGxvYWQgdGhlbSBhcyBzdWJjb21tYW5kcy4gSXQgc2VydmVzIGFzIHRoZSBtYWluIGVudHJ5IHBvaW50XG4gKiBmb3IgdGhlIENMSSBmdW5jdGlvbmFsaXR5LCBleHBvcnRpbmcgdGhlIENsaVdyYXBwZXIgY2xhc3MgYW5kIFZFUlNJT04gY29uc3RhbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIHJ1biBtb2R1bGUgY29tbWFuZCAgICAgLSAkIG5weCBkZWNhZiA8bW9kdWxlIG5hbWU+IDxtb2R1bGUgY29tbWFuZD4gLi4uPG1vZHVsZSBjb21tYW5kIG9wdGlvbnM+XG4gKiBnZXQgbW9kdWxlIGhlbHAgICAgICAgIC0gJCBucHggZGVjYWYgaGVscCA8bW9kdWxlIG5hbWU+O1xuICogbGlzdCBpbXBvcnRlZCBtb2R1bGVzICAtICQgbnB4IGRlY2FmIGxpc3Q7XG4gKiBnZXQgY2xpIGhlbHAgICAgICAgICAgIC0gJCBucHggZGVjYWYgaGVscDtcbiAqXG4gKiBAbW9kdWxlIENMSVxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb25cbiAqIEBzdW1tYXJ5IEEgY29uc3RhbnQgdGhhdCBob2xkcyB0aGUgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIHBhY2thZ2UsIHdoaWNoIGlzIHJlcGxhY2VkIGR1cmluZyBidWlsZFxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Q0xJXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIkNvbW1hbmQiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUdBOzs7Ozs7SUFNRztJQUNJLE1BQU0sYUFBYSxHQUFHLFlBQVk7O0lDTHpDOzs7Ozs7Ozs7Ozs7O0lBYUc7VUFDVSxRQUFRLENBQUE7SUFDbkI7Ozs7OztJQU1HO0lBQ0gsSUFBQSxhQUFhLFlBQVksQ0FBQyxJQUFZLEVBQUE7SUFDcEMsUUFBQSxJQUFJO2dCQUNGLE9BQU8sUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDOztZQUM3QyxPQUFPLENBQVUsRUFBRTtnQkFDbkIsTUFBTSxJQUFJLEtBQUssQ0FDYixDQUFBLG9CQUFBLEVBQXVCLElBQUksQ0FBSyxFQUFBLEVBQUEsQ0FBQyxZQUFZLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBRSxDQUFBLENBQ3JFOzs7SUFJTDs7Ozs7Ozs7SUFRRztJQUNILElBQUEsYUFBYSxlQUFlLENBQUksYUFBeUIsRUFBQTs7SUFFdkQsUUFBQSxPQUFPLGFBQWEsQ0FBQyxJ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
1
+ var t,e;t=this,e=function(t,e,a,n,r,o){"use strict";function s(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var i=s(a),c=s(n);class d{static async loadFromFile(t){try{return d.normalizeImport(import(t))}catch(e){throw Error(`Failed to load from ${t}: ${e instanceof Error?e.message:e}`)}}static async normalizeImport(t){return t.then(t=>t.default||t)}static initialize(t,e){const a=d.packageName(e);t.name(a).description(`Runs ${a} related commands`).version(d.packageVersion(e))}static getPackage(t){try{return JSON.parse(i.default.readFileSync(c.default.join(t,"package.json"),"utf8"))}catch(e){throw Error(`Unable to read version from ${t}: ${e}`)}}static packageVersion(t){return d.getPackage(t).version}static packageName(t){const e=d.getPackage(t).name.split("/");return e[e.length-1]}}const l=["\x1b[38;5;215m","\x1b[38;5;209m","\x1b[38;5;205m","\x1b[38;5;210m","\x1b[38;5;217m","\x1b[38;5;216m","\x1b[38;5;224m","\x1b[38;5;230m","\x1b[38;5;230m"];t.CliWrapper=class{constructor(t="./",e=4){this.basePath=t,this.crawlLevels=e,this.modules={},this.rootPath=c.default.resolve(__dirname,"..")}get command(){return this._command||(this._command=new e.Command,d.initialize(this._command,this.rootPath)),this._command}async load(t,a){let n;try{const r=await d.loadFromFile(t);n=r.name;const o=new e.Command;d.initialize(o,a);let s=r();s instanceof Promise&&(s=await s),this.modules[n]=s}catch(e){throw Error(`failed to load module ${n||"unnamed"} under ${t}: ${e instanceof Error?e.message:e}`)}return n}async boot(){const t=c.default.resolve(this.rootPath,this.basePath),e=this.crawl(t,this.crawlLevels);for(const t of e){if(t.includes("@decaf-ts/cli"))continue;let e;try{e=await this.load(t,this.rootPath)}catch(t){continue}if(!this.command.commands.find(t=>t._name===e))try{this.command.command(e).addCommand(this.modules[e])}catch(t){}}}crawl(t,e=2){return e>0?i.default.readdirSync(t).reduce((a,n)=>(n=c.default.join(t,n),i.default.statSync(n).isDirectory()?a.push(...this.crawl(n,e-1)):n.match(RegExp("cli-module\\.[cm]js$","gm"))&&a.push(n),a),[]):[]}getSlogan(){let t,e=__dirname;try{for(;e&&e!==c.default.parse(e).root;){const a=c.default.join(e,"node_modules");if(i.default.existsSync(a)&&i.default.statSync(a).isDirectory()){t=a;break}const n=c.default.dirname(e);if(n===e)break;e=n}}catch{}const a=[];if(t){const e=c.default.join(t,"@decaf-ts");try{if(i.default.existsSync(e)&&i.default.statSync(e).isDirectory()){const t=i.default.readdirSync(e);for(const n of t){const t=c.default.join(e,n);try{const e=c.default.join(t,"workdocs","assets","slogans.json");if(i.default.existsSync(e)&&i.default.statSync(e).isFile()){const t=i.default.readFileSync(e,"utf-8"),n=JSON.parse(t);if(Array.isArray(n))for(const t of n)"string"==typeof t&&t.trim().length>0&&a.push(t.trim())}}catch{}}}}catch{}}return 0===a.length?"Decaf: strongly brewed TypeScript.":a[Math.floor(Math.random()*a.length)]}printBanner(t=r.Logging.get()){let e;try{e=this.getSlogan()}catch{e="Decaf: strongly brewed TypeScript."}const a="# \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \n# ( ( \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \n# ) ) \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \n# [=======] \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \n# `-----\xb4 \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \n# \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \n# \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \n#".split("\n"),n=a.reduce((t,e)=>Math.max(t,e.length),0);a.push("# "+e.padStart(n-3)),a.forEach((e,a)=>{const n=l[a%l.length]||"",r=t?t.info.bind(t):(()=>{}).bind();try{r(o.style(e||"").raw(n).text)}catch{r((e||"")+"")}})}async run(t=process.argv){return await this.boot(),this.printBanner(),this.command.parseAsync(t)}}},"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("commander"),require("fs"),require("path"),require("@decaf-ts/logging"),require("styled-string-builder")):"function"==typeof define&&define.amd?define(["exports","commander","fs","path","@decaf-ts/logging","styled-string-builder"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).cli={},t.commander,t.fs,t.path,t.decafTsLogging,t.styledStringBuilder);
2
+ //# sourceMappingURL=cli.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.cjs","sources":["../src/utils.ts","../src/CliWrapper.ts"],"sourcesContent":[null,null],"names":["CLIUtils","loadFromFile","path","normalizeImport","import","e","Error","message","importPromise","then","m","default","initialize","command","basePath","name","packageName","description","version","packageVersion","getPackage","JSON","parse","fs","readFileSync","join","split","length","colors","constructor","crawlLevels","this","modules","rootPath","resolve","__dirname","_command","Command","load","filePath","module","cmd","Promise","boot","crawl","includes","commands","find","c","addCommand","levels","readdirSync","reduce","accum","file","statSync","isDirectory","push","match","RegExp","getSlogan","nodeModulesDir","current","root","candidate","existsSync","parent","dirname","slogans","scopeDir","pkgs","pkg","depPath","slogansPath","isFile","raw","parsed","Array","isArray","s","trim","Math","floor","random","printBanner","logger","Logging","get","banner","maxLength","max","line","padStart","forEach","index","color","logFn","info","bind","console","style","text","String","run","args","process","argv","parseAsync"],"mappings":"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"}
package/dist/cli.js ADDED
@@ -0,0 +1,2 @@
1
+ import{Command as t}from"commander";import r from"fs";import a from"path";import{Logging as e}from"@decaf-ts/logging";import{style as n}from"styled-string-builder";class o{static async loadFromFile(t){try{return o.normalizeImport(import(t))}catch(r){throw Error(`Failed to load from ${t}: ${r instanceof Error?r.message:r}`)}}static async normalizeImport(t){return t.then(t=>t.default||t)}static initialize(t,r){const a=o.packageName(r);t.name(a).description(`Runs ${a} related commands`).version(o.packageVersion(r))}static getPackage(t){try{return JSON.parse(r.readFileSync(a.join(t,"package.json"),"utf8"))}catch(r){throw Error(`Unable to read version from ${t}: ${r}`)}}static packageVersion(t){return o.getPackage(t).version}static packageName(t){const r=o.getPackage(t).name.split("/");return r[r.length-1]}}const s=["\x1b[38;5;215m","\x1b[38;5;209m","\x1b[38;5;205m","\x1b[38;5;210m","\x1b[38;5;217m","\x1b[38;5;216m","\x1b[38;5;224m","\x1b[38;5;230m","\x1b[38;5;230m"];class i{constructor(t="./",r=4){this.basePath=t,this.crawlLevels=r,this.modules={},this.rootPath=a.resolve(__dirname,"..")}get command(){return this._command||(this._command=new t,o.initialize(this._command,this.rootPath)),this._command}async load(r,a){let e;try{const n=await o.loadFromFile(r);e=n.name;const s=new t;o.initialize(s,a);let i=n();i instanceof Promise&&(i=await i),this.modules[e]=i}catch(t){throw Error(`failed to load module ${e||"unnamed"} under ${r}: ${t instanceof Error?t.message:t}`)}return e}async boot(){const t=a.resolve(this.rootPath,this.basePath),r=this.crawl(t,this.crawlLevels);for(const t of r){if(t.includes("@decaf-ts/cli"))continue;let r;try{r=await this.load(t,this.rootPath)}catch(t){continue}if(!this.command.commands.find(t=>t._name===r))try{this.command.command(r).addCommand(this.modules[r])}catch(t){}}}crawl(t,e=2){return e>0?r.readdirSync(t).reduce((n,o)=>(o=a.join(t,o),r.statSync(o).isDirectory()?n.push(...this.crawl(o,e-1)):o.match(RegExp("cli-module\\.[cm]js$","gm"))&&n.push(o),n),[]):[]}getSlogan(){let t,e=__dirname;try{for(;e&&e!==a.parse(e).root;){const n=a.join(e,"node_modules");if(r.existsSync(n)&&r.statSync(n).isDirectory()){t=n;break}const o=a.dirname(e);if(o===e)break;e=o}}catch{}const n=[];if(t){const e=a.join(t,"@decaf-ts");try{if(r.existsSync(e)&&r.statSync(e).isDirectory()){const t=r.readdirSync(e);for(const o of t){const t=a.join(e,o);try{const e=a.join(t,"workdocs","assets","slogans.json");if(r.existsSync(e)&&r.statSync(e).isFile()){const t=r.readFileSync(e,"utf-8"),a=JSON.parse(t);if(Array.isArray(a))for(const t of a)"string"==typeof t&&t.trim().length>0&&n.push(t.trim())}}catch{}}}}catch{}}return 0===n.length?"Decaf: strongly brewed TypeScript.":n[Math.floor(Math.random()*n.length)]}printBanner(t=e.get()){let r;try{r=this.getSlogan()}catch{r="Decaf: strongly brewed TypeScript."}const a="# \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \n# ( ( \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \n# ) ) \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \n# [=======] \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \n# `-----\xb4 \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \n# \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \n# \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591\u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2593\u2592\u2591 \u2591\u2592\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2592\u2591 \n#".split("\n"),o=a.reduce((t,r)=>Math.max(t,r.length),0);a.push("# "+r.padStart(o-3)),a.forEach((r,a)=>{const e=s[a%s.length]||"",o=t?t.info.bind(t):(()=>{}).bind();try{o(n(r||"").raw(e).text)}catch{o((r||"")+"")}})}async run(t=process.argv){return await this.boot(),this.printBanner(),this.command.parseAsync(t)}}export{i as CliWrapper};
2
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sources":["../src/utils.ts","../src/CliWrapper.ts"],"sourcesContent":[null,null],"names":["CLIUtils","loadFromFile","path","normalizeImport","import","e","Error","message","importPromise","then","m","default","initialize","command","basePath","name","packageName","description","version","packageVersion","getPackage","JSON","parse","fs","readFileSync","join","split","length","colors","CliWrapper","constructor","crawlLevels","this","modules","rootPath","resolve","__dirname","_command","Command","load","filePath","module","cmd","Promise","boot","crawl","includes","commands","find","c","addCommand","levels","readdirSync","reduce","accum","file","statSync","isDirectory","push","match","RegExp","getSlogan","nodeModulesDir","current","root","candidate","existsSync","parent","dirname","slogans","scopeDir","pkgs","pkg","depPath","slogansPath","isFile","raw","parsed","Array","isArray","s","trim","Math","floor","random","printBanner","logger","Logging","get","banner","maxLength","max","line","padStart","forEach","index","color","logFn","info","bind","console","style","text","String","run","args","process","argv","parseAsync"],"mappings":"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"}