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.
- package/CHANGELOG.md +72 -11
- package/README.md +2 -36
- package/dist/cli/args.d.ts +117 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +231 -64
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts +58 -2
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +130 -12
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/file-processor.d.ts +70 -2
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js +240 -15
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/list-models.d.ts +63 -3
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +202 -27
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/login-handler.d.ts +82 -8
- package/dist/cli/login-handler.d.ts.map +1 -1
- package/dist/cli/login-handler.js +410 -77
- package/dist/cli/login-handler.js.map +1 -1
- package/dist/cli/session-picker.d.ts +74 -2
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js +236 -12
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/core/agent-session.d.ts +214 -9
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +214 -9
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bash-executor.d.ts +302 -12
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +302 -12
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/diagnostics.d.ts +191 -0
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/diagnostics.js +142 -0
- package/dist/core/diagnostics.js.map +1 -1
- package/dist/core/event-bus.d.ts +146 -0
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +93 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/export-html/ansi-to-html.d.ts +4 -0
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
- package/dist/core/export-html/ansi-to-html.js +4 -0
- package/dist/core/export-html/ansi-to-html.js.map +1 -1
- package/dist/core/export-html/index.d.ts +128 -0
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +128 -0
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/tool-renderer.d.ts +4 -0
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js +4 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/keybindings.d.ts +142 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +142 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-registry.d.ts +98 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +98 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +99 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +99 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/sdk.d.ts +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +0 -2
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +127 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +125 -0
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/subagents.js.map +1 -1
- package/dist/core/tools/bash.d.ts +391 -11
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +269 -2
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts +284 -6
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +238 -0
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts +169 -5
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +136 -0
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +285 -5
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +247 -0
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +0 -18
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +1 -23
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts +6 -0
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +6 -0
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts +308 -7
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +231 -0
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/webfetch.d.ts +118 -3
- package/dist/core/tools/webfetch.d.ts.map +1 -1
- package/dist/core/tools/webfetch.js +118 -3
- package/dist/core/tools/webfetch.js.map +1 -1
- package/dist/core/tools/websearch.d.ts +130 -3
- package/dist/core/tools/websearch.d.ts.map +1 -1
- package/dist/core/tools/websearch.js +130 -3
- package/dist/core/tools/websearch.js.map +1 -1
- package/dist/core/tools/write.d.ts +251 -5
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +210 -0
- package/dist/core/tools/write.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +164 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +164 -1
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +297 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +297 -1
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +251 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts +186 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +186 -1
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1567 -13
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +1567 -13
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts +422 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +422 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/print-mode.d.ts +538 -5
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +538 -5
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +921 -8
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +921 -8
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +802 -9
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +802 -9
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +356 -3
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js +356 -3
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/shared.d.ts +386 -0
- package/dist/modes/shared.d.ts.map +1 -0
- package/dist/modes/shared.js +543 -0
- package/dist/modes/shared.js.map +1 -0
- package/dist/utils/array.d.ts +389 -0
- package/dist/utils/array.d.ts.map +1 -0
- package/dist/utils/array.js +585 -0
- package/dist/utils/array.js.map +1 -0
- package/dist/utils/color-formatter.d.ts +318 -0
- package/dist/utils/color-formatter.d.ts.map +1 -0
- package/dist/utils/color-formatter.js +442 -0
- package/dist/utils/color-formatter.js.map +1 -0
- package/dist/utils/data-transformer.d.ts +326 -0
- package/dist/utils/data-transformer.d.ts.map +1 -0
- package/dist/utils/data-transformer.js +512 -0
- package/dist/utils/data-transformer.js.map +1 -0
- package/dist/utils/date-formatter.d.ts +281 -0
- package/dist/utils/date-formatter.d.ts.map +1 -0
- package/dist/utils/date-formatter.js +503 -0
- package/dist/utils/date-formatter.js.map +1 -0
- package/dist/utils/error-handler.d.ts +541 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +726 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/file-operations.d.ts +297 -0
- package/dist/utils/file-operations.d.ts.map +1 -0
- package/dist/utils/file-operations.js +505 -0
- package/dist/utils/file-operations.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +268 -6
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +500 -21
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/json-formatter.d.ts +259 -0
- package/dist/utils/json-formatter.d.ts.map +1 -0
- package/dist/utils/json-formatter.js +517 -0
- package/dist/utils/json-formatter.js.map +1 -0
- package/dist/utils/logger.d.ts +176 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +346 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/markdown-formatter.d.ts +211 -0
- package/dist/utils/markdown-formatter.d.ts.map +1 -0
- package/dist/utils/markdown-formatter.js +482 -0
- package/dist/utils/markdown-formatter.js.map +1 -0
- package/dist/utils/path-validator.d.ts +603 -0
- package/dist/utils/path-validator.d.ts.map +1 -0
- package/dist/utils/path-validator.js +870 -0
- package/dist/utils/path-validator.js.map +1 -0
- package/dist/utils/string-formatter.d.ts +609 -0
- package/dist/utils/string-formatter.d.ts.map +1 -0
- package/dist/utils/string-formatter.js +806 -0
- package/dist/utils/string-formatter.js.map +1 -0
- package/dist/utils/type-guards.d.ts +629 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +662 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/docs/COMPLETE-GUIDE.md +300 -0
- package/docs/MODES-ARCHITECTURE.md +565 -0
- package/docs/PRINT-MODE-GUIDE.md +456 -0
- package/docs/README.md +1 -2
- package/docs/RPC-GUIDE.md +705 -0
- package/docs/UTILS-IMPLEMENTATION-SUMMARY.md +647 -0
- package/docs/UTILS-MODULE-OVERVIEW.md +1480 -0
- package/docs/UTILS-QA-CHECKLIST.md +1061 -0
- package/docs/UTILS-USAGE-GUIDE.md +1419 -0
- 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, '<')
|
|
113
|
+
.replace(/>/g, '>')
|
|
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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"}
|