@atmaticai/agent-tools-core 1.0.0
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/README.md +742 -0
- package/dist/archive/index.d.mts +1 -0
- package/dist/archive/index.d.ts +1 -0
- package/dist/archive/index.js +90 -0
- package/dist/archive/index.js.map +1 -0
- package/dist/archive/index.mjs +80 -0
- package/dist/archive/index.mjs.map +1 -0
- package/dist/color/index.d.mts +1 -0
- package/dist/color/index.d.ts +1 -0
- package/dist/color/index.js +347 -0
- package/dist/color/index.js.map +1 -0
- package/dist/color/index.mjs +336 -0
- package/dist/color/index.mjs.map +1 -0
- package/dist/crypto/index.d.mts +1 -0
- package/dist/crypto/index.d.ts +1 -0
- package/dist/crypto/index.js +116 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/index.mjs +108 -0
- package/dist/crypto/index.mjs.map +1 -0
- package/dist/csv/index.d.mts +1 -0
- package/dist/csv/index.d.ts +1 -0
- package/dist/csv/index.js +371 -0
- package/dist/csv/index.js.map +1 -0
- package/dist/csv/index.mjs +348 -0
- package/dist/csv/index.mjs.map +1 -0
- package/dist/datetime/index.d.mts +1 -0
- package/dist/datetime/index.d.ts +1 -0
- package/dist/datetime/index.js +234 -0
- package/dist/datetime/index.js.map +1 -0
- package/dist/datetime/index.mjs +224 -0
- package/dist/datetime/index.mjs.map +1 -0
- package/dist/diff/index.d.mts +2 -0
- package/dist/diff/index.d.ts +2 -0
- package/dist/diff/index.js +84 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/diff/index.mjs +78 -0
- package/dist/diff/index.mjs.map +1 -0
- package/dist/excel/index.d.mts +1 -0
- package/dist/excel/index.d.ts +1 -0
- package/dist/excel/index.js +163 -0
- package/dist/excel/index.js.map +1 -0
- package/dist/excel/index.mjs +153 -0
- package/dist/excel/index.mjs.map +1 -0
- package/dist/image/index.d.mts +1 -0
- package/dist/image/index.d.ts +1 -0
- package/dist/image/index.js +123 -0
- package/dist/image/index.js.map +1 -0
- package/dist/image/index.mjs +107 -0
- package/dist/image/index.mjs.map +1 -0
- package/dist/index--vbnYfdE.d.mts +142 -0
- package/dist/index--vbnYfdE.d.ts +142 -0
- package/dist/index-7FZQloN-.d.mts +62 -0
- package/dist/index-7FZQloN-.d.ts +62 -0
- package/dist/index-7XgaTVH5.d.mts +93 -0
- package/dist/index-7XgaTVH5.d.ts +93 -0
- package/dist/index-7bvFmh45.d.mts +87 -0
- package/dist/index-7bvFmh45.d.ts +87 -0
- package/dist/index-BDZcIVCU.d.mts +53 -0
- package/dist/index-BDZcIVCU.d.ts +53 -0
- package/dist/index-BN00EnUU.d.mts +55 -0
- package/dist/index-BN00EnUU.d.ts +55 -0
- package/dist/index-CQ1EukC4.d.mts +59 -0
- package/dist/index-CQ1EukC4.d.ts +59 -0
- package/dist/index-CgRVnFOt.d.mts +91 -0
- package/dist/index-CgRVnFOt.d.ts +91 -0
- package/dist/index-DjBDZzuj.d.mts +54 -0
- package/dist/index-DjBDZzuj.d.ts +54 -0
- package/dist/index-FFrvmr-n.d.mts +50 -0
- package/dist/index-FFrvmr-n.d.ts +50 -0
- package/dist/index-QWC8yIgW.d.mts +106 -0
- package/dist/index-QWC8yIgW.d.ts +106 -0
- package/dist/index-RVqNunxE.d.mts +193 -0
- package/dist/index-RVqNunxE.d.ts +193 -0
- package/dist/index-fJD8SORm.d.mts +61 -0
- package/dist/index-fJD8SORm.d.ts +61 -0
- package/dist/index-pPy_XDQU.d.mts +56 -0
- package/dist/index-pPy_XDQU.d.ts +56 -0
- package/dist/index-rwh9hdD9.d.mts +68 -0
- package/dist/index-rwh9hdD9.d.ts +68 -0
- package/dist/index-uXdkAfea.d.mts +93 -0
- package/dist/index-uXdkAfea.d.ts +93 -0
- package/dist/index.d.mts +17 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +3744 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +3694 -0
- package/dist/index.mjs.map +1 -0
- package/dist/json/index.d.mts +1 -0
- package/dist/json/index.d.ts +1 -0
- package/dist/json/index.js +599 -0
- package/dist/json/index.js.map +1 -0
- package/dist/json/index.mjs +552 -0
- package/dist/json/index.mjs.map +1 -0
- package/dist/markdown/index.d.mts +1 -0
- package/dist/markdown/index.d.ts +1 -0
- package/dist/markdown/index.js +151 -0
- package/dist/markdown/index.js.map +1 -0
- package/dist/markdown/index.mjs +139 -0
- package/dist/markdown/index.mjs.map +1 -0
- package/dist/math/index.d.mts +1 -0
- package/dist/math/index.d.ts +1 -0
- package/dist/math/index.js +247 -0
- package/dist/math/index.js.map +1 -0
- package/dist/math/index.mjs +240 -0
- package/dist/math/index.mjs.map +1 -0
- package/dist/pdf/index.d.mts +1 -0
- package/dist/pdf/index.d.ts +1 -0
- package/dist/pdf/index.js +546 -0
- package/dist/pdf/index.js.map +1 -0
- package/dist/pdf/index.mjs +518 -0
- package/dist/pdf/index.mjs.map +1 -0
- package/dist/regex/index.d.mts +1 -0
- package/dist/regex/index.d.ts +1 -0
- package/dist/regex/index.js +93 -0
- package/dist/regex/index.js.map +1 -0
- package/dist/regex/index.mjs +88 -0
- package/dist/regex/index.mjs.map +1 -0
- package/dist/settings/index.d.mts +41 -0
- package/dist/settings/index.d.ts +41 -0
- package/dist/settings/index.js +146 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/index.mjs +139 -0
- package/dist/settings/index.mjs.map +1 -0
- package/dist/sql/index.d.mts +1 -0
- package/dist/sql/index.d.ts +1 -0
- package/dist/sql/index.js +146 -0
- package/dist/sql/index.js.map +1 -0
- package/dist/sql/index.mjs +139 -0
- package/dist/sql/index.mjs.map +1 -0
- package/dist/text/index.d.mts +1 -0
- package/dist/text/index.d.ts +1 -0
- package/dist/text/index.js +250 -0
- package/dist/text/index.js.map +1 -0
- package/dist/text/index.mjs +242 -0
- package/dist/text/index.mjs.map +1 -0
- package/dist/xml/index.d.mts +1 -0
- package/dist/xml/index.d.ts +1 -0
- package/dist/xml/index.js +188 -0
- package/dist/xml/index.js.map +1 -0
- package/dist/xml/index.mjs +180 -0
- package/dist/xml/index.mjs.map +1 -0
- package/package.json +150 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { C as ConvertFormat, a as ConvertOptions, D as DetailedValidationError, b as DiffOperation, c as DiffResult, F as FormatOptions, I as IndentOption, J as JsonStats, Q as QueryDialect, d as QueryOptions, S as SchemaCoverage, e as SchemaValidationSummary, V as ValidationError, f as ValidationResult, g as applyPatch, h as convert, j as detectFormat, k as diff, l as diffValues, m as format, n as fromJson, o as getSizeInfo, p as getStats, q as isValidJson, r as minify, s as parse, t as query, u as queryMultiple, v as queryValue, w as stringify, x as toJson, y as validate, z as validateWithSummary } from '../index--vbnYfdE.mjs';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { C as ConvertFormat, a as ConvertOptions, D as DetailedValidationError, b as DiffOperation, c as DiffResult, F as FormatOptions, I as IndentOption, J as JsonStats, Q as QueryDialect, d as QueryOptions, S as SchemaCoverage, e as SchemaValidationSummary, V as ValidationError, f as ValidationResult, g as applyPatch, h as convert, j as detectFormat, k as diff, l as diffValues, m as format, n as fromJson, o as getSizeInfo, p as getStats, q as isValidJson, r as minify, s as parse, t as query, u as queryMultiple, v as queryValue, w as stringify, x as toJson, y as validate, z as validateWithSummary } from '../index--vbnYfdE.js';
|
|
@@ -0,0 +1,599 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Ajv = require('ajv');
|
|
4
|
+
var addFormats = require('ajv-formats');
|
|
5
|
+
var jsonpathPlus = require('jsonpath-plus');
|
|
6
|
+
var jmespath = require('jmespath');
|
|
7
|
+
var JSON5 = require('json5');
|
|
8
|
+
var yaml = require('js-yaml');
|
|
9
|
+
var TOML = require('smol-toml');
|
|
10
|
+
var fastJsonPatch = require('fast-json-patch');
|
|
11
|
+
|
|
12
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
|
|
14
|
+
function _interopNamespace(e) {
|
|
15
|
+
if (e && e.__esModule) return e;
|
|
16
|
+
var n = Object.create(null);
|
|
17
|
+
if (e) {
|
|
18
|
+
Object.keys(e).forEach(function (k) {
|
|
19
|
+
if (k !== 'default') {
|
|
20
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
21
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () { return e[k]; }
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
n.default = e;
|
|
29
|
+
return Object.freeze(n);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
var Ajv__default = /*#__PURE__*/_interopDefault(Ajv);
|
|
33
|
+
var addFormats__default = /*#__PURE__*/_interopDefault(addFormats);
|
|
34
|
+
var jmespath__default = /*#__PURE__*/_interopDefault(jmespath);
|
|
35
|
+
var JSON5__default = /*#__PURE__*/_interopDefault(JSON5);
|
|
36
|
+
var yaml__default = /*#__PURE__*/_interopDefault(yaml);
|
|
37
|
+
var TOML__namespace = /*#__PURE__*/_interopNamespace(TOML);
|
|
38
|
+
|
|
39
|
+
// src/json/format.ts
|
|
40
|
+
function getIndentString(indent) {
|
|
41
|
+
if (indent === "tab") return " ";
|
|
42
|
+
return indent;
|
|
43
|
+
}
|
|
44
|
+
function sortObjectKeys(obj) {
|
|
45
|
+
if (obj === null || typeof obj !== "object") {
|
|
46
|
+
return obj;
|
|
47
|
+
}
|
|
48
|
+
if (Array.isArray(obj)) {
|
|
49
|
+
return obj.map(sortObjectKeys);
|
|
50
|
+
}
|
|
51
|
+
const sorted = {};
|
|
52
|
+
const keys = Object.keys(obj).sort();
|
|
53
|
+
for (const key of keys) {
|
|
54
|
+
sorted[key] = sortObjectKeys(obj[key]);
|
|
55
|
+
}
|
|
56
|
+
return sorted;
|
|
57
|
+
}
|
|
58
|
+
function format(input, options = {}) {
|
|
59
|
+
const { indent = 2, sortKeys = false } = options;
|
|
60
|
+
let parsed;
|
|
61
|
+
try {
|
|
62
|
+
parsed = JSON.parse(input);
|
|
63
|
+
} catch (error) {
|
|
64
|
+
throw new Error(`Invalid JSON: ${error.message}`);
|
|
65
|
+
}
|
|
66
|
+
if (sortKeys) {
|
|
67
|
+
parsed = sortObjectKeys(parsed);
|
|
68
|
+
}
|
|
69
|
+
const indentValue = getIndentString(indent);
|
|
70
|
+
return JSON.stringify(parsed, null, indentValue);
|
|
71
|
+
}
|
|
72
|
+
function minify(input) {
|
|
73
|
+
const parsed = JSON.parse(input);
|
|
74
|
+
return JSON.stringify(parsed);
|
|
75
|
+
}
|
|
76
|
+
function parse(input) {
|
|
77
|
+
return JSON.parse(input);
|
|
78
|
+
}
|
|
79
|
+
function stringify(value, options = {}) {
|
|
80
|
+
const { indent = 2, sortKeys = false } = options;
|
|
81
|
+
let data = value;
|
|
82
|
+
if (sortKeys) {
|
|
83
|
+
data = sortObjectKeys(value);
|
|
84
|
+
}
|
|
85
|
+
const indentValue = getIndentString(indent);
|
|
86
|
+
return JSON.stringify(data, null, indentValue);
|
|
87
|
+
}
|
|
88
|
+
var ajv = new Ajv__default.default({ allErrors: true, verbose: true });
|
|
89
|
+
addFormats__default.default(ajv);
|
|
90
|
+
function validate(input, schema) {
|
|
91
|
+
let parsed;
|
|
92
|
+
try {
|
|
93
|
+
parsed = JSON.parse(input);
|
|
94
|
+
} catch (error) {
|
|
95
|
+
return {
|
|
96
|
+
valid: false,
|
|
97
|
+
errors: [
|
|
98
|
+
{
|
|
99
|
+
path: "",
|
|
100
|
+
message: `Invalid JSON: ${error.message}`,
|
|
101
|
+
keyword: "parse"
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (!schema) {
|
|
107
|
+
return { valid: true };
|
|
108
|
+
}
|
|
109
|
+
let schemaObj;
|
|
110
|
+
try {
|
|
111
|
+
schemaObj = JSON.parse(schema);
|
|
112
|
+
} catch (error) {
|
|
113
|
+
return {
|
|
114
|
+
valid: false,
|
|
115
|
+
errors: [
|
|
116
|
+
{
|
|
117
|
+
path: "",
|
|
118
|
+
message: `Invalid schema: ${error.message}`,
|
|
119
|
+
keyword: "schema"
|
|
120
|
+
}
|
|
121
|
+
]
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
const validateFn = ajv.compile(schemaObj);
|
|
125
|
+
const valid = validateFn(parsed);
|
|
126
|
+
if (valid) {
|
|
127
|
+
return { valid: true };
|
|
128
|
+
}
|
|
129
|
+
const errors = (validateFn.errors || []).map((err) => ({
|
|
130
|
+
path: err.instancePath || "/",
|
|
131
|
+
message: err.message || "Unknown validation error",
|
|
132
|
+
keyword: err.keyword
|
|
133
|
+
}));
|
|
134
|
+
return { valid: false, errors };
|
|
135
|
+
}
|
|
136
|
+
function isValidJson(input) {
|
|
137
|
+
try {
|
|
138
|
+
JSON.parse(input);
|
|
139
|
+
return true;
|
|
140
|
+
} catch {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
var ajv2 = new Ajv__default.default({ allErrors: true, verbose: true });
|
|
145
|
+
addFormats__default.default(ajv2);
|
|
146
|
+
function countSchemaProperties(schema) {
|
|
147
|
+
const props = schema.properties;
|
|
148
|
+
const totalProperties = props ? Object.keys(props).length : 0;
|
|
149
|
+
const requiredFields = schema.required || [];
|
|
150
|
+
return { totalProperties, requiredFields };
|
|
151
|
+
}
|
|
152
|
+
function buildSuggestion(err) {
|
|
153
|
+
const path = err.instancePath || "/";
|
|
154
|
+
switch (err.keyword) {
|
|
155
|
+
case "type":
|
|
156
|
+
return `Change value at '${path}' from ${typeof err.data} to ${err.schema}`;
|
|
157
|
+
case "required":
|
|
158
|
+
return `Add missing required field '${err.params?.missingProperty}'`;
|
|
159
|
+
case "enum":
|
|
160
|
+
return `Change value at '${path}' to one of: ${err.schema?.join(", ")}`;
|
|
161
|
+
case "minimum":
|
|
162
|
+
return `Adjust value at '${path}' to be >= ${err.schema}`;
|
|
163
|
+
case "maximum":
|
|
164
|
+
return `Adjust value at '${path}' to be <= ${err.schema}`;
|
|
165
|
+
case "pattern":
|
|
166
|
+
return `Change value at '${path}' to match pattern: ${err.schema}`;
|
|
167
|
+
case "additionalProperties":
|
|
168
|
+
return `Remove unexpected property '${err.params?.additionalProperty}'`;
|
|
169
|
+
case "minLength":
|
|
170
|
+
return `Value at '${path}' must have at least ${err.schema} character(s)`;
|
|
171
|
+
case "maxLength":
|
|
172
|
+
return `Value at '${path}' must have at most ${err.schema} character(s)`;
|
|
173
|
+
case "minItems":
|
|
174
|
+
return `Array at '${path}' must have at least ${err.schema} item(s)`;
|
|
175
|
+
case "maxItems":
|
|
176
|
+
return `Array at '${path}' must have at most ${err.schema} item(s)`;
|
|
177
|
+
case "format":
|
|
178
|
+
return `Value at '${path}' must be a valid ${err.params?.format ?? err.schema}`;
|
|
179
|
+
default:
|
|
180
|
+
return `Fix value at '${path}': ${err.keyword}`;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function validateWithSummary(input, schema) {
|
|
184
|
+
let parsed;
|
|
185
|
+
try {
|
|
186
|
+
parsed = JSON.parse(input);
|
|
187
|
+
} catch (error) {
|
|
188
|
+
return {
|
|
189
|
+
valid: false,
|
|
190
|
+
summary: `Invalid JSON input: ${error.message}`,
|
|
191
|
+
errorCount: 1,
|
|
192
|
+
errors: [{
|
|
193
|
+
path: "",
|
|
194
|
+
message: `Invalid JSON: ${error.message}`,
|
|
195
|
+
keyword: "parse",
|
|
196
|
+
suggestion: "Fix JSON syntax errors before validating against a schema"
|
|
197
|
+
}],
|
|
198
|
+
coverage: { totalProperties: 0, validProperties: 0, missingRequired: [], extraProperties: [] },
|
|
199
|
+
suggestions: ["Fix JSON syntax errors before validating against a schema"]
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
let schemaObj;
|
|
203
|
+
try {
|
|
204
|
+
schemaObj = JSON.parse(schema);
|
|
205
|
+
} catch (error) {
|
|
206
|
+
return {
|
|
207
|
+
valid: false,
|
|
208
|
+
summary: `Invalid JSON Schema: ${error.message}`,
|
|
209
|
+
errorCount: 1,
|
|
210
|
+
errors: [{
|
|
211
|
+
path: "",
|
|
212
|
+
message: `Invalid schema: ${error.message}`,
|
|
213
|
+
keyword: "schema",
|
|
214
|
+
suggestion: "Fix the JSON Schema syntax before validating"
|
|
215
|
+
}],
|
|
216
|
+
coverage: { totalProperties: 0, validProperties: 0, missingRequired: [], extraProperties: [] },
|
|
217
|
+
suggestions: ["Fix the JSON Schema syntax before validating"]
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
const { totalProperties } = countSchemaProperties(schemaObj);
|
|
221
|
+
const validateFn = ajv2.compile(schemaObj);
|
|
222
|
+
const valid = validateFn(parsed);
|
|
223
|
+
if (valid) {
|
|
224
|
+
return {
|
|
225
|
+
valid: true,
|
|
226
|
+
summary: `Validation passed. All ${totalProperties} schema properties satisfied (100%).`,
|
|
227
|
+
errorCount: 0,
|
|
228
|
+
errors: [],
|
|
229
|
+
coverage: {
|
|
230
|
+
totalProperties,
|
|
231
|
+
validProperties: totalProperties,
|
|
232
|
+
missingRequired: [],
|
|
233
|
+
extraProperties: []
|
|
234
|
+
},
|
|
235
|
+
suggestions: []
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
const ajvErrors = validateFn.errors || [];
|
|
239
|
+
const missingRequired = [];
|
|
240
|
+
const extraProperties = [];
|
|
241
|
+
const errors = ajvErrors.map((err) => {
|
|
242
|
+
if (err.keyword === "required") {
|
|
243
|
+
const field = err.params?.missingProperty;
|
|
244
|
+
if (field) missingRequired.push(field);
|
|
245
|
+
}
|
|
246
|
+
if (err.keyword === "additionalProperties") {
|
|
247
|
+
const prop = err.params?.additionalProperty;
|
|
248
|
+
if (prop) extraProperties.push(prop);
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
path: err.instancePath || "/",
|
|
252
|
+
message: err.message || "Unknown validation error",
|
|
253
|
+
keyword: err.keyword,
|
|
254
|
+
expected: err.schema,
|
|
255
|
+
received: err.data,
|
|
256
|
+
suggestion: buildSuggestion({
|
|
257
|
+
keyword: err.keyword,
|
|
258
|
+
instancePath: err.instancePath,
|
|
259
|
+
params: err.params,
|
|
260
|
+
schema: err.schema,
|
|
261
|
+
data: err.data
|
|
262
|
+
})
|
|
263
|
+
};
|
|
264
|
+
});
|
|
265
|
+
const propertyErrorCount = new Set(
|
|
266
|
+
ajvErrors.filter((e) => e.keyword !== "required" && e.keyword !== "additionalProperties").map((e) => e.instancePath)
|
|
267
|
+
).size;
|
|
268
|
+
const validProperties = Math.max(0, totalProperties - missingRequired.length - propertyErrorCount);
|
|
269
|
+
const coverage = {
|
|
270
|
+
totalProperties,
|
|
271
|
+
validProperties,
|
|
272
|
+
missingRequired,
|
|
273
|
+
extraProperties
|
|
274
|
+
};
|
|
275
|
+
const pct = totalProperties > 0 ? Math.round(validProperties / totalProperties * 100) : 0;
|
|
276
|
+
const parts = [
|
|
277
|
+
`Validation failed with ${errors.length} error(s).`
|
|
278
|
+
];
|
|
279
|
+
if (totalProperties > 0) {
|
|
280
|
+
parts.push(`${validProperties} of ${totalProperties} schema properties satisfied (${pct}%).`);
|
|
281
|
+
}
|
|
282
|
+
if (missingRequired.length > 0) {
|
|
283
|
+
parts.push(`Missing required: ${missingRequired.join(", ")}.`);
|
|
284
|
+
}
|
|
285
|
+
if (extraProperties.length > 0) {
|
|
286
|
+
parts.push(`Unexpected properties: ${extraProperties.join(", ")}.`);
|
|
287
|
+
}
|
|
288
|
+
const suggestions = [...new Set(errors.map((e) => e.suggestion))];
|
|
289
|
+
return {
|
|
290
|
+
valid: false,
|
|
291
|
+
summary: parts.join(" "),
|
|
292
|
+
errorCount: errors.length,
|
|
293
|
+
errors,
|
|
294
|
+
coverage,
|
|
295
|
+
suggestions
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
function query(input, path, options = {}) {
|
|
299
|
+
const { dialect = "jsonpath" } = options;
|
|
300
|
+
let parsed;
|
|
301
|
+
try {
|
|
302
|
+
parsed = JSON.parse(input);
|
|
303
|
+
} catch (error) {
|
|
304
|
+
throw new Error(`Invalid JSON: ${error.message}`);
|
|
305
|
+
}
|
|
306
|
+
return queryValue(parsed, path, dialect);
|
|
307
|
+
}
|
|
308
|
+
function queryValue(data, path, dialect = "jsonpath") {
|
|
309
|
+
if (dialect === "jsonpath") {
|
|
310
|
+
return jsonpathPlus.JSONPath({ path, json: data, wrap: false });
|
|
311
|
+
}
|
|
312
|
+
if (dialect === "jmespath") {
|
|
313
|
+
return jmespath__default.default.search(data, path);
|
|
314
|
+
}
|
|
315
|
+
throw new Error(`Unknown query dialect: ${dialect}`);
|
|
316
|
+
}
|
|
317
|
+
function queryMultiple(input, paths, dialect = "jsonpath") {
|
|
318
|
+
let parsed;
|
|
319
|
+
try {
|
|
320
|
+
parsed = JSON.parse(input);
|
|
321
|
+
} catch (error) {
|
|
322
|
+
throw new Error(`Invalid JSON: ${error.message}`);
|
|
323
|
+
}
|
|
324
|
+
const results = {};
|
|
325
|
+
for (const path of paths) {
|
|
326
|
+
results[path] = queryValue(parsed, path, dialect);
|
|
327
|
+
}
|
|
328
|
+
return results;
|
|
329
|
+
}
|
|
330
|
+
function getIndent(indent = 2) {
|
|
331
|
+
if (indent === "tab") return 2;
|
|
332
|
+
return indent;
|
|
333
|
+
}
|
|
334
|
+
function parseInput(input, from) {
|
|
335
|
+
switch (from) {
|
|
336
|
+
case "json":
|
|
337
|
+
return JSON.parse(input);
|
|
338
|
+
case "json5":
|
|
339
|
+
case "jsonc":
|
|
340
|
+
return JSON5__default.default.parse(input);
|
|
341
|
+
case "yaml":
|
|
342
|
+
return yaml__default.default.load(input);
|
|
343
|
+
case "toml":
|
|
344
|
+
return TOML__namespace.parse(input);
|
|
345
|
+
default:
|
|
346
|
+
throw new Error(`Unsupported input format: ${from}`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
function stringifyOutput(data, to, indent = 2) {
|
|
350
|
+
const indentNum = getIndent(indent);
|
|
351
|
+
switch (to) {
|
|
352
|
+
case "json":
|
|
353
|
+
return JSON.stringify(data, null, indentNum);
|
|
354
|
+
case "json5":
|
|
355
|
+
case "jsonc":
|
|
356
|
+
return JSON5__default.default.stringify(data, null, indentNum);
|
|
357
|
+
case "yaml":
|
|
358
|
+
return yaml__default.default.dump(data, { indent: indentNum, lineWidth: -1 });
|
|
359
|
+
case "toml":
|
|
360
|
+
if (typeof data !== "object" || data === null || Array.isArray(data)) {
|
|
361
|
+
throw new Error("TOML requires a root object");
|
|
362
|
+
}
|
|
363
|
+
return TOML__namespace.stringify(data);
|
|
364
|
+
default:
|
|
365
|
+
throw new Error(`Unsupported output format: ${to}`);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
function convert(input, options) {
|
|
369
|
+
const { from, to, indent = 2 } = options;
|
|
370
|
+
if (from === to) {
|
|
371
|
+
const parsed2 = parseInput(input, from);
|
|
372
|
+
return stringifyOutput(parsed2, to, indent);
|
|
373
|
+
}
|
|
374
|
+
const parsed = parseInput(input, from);
|
|
375
|
+
return stringifyOutput(parsed, to, indent);
|
|
376
|
+
}
|
|
377
|
+
function toJson(input, from) {
|
|
378
|
+
return convert(input, { from, to: "json" });
|
|
379
|
+
}
|
|
380
|
+
function fromJson(input, to) {
|
|
381
|
+
return convert(input, { from: "json", to });
|
|
382
|
+
}
|
|
383
|
+
function detectFormat(input) {
|
|
384
|
+
const trimmed = input.trim();
|
|
385
|
+
if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
|
|
386
|
+
try {
|
|
387
|
+
JSON.parse(trimmed);
|
|
388
|
+
return "json";
|
|
389
|
+
} catch {
|
|
390
|
+
try {
|
|
391
|
+
JSON5__default.default.parse(trimmed);
|
|
392
|
+
return "json5";
|
|
393
|
+
} catch {
|
|
394
|
+
return null;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
if (trimmed.includes(":") && !trimmed.includes("=")) {
|
|
399
|
+
try {
|
|
400
|
+
yaml__default.default.load(trimmed);
|
|
401
|
+
return "yaml";
|
|
402
|
+
} catch {
|
|
403
|
+
return null;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
if (trimmed.includes("=") && (trimmed.includes("[") || trimmed.includes('"'))) {
|
|
407
|
+
try {
|
|
408
|
+
TOML__namespace.parse(trimmed);
|
|
409
|
+
return "toml";
|
|
410
|
+
} catch {
|
|
411
|
+
return null;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
return null;
|
|
415
|
+
}
|
|
416
|
+
function diff(a, b) {
|
|
417
|
+
let parsedA;
|
|
418
|
+
let parsedB;
|
|
419
|
+
try {
|
|
420
|
+
parsedA = JSON.parse(a);
|
|
421
|
+
} catch (error) {
|
|
422
|
+
throw new Error(`Invalid JSON (first argument): ${error.message}`);
|
|
423
|
+
}
|
|
424
|
+
try {
|
|
425
|
+
parsedB = JSON.parse(b);
|
|
426
|
+
} catch (error) {
|
|
427
|
+
throw new Error(`Invalid JSON (second argument): ${error.message}`);
|
|
428
|
+
}
|
|
429
|
+
return diffValues(parsedA, parsedB);
|
|
430
|
+
}
|
|
431
|
+
function diffValues(a, b) {
|
|
432
|
+
const operations = fastJsonPatch.compare(
|
|
433
|
+
a,
|
|
434
|
+
b
|
|
435
|
+
);
|
|
436
|
+
const summary = {
|
|
437
|
+
added: 0,
|
|
438
|
+
removed: 0,
|
|
439
|
+
changed: 0
|
|
440
|
+
};
|
|
441
|
+
for (const op of operations) {
|
|
442
|
+
switch (op.op) {
|
|
443
|
+
case "add":
|
|
444
|
+
summary.added++;
|
|
445
|
+
break;
|
|
446
|
+
case "remove":
|
|
447
|
+
summary.removed++;
|
|
448
|
+
break;
|
|
449
|
+
case "replace":
|
|
450
|
+
summary.changed++;
|
|
451
|
+
break;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
return {
|
|
455
|
+
identical: operations.length === 0,
|
|
456
|
+
operations,
|
|
457
|
+
summary
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
function applyPatch(input, operations) {
|
|
461
|
+
const parsed = JSON.parse(input);
|
|
462
|
+
for (const op of operations) {
|
|
463
|
+
applyOperation(parsed, op);
|
|
464
|
+
}
|
|
465
|
+
return JSON.stringify(parsed, null, 2);
|
|
466
|
+
}
|
|
467
|
+
function applyOperation(obj, operation) {
|
|
468
|
+
const pathParts = operation.path.split("/").filter(Boolean);
|
|
469
|
+
if (pathParts.length === 0) {
|
|
470
|
+
throw new Error("Cannot apply operation to root");
|
|
471
|
+
}
|
|
472
|
+
const parent = getParent(obj, pathParts);
|
|
473
|
+
const key = pathParts[pathParts.length - 1];
|
|
474
|
+
switch (operation.op) {
|
|
475
|
+
case "add":
|
|
476
|
+
case "replace":
|
|
477
|
+
if (Array.isArray(parent)) {
|
|
478
|
+
const index = parseInt(key, 10);
|
|
479
|
+
if (operation.op === "add") {
|
|
480
|
+
parent.splice(index, 0, operation.value);
|
|
481
|
+
} else {
|
|
482
|
+
parent[index] = operation.value;
|
|
483
|
+
}
|
|
484
|
+
} else if (typeof parent === "object" && parent !== null) {
|
|
485
|
+
parent[key] = operation.value;
|
|
486
|
+
}
|
|
487
|
+
break;
|
|
488
|
+
case "remove":
|
|
489
|
+
if (Array.isArray(parent)) {
|
|
490
|
+
parent.splice(parseInt(key, 10), 1);
|
|
491
|
+
} else if (typeof parent === "object" && parent !== null) {
|
|
492
|
+
delete parent[key];
|
|
493
|
+
}
|
|
494
|
+
break;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
function getParent(obj, pathParts) {
|
|
498
|
+
let current = obj;
|
|
499
|
+
for (let i = 0; i < pathParts.length - 1; i++) {
|
|
500
|
+
const part = pathParts[i];
|
|
501
|
+
if (Array.isArray(current)) {
|
|
502
|
+
current = current[parseInt(part, 10)];
|
|
503
|
+
} else if (typeof current === "object" && current !== null) {
|
|
504
|
+
current = current[part];
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
return current;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
// src/json/stats.ts
|
|
511
|
+
function getStats(input) {
|
|
512
|
+
const parsed = JSON.parse(input);
|
|
513
|
+
const stats = {
|
|
514
|
+
keys: 0,
|
|
515
|
+
depth: 0,
|
|
516
|
+
arrays: 0,
|
|
517
|
+
objects: 0,
|
|
518
|
+
strings: 0,
|
|
519
|
+
numbers: 0,
|
|
520
|
+
booleans: 0,
|
|
521
|
+
nulls: 0,
|
|
522
|
+
sizeBytes: new TextEncoder().encode(input).length
|
|
523
|
+
};
|
|
524
|
+
analyzeValue(parsed, stats, 0);
|
|
525
|
+
return stats;
|
|
526
|
+
}
|
|
527
|
+
function analyzeValue(value, stats, depth) {
|
|
528
|
+
stats.depth = Math.max(stats.depth, depth);
|
|
529
|
+
if (value === null) {
|
|
530
|
+
stats.nulls++;
|
|
531
|
+
return;
|
|
532
|
+
}
|
|
533
|
+
switch (typeof value) {
|
|
534
|
+
case "string":
|
|
535
|
+
stats.strings++;
|
|
536
|
+
break;
|
|
537
|
+
case "number":
|
|
538
|
+
stats.numbers++;
|
|
539
|
+
break;
|
|
540
|
+
case "boolean":
|
|
541
|
+
stats.booleans++;
|
|
542
|
+
break;
|
|
543
|
+
case "object":
|
|
544
|
+
if (Array.isArray(value)) {
|
|
545
|
+
stats.arrays++;
|
|
546
|
+
for (const item of value) {
|
|
547
|
+
analyzeValue(item, stats, depth + 1);
|
|
548
|
+
}
|
|
549
|
+
} else {
|
|
550
|
+
stats.objects++;
|
|
551
|
+
const keys = Object.keys(value);
|
|
552
|
+
stats.keys += keys.length;
|
|
553
|
+
for (const key of keys) {
|
|
554
|
+
analyzeValue(value[key], stats, depth + 1);
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
break;
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
function getSizeInfo(input) {
|
|
561
|
+
const bytes = new TextEncoder().encode(input).length;
|
|
562
|
+
const minified = JSON.stringify(JSON.parse(input));
|
|
563
|
+
const minifiedBytes = new TextEncoder().encode(minified).length;
|
|
564
|
+
return {
|
|
565
|
+
bytes,
|
|
566
|
+
formatted: formatBytes(bytes),
|
|
567
|
+
minifiedBytes,
|
|
568
|
+
savings: bytes - minifiedBytes
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
function formatBytes(bytes) {
|
|
572
|
+
if (bytes === 0) return "0 B";
|
|
573
|
+
const k = 1024;
|
|
574
|
+
const sizes = ["B", "KB", "MB", "GB"];
|
|
575
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
576
|
+
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
exports.applyPatch = applyPatch;
|
|
580
|
+
exports.convert = convert;
|
|
581
|
+
exports.detectFormat = detectFormat;
|
|
582
|
+
exports.diff = diff;
|
|
583
|
+
exports.diffValues = diffValues;
|
|
584
|
+
exports.format = format;
|
|
585
|
+
exports.fromJson = fromJson;
|
|
586
|
+
exports.getSizeInfo = getSizeInfo;
|
|
587
|
+
exports.getStats = getStats;
|
|
588
|
+
exports.isValidJson = isValidJson;
|
|
589
|
+
exports.minify = minify;
|
|
590
|
+
exports.parse = parse;
|
|
591
|
+
exports.query = query;
|
|
592
|
+
exports.queryMultiple = queryMultiple;
|
|
593
|
+
exports.queryValue = queryValue;
|
|
594
|
+
exports.stringify = stringify;
|
|
595
|
+
exports.toJson = toJson;
|
|
596
|
+
exports.validate = validate;
|
|
597
|
+
exports.validateWithSummary = validateWithSummary;
|
|
598
|
+
//# sourceMappingURL=index.js.map
|
|
599
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/json/format.ts","../../src/json/validate.ts","../../src/json/schema-validate.ts","../../src/json/query.ts","../../src/json/convert.ts","../../src/json/diff.ts","../../src/json/stats.ts"],"names":["Ajv","addFormats","ajv","JSONPath","jmespath","JSON5","yaml","TOML","parsed","jsonPatchCompare"],"mappings":"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","file":"index.js","sourcesContent":["import type { FormatOptions, IndentOption } from './types';\n\nfunction getIndentString(indent: IndentOption): string | number {\n if (indent === 'tab') return '\\t';\n return indent;\n}\n\nfunction sortObjectKeys(obj: unknown): unknown {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(sortObjectKeys);\n }\n\n const sorted: Record<string, unknown> = {};\n const keys = Object.keys(obj as Record<string, unknown>).sort();\n\n for (const key of keys) {\n sorted[key] = sortObjectKeys((obj as Record<string, unknown>)[key]);\n }\n\n return sorted;\n}\n\nexport function format(input: string, options: FormatOptions = {}): string {\n const { indent = 2, sortKeys = false } = options;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(input);\n } catch (error) {\n throw new Error(`Invalid JSON: ${(error as Error).message}`);\n }\n\n if (sortKeys) {\n parsed = sortObjectKeys(parsed);\n }\n\n const indentValue = getIndentString(indent);\n return JSON.stringify(parsed, null, indentValue);\n}\n\nexport function minify(input: string): string {\n const parsed = JSON.parse(input);\n return JSON.stringify(parsed);\n}\n\nexport function parse(input: string): unknown {\n return JSON.parse(input);\n}\n\nexport function stringify(value: unknown, options: FormatOptions = {}): string {\n const { indent = 2, sortKeys = false } = options;\n\n let data = value;\n if (sortKeys) {\n data = sortObjectKeys(value);\n }\n\n const indentValue = getIndentString(indent);\n return JSON.stringify(data, null, indentValue);\n}\n","import Ajv from 'ajv';\nimport addFormats from 'ajv-formats';\nimport type { ValidationResult, ValidationError } from './types';\n\nconst ajv = new Ajv({ allErrors: true, verbose: true });\naddFormats(ajv);\n\nexport function validate(input: string, schema?: string): ValidationResult {\n let parsed: unknown;\n try {\n parsed = JSON.parse(input);\n } catch (error) {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Invalid JSON: ${(error as Error).message}`,\n keyword: 'parse',\n },\n ],\n };\n }\n\n if (!schema) {\n return { valid: true };\n }\n\n let schemaObj: object;\n try {\n schemaObj = JSON.parse(schema);\n } catch (error) {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Invalid schema: ${(error as Error).message}`,\n keyword: 'schema',\n },\n ],\n };\n }\n\n const validateFn = ajv.compile(schemaObj);\n const valid = validateFn(parsed);\n\n if (valid) {\n return { valid: true };\n }\n\n const errors: ValidationError[] = (validateFn.errors || []).map((err) => ({\n path: err.instancePath || '/',\n message: err.message || 'Unknown validation error',\n keyword: err.keyword,\n }));\n\n return { valid: false, errors };\n}\n\nexport function isValidJson(input: string): boolean {\n try {\n JSON.parse(input);\n return true;\n } catch {\n return false;\n }\n}\n","import Ajv from 'ajv';\nimport addFormats from 'ajv-formats';\nimport type { DetailedValidationError, SchemaCoverage, SchemaValidationSummary } from './types';\n\nconst ajv = new Ajv({ allErrors: true, verbose: true });\naddFormats(ajv);\n\nfunction countSchemaProperties(schema: Record<string, unknown>): {\n totalProperties: number;\n requiredFields: string[];\n} {\n const props = schema.properties as Record<string, unknown> | undefined;\n const totalProperties = props ? Object.keys(props).length : 0;\n const requiredFields = (schema.required as string[]) || [];\n return { totalProperties, requiredFields };\n}\n\nfunction buildSuggestion(err: { keyword: string; instancePath: string; params?: Record<string, unknown>; schema?: unknown; data?: unknown }): string {\n const path = err.instancePath || '/';\n switch (err.keyword) {\n case 'type':\n return `Change value at '${path}' from ${typeof err.data} to ${err.schema}`;\n case 'required':\n return `Add missing required field '${(err.params as { missingProperty?: string })?.missingProperty}'`;\n case 'enum':\n return `Change value at '${path}' to one of: ${(err.schema as unknown[])?.join(', ')}`;\n case 'minimum':\n return `Adjust value at '${path}' to be >= ${err.schema}`;\n case 'maximum':\n return `Adjust value at '${path}' to be <= ${err.schema}`;\n case 'pattern':\n return `Change value at '${path}' to match pattern: ${err.schema}`;\n case 'additionalProperties':\n return `Remove unexpected property '${(err.params as { additionalProperty?: string })?.additionalProperty}'`;\n case 'minLength':\n return `Value at '${path}' must have at least ${err.schema} character(s)`;\n case 'maxLength':\n return `Value at '${path}' must have at most ${err.schema} character(s)`;\n case 'minItems':\n return `Array at '${path}' must have at least ${err.schema} item(s)`;\n case 'maxItems':\n return `Array at '${path}' must have at most ${err.schema} item(s)`;\n case 'format':\n return `Value at '${path}' must be a valid ${err.params?.format ?? err.schema}`;\n default:\n return `Fix value at '${path}': ${err.keyword}`;\n }\n}\n\nexport function validateWithSummary(input: string, schema: string): SchemaValidationSummary {\n let parsed: unknown;\n try {\n parsed = JSON.parse(input);\n } catch (error) {\n return {\n valid: false,\n summary: `Invalid JSON input: ${(error as Error).message}`,\n errorCount: 1,\n errors: [{\n path: '',\n message: `Invalid JSON: ${(error as Error).message}`,\n keyword: 'parse',\n suggestion: 'Fix JSON syntax errors before validating against a schema',\n }],\n coverage: { totalProperties: 0, validProperties: 0, missingRequired: [], extraProperties: [] },\n suggestions: ['Fix JSON syntax errors before validating against a schema'],\n };\n }\n\n let schemaObj: Record<string, unknown>;\n try {\n schemaObj = JSON.parse(schema);\n } catch (error) {\n return {\n valid: false,\n summary: `Invalid JSON Schema: ${(error as Error).message}`,\n errorCount: 1,\n errors: [{\n path: '',\n message: `Invalid schema: ${(error as Error).message}`,\n keyword: 'schema',\n suggestion: 'Fix the JSON Schema syntax before validating',\n }],\n coverage: { totalProperties: 0, validProperties: 0, missingRequired: [], extraProperties: [] },\n suggestions: ['Fix the JSON Schema syntax before validating'],\n };\n }\n\n const { totalProperties } = countSchemaProperties(schemaObj);\n const validateFn = ajv.compile(schemaObj);\n const valid = validateFn(parsed);\n\n if (valid) {\n return {\n valid: true,\n summary: `Validation passed. All ${totalProperties} schema properties satisfied (100%).`,\n errorCount: 0,\n errors: [],\n coverage: {\n totalProperties,\n validProperties: totalProperties,\n missingRequired: [],\n extraProperties: [],\n },\n suggestions: [],\n };\n }\n\n const ajvErrors = validateFn.errors || [];\n\n const missingRequired: string[] = [];\n const extraProperties: string[] = [];\n const errors: DetailedValidationError[] = ajvErrors.map((err) => {\n if (err.keyword === 'required') {\n const field = (err.params as { missingProperty?: string })?.missingProperty;\n if (field) missingRequired.push(field);\n }\n if (err.keyword === 'additionalProperties') {\n const prop = (err.params as { additionalProperty?: string })?.additionalProperty;\n if (prop) extraProperties.push(prop);\n }\n\n return {\n path: err.instancePath || '/',\n message: err.message || 'Unknown validation error',\n keyword: err.keyword,\n expected: err.schema,\n received: err.data,\n suggestion: buildSuggestion({\n keyword: err.keyword,\n instancePath: err.instancePath,\n params: err.params as Record<string, unknown>,\n schema: err.schema,\n data: err.data,\n }),\n };\n });\n\n const propertyErrorCount = new Set(\n ajvErrors\n .filter((e) => e.keyword !== 'required' && e.keyword !== 'additionalProperties')\n .map((e) => e.instancePath)\n ).size;\n const validProperties = Math.max(0, totalProperties - missingRequired.length - propertyErrorCount);\n\n const coverage: SchemaCoverage = {\n totalProperties,\n validProperties,\n missingRequired,\n extraProperties,\n };\n\n const pct = totalProperties > 0 ? Math.round((validProperties / totalProperties) * 100) : 0;\n const parts: string[] = [\n `Validation failed with ${errors.length} error(s).`,\n ];\n if (totalProperties > 0) {\n parts.push(`${validProperties} of ${totalProperties} schema properties satisfied (${pct}%).`);\n }\n if (missingRequired.length > 0) {\n parts.push(`Missing required: ${missingRequired.join(', ')}.`);\n }\n if (extraProperties.length > 0) {\n parts.push(`Unexpected properties: ${extraProperties.join(', ')}.`);\n }\n\n const suggestions = [...new Set(errors.map((e) => e.suggestion))];\n\n return {\n valid: false,\n summary: parts.join(' '),\n errorCount: errors.length,\n errors,\n coverage,\n suggestions,\n };\n}\n","import { JSONPath } from 'jsonpath-plus';\nimport jmespath from 'jmespath';\nimport type { QueryDialect, QueryOptions } from './types';\n\nexport function query(\n input: string,\n path: string,\n options: QueryOptions = {}\n): unknown {\n const { dialect = 'jsonpath' } = options;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(input);\n } catch (error) {\n throw new Error(`Invalid JSON: ${(error as Error).message}`);\n }\n\n return queryValue(parsed, path, dialect);\n}\n\nexport function queryValue(\n data: unknown,\n path: string,\n dialect: QueryDialect = 'jsonpath'\n): unknown {\n if (dialect === 'jsonpath') {\n return JSONPath({ path, json: data as object, wrap: false });\n }\n\n if (dialect === 'jmespath') {\n return jmespath.search(data, path);\n }\n\n throw new Error(`Unknown query dialect: ${dialect}`);\n}\n\nexport function queryMultiple(\n input: string,\n paths: string[],\n dialect: QueryDialect = 'jsonpath'\n): Record<string, unknown> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(input);\n } catch (error) {\n throw new Error(`Invalid JSON: ${(error as Error).message}`);\n }\n\n const results: Record<string, unknown> = {};\n for (const path of paths) {\n results[path] = queryValue(parsed, path, dialect);\n }\n\n return results;\n}\n","import JSON5 from 'json5';\nimport yaml from 'js-yaml';\nimport * as TOML from 'smol-toml';\nimport type { ConvertFormat, ConvertOptions, IndentOption } from './types';\n\nfunction getIndent(indent: IndentOption = 2): number {\n if (indent === 'tab') return 2;\n return indent;\n}\n\nfunction parseInput(input: string, from: ConvertFormat): unknown {\n switch (from) {\n case 'json':\n return JSON.parse(input);\n case 'json5':\n case 'jsonc':\n return JSON5.parse(input);\n case 'yaml':\n return yaml.load(input);\n case 'toml':\n return TOML.parse(input);\n default:\n throw new Error(`Unsupported input format: ${from}`);\n }\n}\n\nfunction stringifyOutput(\n data: unknown,\n to: ConvertFormat,\n indent: IndentOption = 2\n): string {\n const indentNum = getIndent(indent);\n\n switch (to) {\n case 'json':\n return JSON.stringify(data, null, indentNum);\n case 'json5':\n case 'jsonc':\n return JSON5.stringify(data, null, indentNum);\n case 'yaml':\n return yaml.dump(data, { indent: indentNum, lineWidth: -1 });\n case 'toml':\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\n throw new Error('TOML requires a root object');\n }\n return TOML.stringify(data as Record<string, unknown>);\n default:\n throw new Error(`Unsupported output format: ${to}`);\n }\n}\n\nexport function convert(input: string, options: ConvertOptions): string {\n const { from, to, indent = 2 } = options;\n\n if (from === to) {\n const parsed = parseInput(input, from);\n return stringifyOutput(parsed, to, indent);\n }\n\n const parsed = parseInput(input, from);\n return stringifyOutput(parsed, to, indent);\n}\n\nexport function toJson(input: string, from: ConvertFormat): string {\n return convert(input, { from, to: 'json' });\n}\n\nexport function fromJson(input: string, to: ConvertFormat): string {\n return convert(input, { from: 'json', to });\n}\n\nexport function detectFormat(input: string): ConvertFormat | null {\n const trimmed = input.trim();\n\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n try {\n JSON.parse(trimmed);\n return 'json';\n } catch {\n try {\n JSON5.parse(trimmed);\n return 'json5';\n } catch {\n return null;\n }\n }\n }\n\n if (trimmed.includes(':') && !trimmed.includes('=')) {\n try {\n yaml.load(trimmed);\n return 'yaml';\n } catch {\n return null;\n }\n }\n\n if (trimmed.includes('=') && (trimmed.includes('[') || trimmed.includes('\"'))) {\n try {\n TOML.parse(trimmed);\n return 'toml';\n } catch {\n return null;\n }\n }\n\n return null;\n}\n","import { compare as jsonPatchCompare } from 'fast-json-patch';\nimport type { DiffResult, DiffOperation } from './types';\n\nexport function diff(a: string, b: string): DiffResult {\n let parsedA: unknown;\n let parsedB: unknown;\n\n try {\n parsedA = JSON.parse(a);\n } catch (error) {\n throw new Error(`Invalid JSON (first argument): ${(error as Error).message}`);\n }\n\n try {\n parsedB = JSON.parse(b);\n } catch (error) {\n throw new Error(`Invalid JSON (second argument): ${(error as Error).message}`);\n }\n\n return diffValues(parsedA, parsedB);\n}\n\nexport function diffValues(a: unknown, b: unknown): DiffResult {\n const operations = jsonPatchCompare(\n a as object,\n b as object\n ) as DiffOperation[];\n\n const summary = {\n added: 0,\n removed: 0,\n changed: 0,\n };\n\n for (const op of operations) {\n switch (op.op) {\n case 'add':\n summary.added++;\n break;\n case 'remove':\n summary.removed++;\n break;\n case 'replace':\n summary.changed++;\n break;\n }\n }\n\n return {\n identical: operations.length === 0,\n operations,\n summary,\n };\n}\n\nexport function applyPatch(\n input: string,\n operations: DiffOperation[]\n): string {\n const parsed = JSON.parse(input);\n\n for (const op of operations) {\n applyOperation(parsed, op);\n }\n\n return JSON.stringify(parsed, null, 2);\n}\n\nfunction applyOperation(obj: unknown, operation: DiffOperation): void {\n const pathParts = operation.path.split('/').filter(Boolean);\n\n if (pathParts.length === 0) {\n throw new Error('Cannot apply operation to root');\n }\n\n const parent = getParent(obj, pathParts);\n const key = pathParts[pathParts.length - 1];\n\n switch (operation.op) {\n case 'add':\n case 'replace':\n if (Array.isArray(parent)) {\n const index = parseInt(key, 10);\n if (operation.op === 'add') {\n parent.splice(index, 0, operation.value);\n } else {\n parent[index] = operation.value;\n }\n } else if (typeof parent === 'object' && parent !== null) {\n (parent as Record<string, unknown>)[key] = operation.value;\n }\n break;\n case 'remove':\n if (Array.isArray(parent)) {\n parent.splice(parseInt(key, 10), 1);\n } else if (typeof parent === 'object' && parent !== null) {\n delete (parent as Record<string, unknown>)[key];\n }\n break;\n }\n}\n\nfunction getParent(obj: unknown, pathParts: string[]): unknown {\n let current = obj;\n\n for (let i = 0; i < pathParts.length - 1; i++) {\n const part = pathParts[i];\n if (Array.isArray(current)) {\n current = current[parseInt(part, 10)];\n } else if (typeof current === 'object' && current !== null) {\n current = (current as Record<string, unknown>)[part];\n }\n }\n\n return current;\n}\n","import type { JsonStats } from './types';\n\nexport function getStats(input: string): JsonStats {\n const parsed = JSON.parse(input);\n\n const stats: JsonStats = {\n keys: 0,\n depth: 0,\n arrays: 0,\n objects: 0,\n strings: 0,\n numbers: 0,\n booleans: 0,\n nulls: 0,\n sizeBytes: new TextEncoder().encode(input).length,\n };\n\n analyzeValue(parsed, stats, 0);\n\n return stats;\n}\n\nfunction analyzeValue(value: unknown, stats: JsonStats, depth: number): void {\n stats.depth = Math.max(stats.depth, depth);\n\n if (value === null) {\n stats.nulls++;\n return;\n }\n\n switch (typeof value) {\n case 'string':\n stats.strings++;\n break;\n case 'number':\n stats.numbers++;\n break;\n case 'boolean':\n stats.booleans++;\n break;\n case 'object':\n if (Array.isArray(value)) {\n stats.arrays++;\n for (const item of value) {\n analyzeValue(item, stats, depth + 1);\n }\n } else {\n stats.objects++;\n const keys = Object.keys(value as object);\n stats.keys += keys.length;\n for (const key of keys) {\n analyzeValue((value as Record<string, unknown>)[key], stats, depth + 1);\n }\n }\n break;\n }\n}\n\nexport function getSizeInfo(input: string): {\n bytes: number;\n formatted: string;\n minifiedBytes: number;\n savings: number;\n} {\n const bytes = new TextEncoder().encode(input).length;\n const minified = JSON.stringify(JSON.parse(input));\n const minifiedBytes = new TextEncoder().encode(minified).length;\n\n return {\n bytes,\n formatted: formatBytes(bytes),\n minifiedBytes,\n savings: bytes - minifiedBytes,\n };\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\n"]}
|