devkits-json-formatter 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +103 -23
  2. package/index.js +153 -69
  3. package/package.json +17 -30
package/README.md CHANGED
@@ -1,45 +1,125 @@
1
1
  # @devkits/json-formatter
2
2
 
3
- Format and validate JSON from CLI or stdin. Part of [@devkits/tools](https://devkits-tools.surge.sh).
3
+ [![Part of DevKits](https://img.shields.io/badge/DevKits-84%2B%20Tools-blue)](https://devkits-tools.surge.sh)
4
+ [![DevKits Pro](https://img.shields.io/badge/Pro%20Available-%249%20one--time-amber)](https://devkits-tools.surge.sh/pro.html)
4
5
 
5
- ## Install
6
+ Format, validate, and minify JSON. Syntax error detection with position info. Zero-dependency JSON utility for developers.
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
6
23
 
7
24
  ```bash
8
- npm install -g @devkits/json-formatter
25
+ npm install @devkits/json-formatter
9
26
  ```
10
27
 
11
28
  ## Usage
12
29
 
13
- ### Format JSON (pretty print)
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}' }
83
+ ```
14
84
 
15
- ```bash
16
- # From stdin
17
- echo '{"name":"DevKits","tools":84}' | jsonfmt
85
+ ## API
18
86
 
19
- # From file
20
- jsonfmt package.json
87
+ ### `format(jsonString, options)`
88
+ Formats JSON with specified indentation (default: 2 spaces).
21
89
 
22
- # From JSON string
23
- jsonfmt '{"test":true}'
24
- ```
90
+ Returns `{success, result?, error?}`.
25
91
 
26
- ### Minify JSON
92
+ ### `minify(jsonString)`
93
+ Removes all whitespace from JSON.
27
94
 
28
- ```bash
29
- jsonfmt package.json --minify
30
- jsonfmt '{"test":true}' -m
31
- ```
95
+ Returns `{success, result?, error?, saved?}`.
96
+
97
+ ### `isValid(jsonString)`
98
+ Validates JSON syntax with optional error position.
99
+
100
+ Returns `{valid, error?, position?}`.
101
+
102
+ ### `pretty(obj, indent)`
103
+ Pretty prints a JavaScript object as JSON string.
104
+
105
+ ### `countKeys(obj)`
106
+ Counts all keys in an object recursively.
32
107
 
33
- ### Web Version
108
+ ### `getSizeInfo(jsonString)`
109
+ Returns size statistics: original size, minified size, bytes saved, key count.
34
110
 
35
- Use the web version at: https://devkits-tools.surge.sh
111
+ ### `sortKeys(obj)`
112
+ Returns new object with keys sorted alphabetically (recursive).
36
113
 
37
- ### Pro Features
114
+ ### `formatSorted(jsonString, indent)`
115
+ Formats JSON with keys sorted alphabetically.
38
116
 
39
- Unlock batch processing, API access, and cloud sync: https://devkits-tools.surge.sh/pro
117
+ ## See Also
40
118
 
41
- Use code `EARLYBIRD-2026` for 20% off ($7.20 instead of $9).
119
+ - [DevKits](https://devkits-tools.surge.sh) 82 free developer tools
120
+ - [Invoicely](https://invoicely-app.surge.sh) — Free invoice generator
121
+ - [SnapOG](https://snapog.surge.sh) — Free OG image generator
42
122
 
43
123
  ## License
44
124
 
45
- MIT — DevKits Team
125
+ MIT
package/index.js CHANGED
@@ -1,93 +1,177 @@
1
- #!/usr/bin/env node
2
-
3
1
  /**
4
- * @devkits/json-formatter — Format and validate JSON
2
+ * @devkits/json-formatter
5
3
  *
6
- * Usage:
7
- * jsonfmt <file|json> [--minify]
8
- * echo '{"foo":"bar"}' | jsonfmt
9
- * jsonfmt package.json
4
+ * Format, validate, and minify JSON.
5
+ * Works in both Node.js and browser environments.
10
6
  */
11
7
 
12
- const fs = require('fs');
13
-
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';
15
-
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
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;
34
17
 
35
- Web Version: https://devkits-tools.surge.sh
36
- Pro Features: https://devkits-tools.surge.sh/pro
37
- `);
18
+ try {
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
+ }
38
30
  }
39
31
 
40
- function formatJSON(input, minify = false) {
32
+ /**
33
+ * Minify JSON (remove all whitespace)
34
+ * @param {string} jsonString - JSON string to minify
35
+ * @returns {{success: boolean, result?: string, error?: string, saved?: number}}
36
+ */
37
+ function minify(jsonString) {
41
38
  try {
42
- let jsonData;
39
+ const parsed = JSON.parse(jsonString);
40
+ const minified = JSON.stringify(parsed);
41
+ return {
42
+ success: true,
43
+ result: minified,
44
+ saved: jsonString.length - minified.length
45
+ };
46
+ } catch (e) {
47
+ return {
48
+ success: false,
49
+ error: e.message
50
+ };
51
+ }
52
+ }
43
53
 
44
- // Check if input is a file path
45
- if (fs.existsSync(input)) {
46
- input = fs.readFileSync(input, 'utf-8');
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) {
60
+ try {
61
+ JSON.parse(jsonString);
62
+ return { valid: true };
63
+ } catch (e) {
64
+ // Try to extract position from error message
65
+ const posMatch = e.message.match(/position\s+(\d+)/i);
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
+ };
47
75
  }
48
76
 
49
- jsonData = JSON.parse(input);
77
+ return {
78
+ valid: false,
79
+ error: e.message,
80
+ position
81
+ };
82
+ }
83
+ }
50
84
 
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
- }
85
+ /**
86
+ * Pretty print a JavaScript object as JSON
87
+ * @param {any} obj - Object to pretty print
88
+ * @param {number} [indent=2] - Indentation spaces
89
+ * @returns {string} Formatted JSON string
90
+ */
91
+ function pretty(obj, indent = 2) {
92
+ return JSON.stringify(obj, null, indent);
93
+ }
57
94
 
