diff options
Diffstat (limited to 'src/tools/json-viewer/json.models.ts')
-rw-r--r-- | src/tools/json-viewer/json.models.ts | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/tools/json-viewer/json.models.ts b/src/tools/json-viewer/json.models.ts new file mode 100644 index 0000000..15f981f --- /dev/null +++ b/src/tools/json-viewer/json.models.ts @@ -0,0 +1,35 @@ +import { get, type MaybeRef } from '@vueuse/core'; +import JSON5 from 'json5'; + +export { sortObjectKeys, formatJson }; + +function sortObjectKeys<T>(obj: T): T { + if (typeof obj !== 'object' || obj === null) { + return obj; + } + + if (Array.isArray(obj)) { + return obj.map(sortObjectKeys) as T; + } + + return Object.keys(obj) + .sort() + .reduce((sortedObj, key) => { + sortedObj[key] = sortObjectKeys((obj as Record<string, unknown>)[key]); + return sortedObj; + }, {} as Record<string, unknown>) as T; +} + +function formatJson({ + rawJson, + sortKeys = true, + indentSize = 3, +}: { + rawJson: MaybeRef<string>; + sortKeys?: MaybeRef<boolean>; + indentSize?: MaybeRef<number>; +}) { + const parsedObject = JSON5.parse(get(rawJson)); + + return JSON.stringify(get(sortKeys) ? sortObjectKeys(parsedObject) : parsedObject, null, get(indentSize)); +} |