devkits-json-formatter 1.0.2 → 1.0.5
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 +27 -104
- package/index.js +69 -153
- package/package.json +30 -17
package/README.md
CHANGED
|
@@ -1,125 +1,48 @@
|
|
|
1
|
-
#
|
|
1
|
+
# devkits-json-formatter
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
[](https://devkits-tools.surge.sh/pro.html)
|
|
3
|
+
Format and validate JSON from CLI or stdin. Part of [DevKits Tools](https://devkits-tools.surge.sh).
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
## 💎 Upgrade to DevKits Pro
|
|
9
|
-
|
|
10
|
-
Get access to **20+ premium tools** including SQL to Code, Data Faker, JWT Generator, and more — all for **$9 one-time**.
|
|
11
|
-
|
|
12
|
-
**[→ Unlock DevKits Pro](https://devkits-tools.surge.sh/pro.html)**
|
|
13
|
-
|
|
14
|
-
> 💡 **Pay with Crypto:** BTC, ETH, USDT (TRC-20), SOL accepted. [View crypto addresses](https://devkits-tools.surge.sh/assets/crypto-payment-addresses.md)
|
|
15
|
-
|
|
16
|
-
## 🧰 DevKits Pro Tools
|
|
17
|
-
|
|
18
|
-
This package is part of **DevKits** — 82+ free developer tools. The online JSON Formatter includes schema validation, tree view, and query/filter tools.
|
|
19
|
-
|
|
20
|
-
**→ [Format JSON with Tree View](https://devkits-tools.surge.sh)**
|
|
21
|
-
|
|
22
|
-
## Installation
|
|
5
|
+
## Install
|
|
23
6
|
|
|
24
7
|
```bash
|
|
25
|
-
npm install
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Usage
|
|
29
|
-
|
|
30
|
-
```javascript
|
|
31
|
-
const {
|
|
32
|
-
format,
|
|
33
|
-
minify,
|
|
34
|
-
isValid,
|
|
35
|
-
pretty,
|
|
36
|
-
countKeys,
|
|
37
|
-
getSizeInfo,
|
|
38
|
-
sortKeys,
|
|
39
|
-
formatSorted
|
|
40
|
-
} = require('@devkits/json-formatter');
|
|
41
|
-
|
|
42
|
-
const uglyJson = '{"name":"John","age":30,"city":"NYC"}';
|
|
43
|
-
|
|
44
|
-
// Format JSON with indentation
|
|
45
|
-
const result = format(uglyJson, { indent: 2 });
|
|
46
|
-
// {
|
|
47
|
-
// success: true,
|
|
48
|
-
// result: '{\n "name": "John",\n "age": 30,\n "city": "NYC"\n}'
|
|
49
|
-
// }
|
|
50
|
-
|
|
51
|
-
// Minify JSON
|
|
52
|
-
const min = minify(uglyJson);
|
|
53
|
-
// { success: true, result: '{"name":"John",...}', saved: 15 }
|
|
54
|
-
|
|
55
|
-
// Validate JSON
|
|
56
|
-
isValid('{"valid": true}');
|
|
57
|
-
// { valid: true }
|
|
58
|
-
|
|
59
|
-
isValid('{invalid}');
|
|
60
|
-
// { valid: false, error: 'Unexpected token...', position: {line: 1, column: 2} }
|
|
61
|
-
|
|
62
|
-
// Pretty print an object
|
|
63
|
-
pretty({ name: 'John', age: 30 });
|
|
64
|
-
// '{\n "name": "John",\n "age": 30\n}'
|
|
65
|
-
|
|
66
|
-
// Count keys recursively
|
|
67
|
-
const nested = { a: { b: { c: 1 } }, d: [1, 2, 3] };
|
|
68
|
-
countKeys(nested);
|
|
69
|
-
// 5
|
|
70
|
-
|
|
71
|
-
// Get size info
|
|
72
|
-
getSizeInfo(uglyJson);
|
|
73
|
-
// { original: 36, minified: 36, saved: 0, keys: 3 }
|
|
74
|
-
|
|
75
|
-
// Sort keys alphabetically
|
|
76
|
-
const unsorted = { z: 1, a: 2, m: 3 };
|
|
77
|
-
sortKeys(unsorted);
|
|
78
|
-
// { a: 2, m: 3, z: 1 }
|
|
79
|
-
|
|
80
|
-
// Format with sorted keys
|
|
81
|
-
formatSorted('{"z":1,"a":2}', 2);
|
|
82
|
-
// { success: true, result: '{\n "a": 2,\n "z": 1\n}' }
|
|
8
|
+
npm install -g devkits-json-formatter
|
|
83
9
|
```
|
|
84
10
|
|
|
85
|
-
|
|
11
|
+
[](https://www.npmjs.com/package/devkits-json-formatter)
|
|
86
12
|
|
|
87
|
-
|
|
88
|
-
Formats JSON with specified indentation (default: 2 spaces).
|
|
89
|
-
|
|
90
|
-
Returns `{success, result?, error?}`.
|
|
13
|
+
## Usage
|
|
91
14
|
|
|
92
|
-
###
|
|
93
|
-
Removes all whitespace from JSON.
|
|
15
|
+
### Format JSON (pretty print)
|
|
94
16
|
|
|
95
|
-
|
|
17
|
+
```bash
|
|
18
|
+
# From stdin
|
|
19
|
+
echo '{"name":"DevKits","tools":84}' | jsonfmt
|
|
96
20
|
|
|
97
|
-
|
|
98
|
-
|
|
21
|
+
# From file
|
|
22
|
+
jsonfmt package.json
|
|
99
23
|
|
|
100
|
-
|
|
24
|
+
# From JSON string
|
|
25
|
+
jsonfmt '{"test":true}'
|
|
26
|
+
```
|
|
101
27
|
|
|
102
|
-
###
|
|
103
|
-
Pretty prints a JavaScript object as JSON string.
|
|
28
|
+
### Minify JSON
|
|
104
29
|
|
|
105
|
-
|
|
106
|
-
|
|
30
|
+
```bash
|
|
31
|
+
jsonfmt package.json --minify
|
|
32
|
+
jsonfmt '{"test":true}' -m
|
|
33
|
+
```
|
|
107
34
|
|
|
108
|
-
### `getSizeInfo(jsonString)`
|
|
109
|
-
Returns size statistics: original size, minified size, bytes saved, key count.
|
|
110
35
|
|
|
111
|
-
|
|
112
|
-
Returns new object with keys sorted alphabetically (recursive).
|
|
36
|
+
---
|
|
113
37
|
|
|
114
|
-
|
|
115
|
-
Formats JSON with keys sorted alphabetically.
|
|
38
|
+
## More Free Tools
|
|
116
39
|
|
|
117
|
-
|
|
40
|
+
Explore 82+ free developer tools at [aiforeverthing.com](https://aiforeverthing.com)
|
|
118
41
|
|
|
119
|
-
-
|
|
120
|
-
-
|
|
121
|
-
-
|
|
42
|
+
- No signup required
|
|
43
|
+
- 100% free
|
|
44
|
+
- Browser-based
|
|
122
45
|
|
|
123
46
|
## License
|
|
124
47
|
|
|
125
|
-
MIT
|
|
48
|
+
MIT — DevKits Team
|
package/index.js
CHANGED
|
@@ -1,177 +1,93 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
|
-
* @devkits/json-formatter
|
|
4
|
+
* @devkits/json-formatter — Format and validate JSON
|
|
3
5
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* jsonfmt <file|json> [--minify]
|
|
8
|
+
* echo '{"foo":"bar"}' | jsonfmt
|
|
9
|
+
* jsonfmt package.json
|
|
6
10
|
*/
|
|
7
11
|
|
|
8
|
-
|
|
9
|
-
* Format JSON string with indentation
|
|
10
|
-
* @param {string} jsonString - JSON string to format
|
|
11
|
-
* @param {Object} options - Format options
|
|
12
|
-
* @param {number} options.indent - Indentation spaces (default: 2)
|
|
13
|
-
* @returns {{success: boolean, result?: string, error?: string}}
|
|
14
|
-
*/
|
|
15
|
-
function format(jsonString, options = {}) {
|
|
16
|
-
const { indent = 2 } = options;
|
|
12
|
+
const fs = require('fs');
|
|
17
13
|
|
|
18
|
-
|
|
19
|
-
const parsed = JSON.parse(jsonString);
|
|
20
|
-
return {
|
|
21
|
-
success: true,
|
|
22
|
-
result: JSON.stringify(parsed, null, indent)
|
|
23
|
-
};
|
|
24
|
-
} catch (e) {
|
|
25
|
-
return {
|
|
26
|
-
success: false,
|
|
27
|
-
error: e.message
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
}
|
|
14
|
+
const PRO_UPGRADE = '\n🚀 Want more? Upgrade to Pro: https://devkits-tools.surge.sh/pro\n Use code EARLYBIRD-2026 for 20% off\n';
|
|
31
15
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
16
|
+
function showHelp() {
|
|
17
|
+
console.log(`
|
|
18
|
+
@devkits/json-formatter — Format and validate JSON
|
|
19
|
+
|
|
20
|
+
Usage:
|
|
21
|
+
jsonfmt <file|json> [--minify]
|
|
22
|
+
jsonfmt package.json
|
|
23
|
+
jsonfmt '{"foo":"bar"}'
|
|
24
|
+
echo '{"test":true}' | jsonfmt
|
|
25
|
+
|
|
26
|
+
Options:
|
|
27
|
+
--minify, -m Minify JSON (remove whitespace)
|
|
28
|
+
--help, -h Show this help
|
|
29
|
+
|
|
30
|
+
Examples:
|
|
31
|
+
jsonfmt package.json
|
|
32
|
+
jsonfmt '{"foo":"bar"}' --minify
|
|
33
|
+
cat data.json | jsonfmt
|
|
34
|
+
|
|
35
|
+
Web Version: https://devkits-tools.surge.sh
|
|
36
|
+
Pro Features: https://devkits-tools.surge.sh/pro
|
|
37
|
+
`);
|
|
52
38
|
}
|
|
53
39
|
|
|
54
|
-
|
|
55
|
-
* Validate JSON syntax
|
|
56
|
-
* @param {string} jsonString - JSON string to validate
|
|
57
|
-
* @returns {{valid: boolean, error?: string, position?: {line: number, column: number}}}
|
|
58
|
-
*/
|
|
59
|
-
function isValid(jsonString) {
|
|
40
|
+
function formatJSON(input, minify = false) {
|
|
60
41
|
try {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
let position = null;
|
|
67
|
-
|
|
68
|
-
if (posMatch) {
|
|
69
|
-
const pos = parseInt(posMatch[1], 10);
|
|
70
|
-
const lines = jsonString.substring(0, pos).split('\n');
|
|
71
|
-
position = {
|
|
72
|
-
line: lines.length,
|
|
73
|
-
column: lines[lines.length - 1].length + 1
|
|
74
|
-
};
|
|
42
|
+
let jsonData;
|
|
43
|
+
|
|
44
|
+
// Check if input is a file path
|
|
45
|
+
if (fs.existsSync(input)) {
|
|
46
|
+
input = fs.readFileSync(input, 'utf-8');
|
|
75
47
|
}
|
|
76
48
|
|
|
77
|
-
|
|
78
|
-
valid: false,
|
|
79
|
-
error: e.message,
|
|
80
|
-
position
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
}
|
|
49
|
+
jsonData = JSON.parse(input);
|
|
84
50
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
function pretty(obj, indent = 2) {
|
|
92
|
-
return JSON.stringify(obj, null, indent);
|
|
93
|
-
}
|
|
51
|
+
if (minify) {
|
|
52
|
+
console.log(JSON.stringify(jsonData));
|
|
53
|
+
} else {
|
|
54
|
+
console.log(JSON.stringify(jsonData, null, 2));
|
|
55
|
+
console.log(`\n✅ Valid JSON`);
|
|
56
|
+
}
|
|
94
57
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
* @returns {number} Total key count
|
|
99
|
-
*/
|
|
100
|
-
function countKeys(obj) {
|
|
101
|
-
if (typeof obj !== 'object' || obj === null) return 0;
|
|
102
|
-
if (Array.isArray(obj)) {
|
|
103
|
-
return obj.reduce((n, v) => n + countKeys(v), 0);
|
|
58
|
+
} catch (err) {
|
|
59
|
+
console.error(`❌ Invalid JSON: ${err.message}`);
|
|
60
|
+
process.exit(1);
|
|
104
61
|
}
|
|
105
|
-
return Object.keys(obj).reduce((n, k) => n + 1 + countKeys(obj[k]), 0);
|
|
106
62
|
}
|
|
107
63
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
* @param {string} jsonString - JSON string
|
|
111
|
-
* @returns {{original: number, minified?: number, saved?: number, keys?: number}}
|
|
112
|
-
*/
|
|
113
|
-
function getSizeInfo(jsonString) {
|
|
114
|
-
const info = { original: jsonString.length };
|
|
115
|
-
|
|
116
|
-
try {
|
|
117
|
-
const parsed = JSON.parse(jsonString);
|
|
118
|
-
info.keys = countKeys(parsed);
|
|
119
|
-
|
|
120
|
-
const minified = JSON.stringify(parsed);
|
|
121
|
-
info.minified = minified.length;
|
|
122
|
-
info.saved = jsonString.length - minified.length;
|
|
123
|
-
} catch (e) {
|
|
124
|
-
// Invalid JSON
|
|
125
|
-
}
|
|
64
|
+
// Main
|
|
65
|
+
const args = process.argv.slice(2);
|
|
126
66
|
|
|
127
|
-
|
|
67
|
+
// Check for help
|
|
68
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
69
|
+
showHelp();
|
|
70
|
+
process.exit(0);
|
|
128
71
|
}
|
|
129
72
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
* @param {any} obj - Object to sort
|
|
133
|
-
* @returns {any} Object with sorted keys
|
|
134
|
-
*/
|
|
135
|
-
function sortKeys(obj) {
|
|
136
|
-
if (obj === null || typeof obj !== 'object') return obj;
|
|
137
|
-
if (Array.isArray(obj)) return obj.map(sortKeys);
|
|
138
|
-
|
|
139
|
-
const sorted = {};
|
|
140
|
-
Object.keys(obj).sort().forEach(key => {
|
|
141
|
-
sorted[key] = sortKeys(obj[key]);
|
|
142
|
-
});
|
|
143
|
-
return sorted;
|
|
144
|
-
}
|
|
73
|
+
const minify = args.includes('--minify') || args.includes('-m');
|
|
74
|
+
const input = args.filter(a => !a.startsWith('-')).join(' ');
|
|
145
75
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
* @param {string} jsonString - JSON string
|
|
149
|
-
* @param {number} [indent=2] - Indentation spaces
|
|
150
|
-
* @returns {{success: boolean, result?: string, error?: string}}
|
|
151
|
-
*/
|
|
152
|
-
function formatSorted(jsonString, indent = 2) {
|
|
76
|
+
if (!input) {
|
|
77
|
+
// Read from stdin
|
|
153
78
|
try {
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
} catch (
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
error: e.message
|
|
164
|
-
};
|
|
79
|
+
const stdin = fs.readFileSync(0, 'utf-8').trim();
|
|
80
|
+
if (!stdin) {
|
|
81
|
+
showHelp();
|
|
82
|
+
process.exit(0);
|
|
83
|
+
}
|
|
84
|
+
formatJSON(stdin, minify);
|
|
85
|
+
} catch (err) {
|
|
86
|
+
console.error('Error reading stdin: ' + err.message);
|
|
87
|
+
process.exit(1);
|
|
165
88
|
}
|
|
89
|
+
} else {
|
|
90
|
+
formatJSON(input, minify);
|
|
166
91
|
}
|
|
167
92
|
|
|
168
|
-
|
|
169
|
-
format,
|
|
170
|
-
minify,
|
|
171
|
-
isValid,
|
|
172
|
-
pretty,
|
|
173
|
-
countKeys,
|
|
174
|
-
getSizeInfo,
|
|
175
|
-
sortKeys,
|
|
176
|
-
formatSorted
|
|
177
|
-
};
|
|
93
|
+
console.log(PRO_UPGRADE);
|
package/package.json
CHANGED
|
@@ -1,27 +1,40 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "devkits-json-formatter",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "Format
|
|
3
|
+
"version": "1.0.5",
|
|
4
|
+
"description": "Format and validate JSON from CLI or stdin — pretty print, minify, and validate JSON files",
|
|
5
5
|
"main": "index.js",
|
|
6
|
-
"
|
|
7
|
-
"index.js",
|
|
8
|
-
"
|
|
9
|
-
|
|
6
|
+
"bin": {
|
|
7
|
+
"jsonfmt": "./index.js",
|
|
8
|
+
"json-formatter": "./index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"test": "node test.js"
|
|
12
|
+
},
|
|
10
13
|
"keywords": [
|
|
11
14
|
"json",
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"developer-tools"
|
|
18
|
-
"devkits"
|
|
15
|
+
"formatter",
|
|
16
|
+
"validator",
|
|
17
|
+
"cli",
|
|
18
|
+
"pretty-print",
|
|
19
|
+
"minify",
|
|
20
|
+
"developer-tools"
|
|
19
21
|
],
|
|
20
|
-
"author": "DevKits
|
|
22
|
+
"author": "DevKits Team <devkits-auto@protonmail.com>",
|
|
21
23
|
"license": "MIT",
|
|
22
|
-
"repository":
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "https://github.com/devkits/tools"
|
|
27
|
+
},
|
|
28
|
+
"homepage": "https://devkits-tools.surge.sh",
|
|
23
29
|
"bugs": {
|
|
24
|
-
"url": "https://github.com/devkits/
|
|
30
|
+
"url": "https://github.com/devkits/tools/issues"
|
|
31
|
+
},
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=14.0.0"
|
|
25
34
|
},
|
|
26
|
-
"
|
|
35
|
+
"files": [
|
|
36
|
+
"index.js",
|
|
37
|
+
"README.md"
|
|
38
|
+
],
|
|
39
|
+
"dependencies": {}
|
|
27
40
|
}
|