aboutsummaryrefslogtreecommitdiff
path: root/src/tools/json-viewer/json-viewer.vue
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/json-viewer/json-viewer.vue')
-rw-r--r--src/tools/json-viewer/json-viewer.vue53
1 files changed, 53 insertions, 0 deletions
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>