indusagi-coding-agent 0.1.22 → 0.1.24

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 (222) hide show
  1. package/CHANGELOG.md +72 -11
  2. package/README.md +2 -36
  3. package/dist/cli/args.d.ts +117 -1
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +231 -64
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/config-selector.d.ts +58 -2
  8. package/dist/cli/config-selector.d.ts.map +1 -1
  9. package/dist/cli/config-selector.js +130 -12
  10. package/dist/cli/config-selector.js.map +1 -1
  11. package/dist/cli/file-processor.d.ts +70 -2
  12. package/dist/cli/file-processor.d.ts.map +1 -1
  13. package/dist/cli/file-processor.js +240 -15
  14. package/dist/cli/file-processor.js.map +1 -1
  15. package/dist/cli/list-models.d.ts +63 -3
  16. package/dist/cli/list-models.d.ts.map +1 -1
  17. package/dist/cli/list-models.js +202 -27
  18. package/dist/cli/list-models.js.map +1 -1
  19. package/dist/cli/login-handler.d.ts +82 -8
  20. package/dist/cli/login-handler.d.ts.map +1 -1
  21. package/dist/cli/login-handler.js +410 -77
  22. package/dist/cli/login-handler.js.map +1 -1
  23. package/dist/cli/session-picker.d.ts +74 -2
  24. package/dist/cli/session-picker.d.ts.map +1 -1
  25. package/dist/cli/session-picker.js +236 -12
  26. package/dist/cli/session-picker.js.map +1 -1
  27. package/dist/core/agent-session.d.ts +214 -9
  28. package/dist/core/agent-session.d.ts.map +1 -1
  29. package/dist/core/agent-session.js +214 -9
  30. package/dist/core/agent-session.js.map +1 -1
  31. package/dist/core/bash-executor.d.ts +302 -12
  32. package/dist/core/bash-executor.d.ts.map +1 -1
  33. package/dist/core/bash-executor.js +302 -12
  34. package/dist/core/bash-executor.js.map +1 -1
  35. package/dist/core/diagnostics.d.ts +191 -0
  36. package/dist/core/diagnostics.d.ts.map +1 -1
  37. package/dist/core/diagnostics.js +142 -0
  38. package/dist/core/diagnostics.js.map +1 -1
  39. package/dist/core/event-bus.d.ts +146 -0
  40. package/dist/core/event-bus.d.ts.map +1 -1
  41. package/dist/core/event-bus.js +93 -0
  42. package/dist/core/event-bus.js.map +1 -1
  43. package/dist/core/export-html/ansi-to-html.d.ts +4 -0
  44. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  45. package/dist/core/export-html/ansi-to-html.js +4 -0
  46. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  47. package/dist/core/export-html/index.d.ts +128 -0
  48. package/dist/core/export-html/index.d.ts.map +1 -1
  49. package/dist/core/export-html/index.js +128 -0
  50. package/dist/core/export-html/index.js.map +1 -1
  51. package/dist/core/export-html/tool-renderer.d.ts +4 -0
  52. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  53. package/dist/core/export-html/tool-renderer.js +4 -0
  54. package/dist/core/export-html/tool-renderer.js.map +1 -1
  55. package/dist/core/keybindings.d.ts +142 -0
  56. package/dist/core/keybindings.d.ts.map +1 -1
  57. package/dist/core/keybindings.js +142 -0
  58. package/dist/core/keybindings.js.map +1 -1
  59. package/dist/core/model-registry.d.ts +98 -1
  60. package/dist/core/model-registry.d.ts.map +1 -1
  61. package/dist/core/model-registry.js +98 -1
  62. package/dist/core/model-registry.js.map +1 -1
  63. package/dist/core/model-resolver.d.ts +99 -1
  64. package/dist/core/model-resolver.d.ts.map +1 -1
  65. package/dist/core/model-resolver.js +99 -1
  66. package/dist/core/model-resolver.js.map +1 -1
  67. package/dist/core/prompt-templates.js.map +1 -1
  68. package/dist/core/sdk.d.ts +1 -1
  69. package/dist/core/sdk.d.ts.map +1 -1
  70. package/dist/core/sdk.js +0 -2
  71. package/dist/core/sdk.js.map +1 -1
  72. package/dist/core/session-manager.d.ts +127 -0
  73. package/dist/core/session-manager.d.ts.map +1 -1
  74. package/dist/core/session-manager.js +125 -0
  75. package/dist/core/session-manager.js.map +1 -1
  76. package/dist/core/skills.js.map +1 -1
  77. package/dist/core/subagents.js.map +1 -1
  78. package/dist/core/tools/bash.d.ts +391 -11
  79. package/dist/core/tools/bash.d.ts.map +1 -1
  80. package/dist/core/tools/bash.js +269 -2
  81. package/dist/core/tools/bash.js.map +1 -1
  82. package/dist/core/tools/edit.d.ts +284 -6
  83. package/dist/core/tools/edit.d.ts.map +1 -1
  84. package/dist/core/tools/edit.js +238 -0
  85. package/dist/core/tools/edit.js.map +1 -1
  86. package/dist/core/tools/find.d.ts +169 -5
  87. package/dist/core/tools/find.d.ts.map +1 -1
  88. package/dist/core/tools/find.js +136 -0
  89. package/dist/core/tools/find.js.map +1 -1
  90. package/dist/core/tools/grep.d.ts +285 -5
  91. package/dist/core/tools/grep.d.ts.map +1 -1
  92. package/dist/core/tools/grep.js +247 -0
  93. package/dist/core/tools/grep.js.map +1 -1
  94. package/dist/core/tools/index.d.ts +0 -18
  95. package/dist/core/tools/index.d.ts.map +1 -1
  96. package/dist/core/tools/index.js +1 -23
  97. package/dist/core/tools/index.js.map +1 -1
  98. package/dist/core/tools/ls.d.ts +6 -0
  99. package/dist/core/tools/ls.d.ts.map +1 -1
  100. package/dist/core/tools/ls.js +6 -0
  101. package/dist/core/tools/ls.js.map +1 -1
  102. package/dist/core/tools/read.d.ts +308 -7
  103. package/dist/core/tools/read.d.ts.map +1 -1
  104. package/dist/core/tools/read.js +231 -0
  105. package/dist/core/tools/read.js.map +1 -1
  106. package/dist/core/tools/webfetch.d.ts +118 -3
  107. package/dist/core/tools/webfetch.d.ts.map +1 -1
  108. package/dist/core/tools/webfetch.js +118 -3
  109. package/dist/core/tools/webfetch.js.map +1 -1
  110. package/dist/core/tools/websearch.d.ts +130 -3
  111. package/dist/core/tools/websearch.d.ts.map +1 -1
  112. package/dist/core/tools/websearch.js +130 -3
  113. package/dist/core/tools/websearch.js.map +1 -1
  114. package/dist/core/tools/write.d.ts +251 -5
  115. package/dist/core/tools/write.d.ts.map +1 -1
  116. package/dist/core/tools/write.js +210 -0
  117. package/dist/core/tools/write.js.map +1 -1
  118. package/dist/modes/interactive/components/assistant-message.d.ts +164 -1
  119. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  120. package/dist/modes/interactive/components/assistant-message.js +164 -1
  121. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  122. package/dist/modes/interactive/components/bash-execution.d.ts +297 -1
  123. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  124. package/dist/modes/interactive/components/bash-execution.js +297 -1
  125. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  126. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  127. package/dist/modes/interactive/components/tool-execution.js +251 -1
  128. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  129. package/dist/modes/interactive/components/user-message.d.ts +186 -1
  130. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  131. package/dist/modes/interactive/components/user-message.js +186 -1
  132. package/dist/modes/interactive/components/user-message.js.map +1 -1
  133. package/dist/modes/interactive/interactive-mode.d.ts +1567 -13
  134. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  135. package/dist/modes/interactive/interactive-mode.js +1567 -13
  136. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  137. package/dist/modes/interactive/theme/theme.d.ts +422 -0
  138. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  139. package/dist/modes/interactive/theme/theme.js +422 -0
  140. package/dist/modes/interactive/theme/theme.js.map +1 -1
  141. package/dist/modes/print-mode.d.ts +538 -5
  142. package/dist/modes/print-mode.d.ts.map +1 -1
  143. package/dist/modes/print-mode.js +538 -5
  144. package/dist/modes/print-mode.js.map +1 -1
  145. package/dist/modes/rpc/rpc-client.d.ts +921 -8
  146. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  147. package/dist/modes/rpc/rpc-client.js +921 -8
  148. package/dist/modes/rpc/rpc-client.js.map +1 -1
  149. package/dist/modes/rpc/rpc-mode.d.ts +802 -9
  150. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  151. package/dist/modes/rpc/rpc-mode.js +802 -9
  152. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  153. package/dist/modes/rpc/rpc-types.d.ts +356 -3
  154. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  155. package/dist/modes/rpc/rpc-types.js +356 -3
  156. package/dist/modes/rpc/rpc-types.js.map +1 -1
  157. package/dist/modes/shared.d.ts +386 -0
  158. package/dist/modes/shared.d.ts.map +1 -0
  159. package/dist/modes/shared.js +543 -0
  160. package/dist/modes/shared.js.map +1 -0
  161. package/dist/utils/array.d.ts +389 -0
  162. package/dist/utils/array.d.ts.map +1 -0
  163. package/dist/utils/array.js +585 -0
  164. package/dist/utils/array.js.map +1 -0
  165. package/dist/utils/color-formatter.d.ts +318 -0
  166. package/dist/utils/color-formatter.d.ts.map +1 -0
  167. package/dist/utils/color-formatter.js +442 -0
  168. package/dist/utils/color-formatter.js.map +1 -0
  169. package/dist/utils/data-transformer.d.ts +326 -0
  170. package/dist/utils/data-transformer.d.ts.map +1 -0
  171. package/dist/utils/data-transformer.js +512 -0
  172. package/dist/utils/data-transformer.js.map +1 -0
  173. package/dist/utils/date-formatter.d.ts +281 -0
  174. package/dist/utils/date-formatter.d.ts.map +1 -0
  175. package/dist/utils/date-formatter.js +503 -0
  176. package/dist/utils/date-formatter.js.map +1 -0
  177. package/dist/utils/error-handler.d.ts +541 -0
  178. package/dist/utils/error-handler.d.ts.map +1 -0
  179. package/dist/utils/error-handler.js +726 -0
  180. package/dist/utils/error-handler.js.map +1 -0
  181. package/dist/utils/file-operations.d.ts +297 -0
  182. package/dist/utils/file-operations.d.ts.map +1 -0
  183. package/dist/utils/file-operations.js +505 -0
  184. package/dist/utils/file-operations.js.map +1 -0
  185. package/dist/utils/frontmatter.d.ts +268 -6
  186. package/dist/utils/frontmatter.d.ts.map +1 -1
  187. package/dist/utils/frontmatter.js +500 -21
  188. package/dist/utils/frontmatter.js.map +1 -1
  189. package/dist/utils/json-formatter.d.ts +259 -0
  190. package/dist/utils/json-formatter.d.ts.map +1 -0
  191. package/dist/utils/json-formatter.js +517 -0
  192. package/dist/utils/json-formatter.js.map +1 -0
  193. package/dist/utils/logger.d.ts +176 -0
  194. package/dist/utils/logger.d.ts.map +1 -0
  195. package/dist/utils/logger.js +346 -0
  196. package/dist/utils/logger.js.map +1 -0
  197. package/dist/utils/markdown-formatter.d.ts +211 -0
  198. package/dist/utils/markdown-formatter.d.ts.map +1 -0
  199. package/dist/utils/markdown-formatter.js +482 -0
  200. package/dist/utils/markdown-formatter.js.map +1 -0
  201. package/dist/utils/path-validator.d.ts +603 -0
  202. package/dist/utils/path-validator.d.ts.map +1 -0
  203. package/dist/utils/path-validator.js +870 -0
  204. package/dist/utils/path-validator.js.map +1 -0
  205. package/dist/utils/string-formatter.d.ts +609 -0
  206. package/dist/utils/string-formatter.d.ts.map +1 -0
  207. package/dist/utils/string-formatter.js +806 -0
  208. package/dist/utils/string-formatter.js.map +1 -0
  209. package/dist/utils/type-guards.d.ts +629 -0
  210. package/dist/utils/type-guards.d.ts.map +1 -0
  211. package/dist/utils/type-guards.js +662 -0
  212. package/dist/utils/type-guards.js.map +1 -0
  213. package/docs/COMPLETE-GUIDE.md +300 -0
  214. package/docs/MODES-ARCHITECTURE.md +565 -0
  215. package/docs/PRINT-MODE-GUIDE.md +456 -0
  216. package/docs/README.md +1 -2
  217. package/docs/RPC-GUIDE.md +705 -0
  218. package/docs/UTILS-IMPLEMENTATION-SUMMARY.md +647 -0
  219. package/docs/UTILS-MODULE-OVERVIEW.md +1480 -0
  220. package/docs/UTILS-QA-CHECKLIST.md +1061 -0
  221. package/docs/UTILS-USAGE-GUIDE.md +1419 -0
  222. package/package.json +3 -3
