import { type MaybeRef, get } from '@vueuse/core'; import JSON5 from 'json5'; export { sortObjectKeys, formatJson }; function sortObjectKeys(obj: T): T { if (typeof obj !== 'object' || obj === null) { return obj; } if (Array.isArray(obj)) { return obj.map(sortObjectKeys) as unknown as T; } return Object.keys(obj) .sort((a, b) => a.localeCompare(b)) .reduce((sortedObj, key) => { sortedObj[key] = sortObjectKeys((obj as Record)[key]); return sortedObj; }, {} as Record) as T; } function unescapeUnicodeJSON(str: string) { return str.replace(/\\u([\dA-Fa-f]{4})/g, (match, grp) => String.fromCharCode(Number.parseInt(grp, 16)), ); } function formatJson({ rawJson, sortKeys = true, indentSize = 3, unescapeUnicode = false, }: { rawJson: MaybeRef sortKeys?: MaybeRef indentSize?: MaybeRef unescapeUnicode?: MaybeRef }) { const raw = get(rawJson); const parsedObject = JSON5.parse(get(unescapeUnicode) ? unescapeUnicodeJSON(raw) : raw); return JSON.stringify(get(sortKeys) ? sortObjectKeys(parsedObject) : parsedObject, null, get(indentSize)); }