58
- } catch (err) {
59
- console.error(`❌ Invalid JSON: ${err.message}`);
60
- process.exit(1);
95
+ /**
96
+ * Count keys in a JSON object recursively
97
+ * @param {any} obj - Object to count keys in
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);
61
104
  }
105
+ return Object.keys(obj).reduce((n, k) => n + 1 + countKeys(obj[k]), 0);
62
106
  }
63
107
 
64
- // Main
65
- const args = process.argv.slice(2);
108
+ /**
109
+ * Get JSON size info
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
+ }
66
126
 
67
- // Check for help
68
- if (args.includes('--help') || args.includes('-h')) {
69
- showHelp();
70
- process.exit(0);
127
+ return info;
71
128
  }
72
129
 
73
- const minify = args.includes('--minify') || args.includes('-m');
74
- const input = args.filter(a => !a.startsWith('-')).join(' ');
130
+ /**
131
+ * Sort object keys alphabetically
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
+ }
75
145
 
76
- if (!input) {
77
- // Read from stdin
146
+ /**
147
+ * Format with sorted keys
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) {
78
153
  try {
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);
154
+ const parsed = JSON.parse(jsonString);
155
+ const sorted = sortKeys(parsed);
156
+ return {
157
+ success: true,
158
+ result: JSON.stringify(sorted, null, indent)
159
+ };
160
+ } catch (e) {
161
+ return {
162
+ success: false,
163
+ error: e.message
164
+ };
88
165
  }
89
- } else {
90
- formatJSON(input, minify);
91
166
  }
92
167
 
93
- console.log(PRO_UPGRADE);
168
+ module.exports = {
169
+ format,
170
+ minify,
171
+ isValid,
172
+ pretty,
173
+ countKeys,
174
+ getSizeInfo,
175
+ sortKeys,
176
+ formatSorted
177
+ };
package/package.json CHANGED
@@ -1,40 +1,27 @@
1
1
  {
2
2
  "name": "devkits-json-formatter",
3
- "version": "1.0.0",
4
- "description": "Format and validate JSON from CLI or stdin pretty print, minify, and validate JSON files",
3
+ "version": "1.0.2",
4
+ "description": "Format, validate, and minify JSON. Syntax error detection with position info. Zero-dependency JSON utility for developers.",
5
5
  "main": "index.js",
6
- "bin": {
7
- "jsonfmt": "./index.js",
8
- "json-formatter": "./index.js"
9
- },
10
- "scripts": {
11
- "test": "node test.js"
12
- },
6
+ "files": [
7
+ "index.js",
8
+ "README.md"
9
+ ],
13
10
  "keywords": [
14
11
  "json",
15
- "formatter",
16
- "validator",
17
- "cli",
18
- "pretty-print",
19
- "minify",
20
- "developer-tools"
12
+ "json-formatter",
13
+ "json-validator",
14
+ "json-minifier",
15
+ "json-beautifier",
16
+ "json-linter",
17
+ "developer-tools",
18
+ "devkits"
21
19
  ],
22
- "author": "DevKits Team <devkits-auto@protonmail.com>",
20
+ "author": "DevKits Auto <devkits-auto@protonmail.com>",
23
21
  "license": "MIT",
24
- "repository": {
25
- "type": "git",
26
- "url": "https://github.com/devkits/tools"
27
- },
28
- "homepage": "https://devkits-tools.surge.sh",
22
+ "repository": "",
29
23
  "bugs": {
30
- "url": "https://github.com/devkits/tools/issues"
31
- },
32
- "engines": {
33
- "node": ">=14.0.0"
24
+ "url": "https://github.com/devkits/devkits/issues"
34
25
  },
35
- "files": [
36
- "index.js",
37
- "README.md"
38
- ],
39
- "dependencies": {}
26
+ "homepage": "https://devkits-tools.surge.sh"
40
27
  }