@@ -0,0 +1,517 @@
1
+ /**
2
+ * @fileoverview Comprehensive JSON handling with safe parsing, validation, and manipulation
3
+ *
4
+ * This module provides:
5
+ * - Safe JSON parsing with fallback values
6
+ * - JSON stringification with custom serializers
7
+ * - Pretty printing with configurable indentation
8
+ * - JSON minification and compression
9
+ * - JSON validation and schema checking
10
+ * - JSON path extraction and manipulation
11
+ * - Circular reference handling
12
+ * - Large JSON handling
13
+ *
14
+ * @example
15
+ * import { parseJsonSafe, stringifyJson, prettyPrint, validateJson } from './json-formatter';
16
+ *
17
+ * const data = parseJsonSafe('{"name": "John"}');
18
+ * const pretty = prettyPrint(data);
19
+ * const minified = minify(pretty);
20
+ *
21
+ * @author indusagi
22
+ * @version 1.0.0
23
+ */
24
+ /**
25
+ * Safely parse JSON string with fallback
26
+ * @param jsonString - JSON string to parse
27
+ * @param fallback - Fallback value if parsing fails
28
+ * @returns Parsed object or fallback
29
+ *
30
+ * @example
31
+ * const data = parseJsonSafe('{"name": "John"}');
32
+ * // { name: 'John' }
33
+ *
34
+ * @example
35
+ * const data = parseJsonSafe('invalid json', { error: true });
36
+ * // { error: true }
37
+ *
38
+ * @example
39
+ * const data = parseJsonSafe('{"incomplete": ', null);
40
+ * // null
41
+ */
42
+ export function parseJsonSafe(jsonString, fallback) {
43
+ try {
44
+ // Handle empty or whitespace-only strings
45
+ if (!jsonString || !jsonString.trim()) {
46
+ return fallback !== undefined ? fallback : {};
47
+ }
48
+ return JSON.parse(jsonString);
49
+ }
50
+ catch (error) {
51
+ if (fallback !== undefined) {
52
+ return fallback;
53
+ }
54
+ throw new Error(`Failed to parse JSON: ${error.message}`);
55
+ }
56
+ }
57
+ /**
58
+ * Stringify object to JSON
59
+ * @param obj - Object to stringify
60
+ * @param indent - Indentation level (0 = minified)
61
+ * @param replacer - Custom value replacer function
62
+ * @returns JSON string
63
+ *
64
+ * @example
65
+ * const json = stringifyJson({ name: 'John', age: 30 }, 2);
66
+ * // '{\\n "name": "John",\\n "age": 30\\n}'
67
+ *
68
+ * @example
69
+ * const json = stringifyJson({ name: 'John', age: 30 });
70
+ * // '{"name":"John","age":30}'
71
+ *
72
+ * @example
73
+ * // Custom replacer for sensitive data
74
+ * const json = stringifyJson({ password: 'secret', user: 'john' }, 2, (key, value) => {
75
+ * if (key === 'password') return '[REDACTED]';
76
+ * return value;
77
+ * });
78
+ */
79
+ export function stringifyJson(obj, indent = 0, replacer) {
80
+ try {
81
+ return JSON.stringify(obj, replacer, indent > 0 ? indent : undefined);
82
+ }
83
+ catch (error) {
84
+ return '{}';
85
+ }
86
+ }
87
+ /**
88
+ * Pretty print JSON with color support
89
+ * @param obj - Object to format
90
+ * @param indent - Indentation spaces
91
+ * @param colorize - Add ANSI color codes
92
+ * @returns Formatted JSON string
93
+ *
94
+ * @example
95
+ * const formatted = prettyPrint({ name: 'John', tags: ['admin', 'user'] });
96
+ * console.log(formatted);
97
+ * // {
98
+ * // "name": "John",
99
+ * // "tags": [
100
+ * // "admin",
101
+ * // "user"
102
+ * // ]
103
+ * // }
104
+ */
105
+ export function prettyPrint(obj, indent = 2, colorize = false) {
106
+ const json = JSON.stringify(obj, null, indent);
107
+ if (!colorize) {
108
+ return json;
109
+ }
110
+ return json
111
+ .replace(/&/g, '&')
112
+ .replace(/</g, '&lt;')
113
+ .replace(/>/g, '&gt;')
114
+ .replace(/^(\s*)"([^"]+)": /gm, '$1\x1b[34m"$2"\x1b[0m: ')
115
+ .replace(/(: )("(?:\\.|[^"\\])*")/g, '$1\x1b[32m$2\x1b[0m')
116
+ .replace(/(\d+)/g, '\x1b[33m$1\x1b[0m')
117
+ .replace(/(true|false|null)/g, '\x1b[35m$1\x1b[0m');
118
+ }
119
+ /**
120
+ * Minify JSON by removing whitespace
121
+ * @param json - JSON string or object
122
+ * @returns Minified JSON string
123
+ *
124
+ * @example
125
+ * const large = '{ "name": "John", "age": 30 }';
126
+ * const small = minify(large);
127
+ * // '{"name":"John","age":30}'
128
+ *
129
+ * @example
130
+ * const obj = { name: 'John', address: { city: 'NYC' } };
131
+ * const minified = minify(obj);
132
+ */
133
+ export function minify(json) {
134
+ const obj = typeof json === 'string' ? parseJsonSafe(json, {}) : json;
135
+ return JSON.stringify(obj);
136
+ }
137
+ /**
138
+ * Validate JSON against schema
139
+ * @param obj - Object to validate
140
+ * @param schema - JSON schema
141
+ * @returns Array of validation errors (empty if valid)
142
+ *
143
+ * @example
144
+ * const schema = {
145
+ * type: 'object',
146
+ * properties: {
147
+ * name: { type: 'string' },
148
+ * age: { type: 'number', minimum: 0, maximum: 150 }
149
+ * },
150
+ * required: ['name']
151
+ * };
152
+ * const errors = validateJson({ name: 'John', age: 30 }, schema);
153
+ * // [] (valid)
154
+ *
155
+ * @example
156
+ * const errors = validateJson({ age: 30 }, schema);
157
+ * // [{ message: 'Missing required field: name', path: '', type: 'required' }]
158
+ */
159
+ export function validateJson(obj, schema) {
160
+ const errors = [];
161
+ function validate(value, currentSchema, path) {
162
+ // Check type
163
+ if (currentSchema.type) {
164
+ const actualType = Array.isArray(value) ? 'array' : typeof value;
165
+ if (actualType !== currentSchema.type) {
166
+ errors.push({
167
+ message: `Expected type ${currentSchema.type}, got ${actualType}`,
168
+ path,
169
+ value,
170
+ type: 'type',
171
+ });
172
+ return;
173
+ }
174
+ }
175
+ // Validate properties for objects
176
+ if (currentSchema.type === 'object' && typeof value === 'object' && value !== null) {
177
+ // Check required fields
178
+ if (currentSchema.required) {
179
+ for (const field of currentSchema.required) {
180
+ if (!(field in value)) {
181
+ errors.push({
182
+ message: `Missing required field: ${field}`,
183
+ path: path ? `${path}.${field}` : field,
184
+ type: 'required',
185
+ });
186
+ }
187
+ }
188
+ }
189
+ // Validate properties
190
+ if (currentSchema.properties) {
191
+ for (const key in value) {
192
+ if (key in currentSchema.properties) {
193
+ const newPath = path ? `${path}.${key}` : key;
194
+ validate(value[key], currentSchema.properties[key], newPath);
195
+ }
196
+ }
197
+ }
198
+ }
199
+ // Validate array items
200
+ if (currentSchema.type === 'array' && Array.isArray(value)) {
201
+ if (currentSchema.items) {
202
+ value.forEach((item, index) => {
203
+ const newPath = `${path}[${index}]`;
204
+ validate(item, currentSchema.items, newPath);
205
+ });
206
+ }
207
+ }
208
+ // Validate string constraints
209
+ if (typeof value === 'string') {
210
+ if (currentSchema.minLength && value.length < currentSchema.minLength) {
211
+ errors.push({
212
+ message: `String length ${value.length} is less than minimum ${currentSchema.minLength}`,
213
+ path,
214
+ value,
215
+ type: 'minLength',
216
+ });
217
+ }
218
+ if (currentSchema.maxLength && value.length > currentSchema.maxLength) {
219
+ errors.push({
220
+ message: `String length ${value.length} exceeds maximum ${currentSchema.maxLength}`,
221
+ path,
222
+ value,
223
+ type: 'maxLength',
224
+ });
225
+ }
226
+ if (currentSchema.pattern && !new RegExp(currentSchema.pattern).test(value)) {
227
+ errors.push({
228
+ message: `String does not match pattern ${currentSchema.pattern}`,
229
+ path,
230
+ value,
231
+ type: 'pattern',
232
+ });
233
+ }
234
+ if (currentSchema.enum && !currentSchema.enum.includes(value)) {
235
+ errors.push({
236
+ message: `Value must be one of: ${currentSchema.enum.join(', ')}`,
237
+ path,
238
+ value,
239
+ type: 'enum',
240
+ });
241
+ }
242
+ }
243
+ // Validate number constraints
244
+ if (typeof value === 'number') {
245
+ if (currentSchema.minimum !== undefined &&
246
+ value < currentSchema.minimum) {
247
+ errors.push({
248
+ message: `Number ${value} is less than minimum ${currentSchema.minimum}`,
249
+ path,
250
+ value,
251
+ type: 'minimum',
252
+ });
253
+ }
254
+ if (currentSchema.maximum !== undefined &&
255
+ value > currentSchema.maximum) {
256
+ errors.push({
257
+ message: `Number ${value} exceeds maximum ${currentSchema.maximum}`,
258
+ path,
259
+ value,
260
+ type: 'maximum',
261
+ });
262
+ }
263
+ }
264
+ }
265
+ validate(obj, schema, '');
266
+ return errors;
267
+ }
268
+ /**
269
+ * Extract value from JSON using dot notation path
270
+ * @param obj - Source object
271
+ * @param path - Dot notation path
272
+ * @param defaultValue - Default if not found
273
+ * @returns Value at path or default
274
+ *
275
+ * @example
276
+ * const obj = { user: { profile: { age: 30 } } };
277
+ * const age = extractPath(obj, 'user.profile.age');
278
+ * // 30
279
+ *
280
+ * @example
281
+ * const age = extractPath(obj, 'user.settings.age', 0);
282
+ * // 0
283
+ */
284
+ export function extractPath(obj, path, defaultValue) {
285
+ const keys = path.split('.');
286
+ let current = obj;
287
+ for (const key of keys) {
288
+ if (current == null) {
289
+ return defaultValue;
290
+ }
291
+ current = current[key];
292
+ }
293
+ return current ?? defaultValue;
294
+ }
295
+ /**
296
+ * Set value in JSON using dot notation path
297
+ * @param obj - Target object (mutated)
298
+ * @param path - Dot notation path
299
+ * @param value - Value to set
300
+ * @returns Modified object
301
+ *
302
+ * @example
303
+ * const obj = { user: { name: 'John' } };
304
+ * setPath(obj, 'user.age', 30);
305
+ * // { user: { name: 'John', age: 30 } }
306
+ */
307
+ export function setPath(obj, path, value) {
308
+ const keys = path.split('.');
309
+ let current = obj;
310
+ for (let i = 0; i < keys.length - 1; i++) {
311
+ const key = keys[i];
312
+ if (!(key in current) || typeof current[key] !== 'object') {
313
+ current[key] = {};
314
+ }
315
+ current = current[key];
316
+ }
317
+ current[keys[keys.length - 1]] = value;
318
+ return obj;
319
+ }
320
+ /**
321
+ * Delete value from JSON using dot notation path
322
+ * @param obj - Target object
323
+ * @param path - Dot notation path
324
+ *
325
+ * @example
326
+ * const obj = { user: { name: 'John', password: 'secret' } };
327
+ * deletePath(obj, 'user.password');
328
+ * // { user: { name: 'John' } }
329
+ */
330
+ export function deletePath(obj, path) {
331
+ const keys = path.split('.');
332
+ let current = obj;
333
+ for (let i = 0; i < keys.length - 1; i++) {
334
+ const key = keys[i];
335
+ if (!(key in current)) {
336
+ return;
337
+ }
338
+ current = current[key];
339
+ }
340
+ delete current[keys[keys.length - 1]];
341
+ }
342
+ /**
343
+ * Check if JSON string is valid
344
+ * @param jsonString - String to validate
345
+ * @returns True if valid JSON
346
+ *
347
+ * @example
348
+ * isValidJson('{"name": "John"}'); // true
349
+ * isValidJson('invalid'); // false
350
+ * isValidJson(''); // false
351
+ */
352
+ export function isValidJson(jsonString) {
353
+ try {
354
+ if (!jsonString || !jsonString.trim()) {
355
+ return false;
356
+ }
357
+ JSON.parse(jsonString);
358
+ return true;
359
+ }
360
+ catch {
361
+ return false;
362
+ }
363
+ }
364
+ /**
365
+ * Deep merge JSON objects
366
+ * @param target - Target object
367
+ * @param sources - Source objects
368
+ * @returns Merged object
369
+ *
370
+ * @example
371
+ * const base = { api: { host: 'localhost' } };
372
+ * const prod = { api: { host: 'api.prod.com' } };
373
+ * const merged = mergeJson(base, prod);
374
+ * // { api: { host: 'api.prod.com' } }
375
+ */
376
+ export function mergeJson(target, ...sources) {
377
+ if (sources.length === 0) {
378
+ return target;
379
+ }
380
+ const result = JSON.parse(JSON.stringify(target));
381
+ for (const source of sources) {
382
+ if (!source || typeof source !== 'object') {
383
+ continue;
384
+ }
385
+ for (const key in source) {
386
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
387
+ const targetValue = result[key];
388
+ const sourceValue = source[key];
389
+ if (targetValue &&
390
+ typeof targetValue === 'object' &&
391
+ !Array.isArray(targetValue) &&
392
+ sourceValue &&
393
+ typeof sourceValue === 'object' &&
394
+ !Array.isArray(sourceValue)) {
395
+ result[key] = mergeJson(targetValue, sourceValue);
396
+ }
397
+ else {
398
+ result[key] = JSON.parse(JSON.stringify(sourceValue));
399
+ }
400
+ }
401
+ }
402
+ }
403
+ return result;
404
+ }
405
+ /**
406
+ * Flatten JSON object
407
+ * @param obj - Nested object
408
+ * @param prefix - Key prefix
409
+ * @returns Flattened object
410
+ *
411
+ * @example
412
+ * const obj = { user: { profile: { age: 30, name: 'John' } } };
413
+ * const flat = flattenJson(obj);
414
+ * // { 'user.profile.age': 30, 'user.profile.name': 'John' }
415
+ */
416
+ export function flattenJson(obj, prefix = '') {
417
+ const result = {};
418
+ for (const key in obj) {
419
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
420
+ const value = obj[key];
421
+ const newKey = prefix ? `${prefix}.${key}` : key;
422
+ if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
423
+ Object.assign(result, flattenJson(value, newKey));
424
+ }
425
+ else {
426
+ result[newKey] = value;
427
+ }
428
+ }
429
+ }
430
+ return result;
431
+ }
432
+ /**
433
+ * Convert JSON to CSV string
434
+ * @param objects - Array of objects
435
+ * @param delimiter - Field delimiter
436
+ * @returns CSV string
437
+ *
438
+ * @example
439
+ * const data = [
440
+ * { id: 1, name: 'John', age: 30 },
441
+ * { id: 2, name: 'Jane', age: 28 }
442
+ * ];
443
+ * const csv = jsonToCsv(data);
444
+ * // 'id,name,age\n1,John,30\n2,Jane,28'
445
+ */
446
+ export function jsonToCsv(objects, delimiter = ',') {
447
+ if (objects.length === 0) {
448
+ return '';
449
+ }
450
+ const keys = Object.keys(objects[0]);
451
+ const header = keys.join(delimiter);
452
+ const rows = objects.map((obj) => keys.map((key) => {
453
+ const value = obj[key];
454
+ if (typeof value === 'string' && (value.includes(delimiter) || value.includes('"'))) {
455
+ return `"${value.replace(/"/g, '""')}"`;
456
+ }
457
+ return value;
458
+ }).join(delimiter));
459
+ return [header, ...rows].join('\n');
460
+ }
461
+ /**
462
+ * Count properties in JSON object
463
+ * @param obj - Object to count
464
+ * @param deep - Count nested properties
465
+ * @returns Property count
466
+ *
467
+ * @example
468
+ * const obj = { a: 1, b: { c: 2, d: 3 } };
469
+ * countKeys(obj); // 2
470
+ * countKeys(obj, true); // 4
471
+ */
472
+ export function countKeys(obj, deep = false) {
473
+ let count = 0;
474
+ for (const key in obj) {
475
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
476
+ count++;
477
+ if (deep && typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) {
478
+ count += countKeys(obj[key], true);
479
+ }
480
+ }
481
+ }
482
+ return count;
483
+ }
484
+ /**
485
+ * Compare two JSON objects for equality
486
+ * @param obj1 - First object
487
+ * @param obj2 - Second object
488
+ * @returns True if equal
489
+ *
490
+ * @example
491
+ * const a = { name: 'John', age: 30 };
492
+ * const b = { name: 'John', age: 30 };
493
+ * deepEqual(a, b); // true
494
+ */
495
+ export function deepEqual(obj1, obj2) {
496
+ if (obj1 === obj2) {
497
+ return true;
498
+ }
499
+ if (typeof obj1 !== 'object' ||
500
+ obj1 === null ||
501
+ typeof obj2 !== 'object' ||
502
+ obj2 === null) {
503
+ return false;
504
+ }
505
+ const keys1 = Object.keys(obj1);
506
+ const keys2 = Object.keys(obj2);
507
+ if (keys1.length !== keys2.length) {
508
+ return false;
509
+ }
510
+ for (const key of keys1) {
511
+ if (!deepEqual(obj1[key], obj2[key])) {
512
+ return false;
513
+ }
514
+ }
515
+ return true;
516
+ }
517
+ //# sourceMappingURL=json-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-formatter.js","sourceRoot":"","sources":["../../src/utils/json-formatter.ts"],"names":[],"mappings":"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"}