@decaf-ts/cli 0.4.3 → 0.4.5

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 (63) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.cjs +1 -1
  3. package/dist/cli.cjs.map +1 -1
  4. package/dist/cli.js +1 -1
  5. package/dist/cli.js.map +1 -1
  6. package/lib/CliWrapper.cjs +209 -90
  7. package/lib/CliWrapper.d.ts +28 -4
  8. package/lib/CliWrapper.js.map +1 -1
  9. package/lib/banners.cjs +194 -0
  10. package/lib/banners.d.ts +3 -0
  11. package/lib/banners.js.map +1 -0
  12. package/lib/demo/cli-module.cjs +9 -39
  13. package/lib/demo/cli-module.d.ts +0 -33
  14. package/lib/demo/cli-module.js.map +1 -1
  15. package/lib/environment.cjs +17 -0
  16. package/lib/environment.d.ts +17 -0
  17. package/lib/environment.js.map +1 -0
  18. package/lib/esm/CliWrapper.d.ts +28 -4
  19. package/lib/esm/CliWrapper.js +210 -91
  20. package/lib/esm/CliWrapper.js.map +1 -1
  21. package/lib/esm/banners.d.ts +3 -0
  22. package/lib/esm/banners.js +191 -0
  23. package/lib/esm/banners.js.map +1 -0
  24. package/lib/esm/demo/cli-module.d.ts +0 -33
  25. package/lib/esm/demo/cli-module.js +9 -39
  26. package/lib/esm/demo/cli-module.js.map +1 -1
  27. package/lib/esm/environment.d.ts +17 -0
  28. package/lib/esm/environment.js +11 -0
  29. package/lib/esm/environment.js.map +1 -0
  30. package/lib/esm/index.d.ts +1 -0
  31. package/lib/esm/index.js +1 -0
  32. package/lib/esm/index.js.map +1 -1
  33. package/lib/esm/logging.d.ts +3 -0
  34. package/lib/esm/logging.js +16 -0
  35. package/lib/esm/logging.js.map +1 -0
  36. package/lib/esm/slogans.d.ts +40 -0
  37. package/lib/esm/slogans.js +142 -0
  38. package/lib/esm/slogans.js.map +1 -0
  39. package/lib/esm/utils-module/cli-module.d.ts +2 -0
  40. package/lib/esm/utils-module/cli-module.js +77 -0
  41. package/lib/esm/utils-module/cli-module.js.map +1 -0
  42. package/lib/esm/utils.js +1 -1
  43. package/lib/esm/utils.js.map +1 -1
  44. package/lib/esm/version.d.ts +1 -1
  45. package/lib/esm/version.js +1 -1
  46. package/lib/index.cjs +1 -0
  47. package/lib/index.d.ts +1 -0
  48. package/lib/index.js.map +1 -1
  49. package/lib/logging.cjs +19 -0
  50. package/lib/logging.d.ts +3 -0
  51. package/lib/logging.js.map +1 -0
  52. package/lib/slogans.cjs +150 -0
  53. package/lib/slogans.d.ts +40 -0
  54. package/lib/slogans.js.map +1 -0
  55. package/lib/utils-module/cli-module.cjs +83 -0
  56. package/lib/utils-module/cli-module.d.ts +2 -0
  57. package/lib/utils-module/cli-module.js.map +1 -0
  58. package/lib/utils.cjs +1 -1
  59. package/lib/utils.js.map +1 -1
  60. package/lib/version.cjs +1 -1
  61. package/lib/version.d.ts +1 -1
  62. package/package.json +3 -2
  63. package/workdocs/assets/slogans.json +194 -0
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.readSlogans = readSlogans;
7
+ exports.collectSlogans = collectSlogans;
8
+ exports.flattenSlogansWithPriority = flattenSlogansWithPriority;
9
+ const path_1 = __importDefault(require("path"));
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const utils_1 = require("@decaf-ts/utils");
12
+ /**
13
+ * @description Reads and parses slogans from workdocs/assets/slogans.json.
14
+ * @summary Attempts to read a slogans.json file from the workdocs/assets directory at the given base path and returns its parsed contents as an array.
15
+ *
16
+ * @param {string} basePath - The base directory path where workdocs/assets/slogans.json should exist.
17
+ * @return {any[] | undefined} The parsed array from slogans.json, or undefined if the file doesn't exist.
18
+ *
19
+ * @function readSlogans
20
+ *
21
+ * @memberOf module:utils
22
+ */
23
+ function readSlogans(log, basePath) {
24
+ log = log.for(readSlogans);
25
+ const slogansPath = path_1.default.join(basePath, "workdocs", "assets", "slogans.json");
26
+ try {
27
+ if (!fs_1.default.existsSync(slogansPath)) {
28
+ return undefined;
29
+ }
30
+ const content = fs_1.default.readFileSync(slogansPath);
31
+ return JSON.parse(content.toString());
32
+ }
33
+ catch (error) {
34
+ log.error(`Failed to read slogans from ${slogansPath}`, error);
35
+ return undefined;
36
+ }
37
+ }
38
+ /**
39
+ * @description Collects slogans from a base path and all @decaf scoped packages.
40
+ * @summary Recursively collects slogans.json files from the given base path and all subdirectories under node_modules/@decaf/*. Results are stored in an object keyed by the package name (from package.json).
41
+ *
42
+ * @param {string} basePath - The base directory path to start collecting from.
43
+ * @return {Record<string, any[]>} An object mapping package names to their slogans arrays.
44
+ *
45
+ * @function collectSlogans
46
+ *
47
+ * @memberOf module:utils
48
+ */
49
+ function collectSlogans(log, basePath) {
50
+ log = log.for(collectSlogans);
51
+ const result = {};
52
+ // Read slogans for the base path
53
+ const baseSlogans = readSlogans(log, basePath);
54
+ if (baseSlogans) {
55
+ try {
56
+ const pkgName = (0, utils_1.getPackage)(basePath, "name");
57
+ result[pkgName] = baseSlogans;
58
+ log.verbose(`Collected ${baseSlogans.length} slogans from ${pkgName}`);
59
+ }
60
+ catch (error) {
61
+ log.verbose(`Failed to get package name for base path: ${error}`);
62
+ }
63
+ }
64
+ // Check for @decaf/* packages in node_modules
65
+ const decafModulesPath = path_1.default.join(basePath, "node_modules", "@decaf-ts");
66
+ if (fs_1.default.existsSync(decafModulesPath)) {
67
+ try {
68
+ const decafPackages = fs_1.default.readdirSync(decafModulesPath, {
69
+ withFileTypes: true,
70
+ });
71
+ for (const pkg of decafPackages) {
72
+ if (!pkg.isDirectory())
73
+ continue;
74
+ const pkgPath = path_1.default.join(decafModulesPath, pkg.name);
75
+ const pkgSlogans = readSlogans(log, pkgPath);
76
+ if (pkgSlogans) {
77
+ try {
78
+ const pkgName = (0, utils_1.getPackage)(pkgPath, "name");
79
+ result[pkgName] = pkgSlogans;
80
+ log.verbose(`Collected ${pkgSlogans.length} slogans from ${pkgName}`);
81
+ }
82
+ catch (error) {
83
+ log.verbose(`Failed to get package name for ${pkgPath}: ${error}`);
84
+ }
85
+ }
86
+ }
87
+ }
88
+ catch (error) {
89
+ log.verbose(`Error reading @decaf-ts modules: ${error}`);
90
+ }
91
+ }
92
+ return result;
93
+ }
94
+ /**
95
+ * @description Flattens collected slogans with weighted selection for a priority package.
96
+ * @summary Given a collection of slogans and a priority package name, returns a flat array where slogans from the priority package have a 30-40% chance of appearing at any given position.
97
+ *
98
+ * @param {Record<string, any[]>} slogansMap - Object mapping package names to slogan arrays.
99
+ * @param {string} priorityPackage - The package name whose slogans should be prioritized.
100
+ * @return {any[]} A flat array of all slogans with weighted distribution.
101
+ *
102
+ * @function flattenSlogansWithPriority
103
+ *
104
+ * @memberOf module:utils
105
+ */
106
+ function flattenSlogansWithPriority(log, slogansMap, priorityPackage) {
107
+ log = log.for(flattenSlogansWithPriority);
108
+ const result = [];
109
+ const prioritySlogans = slogansMap[priorityPackage] || [];
110
+ const otherSlogans = [];
111
+ // Collect all non-priority slogans
112
+ for (const [pkgName, slogans] of Object.entries(slogansMap)) {
113
+ if (pkgName === priorityPackage)
114
+ continue;
115
+ otherSlogans.push(...slogans);
116
+ }
117
+ if (prioritySlogans.length === 0 && otherSlogans.length === 0) {
118
+ log.error("No slogans found to flatten");
119
+ return result;
120
+ }
121
+ if (prioritySlogans.length === 0) {
122
+ log.verbose(`package "${priorityPackage}" has no slogans, returning all other slogans`);
123
+ return otherSlogans;
124
+ }
125
+ if (otherSlogans.length === 0) {
126
+ log.debug("Only priority slogans available, returning them");
127
+ return prioritySlogans;
128
+ }
129
+ // Interleave with 30-40% chance for priority slogans
130
+ let priorityIndex = 0;
131
+ let otherIndex = 0;
132
+ const priorityWeight = 0.35; // 35% average chance
133
+ while (priorityIndex < prioritySlogans.length ||
134
+ otherIndex < otherSlogans.length) {
135
+ const usePriority = Math.random() < priorityWeight;
136
+ if (usePriority && priorityIndex < prioritySlogans.length) {
137
+ result.push(prioritySlogans[priorityIndex++]);
138
+ }
139
+ else if (otherIndex < otherSlogans.length) {
140
+ result.push(otherSlogans[otherIndex++]);
141
+ }
142
+ else if (priorityIndex < prioritySlogans.length) {
143
+ // Only priority slogans left
144
+ result.push(prioritySlogans[priorityIndex++]);
145
+ }
146
+ }
147
+ log.debug(`Flattened ${result.length} slogans with priority for "${priorityPackage}"`);
148
+ return result;
149
+ }
150
+ //# sourceMappingURL=slogans.js.map
@@ -0,0 +1,40 @@
1
+ import { Logger } from "@decaf-ts/logging";
2
+ /**
3
+ * @description Reads and parses slogans from workdocs/assets/slogans.json.
4
+ * @summary Attempts to read a slogans.json file from the workdocs/assets directory at the given base path and returns its parsed contents as an array.
5
+ *
6
+ * @param {string} basePath - The base directory path where workdocs/assets/slogans.json should exist.
7
+ * @return {any[] | undefined} The parsed array from slogans.json, or undefined if the file doesn't exist.
8
+ *
9
+ * @function readSlogans
10
+ *
11
+ * @memberOf module:utils
12
+ */
13
+ export declare function readSlogans(log: Logger, basePath: string): {
14
+ Slogan: string;
15
+ }[] | undefined;
16
+ /**
17
+ * @description Collects slogans from a base path and all @decaf scoped packages.
18
+ * @summary Recursively collects slogans.json files from the given base path and all subdirectories under node_modules/@decaf/*. Results are stored in an object keyed by the package name (from package.json).
19
+ *
20
+ * @param {string} basePath - The base directory path to start collecting from.
21
+ * @return {Record<string, any[]>} An object mapping package names to their slogans arrays.
22
+ *
23
+ * @function collectSlogans
24
+ *
25
+ * @memberOf module:utils
26
+ */
27
+ export declare function collectSlogans(log: Logger, basePath: string): Record<string, any[]>;
28
+ /**
29
+ * @description Flattens collected slogans with weighted selection for a priority package.
30
+ * @summary Given a collection of slogans and a priority package name, returns a flat array where slogans from the priority package have a 30-40% chance of appearing at any given position.
31
+ *
32
+ * @param {Record<string, any[]>} slogansMap - Object mapping package names to slogan arrays.
33
+ * @param {string} priorityPackage - The package name whose slogans should be prioritized.
34
+ * @return {any[]} A flat array of all slogans with weighted distribution.
35
+ *
36
+ * @function flattenSlogansWithPriority
37
+ *
38
+ * @memberOf module:utils
39
+ */
40
+ export declare function flattenSlogansWithPriority(log: Logger, slogansMap: Record<string, any[]>, priorityPackage: string): any[];
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slogans.js","sourceRoot":"","sources":["../src/slogans.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = utils;
7
+ const commander_1 = require("commander");
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const logging_1 = require("./../logging.cjs");
11
+ const decoration_1 = require("@decaf-ts/decoration");
12
+ const CliWrapper_1 = require("./../CliWrapper.cjs");
13
+ const logging_2 = require("@decaf-ts/logging");
14
+ const libraries = new commander_1.Command()
15
+ .name("libraries")
16
+ .description("outputs the installed decaf-ts libraries and their versions")
17
+ .option("--format [String]", "additional output formats (json, raw)")
18
+ .action(async (options) => {
19
+ const pkg = JSON.parse(fs_1.default.readFileSync(path_1.default.join(process.cwd(), "package.json"), "utf-8"));
20
+ const version = pkg.version;
21
+ const log = (0, logging_1.getCmdLogger)(libraries);
22
+ log.debug(`running with options: ${JSON.stringify(options)} for ${pkg.name} version ${version}`);
23
+ const { format } = options;
24
+ const libs = decoration_1.Metadata.libraries();
25
+ switch (format) {
26
+ case "json":
27
+ console.log(JSON.stringify(libs, null, 2));
28
+ break;
29
+ case "raw":
30
+ Object.entries(libs).forEach(([key, value]) => console.log(`${key}: ${value}`));
31
+ break;
32
+ default:
33
+ Object.entries(libs).forEach(([key, value]) => log.info(`${key}: ${value}`));
34
+ }
35
+ });
36
+ const environmentExport = new commander_1.Command()
37
+ .name("environment-export")
38
+ .description("outputs currently enforced environment")
39
+ .option("--format [String]", "additional output formats (json, raw)")
40
+ .action(async (options) => {
41
+ const pkg = JSON.parse(fs_1.default.readFileSync(path_1.default.join(process.cwd(), "package.json"), "utf-8"));
42
+ const version = pkg.version;
43
+ const log = (0, logging_1.getCmdLogger)(environmentExport);
44
+ log.debug(`running with options: ${JSON.stringify(options)} for ${pkg.name} version ${version}`);
45
+ const { format } = options;
46
+ const env = CliWrapper_1.CliWrapper.getEnv();
47
+ const flatten = (accum, obj, prefix = "") => {
48
+ Object.entries(obj).forEach(([key, value]) => {
49
+ const envKey = (0, logging_2.toENVFormat)(key);
50
+ const fullKey = prefix ? `${prefix}__${envKey}` : envKey;
51
+ if (value && typeof value === "object" && !Array.isArray(value)) {
52
+ flatten(accum, value, fullKey);
53
+ }
54
+ else {
55
+ accum.push(`${fullKey}=${value}`);
56
+ }
57
+ });
58
+ };
59
+ switch (format) {
60
+ case "json":
61
+ console.log(JSON.stringify(env, null, 2));
62
+ break;
63
+ case "raw": {
64
+ const str = [];
65
+ flatten(str, env);
66
+ console.log(str.join("\n"));
67
+ break;
68
+ }
69
+ default: {
70
+ const str = [];
71
+ flatten(str, env);
72
+ str.forEach((s) => log.info(s));
73
+ }
74
+ }
75
+ });
76
+ function utils() {
77
+ const utilsCmd = new commander_1.Command()
78
+ .command("utils")
79
+ .description("utilitarian cli commands for the decaf-ts framework");
80
+ utilsCmd.addCommand(libraries);
81
+ return utilsCmd;
82
+ }
83
+ //# sourceMappingURL=cli-module.js.map
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export default function utils(): Command;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-module.js","sourceRoot":"","sources":["../../src/utils-module/cli-module.ts"],"names":[],"mappings":"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"}
package/lib/utils.cjs CHANGED
@@ -93,7 +93,7 @@ class CLIUtils {
93
93
  static initialize(command, basePath) {
94
94
  const name = CLIUtils.packageName(basePath);
95
95
  command
96
- .name(name)
96
+ .name("decaf")
97
97
  .description(`Runs ${name} related commands`)
98
98
  .version(CLIUtils.packageVersion(basePath));
99
99
  }
package/lib/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAwB;AACxB,4CAAoB;AAIpB;;;;;;;;;;;;;GAaG;AACH,MAAa,QAAQ;IACnB;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAY;QACpC,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,eAAe,oBAAQ,IAAI,wCAAE,CAAC;QAChD,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,uBAAuB,IAAI,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CACrE,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,KAAK,CAAC,eAAe,CAAI,aAAyB;QACvD,mEAAmE;QACnE,OAAO,aAAa,CAAC,IAAI,CACvB,CAAC,CAAU,EAAE,EAAE,CAAC,CAAE,CAAoB,CAAC,OAAO,IAAI,CAAC,CAAM,CAC1D,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,UAAU,CAAC,OAAgB,EAAE,QAAgB;QAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC5C,OAAO;aACJ,IAAI,CAAC,IAAI,CAAC;aACV,WAAW,CAAC,QAAQ,IAAI,mBAAmB,CAAC;aAC5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,CAAC;IAED;;;;;;;OAOG;IACK,MAAM,CAAC,UAAU,CAAC,QAAgB;QACxC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CACf,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAC7D,CAAC;QACJ,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,KAAK,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,cAAc,CAAC,QAAgB;QACpC,OAAO,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAW,CAAC;IAC5D,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,WAAW,CAAC,QAAgB;QACjC,MAAM,IAAI,GAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC;CACF;AA1FD,4BA0FC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAwB;AACxB,4CAAoB;AAIpB;;;;;;;;;;;;;GAaG;AACH,MAAa,QAAQ;IACnB;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAY;QACpC,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,eAAe,oBAAQ,IAAI,wCAAE,CAAC;QAChD,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,uBAAuB,IAAI,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CACrE,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,KAAK,CAAC,eAAe,CAAI,aAAyB;QACvD,mEAAmE;QACnE,OAAO,aAAa,CAAC,IAAI,CACvB,CAAC,CAAU,EAAE,EAAE,CAAC,CAAE,CAAoB,CAAC,OAAO,IAAI,CAAC,CAAM,CAC1D,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,UAAU,CAAC,OAAgB,EAAE,QAAgB;QAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC5C,OAAO;aACJ,IAAI,CAAC,OAAO,CAAC;aACb,WAAW,CAAC,QAAQ,IAAI,mBAAmB,CAAC;aAC5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,CAAC;IAED;;;;;;;OAOG;IACK,MAAM,CAAC,UAAU,CAAC,QAAgB;QACxC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CACf,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAC7D,CAAC;QACJ,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,KAAK,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,cAAc,CAAC,QAAgB;QACpC,OAAO,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAW,CAAC;IAC5D,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,WAAW,CAAC,QAAgB;QACjC,MAAM,IAAI,GAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC;CACF;AA1FD,4BA0FC"}
package/lib/version.cjs CHANGED
@@ -8,7 +8,7 @@ const decoration_1 = require("@decaf-ts/decoration");
8
8
  * @const VERSION
9
9
  * @memberOf module:CLI
10
10
  */
11
- exports.VERSION = "0.4.2";
11
+ exports.VERSION = "0.4.4";
12
12
  /**
13
13
  * @description Stores the current package version
14
14
  * @summary A constant that holds the version string of the package, which is replaced during build
package/lib/version.d.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  * @const VERSION
5
5
  * @memberOf module:CLI
6
6
  */
7
- export declare const VERSION = "0.4.2";
7
+ export declare const VERSION = "0.4.4";
8
8
  /**
9
9
  * @description Stores the current package version
10
10
  * @summary A constant that holds the version string of the package, which is replaced during build
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decaf-ts/cli",
3
- "version": "0.4.3",
3
+ "version": "0.4.5",
4
4
  "description": "cli for decaf-ts projects",
5
5
  "type": "module",
6
6
  "exports": {
@@ -55,7 +55,8 @@
55
55
  },
56
56
  "files": [
57
57
  "lib",
58
- "dist"
58
+ "dist",
59
+ "workdocs/assets/slogans.json"
59
60
  ],
60
61
  "keywords": [
61
62
  "cli",
@@ -0,0 +1,194 @@
1
+ [
2
+ {
3
+ "Slogan": "CLI: Your code’s command‑line calm in a caffeinated world.",
4
+ "Tags": "CLI, Coffee‑themed, Developer"
5
+ },
6
+ {
7
+ "Slogan": "Run commands, not your heartbeat.",
8
+ "Tags": "CLI, Calm, Humor"
9
+ },
10
+ {
11
+ "Slogan": "Install once. Ship features forever. No caffeine required.",
12
+ "Tags": "Workflow, Coffee‑themed, Productivity"
13
+ },
14
+ {
15
+ "Slogan": "The CLI that brews your releases smoother than your morning decaf.",
16
+ "Tags": "Release, Coffee‑themed, DevX"
17
+ },
18
+ {
19
+ "Slogan": "Command‑line interface that doesn’t interface with your panic button.",
20
+ "Tags": "CLI, Calm, Humor"
21
+ },
22
+ {
23
+ "Slogan": "Generate, test, deploy — with a gentle click, not a frantic chase.",
24
+ "Tags": "CLI, DevOps, Calm"
25
+ },
26
+ {
27
+ "Slogan": "Scaffolding without the caffeine crash.",
28
+ "Tags": "Scaffolding, Coffee‑themed, Developer"
29
+ },
30
+ {
31
+ "Slogan": "CLI commands so smooth you’ll forget you typed them.",
32
+ "Tags": "CLI, Chill, Developer"
33
+ },
34
+ {
35
+ "Slogan": "Bump version, tag release, sip coffee. Repeat.",
36
+ "Tags": "Release, Coffee‑themed, Humor"
37
+ },
38
+ {
39
+ "Slogan": "Your terminal’s new best friend — decaf‑approved.",
40
+ "Tags": "Terminal, Branding, Coffee‑themed"
41
+ },
42
+ {
43
+ "Slogan": "CLI this. Command that. Without causing your dev heart to spike.",
44
+ "Tags": "CLI, Calm, Developer"
45
+ },
46
+ {
47
+ "Slogan": "Scripts that serve features, not adrenaline.",
48
+ "Tags": "Scripts, Calm, Technical"
49
+ },
50
+ {
51
+ "Slogan": "Automate the boring parts. Relax during the rest.",
52
+ "Tags": "Automation, Productivity, Calm"
53
+ },
54
+ {
55
+ "Slogan": "CLI with barista‑level polish.",
56
+ "Tags": "CLI, Coffee‑themed, UX"
57
+ },
58
+ {
59
+ "Slogan": "Deployments that feel like Sunday brunch.",
60
+ "Tags": "Deploy, Chill, Metaphor"
61
+ },
62
+ {
63
+ "Slogan": "Run generator. Grab decaf. Celebrate minimal bug count.",
64
+ "Tags": "Generator, Coffee‑themed, Fun"
65
+ },
66
+ {
67
+ "Slogan": "Your tooling should relax you, not stress you — CLI included.",
68
+ "Tags": "DevTools, Calm, Developer"
69
+ },
70
+ {
71
+ "Slogan": "Command‑line magic that doesn’t require caffeine spells.",
72
+ "Tags": "CLI, Humor, Calm"
73
+ },
74
+ {
75
+ "Slogan": "CLI: Because your code deserves smooth launches and smooth lattes.",
76
+ "Tags": "Release, Coffee‑themed, Branding"
77
+ },
78
+ {
79
+ "Slogan": "No caffeine jitters. Just clean builds.",
80
+ "Tags": "Build, Calm, Technical"
81
+ },
82
+ {
83
+ "Slogan": "Terminal tasks don’t need to feel like espresso shots.",
84
+ "Tags": "Terminal, Coffee‑themed, Developer"
85
+ },
86
+ {
87
+ "Slogan": "Execute commands. Exhale. Enjoy decaf.",
88
+ "Tags": "CLI, Calm, Workflow"
89
+ },
90
+ {
91
+ "Slogan": "From init to publish — a journey less frantic, more refined.",
92
+ "Tags": "CLI, Release, Calm"
93
+ },
94
+ {
95
+ "Slogan": "Scripts that flow like slow‑pour latte art.",
96
+ "Tags": "Scripts, Coffee‑themed, Fun"
97
+ },
98
+ {
99
+ "Slogan": "Your code’s new morning ritual: launch CLI, sip decaf, ship features.",
100
+ "Tags": "Workflow, Coffee‑themed, Developer"
101
+ },
102
+ {
103
+ "Slogan": "Generate templates. Delete boilerplate. Breathe deeply.",
104
+ "Tags": "Generator, Calm, Developer"
105
+ },
106
+ {
107
+ "Slogan": "CLI commands worthy of a café soundtrack.",
108
+ "Tags": "CLI, Humor, Branding"
109
+ },
110
+ {
111
+ "Slogan": "Stop sprinting through your tooling. Walk. Breathe. Ship.",
112
+ "Tags": "Workflow, Calm, DevX"
113
+ },
114
+ {
115
+ "Slogan": "Your terminal session: now in lounge mode.",
116
+ "Tags": "Terminal, Chill, Developer"
117
+ },
118
+ {
119
+ "Slogan": "From blank project to feature‑rich: all served decaf.",
120
+ "Tags": "Setup, Coffee‑themed, Productivity"
121
+ },
122
+ {
123
+ "Slogan": "Automate your release train without boarding a stress express.",
124
+ "Tags": "Release, Calm, Developer"
125
+ },
126
+ {
127
+ "Slogan": "The CLI that keeps your dev pulses steady.",
128
+ "Tags": "CLI, Wellness, Tech"
129
+ },
130
+ {
131
+ "Slogan": "Less sugar‑rush commands. More stable deployments.",
132
+ "Tags": "Deploy, Calm, Humor"
133
+ },
134
+ {
135
+ "Slogan": "Forge your project with elegance — no caffeine spikes needed.",
136
+ "Tags": "ProjectSetup, Calm, Developer"
137
+ },
138
+ {
139
+ "Slogan": "Terminal tasks done while your thoughts stay cool and collected.",
140
+ "Tags": "Terminal, Calm, DevX"
141
+ },
142
+ {
143
+ "Slogan": "CLI: Because productivity doesn’t require palpitations.",
144
+ "Tags": "CLI, Calm, Developer"
145
+ },
146
+ {
147
+ "Slogan": "Generate code while your coffee cools.",
148
+ "Tags": "Coffee‑themed, Generator, Fun"
149
+ },
150
+ {
151
+ "Slogan": "Launch scripts. Not panic attacks.",
152
+ "Tags": "Scripts, Calm, Humor"
153
+ },
154
+ {
155
+ "Slogan": "Your build scripts finally learned to chill.",
156
+ "Tags": "Build, Calm, Developer"
157
+ },
158
+ {
159
+ "Slogan": "From run‑nervous‑to‑build to run‑relax‑to‑ship.",
160
+ "Tags": "Workflow, Humor, Technical"
161
+ },
162
+ {
163
+ "Slogan": "Your code’s liftoff, no caffeine liftoff included.",
164
+ "Tags": "Release, Calm, Developer"
165
+ },
166
+ {
167
+ "Slogan": "CLI: the quiet hero of your dev stack.",
168
+ "Tags": "CLI, Branding, Chill"
169
+ },
170
+ {
171
+ "Slogan": "Script once. Breathe often.",
172
+ "Tags": "Automation, Calm, Developer"
173
+ },
174
+ {
175
+ "Slogan": "Deployments that sip, not slam.",
176
+ "Tags": "Deploy, Coffee‑themed, Fun"
177
+ },
178
+ {
179
+ "Slogan": "One CLI to rule them… quietly.",
180
+ "Tags": "CLI, Humor, Developer"
181
+ },
182
+ {
183
+ "Slogan": "Coffee in your mug. Calm in your terminal.",
184
+ "Tags": "Coffee‑themed, Terminal, Developer"
185
+ },
186
+ {
187
+ "Slogan": "CLI commands so smooth they pair with your decaf latte.",
188
+ "Tags": "CLI, Coffee‑themed, UX"
189
+ },
190
+ {
191
+ "Slogan": "Your dev stack’s decaf upgrade starts at the terminal.",
192
+ "Tags": "CLI, Branding, Developer"
193
+ }
194
+ ]