andrud 1.0.1 → 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 (121) hide show
  1. package/README.md +295 -306
  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 +10 -21
  95. package/CHANGELOG.md +0 -70
  96. package/CONTRIBUTING.md +0 -132
  97. package/sc.png +0 -0
  98. package/src/__tests__/context.test.ts +0 -133
  99. package/src/__tests__/generator.test.ts +0 -107
  100. package/src/__tests__/validation.test.ts +0 -105
  101. package/src/cli/commands/create.ts +0 -252
  102. package/src/cli/commands/info.ts +0 -178
  103. package/src/cli/commands/init.ts +0 -186
  104. package/src/cli/commands/list.ts +0 -156
  105. package/src/cli/commands/new.ts +0 -316
  106. package/src/cli/index.ts +0 -116
  107. package/src/core/config.ts +0 -172
  108. package/src/core/context.ts +0 -212
  109. package/src/core/types.ts +0 -184
  110. package/src/templates/index.ts +0 -162
  111. package/src/types/gradient-string.d.ts +0 -25
  112. package/src/ui/colors.ts +0 -139
  113. package/src/ui/output.ts +0 -230
  114. package/src/ui/prompts.ts +0 -170
  115. package/src/ui/spinners.ts +0 -95
  116. package/src/ui/types.ts +0 -41
  117. package/src/utils/filesystem.ts +0 -222
  118. package/src/utils/logger.ts +0 -67
  119. package/src/utils/object.ts +0 -456
  120. package/src/utils/validation.ts +0 -345
  121. package/tsconfig.json +0 -25
