diff options
Diffstat (limited to 'src/tools/json-viewer')
-rw-r--r-- | src/tools/json-viewer/index.ts | 11 | ||||
-rw-r--r-- | src/tools/json-viewer/json-viewer.vue | 53 |
2 files changed, 64 insertions, 0 deletions
diff --git a/src/tools/json-viewer/index.ts b/src/tools/json-viewer/index.ts new file mode 100644 index 0000000..1911f61 --- /dev/null +++ b/src/tools/json-viewer/index.ts @@ -0,0 +1,11 @@ +import { Braces } from '@vicons/tabler'; +import type { ITool } from './../Tool'; + +export const tool: ITool = { + name: 'JSON viewer', + path: '/json-viewer', + description: 'Prettify JSON string to a human friendly readable format.', + keywords: ['json', 'viewer', 'prettify', 'format'], + component: () => import('./json-viewer.vue'), + icon: Braces, +}; diff --git a/src/tools/json-viewer/json-viewer.vue b/src/tools/json-viewer/json-viewer.vue new file mode 100644 index 0000000..3307cba --- /dev/null +++ b/src/tools/json-viewer/json-viewer.vue @@ -0,0 +1,53 @@ +<template> + <n-card> + <n-form-item + label="Your raw json:" + :feedback="rawJsonValidation.message" + :validation-status="rawJsonValidation.status" + > + <n-input v-model:value="rawJson" class="json-input" type="textarea" placeholder="Paste your raw json here..." /> + </n-form-item> + </n-card> + + <n-card v-if="cleanJson.length > 0"> + <n-scrollbar :x-scrollable="true"> + <n-config-provider :hljs="hljs"> + <n-code :code="cleanJson" language="json" /> + </n-config-provider> + </n-scrollbar> + </n-card> +</template> + +<script setup lang="ts"> +import { ref, computed } from 'vue'; +import hljs from 'highlight.js/lib/core'; +import json from 'highlight.js/lib/languages/json'; +import { useValidation } from '@/composable/validation'; + +hljs.registerLanguage('json', json); + +const rawJson = ref(''); +const cleanJson = computed(() => { + try { + return JSON.stringify(JSON.parse(rawJson.value), null, 3); + } catch (_) { + return ''; + } +}); + +const rawJsonValidation = useValidation({ + source: rawJson, + rules: [ + { + validator: (v) => JSON.parse(v), + message: 'Invalid json string', + }, + ], +}); +</script> + +<style lang="less" scoped> +.json-input ::v-deep(.n-input-wrapper) { + resize: both !important; +} +</style> |