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.
Files changed (3) hide show
  1. package/README.md +27 -104
  2. package/index.js +69 -153
  3. package/package.json +30 -17
package/README.md CHANGED
@@ -1,125 +1,48 @@
1
- # @devkits/json-formatter
1
+ # devkits-json-formatter
2
2
 
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)
3
+ Format and validate JSON from CLI or stdin. Part of [DevKits Tools](https://devkits-tools.surge.sh).
5
4
 
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
5
+ ## Install
23
6
 
24
7
  ```bash
25
- npm install @devkits/json-formatter
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
- ## API
11
+ [![npm version](https://badge.fury.io/js/devkits-json-formatter.svg)](https://www.npmjs.com/package/devkits-json-formatter)
86
12
 
87
- ### `format(jsonString, options)`
88
- Formats JSON with specified indentation (default: 2 spaces).
89
-
90
- Returns `{success, result?, error?}`.
13
+ ## Usage
91
14
 
92
- ### `minify(jsonString)`
93
- Removes all whitespace from JSON.
15
+ ### Format JSON (pretty print)
94
16
 
95
- Returns `{success, result?, error?, saved?}`.
17
+ ```bash
18
+ # From stdin
19
+ echo '{"name":"DevKits","tools":84}' | jsonfmt
96
20
 
97
- ### `isValid(jsonString)`
98
- Validates JSON syntax with optional error position.
21
+ # From file
22
+ jsonfmt package.json
99
23
 
100
- Returns `{valid, error?, position?}`.
24
+ # From JSON string
25
+ jsonfmt '{"test":true}'
26
+ ```
101
27
 
102
- ### `pretty(obj, indent)`
103
- Pretty prints a JavaScript object as JSON string.
28
+ ### Minify JSON
104
29
 
105
- ### `countKeys(obj)`
106
- Counts all keys in an object recursively.
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
- ### `sortKeys(obj)`
112
- Returns new object with keys sorted alphabetically (recursive).
36
+ ---
113
37
 
114
- ### `formatSorted(jsonString, indent)`
115
- Formats JSON with keys sorted alphabetically.
38
+ ## More Free Tools
116
39
 
117
- ## See Also
40
+ Explore 82+ free developer tools at [aiforeverthing.com](https://aiforeverthing.com)
118
41
 
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
+ - 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
- * Format, validate, and minify JSON.
5
- * Works in both Node.js and browser environments.
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
- 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
- }
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
- * 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) {
38
- try {
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
- }
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
- 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
- };
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
- return {
78
- valid: false,
79
- error: e.message,
80
- position
81
- };
82
- }
83
- }
49
+ jsonData = JSON.parse(input);
84
50
 
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
- }
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
- * 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);
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
- * 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
- }
64
+ // Main
65
+ const args = process.argv.slice(2);
126
66
 
127
- return info;
67
+ // Check for help
68
+ if (args.includes('--help') || args.includes('-h')) {
69
+ showHelp();
70
+ process.exit(0);
128
71
  }
129
72
 
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
- }
73
+ const minify = args.includes('--minify') || args.includes('-m');
74
+ const input = args.filter(a => !a.startsWith('-')).join(' ');
145
75
 
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) {
76
+ if (!input) {
77
+ // Read from stdin
153
78
  try {
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
- };
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
- module.exports = {
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.2",
4
- "description": "Format, validate, and minify JSON. Syntax error detection with position info. Zero-dependency JSON utility for developers.",
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
- "files": [
7
- "index.js",
8
- "README.md"
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
- "json-formatter",
13
- "json-validator",
14
- "json-minifier",
15
- "json-beautifier",
16
- "json-linter",
17
- "developer-tools",
18
- "devkits"
15
+ "formatter",
16
+ "validator",
17
+ "cli",
18
+ "pretty-print",
19
+ "minify",
20
+ "developer-tools"
19
21
  ],
20
- "author": "DevKits Auto <devkits-auto@protonmail.com>",
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/devkits/issues"
30
+ "url": "https://github.com/devkits/tools/issues"
31
+ },
32
+ "engines": {
33
+ "node": ">=14.0.0"
25
34
  },
26
- "homepage": "https://devkits-tools.surge.sh"
35
+ "files": [
36
+ "index.js",
37
+ "README.md"
38
+ ],
39
+ "dependencies": {}
27
40
  }