@@ -0,0 +1,181 @@
1
+ /**
2
+ * File system utilities using fs-extra
3
+ */
4
+ import fse from 'fs-extra';
5
+ import { resolve, join, dirname, basename, extname, relative, normalize, isAbsolute } from 'path';
6
+ import { fileURLToPath } from 'url';
7
+ // Check if path exists
8
+ export async function exists(path) {
9
+ try {
10
+ await fse.access(path);
11
+ return true;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ // Check if path is a directory
18
+ export async function isDirectory(path) {
19
+ try {
20
+ const stats = await fse.stat(path);
21
+ return stats.isDirectory();
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ }
27
+ // Check if path is a file
28
+ export async function isFile(path) {
29
+ try {
30
+ const stats = await fse.stat(path);
31
+ return stats.isFile();
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }
37
+ // Read file content
38
+ export async function readFile(path) {
39
+ return fse.readFile(path, 'utf-8');
40
+ }
41
+ // Write file content
42
+ export async function writeFile(path, content) {
43
+ await fse.writeFile(path, content, 'utf-8');
44
+ }
45
+ // Read JSON file
46
+ export async function readJson(path) {
47
+ return fse.readJson(path);
48
+ }
49
+ // Write JSON file
50
+ export async function writeJson(path, data, spaces = 2) {
51
+ await fse.writeJson(path, data, { spaces });
52
+ }
53
+ // Copy file
54
+ export async function copyFile(source, destination) {
55
+ await fse.copy(source, destination);
56
+ }
57
+ // Move file
58
+ export async function moveFile(source, destination) {
59
+ await fse.move(source, destination);
60
+ }
61
+ // Remove file
62
+ export async function removeFile(path) {
63
+ try {
64
+ await fse.remove(path);
65
+ }
66
+ catch {
67
+ // Ignore errors if file doesn't exist
68
+ }
69
+ }
70
+ // Create directory
71
+ export async function createDirectory(path) {
72
+ await fse.mkdir(path, { recursive: true });
73
+ }
74
+ // Remove directory
75
+ export async function removeDirectory(path) {
76
+ try {
77
+ await fse.remove(path);
78
+ }
79
+ catch {
80
+ // Ignore errors if directory doesn't exist
81
+ }
82
+ }
83
+ // Copy directory
84
+ export async function copyDirectory(source, destination) {
85
+ await fse.copy(source, destination);
86
+ }
87
+ // Ensure directory exists
88
+ export async function ensureDirectory(path) {
89
+ await fse.ensureDir(path);
90
+ }
91
+ // Ensure file exists (creates empty file if it doesn't)
92
+ export async function ensureFile(path) {
93
+ await fse.ensureFile(path);
94
+ }
95
+ // Get absolute path
96
+ export function getAbsolutePath(path) {
97
+ if (isAbsolute(path)) {
98
+ return normalize(path);
99
+ }
100
+ return resolve(getCurrentWorkingDirectory(), path);
101
+ }
102
+ // Normalize path
103
+ export function normalizePath(path) {
104
+ return normalize(path);
105
+ }
106
+ // Join path segments
107
+ export function joinPath(...paths) {
108
+ return join(...paths);
109
+ }
110
+ // Get directory name
111
+ export function dirnamePath(path) {
112
+ return dirname(path);
113
+ }
114
+ // Get base name
115
+ export function basenamePath(path, ext) {
116
+ return basename(path, ext);
117
+ }
118
+ // Get extension
119
+ export function extnamePath(path) {
120
+ return extname(path);
121
+ }
122
+ // Get relative path
123
+ export function relativePath(from, to) {
124
+ return relative(from, to);
125
+ }
126
+ // Get current working directory
127
+ export function getCurrentWorkingDirectory() {
128
+ return process.cwd();
129
+ }
130
+ // Get package root directory
131
+ export function getPackageRoot() {
132
+ const currentFile = import.meta.url;
133
+ if (currentFile.startsWith('file://')) {
134
+ const currentDir = fileURLToPath(new URL('.', currentFile));
135
+ return resolve(currentDir, '..');
136
+ }
137
+ return getCurrentWorkingDirectory();
138
+ }
139
+ // List files in directory
140
+ export async function listFiles(directory, extensions) {
141
+ const files = [];
142
+ async function walk(dir) {
143
+ const entries = await fse.readdir(dir, { withFileTypes: true });
144
+ for (const entry of entries) {
145
+ const fullPath = join(dir, entry.name);
146
+ if (entry.isDirectory()) {
147
+ await walk(fullPath);
148
+ }
149
+ else if (entry.isFile()) {
150
+ if (!extensions || extensions.some(ext => entry.name.endsWith(ext))) {
151
+ files.push(fullPath);
152
+ }
153
+ }
154
+ }
155
+ }
156
+ await walk(directory);
157
+ return files;
158
+ }
159
+ // Read directory contents
160
+ export async function readDirectory(directory) {
161
+ return fse.readdir(directory);
162
+ }
163
+ /**
164
+ * Write file with timeout protection
165
+ */
166
+ export async function writeFileWithTimeout(path, content, timeoutMs = 5000) {
167
+ return Promise.race([
168
+ writeFile(path, content),
169
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Write operation timeout after ${timeoutMs}ms`)), timeoutMs))
170
+ ]);
171
+ }
172
+ /**
173
+ * Create directory with timeout protection
174
+ */
175
+ export async function createDirectoryWithTimeout(path, timeoutMs = 5000) {
176
+ return Promise.race([
177
+ createDirectory(path),
178
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Create directory operation timeout after ${timeoutMs}ms`)), timeoutMs))
179
+ ]);
180
+ }
181
+ //# sourceMappingURL=filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Logging utilities with structured logging levels
3
+ */
4
+ export declare enum LogLevel {
5
+ DEBUG = 0,
6
+ INFO = 1,
7
+ WARN = 2,
8
+ ERROR = 3
9
+ }
10
+ export interface LoggerOptions {
11
+ level?: LogLevel;
12
+ verbose?: boolean;
13
+ }
14
+ export declare class Logger {
15
+ private level;
16
+ private verbose;
17
+ constructor(options?: LoggerOptions);
18
+ debug(message: string, data?: unknown): void;
19
+ info(message: string, data?: unknown): void;
20
+ warn(message: string, data?: unknown): void;
21
+ error(message: string, error?: Error | string): void;
22
+ success(message: string): void;
23
+ setLevel(level: LogLevel): void;
24
+ setVerbose(verbose: boolean): void;
25
+ }
26
+ export declare const defaultLogger: Logger;
27
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,OAAO,CAAU;gBAEb,OAAO,GAAE,aAAkB;IAKvC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAM5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAM3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAM3C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI;IAIpD,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI/B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAGnC;AAGD,eAAO,MAAM,aAAa,QAGxB,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Logging utilities with structured logging levels
3
+ */
4
+ import pc from 'picocolors';
5
+ export var LogLevel;
6
+ (function (LogLevel) {
7
+ LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
8
+ LogLevel[LogLevel["INFO"] = 1] = "INFO";
9
+ LogLevel[LogLevel["WARN"] = 2] = "WARN";
10
+ LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
11
+ })(LogLevel || (LogLevel = {}));
12
+ export class Logger {
13
+ level;
14
+ verbose;
15
+ constructor(options = {}) {
16
+ this.level = options.level ?? LogLevel.INFO;
17
+ this.verbose = options.verbose ?? false;
18
+ }
19
+ debug(message, data) {
20
+ if (this.level <= LogLevel.DEBUG) {
21
+ console.log(pc.gray(`[DEBUG] ${message}`), data ?? '');
22
+ }
23
+ }
24
+ info(message, data) {
25
+ if (this.level <= LogLevel.INFO) {
26
+ console.log(pc.blue(`[INFO] ${message}`), data ?? '');
27
+ }
28
+ }
29
+ warn(message, data) {
30
+ if (this.level <= LogLevel.WARN) {
31
+ console.log(pc.yellow(`[WARN] ${message}`), data ?? '');
32
+ }
33
+ }
34
+ error(message, error) {
35
+ console.error(pc.red(`[ERROR] ${message}`), error ?? '');
36
+ }
37
+ success(message) {
38
+ console.log(pc.green(`[SUCCESS] ${message}`));
39
+ }
40
+ setLevel(level) {
41
+ this.level = level;
42
+ }
43
+ setVerbose(verbose) {
44
+ this.verbose = verbose;
45
+ }
46
+ }
47
+ // Create default logger instance
48
+ export const defaultLogger = new Logger({
49
+ level: process.env.DEBUG ? LogLevel.DEBUG : LogLevel.INFO,
50
+ verbose: process.env.VERBOSE === 'true'
51
+ });
52
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,yCAAS,CAAA;IACT,uCAAQ,CAAA;IACR,uCAAQ,CAAA;IACR,yCAAS,CAAA;AACX,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;AAOD,MAAM,OAAO,MAAM;IACT,KAAK,CAAW;IAChB,OAAO,CAAU;IAEzB,YAAY,UAAyB,EAAE;QACrC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAAc;QACnC,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAAc;QAClC,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,OAAO,EAAE,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAAc;QAClC,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,OAAO,EAAE,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,KAAsB;QAC3C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,QAAQ,CAAC,KAAe;QACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,UAAU,CAAC,OAAgB;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,iCAAiC;AACjC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC;IACtC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI;IACzD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,MAAM;CACxC,CAAC,CAAC"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Object and array utilities
3
+ */
4
+ /**
5
+ * Deep merge objects
6
+ */
7
+ export declare function merge<T extends object>(target: T, ...sources: Partial<T>[]): T;
8
+ /**
9
+ * Omit keys from object
10
+ */
11
+ export declare function omit<T extends object, K extends keyof T>(obj: T, keys: K[]): Omit<T, K>;
12
+ /**
13
+ * Pick keys from object
14
+ */
15
+ export declare function pick<T extends object, K extends keyof T>(obj: T, keys: K[]): Pick<T, K>;
16
+ /**
17
+ * Invert object keys and values
18
+ */
19
+ export declare function invert<T extends Record<string, string | number>>(obj: T): Record<string, string>;
20
+ /**
21
+ * Map values of object
22
+ */
23
+ export declare function mapValues<T extends object, U>(obj: T, fn: (value: T[keyof T], key: keyof T) => U): Record<keyof T, U>;
24
+ /**
25
+ * Filter object keys
26
+ */
27
+ export declare function filterKeys<T extends object>(obj: T, fn: (key: keyof T) => boolean): Partial<T>;
28
+ /**
29
+ * Group array items by key
30
+ */
31
+ export declare function groupBy<T, K extends string | number>(array: T[], keyFn: (item: T) => K): Record<K, T[]>;
32
+ /**
33
+ * Get unique values
34
+ */
35
+ export declare function unique<T>(array: T[]): T[];
36
+ /**
37
+ * Get unique values by predicate
38
+ */
39
+ export declare function uniqueBy<T>(array: T[], predicate: (item: T) => unknown): T[];
40
+ /**
41
+ * Split array into chunks
42
+ */
43
+ export declare function chunk<T>(array: T[], size: number): T[][];
44
+ /**
45
+ * Flatten array one level
46
+ */
47
+ export declare function flatten<T>(array: (T | T[])[]): T[];
48
+ /**
49
+ * Deep flatten nested array
50
+ */
51
+ export declare function flattenDeep<T>(array: (T | T[])[]): T[];
52
+ /**
53
+ * Get difference between arrays
54
+ */
55
+ export declare function difference<T>(a: T[], b: T[]): T[];
56
+ /**
57
+ * Get intersection of arrays
58
+ */
59
+ export declare function intersection<T>(a: T[], b: T[]): T[];
60
+ /**
61
+ * Get union of arrays
62
+ */
63
+ export declare function union<T>(...arrays: T[][]): T[];
64
+ /**
65
+ * Sort array by key
66
+ */
67
+ export declare function sortBy<T>(array: T[], keyFn: (item: T) => unknown | unknown[]): T[];
68
+ /**
69
+ * Partition array by predicate
70
+ */
71
+ export declare function partition<T>(array: T[], predicate: (item: T) => boolean): [T[], T[]];
72
+ /**
73
+ * Remove falsy values from array
74
+ */
75
+ export declare function compact<T>(array: (T | null | undefined | false | '' | 0)[]): T[];
76
+ /**
77
+ * Zip arrays together
78
+ */
79
+ export declare function zip<T, U>(a: T[], b: U[]): Array<[T, U]>;
80
+ /**
81
+ * Unzip zipped arrays
82
+ */
83
+ export declare function unzip<T, U>(zipped: Array<[T, U]>): [T[], U[]];
84
+ /**
85
+ * Generate range of numbers
86
+ */
87
+ export declare function range(start: number, end?: number, step?: number): number[];
88
+ /**
89
+ * Generate array of repeated values
90
+ */
91
+ export declare function times<T>(n: number, fn: (index: number) => T): T[];
92
+ /**
93
+ * Clamp number between min and max
94
+ */
95
+ export declare function clamp(value: number, min: number, max: number): number;
96
+ /**
97
+ * Generate random integer between min and max
98
+ */
99
+ export declare function randomInt(min: number, max: number): number;
100
+ /**
101
+ * Get random element from array
102
+ */
103
+ export declare function randomElement<T>(array: T[]): T | undefined;
104
+ /**
105
+ * Shuffle array in place
106
+ */
107
+ export declare function shuffle<T>(array: T[]): T[];
108
+ /**
109
+ * Sleep for specified milliseconds
110
+ */
111
+ export declare function sleep(ms: number): Promise<void>;
112
+ export interface RetryOptions {
113
+ retries?: number;
114
+ delay?: number;
115
+ backoff?: number;
116
+ onRetry?: (error: Error, attempt: number) => void;
117
+ }
118
+ /**
119
+ * Retry function on failure
120
+ */
121
+ export declare function retry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
122
+ /**
123
+ * Memoize function results
124
+ */
125
+ export declare function memoize<T extends (...args: unknown[]) => unknown>(fn: T): T & {
126
+ clear: () => void;
127
+ };
128
+ /**
129
+ * Deep clone an object
130
+ */
131
+ export declare function deepClone<T>(obj: T): T;
132
+ /**
133
+ * Deep equality check
134
+ */
135
+ export declare function deepEqual(a: unknown, b: unknown): boolean;
136
+ /**
137
+ * Deep merge objects
138
+ */
139
+ export declare function deepMerge<T extends object>(target: T, ...sources: Partial<T>[]): T;
140
+ //# sourceMappingURL=object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/utils/object.ts"],"names":[],"mappings":"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"}