andrud 1.0.0 → 1.0.2

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 (122) hide show
  1. package/README.md +69 -83
  2. package/dist/__tests__/context.test.d.ts +5 -0
  3. package/dist/__tests__/context.test.d.ts.map +1 -0
  4. package/dist/__tests__/context.test.js +86 -0
  5. package/dist/__tests__/context.test.js.map +1 -0
  6. package/dist/__tests__/generator.test.d.ts +5 -0
  7. package/dist/__tests__/generator.test.d.ts.map +1 -0
  8. package/dist/__tests__/generator.test.js +83 -0
  9. package/dist/__tests__/generator.test.js.map +1 -0
  10. package/dist/__tests__/validation.test.d.ts +5 -0
  11. package/dist/__tests__/validation.test.d.ts.map +1 -0
  12. package/dist/__tests__/validation.test.js +81 -0
  13. package/dist/__tests__/validation.test.js.map +1 -0
  14. package/dist/cli/commands/create.d.ts +10 -0
  15. package/dist/cli/commands/create.d.ts.map +1 -0
  16. package/dist/cli/commands/create.js +203 -0
  17. package/dist/cli/commands/create.js.map +1 -0
  18. package/dist/cli/commands/info.d.ts +13 -0
  19. package/dist/cli/commands/info.d.ts.map +1 -0
  20. package/dist/cli/commands/info.js +153 -0
  21. package/dist/cli/commands/info.js.map +1 -0
  22. package/dist/cli/commands/init.d.ts +15 -0
  23. package/dist/cli/commands/init.d.ts.map +1 -0
  24. package/dist/cli/commands/init.js +141 -0
  25. package/dist/cli/commands/init.js.map +1 -0
  26. package/dist/cli/commands/list.d.ts +18 -0
  27. package/dist/cli/commands/list.d.ts.map +1 -0
  28. package/dist/cli/commands/list.js +122 -0
  29. package/dist/cli/commands/list.js.map +1 -0
  30. package/dist/cli/commands/new.d.ts +22 -0
  31. package/dist/cli/commands/new.d.ts.map +1 -0
  32. package/dist/cli/commands/new.js +245 -0
  33. package/dist/cli/commands/new.js.map +1 -0
  34. package/dist/cli/index.d.ts +5 -0
  35. package/dist/cli/index.d.ts.map +1 -0
  36. package/dist/cli/index.js +99 -0
  37. package/dist/cli/index.js.map +1 -0
  38. package/dist/core/config.d.ts +89 -0
  39. package/dist/core/config.d.ts.map +1 -0
  40. package/dist/core/config.js +151 -0
  41. package/dist/core/config.js.map +1 -0
  42. package/dist/core/context.d.ts +47 -0
  43. package/dist/core/context.d.ts.map +1 -0
  44. package/dist/core/context.js +175 -0
  45. package/dist/core/context.js.map +1 -0
  46. package/dist/core/generator.d.ts +44 -0
  47. package/dist/core/generator.d.ts.map +1 -0
  48. package/{src/core/generator.ts → dist/core/generator.js} +394 -484
  49. package/dist/core/generator.js.map +1 -0
  50. package/dist/core/types.d.ts +125 -0
  51. package/dist/core/types.d.ts.map +1 -0
  52. package/dist/core/types.js +22 -0
  53. package/dist/core/types.js.map +1 -0
  54. package/dist/templates/index.d.ts +36 -0
  55. package/dist/templates/index.d.ts.map +1 -0
  56. package/dist/templates/index.js +141 -0
  57. package/dist/templates/index.js.map +1 -0
  58. package/dist/ui/colors.d.ts +40 -0
  59. package/dist/ui/colors.d.ts.map +1 -0
  60. package/dist/ui/colors.js +117 -0
  61. package/dist/ui/colors.js.map +1 -0
  62. package/dist/ui/output.d.ts +69 -0
  63. package/dist/ui/output.d.ts.map +1 -0
  64. package/dist/ui/output.js +199 -0
  65. package/dist/ui/output.js.map +1 -0
  66. package/dist/ui/prompts.d.ts +20 -0
  67. package/dist/ui/prompts.d.ts.map +1 -0
  68. package/dist/ui/prompts.js +118 -0
  69. package/dist/ui/prompts.js.map +1 -0
  70. package/dist/ui/spinners.d.ts +30 -0
  71. package/dist/ui/spinners.d.ts.map +1 -0
  72. package/dist/ui/spinners.js +74 -0
  73. package/dist/ui/spinners.js.map +1 -0
  74. package/dist/ui/types.d.ts +35 -0
  75. package/dist/ui/types.d.ts.map +1 -0
  76. package/dist/ui/types.js +5 -0
  77. package/dist/ui/types.js.map +1 -0
  78. package/dist/utils/filesystem.d.ts +38 -0
  79. package/dist/utils/filesystem.d.ts.map +1 -0
  80. package/dist/utils/filesystem.js +181 -0
  81. package/dist/utils/filesystem.js.map +1 -0
  82. package/dist/utils/logger.d.ts +27 -0
  83. package/dist/utils/logger.d.ts.map +1 -0
  84. package/dist/utils/logger.js +52 -0
  85. package/dist/utils/logger.js.map +1 -0
  86. package/dist/utils/object.d.ts +140 -0
  87. package/dist/utils/object.d.ts.map +1 -0
  88. package/dist/utils/object.js +385 -0
  89. package/dist/utils/object.js.map +1 -0
  90. package/dist/utils/validation.d.ts +35 -0
  91. package/dist/utils/validation.d.ts.map +1 -0
  92. package/dist/utils/validation.js +270 -0
  93. package/dist/utils/validation.js.map +1 -0
  94. package/package.json +8 -19
  95. package/CHANGELOG.md +0 -70
  96. package/CODE_REVIEW_ANALYSIS.md +0 -177
  97. package/CONTRIBUTING.md +0 -132
  98. package/FIXES_IMPLEMENTED.md +0 -546
  99. package/src/__tests__/context.test.ts +0 -133
  100. package/src/__tests__/generator.test.ts +0 -107
  101. package/src/__tests__/validation.test.ts +0 -105
  102. package/src/cli/commands/create.ts +0 -252
  103. package/src/cli/commands/info.ts +0 -178
  104. package/src/cli/commands/init.ts +0 -186
  105. package/src/cli/commands/list.ts +0 -156
  106. package/src/cli/commands/new.ts +0 -316
  107. package/src/cli/index.ts +0 -116
  108. package/src/core/config.ts +0 -172
  109. package/src/core/context.ts +0 -212
  110. package/src/core/types.ts +0 -184
  111. package/src/templates/index.ts +0 -162
  112. package/src/types/gradient-string.d.ts +0 -25
  113. package/src/ui/colors.ts +0 -139
  114. package/src/ui/output.ts +0 -230
  115. package/src/ui/prompts.ts +0 -170
  116. package/src/ui/spinners.ts +0 -95
  117. package/src/ui/types.ts +0 -41
  118. package/src/utils/filesystem.ts +0 -222
  119. package/src/utils/logger.ts +0 -67
  120. package/src/utils/object.ts +0 -456
  121. package/src/utils/validation.ts +0 -345
  122. package/tsconfig.json +0 -25
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Output formatting utilities
3
+ */
4
+ import pc from 'picocolors';
5
+ import { bold, dim, section, printSeparator } from './colors.js';
6
+ import gradient from 'gradient-string';
7
+ const logger = {
8
+ log: (message, ...args) => {
9
+ console.log(message, ...args);
10
+ },
11
+ info: (message, ...args) => {
12
+ console.log(pc.blue('INFO: ') + message, ...args);
13
+ },
14
+ success: (message, ...args) => {
15
+ console.log(pc.green('SUCCESS: ') + message, ...args);
16
+ },
17
+ warn: (message, ...args) => {
18
+ console.log(pc.yellow('WARN: ') + message, ...args);
19
+ },
20
+ error: (message, ...args) => {
21
+ console.error(pc.red('ERROR: ') + message, ...args);
22
+ },
23
+ debug: (message, ...args) => {
24
+ if (process.env.DEBUG || process.env.VERBOSE) {
25
+ console.log(pc.gray('DEBUG: ') + message, ...args);
26
+ }
27
+ },
28
+ verbose: (message, ...args) => {
29
+ if (process.env.VERBOSE) {
30
+ console.log(pc.gray('VERBOSE: ') + message, ...args);
31
+ }
32
+ }
33
+ };
34
+ export { logger };
35
+ /**
36
+ * Creates a gradient from cyan to green (singleton pattern to prevent memory leak)
37
+ */
38
+ const teenGradient = gradient('#00C9FF', '#92FE9D');
39
+ /**
40
+ * Prints the welcome banner
41
+ */
42
+ export function printWelcome() {
43
+ console.log('');
44
+ console.log(pc.cyan(`
45
+ ╔═══════════════════════════════════════════════════════════╗
46
+ ║ ║
47
+ ║ ██╗ ██╗ █████╗ ██████╗ ███████╗███╗ ██╗ ║
48
+ ║ ██║ ██║██╔══██╗██╔══██╗ ██╔════╝████╗ ██║ ║
49
+ ║ ██║ █╗ ██║███████║██████╔╝ █████╗ ██╔██╗ ██║ ║
50
+ ║ ██║███╗██║██╔══██║██╔══██╗ ██╔══╝ ██║╚██╗██║ ║
51
+ ║ ╚███╔███╔╝██║ ██║██║ ██║ ███████╗██║ ╚████║ ║
52
+ ║ ╚══╝╚══╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ║
53
+ ║ ║
54
+ ║ Android Project Generator v1.0.0 ║
55
+ ║ Modern Android Development CLI ║
56
+ ║ ║
57
+ ╚═══════════════════════════════════════════════════════════╝
58
+ `));
59
+ console.log('');
60
+ }
61
+ /**
62
+ * Prints the goodbye message
63
+ */
64
+ export function printGoodbye(success = true) {
65
+ // Uses module-level teenGradient constant
66
+ if (success) {
67
+ console.log('');
68
+ console.log(teenGradient(`
69
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
70
+
71
+ Thanks for using andrud! Happy coding! 🚀
72
+
73
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
74
+ `));
75
+ }
76
+ else {
77
+ console.log('');
78
+ console.log(pc.red(`
79
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
80
+
81
+ Operation failed. Please check the error above.
82
+
83
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
84
+ `));
85
+ }
86
+ }
87
+ /**
88
+ * Prints a success message
89
+ */
90
+ export function printSuccess(message, details) {
91
+ console.log(pc.green(' ✓ ') + pc.white(message));
92
+ if (details) {
93
+ console.log(pc.gray(` ${details}`));
94
+ }
95
+ }
96
+ /**
97
+ * Prints an error message
98
+ */
99
+ export function printError(message, details) {
100
+ console.error(pc.red(' ✗ ') + pc.white(message));
101
+ if (details) {
102
+ console.error(pc.gray(` ${details}`));
103
+ }
104
+ }
105
+ /**
106
+ * Prints a section header
107
+ */
108
+ export function printSection(text) {
109
+ console.log('');
110
+ console.log(section(text));
111
+ console.log(dim(printSeparator('─', 50)));
112
+ }
113
+ /**
114
+ * Prints key-value pairs
115
+ */
116
+ export function printKeyValue(items) {
117
+ const maxKeyLength = Math.max(...items.map(item => item.key.length));
118
+ items.forEach(item => {
119
+ const padding = ' '.repeat(maxKeyLength - item.key.length);
120
+ console.log(` ${pc.cyan(item.key)}${padding} ${item.value}`);
121
+ });
122
+ }
123
+ /**
124
+ * Prints a separator line
125
+ */
126
+ export function printSeparatorLine(char = '─', length = 60) {
127
+ console.log(dim(char.repeat(length)));
128
+ }
129
+ /**
130
+ * Prints a banner with text
131
+ */
132
+ export function printBanner(text, color = 'primary') {
133
+ const padding = 4;
134
+ const line = ' '.repeat(padding);
135
+ const border = '━'.repeat(text.length + padding * 2);
136
+ console.log('');
137
+ console.log(pc.cyan(' ' + border));
138
+ console.log(pc.cyan(' ║') + ' '.repeat(padding) + text + ' '.repeat(padding) + pc.cyan('║'));
139
+ console.log(pc.cyan(' ' + border));
140
+ console.log('');
141
+ }
142
+ /**
143
+ * Prints an ASCII box with content
144
+ */
145
+ export function printAsciiBox(lines, options = {}) {
146
+ const border = options.border ?? '─';
147
+ const padding = options.padding ?? 2;
148
+ const maxLength = Math.max(...lines.map(l => l.length));
149
+ const width = maxLength + padding * 2;
150
+ console.log(pc.gray(' ┌' + border.repeat(width) + '┐'));
151
+ if (lines.length === 0) {
152
+ console.log(pc.gray(' │' + ' '.repeat(width) + '│'));
153
+ }
154
+ else {
155
+ lines.forEach(line => {
156
+ const padded = line + ' '.repeat(maxLength - line.length);
157
+ console.log(pc.gray(' │') + ' '.repeat(padding) + padded + ' '.repeat(padding) + pc.gray('│'));
158
+ });
159
+ }
160
+ console.log(pc.gray(' └' + border.repeat(width) + '┘'));
161
+ }
162
+ /**
163
+ * Prints a table with columns
164
+ */
165
+ export function printTable(columns, rows) {
166
+ const colWidths = columns.map(col => {
167
+ const headerWidth = col.header.length;
168
+ const dataWidths = rows.map(row => col.accessor(row).length);
169
+ return col.width ?? Math.max(headerWidth, ...dataWidths);
170
+ });
171
+ // Print header
172
+ const headerRow = columns.map((_col, i) => {
173
+ const width = colWidths[i] ?? 10;
174
+ return _col.header.substring(0, width).padEnd(width);
175
+ });
176
+ console.log(bold(headerRow.join(' ')));
177
+ console.log(pc.gray(colWidths.map(w => '─'.repeat(w)).join(' ')));
178
+ // Print rows
179
+ rows.forEach(row => {
180
+ const dataRow = columns.map((col, i) => {
181
+ const width = colWidths[i] ?? 10;
182
+ const value = col.accessor(row);
183
+ return value.substring(0, width).padEnd(width);
184
+ });
185
+ console.log(dataRow.join(' '));
186
+ });
187
+ }
188
+ /**
189
+ * Prints numbered steps
190
+ */
191
+ export function printSteps(steps) {
192
+ console.log('');
193
+ steps.forEach((step, index) => {
194
+ const num = pc.cyan(`${index + 1}.`);
195
+ console.log(` ${num} ${step}`);
196
+ });
197
+ console.log('');
198
+ }
199
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/ui/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Wrapper around @clack/prompts with proper TypeScript types
3
+ */
4
+ import { select, text, multiselect, confirm, isCancel, cancel, type SelectOptions, type TextOptions, type MultiSelectOptions, type ConfirmOptions } from '@clack/prompts';
5
+ export { select, text, multiselect, confirm, isCancel, cancel, type SelectOptions, type TextOptions, type MultiSelectOptions, type ConfirmOptions };
6
+ export declare function askAppName(defaultValue?: string): Promise<string>;
7
+ export declare function askPackageName(defaultValue?: string): Promise<string>;
8
+ export declare function askDirectory(defaultValue?: string): Promise<string>;
9
+ export declare function selectTemplate<T extends string>(templates: Array<{
10
+ label: string;
11
+ value: T;
12
+ hint?: string;
13
+ }>): Promise<T>;
14
+ export declare function askMultiSelect<T>(options: Array<{
15
+ label: string;
16
+ value: T;
17
+ hint?: string;
18
+ }>, message?: string, min?: number): Promise<T[]>;
19
+ export declare function askConfirmation(message: string, initialValue?: boolean): Promise<boolean>;
20
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,MAAM,EACN,IAAI,EACJ,WAAW,EACX,OAAO,EACP,QAAQ,EACR,MAAM,EACN,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,MAAM,EACN,IAAI,EACJ,WAAW,EACX,OAAO,EACP,QAAQ,EACR,MAAM,EACN,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACpB,CAAC;AAGF,wBAAsB,UAAU,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBvE;AAGD,wBAAsB,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsB3E;AAGD,wBAAsB,YAAY,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBzE;AAGD,wBAAsB,cAAc,CAAC,CAAC,SAAS,MAAM,EACnD,SAAS,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC3D,OAAO,CAAC,CAAC,CAAC,CAiBZ;AAGD,wBAAsB,cAAc,CAAC,CAAC,EACpC,OAAO,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAC1D,OAAO,GAAE,MAA2B,EACpC,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,CAAC,EAAE,CAAC,CAkBd;AAGD,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,OAAO,CAAC,CAYlB"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Wrapper around @clack/prompts with proper TypeScript types
3
+ */
4
+ import { select, text, multiselect, confirm, isCancel, cancel } from '@clack/prompts';
5
+ // Re-export core functions
6
+ export { select, text, multiselect, confirm, isCancel, cancel };
7
+ // Helper function to ask for app name
8
+ export async function askAppName(defaultValue) {
9
+ const value = await text({
10
+ message: '? What is the app name?',
11
+ placeholder: 'MyAwesomeApp',
12
+ defaultValue: defaultValue ?? 'MyAwesomeApp',
13
+ validate: (value) => {
14
+ if (!value || value.trim().length === 0) {
15
+ return 'App name cannot be empty';
16
+ }
17
+ if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(value)) {
18
+ return 'App name must start with a letter and contain only letters, numbers, and underscores';
19
+ }
20
+ return undefined;
21
+ }
22
+ });
23
+ if (isCancel(value)) {
24
+ cancel();
25
+ process.exit(0);
26
+ }
27
+ return value;
28
+ }
29
+ // Helper function to ask for package name
30
+ export async function askPackageName(defaultValue) {
31
+ const value = await text({
32
+ message: '? What is the package name?',
33
+ placeholder: 'com.example.myapp',
34
+ defaultValue: defaultValue ?? 'com.example.myapp',
35
+ validate: (value) => {
36
+ if (!value || value.trim().length === 0) {
37
+ return 'Package name cannot be empty';
38
+ }
39
+ if (!/^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+$/.test(value)) {
40
+ return 'Package name must be a valid domain structure (e.g., com.example.myapp)';
41
+ }
42
+ return undefined;
43
+ }
44
+ });
45
+ if (isCancel(value)) {
46
+ cancel();
47
+ process.exit(0);
48
+ }
49
+ return value;
50
+ }
51
+ // Helper function to ask for project directory
52
+ export async function askDirectory(defaultValue) {
53
+ const value = await text({
54
+ message: '? In which directory should the project be created?',
55
+ placeholder: './my-app',
56
+ defaultValue: defaultValue ?? './my-app',
57
+ validate: (value) => {
58
+ if (!value || value.trim().length === 0) {
59
+ return 'Directory path cannot be empty';
60
+ }
61
+ if (value.includes('..')) {
62
+ return 'Directory path cannot contain ".." to prevent directory traversal';
63
+ }
64
+ return undefined;
65
+ }
66
+ });
67
+ if (isCancel(value)) {
68
+ cancel();
69
+ process.exit(0);
70
+ }
71
+ return value;
72
+ }
73
+ // Template selection helper
74
+ export async function selectTemplate(templates) {
75
+ const options = templates.map(t => ({
76
+ label: t.label + (t.hint ? ` ${t.hint}` : ''),
77
+ value: t.value
78
+ }));
79
+ const value = await select({
80
+ message: '? Select a project template',
81
+ options
82
+ });
83
+ if (isCancel(value)) {
84
+ cancel();
85
+ process.exit(0);
86
+ }
87
+ return value;
88
+ }
89
+ // Multi-select helper
90
+ export async function askMultiSelect(options, message = '? Select options', min) {
91
+ const formattedOptions = options.map(o => ({
92
+ label: o.label + (o.hint ? ` (${o.hint})` : ''),
93
+ value: o.value
94
+ }));
95
+ const value = await multiselect({
96
+ message,
97
+ options: formattedOptions,
98
+ ...(min !== undefined ? { min } : {})
99
+ });
100
+ if (isCancel(value)) {
101
+ cancel();
102
+ process.exit(0);
103
+ }
104
+ return value;
105
+ }
106
+ // Confirmation helper
107
+ export async function askConfirmation(message, initialValue = false) {
108
+ const value = await confirm({
109
+ message: `? ${message}`,
110
+ initialValue
111
+ });
112
+ if (isCancel(value)) {
113
+ cancel();
114
+ process.exit(0);
115
+ }
116
+ return value;
117
+ }
118
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Spinner utilities using ora
3
+ */
4
+ import { type Ora } from 'ora';
5
+ export declare class AsyncSpinner {
6
+ private spinner;
7
+ private startTime;
8
+ start(text?: string): void;
9
+ update(text: string): void;
10
+ succeed(text?: string): void;
11
+ fail(text?: string): void;
12
+ warn(text?: string): void;
13
+ stop(): void;
14
+ isSpinning(): boolean;
15
+ }
16
+ export interface WithSpinnerOptions {
17
+ text?: string;
18
+ successText?: string;
19
+ failText?: string;
20
+ warnText?: string;
21
+ }
22
+ /**
23
+ * Executes an async function with a spinner
24
+ */
25
+ export declare function withSpinner<T>(text: string, fn: () => Promise<T>, options?: WithSpinnerOptions): Promise<T>;
26
+ /**
27
+ * Creates a simple loading indicator
28
+ */
29
+ export declare function createSpinner(text?: string): Ora;
30
+ //# sourceMappingURL=spinners.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinners.d.ts","sourceRoot":"","sources":["../../src/ui/spinners.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAEpC,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,SAAS,CAAa;IAE9B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAQ1B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM1B,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAQ5B,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAQzB,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAMzB,IAAI,IAAI,IAAI;IAOZ,UAAU,IAAI,OAAO;CAGtB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,CAAC,CAAC,CAYZ;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG,CAKhD"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Spinner utilities using ora
3
+ */
4
+ import ora from 'ora';
5
+ export class AsyncSpinner {
6
+ spinner = null;
7
+ startTime = 0;
8
+ start(text) {
9
+ this.startTime = Date.now();
10
+ this.spinner = ora({
11
+ text: text ?? 'Loading...',
12
+ spinner: 'dots'
13
+ }).start();
14
+ }
15
+ update(text) {
16
+ if (this.spinner) {
17
+ this.spinner.text = text;
18
+ }
19
+ }
20
+ succeed(text) {
21
+ if (this.spinner) {
22
+ const elapsed = ((Date.now() - this.startTime) / 1000).toFixed(1);
23
+ this.spinner.succeed(text ? `${text} (${elapsed}s)` : undefined);
24
+ this.spinner = null;
25
+ }
26
+ }
27
+ fail(text) {
28
+ if (this.spinner) {
29
+ const elapsed = ((Date.now() - this.startTime) / 1000).toFixed(1);
30
+ this.spinner.fail(text ? `${text} (${elapsed}s)` : undefined);
31
+ this.spinner = null;
32
+ }
33
+ }
34
+ warn(text) {
35
+ if (this.spinner) {
36
+ this.spinner.warn(text);
37
+ }
38
+ }
39
+ stop() {
40
+ if (this.spinner) {
41
+ this.spinner.stop();
42
+ this.spinner = null;
43
+ }
44
+ }
45
+ isSpinning() {
46
+ return this.spinner?.isSpinning ?? false;
47
+ }
48
+ }
49
+ /**
50
+ * Executes an async function with a spinner
51
+ */
52
+ export async function withSpinner(text, fn, options) {
53
+ const spinner = new AsyncSpinner();
54
+ spinner.start(text);
55
+ try {
56
+ const result = await fn();
57
+ spinner.succeed(options?.successText);
58
+ return result;
59
+ }
60
+ catch (error) {
61
+ spinner.fail(options?.failText ?? (error instanceof Error ? error.message : 'An error occurred'));
62
+ throw error;
63
+ }
64
+ }
65
+ /**
66
+ * Creates a simple loading indicator
67
+ */
68
+ export function createSpinner(text) {
69
+ return ora({
70
+ text,
71
+ spinner: 'dots'
72
+ });
73
+ }
74
+ //# sourceMappingURL=spinners.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinners.js","sourceRoot":"","sources":["../../src/ui/spinners.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Type definitions for UI components and utilities
3
+ */
4
+ export type StyleType = 'primary' | 'success' | 'warning' | 'error' | 'info' | 'muted';
5
+ export interface SpinnerOptions {
6
+ text?: string;
7
+ color?: string;
8
+ }
9
+ export interface TableColumn<T> {
10
+ header: string;
11
+ accessor: (row: T) => string;
12
+ width?: number;
13
+ }
14
+ export interface ConfirmationOptions {
15
+ message: string;
16
+ initialValue?: boolean;
17
+ }
18
+ export interface SelectOption<T> {
19
+ label: string;
20
+ value: T;
21
+ hint?: string;
22
+ }
23
+ export interface TextInputOptions {
24
+ message: string;
25
+ placeholder?: string;
26
+ defaultValue?: string;
27
+ validate?: (value: string) => string | null;
28
+ }
29
+ export interface MultiSelectOptions<T> {
30
+ message: string;
31
+ options: SelectOption<T>[];
32
+ min?: number;
33
+ max?: number;
34
+ }
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ui/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAEvF,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Type definitions for UI components and utilities
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ui/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * File system utilities using fs-extra
3
+ */
4
+ export declare function exists(path: string): Promise<boolean>;
5
+ export declare function isDirectory(path: string): Promise<boolean>;
6
+ export declare function isFile(path: string): Promise<boolean>;
7
+ export declare function readFile(path: string): Promise<string>;
8
+ export declare function writeFile(path: string, content: string): Promise<void>;
9
+ export declare function readJson<T = unknown>(path: string): Promise<T>;
10
+ export declare function writeJson(path: string, data: unknown, spaces?: number): Promise<void>;
11
+ export declare function copyFile(source: string, destination: string): Promise<void>;
12
+ export declare function moveFile(source: string, destination: string): Promise<void>;
13
+ export declare function removeFile(path: string): Promise<void>;
14
+ export declare function createDirectory(path: string): Promise<void>;
15
+ export declare function removeDirectory(path: string): Promise<void>;
16
+ export declare function copyDirectory(source: string, destination: string): Promise<void>;
17
+ export declare function ensureDirectory(path: string): Promise<void>;
18
+ export declare function ensureFile(path: string): Promise<void>;
19
+ export declare function getAbsolutePath(path: string): string;
20
+ export declare function normalizePath(path: string): string;
21
+ export declare function joinPath(...paths: string[]): string;
22
+ export declare function dirnamePath(path: string): string;
23
+ export declare function basenamePath(path: string, ext?: string): string;
24
+ export declare function extnamePath(path: string): string;
25
+ export declare function relativePath(from: string, to: string): string;
26
+ export declare function getCurrentWorkingDirectory(): string;
27
+ export declare function getPackageRoot(): string;
28
+ export declare function listFiles(directory: string, extensions?: string[]): Promise<string[]>;
29
+ export declare function readDirectory(directory: string): Promise<string[]>;
30
+ /**
31
+ * Write file with timeout protection
32
+ */
33
+ export declare function writeFileWithTimeout(path: string, content: string, timeoutMs?: number): Promise<void>;
34
+ /**
35
+ * Create directory with timeout protection
36
+ */
37
+ export declare function createDirectoryWithTimeout(path: string, timeoutMs?: number): Promise<void>;
38
+ //# sourceMappingURL=filesystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"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"}