Skip to content

Commit bb1f872

Browse files
committed
feat(new tool): JSON to object
1 parent 318fb6e commit bb1f872

File tree

7 files changed

+121
-8
lines changed

7 files changed

+121
-8
lines changed

components.d.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,17 +90,28 @@ declare module '@vue/runtime-core' {
9090
HttpStatusCodes: typeof import('./src/tools/http-status-codes/http-status-codes.vue')['default']
9191
IbanValidatorAndParser: typeof import('./src/tools/iban-validator-and-parser/iban-validator-and-parser.vue')['default']
9292
'IconMdi:brushVariant': typeof import('~icons/mdi/brush-variant')['default']
93+
'IconMdi:contentCopy': typeof import('~icons/mdi/content-copy')['default']
9394
'IconMdi:kettleSteamOutline': typeof import('~icons/mdi/kettle-steam-outline')['default']
95+
IconMdiArrowDown: typeof import('~icons/mdi/arrow-down')['default']
96+
IconMdiArrowRightBottom: typeof import('~icons/mdi/arrow-right-bottom')['default']
97+
IconMdiCamera: typeof import('~icons/mdi/camera')['default']
9498
IconMdiChevronDown: typeof import('~icons/mdi/chevron-down')['default']
9599
IconMdiChevronRight: typeof import('~icons/mdi/chevron-right')['default']
96100
IconMdiClose: typeof import('~icons/mdi/close')['default']
97101
IconMdiContentCopy: typeof import('~icons/mdi/content-copy')['default']
102+
IconMdiDeleteOutline: typeof import('~icons/mdi/delete-outline')['default']
103+
IconMdiDownload: typeof import('~icons/mdi/download')['default']
98104
IconMdiEye: typeof import('~icons/mdi/eye')['default']
99105
IconMdiEyeOff: typeof import('~icons/mdi/eye-off')['default']
100106
IconMdiHeart: typeof import('~icons/mdi/heart')['default']
107+
IconMdiPause: typeof import('~icons/mdi/pause')['default']
108+
IconMdiPlay: typeof import('~icons/mdi/play')['default']
109+
IconMdiRecord: typeof import('~icons/mdi/record')['default']
110+
IconMdiRefresh: typeof import('~icons/mdi/refresh')['default']
101111
IconMdiSearch: typeof import('~icons/mdi/search')['default']
102112
IconMdiTranslate: typeof import('~icons/mdi/translate')['default']
103113
IconMdiTriangleDown: typeof import('~icons/mdi/triangle-down')['default']
114+
IconMdiVideo: typeof import('~icons/mdi/video')['default']
104115
InputCopyable: typeof import('./src/components/InputCopyable.vue')['default']
105116
IntegerBaseConverter: typeof import('./src/tools/integer-base-converter/integer-base-converter.vue')['default']
106117
Ipv4AddressConverter: typeof import('./src/tools/ipv4-address-converter/ipv4-address-converter.vue')['default']
@@ -110,6 +121,7 @@ declare module '@vue/runtime-core' {
110121
JsonDiff: typeof import('./src/tools/json-diff/json-diff.vue')['default']
111122
JsonMinify: typeof import('./src/tools/json-minify/json-minify.vue')['default']
112123
JsonToCsv: typeof import('./src/tools/json-to-csv/json-to-csv.vue')['default']
124+
JsonToObject: typeof import('./src/tools/json-to-object/json-to-object.vue')['default']
113125
JsonToToml: typeof import('./src/tools/json-to-toml/json-to-toml.vue')['default']
114126
JsonToXml: typeof import('./src/tools/json-to-xml/json-to-xml.vue')['default']
115127
JsonToYaml: typeof import('./src/tools/json-to-yaml-converter/json-to-yaml.vue')['default']
@@ -128,23 +140,40 @@ declare module '@vue/runtime-core' {
128140
MenuLayout: typeof import('./src/components/MenuLayout.vue')['default']
129141
MetaTagGenerator: typeof import('./src/tools/meta-tag-generator/meta-tag-generator.vue')['default']
130142
MimeTypes: typeof import('./src/tools/mime-types/mime-types.vue')['default']
143+
NAlert: typeof import('naive-ui')['NAlert']
131144
NavbarButtons: typeof import('./src/components/NavbarButtons.vue')['default']
145+
NCheckbox: typeof import('naive-ui')['NCheckbox']
132146
NCode: typeof import('naive-ui')['NCode']
133147
NCollapseTransition: typeof import('naive-ui')['NCollapseTransition']
148+
NColorPicker: typeof import('naive-ui')['NColorPicker']
134149
NConfigProvider: typeof import('naive-ui')['NConfigProvider']
150+
NDatePicker: typeof import('naive-ui')['NDatePicker']
151+
NDivider: typeof import('naive-ui')['NDivider']
152+
NDynamicInput: typeof import('naive-ui')['NDynamicInput']
135153
NEllipsis: typeof import('naive-ui')['NEllipsis']
136154
NForm: typeof import('naive-ui')['NForm']
137155
NFormItem: typeof import('naive-ui')['NFormItem']
156+
NGi: typeof import('naive-ui')['NGi']
157+
NGrid: typeof import('naive-ui')['NGrid']
138158
NH1: typeof import('naive-ui')['NH1']
159+
NH2: typeof import('naive-ui')['NH2']
139160
NH3: typeof import('naive-ui')['NH3']
140161
NIcon: typeof import('naive-ui')['NIcon']
162+
NImage: typeof import('naive-ui')['NImage']
163+
NInputGroup: typeof import('naive-ui')['NInputGroup']
164+
NInputGroupLabel: typeof import('naive-ui')['NInputGroupLabel']
141165
NInputNumber: typeof import('naive-ui')['NInputNumber']
142166
NLayout: typeof import('naive-ui')['NLayout']
143167
NLayoutSider: typeof import('naive-ui')['NLayoutSider']
144168
NMenu: typeof import('naive-ui')['NMenu']
169+
NProgress: typeof import('naive-ui')['NProgress']
145170
NScrollbar: typeof import('naive-ui')['NScrollbar']
146171
NSlider: typeof import('naive-ui')['NSlider']
172+
NSpin: typeof import('naive-ui')['NSpin']
173+
NStatistic: typeof import('naive-ui')['NStatistic']
147174
NSwitch: typeof import('naive-ui')['NSwitch']
175+
NTable: typeof import('naive-ui')['NTable']
176+
NTag: typeof import('naive-ui')['NTag']
148177
NumeronymGenerator: typeof import('./src/tools/numeronym-generator/numeronym-generator.vue')['default']
149178
OtpCodeGeneratorAndValidator: typeof import('./src/tools/otp-code-generator-and-validator/otp-code-generator-and-validator.vue')['default']
150179
PasswordStrengthAnalyser: typeof import('./src/tools/password-strength-analyser/password-strength-analyser.vue')['default']

locales/en.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,3 +391,6 @@ tools:
391391
text-to-binary:
392392
title: Text to ASCII binary
393393
description: Convert text to its ASCII binary representation and vice-versa.
394+
json-to-object:
395+
title: JSON to Obfuscatebject
396+
description: Parse and convert JSON to object.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
"plausible-tracker": "^0.3.8",
8484
"qrcode": "^1.5.1",
8585
"sql-formatter": "^13.0.0",
86+
"stringify-object": "^5.0.0",
8687
"ua-parser-js": "^1.0.35",
8788
"ulid": "^2.3.0",
8889
"unicode-emoji-json": "^0.4.0",
@@ -113,6 +114,7 @@
113114
"@types/node": "^18.15.11",
114115
"@types/node-forge": "^1.3.2",
115116
"@types/qrcode": "^1.5.0",
117+
"@types/stringify-object": "^4.0.5",
116118
"@types/ua-parser-js": "^0.7.36",
117119
"@types/uuid": "^9.0.0",
118120
"@unocss/eslint-config": "^0.57.0",

pnpm-lock.yaml

Lines changed: 41 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/tools/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ import { tool as uuidGenerator } from './uuid-generator';
8484
import { tool as macAddressLookup } from './mac-address-lookup';
8585
import { tool as xmlFormatter } from './xml-formatter';
8686
import { tool as yamlViewer } from './yaml-viewer';
87+
import { tool as jsonToObject } from './json-to-object';
8788

8889
export const toolsByCategory: ToolCategory[] = [
8990
{
@@ -148,6 +149,7 @@ export const toolsByCategory: ToolCategory[] = [
148149
jsonViewer,
149150
jsonMinify,
150151
jsonToCsv,
152+
jsonToObject,
151153
sqlPrettify,
152154
chmodCalculator,
153155
dockerRunToDockerComposeConverter,

src/tools/json-to-object/index.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Braces } from '@vicons/tabler';
2+
import { defineTool } from '../tool';
3+
import { translate } from '@/plugins/i18n.plugin';
4+
5+
export const tool = defineTool({
6+
name: translate('tools.json-to-object.title'),
7+
path: '/json-to-object',
8+
description: translate('tools.json-to-object.description'),
9+
keywords: ['json', 'parse', 'object', 'convert', 'transform'],
10+
component: () => import('./json-to-object.vue'),
11+
icon: Braces,
12+
createdAt: new Date('2024-08-16'),
13+
});
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<script setup lang="ts">
2+
import JSON5 from 'json5';
3+
import type { UseValidationRule } from '@/composable/validation';
4+
import { isNotThrowing } from '@/utils/boolean';
5+
import { withDefaultOnError } from '@/utils/defaults';
6+
import stringifyObject from "stringify-object"
7+
8+
const transformer = (value: string) => withDefaultOnError(() => stringifyObject(JSON5.parse(value), {
9+
indent: ' ',
10+
singleQuotes: false
11+
}), '');
12+
13+
14+
const rules: UseValidationRule<string>[] = [
15+
{
16+
validator: (value: string) => value === '' || isNotThrowing(() => stringifyObject(JSON5.parse(value))),
17+
message: 'Provided JSON is not valid.',
18+
},
19+
];
20+
</script>
21+
22+
<template>
23+
<format-transformer
24+
input-label="Your JSON"
25+
input-placeholder="Paste your JSON here..."
26+
output-label="Object from your JSON"
27+
output-language="js"
28+
:input-validation-rules="rules"
29+
:transformer="transformer"
30+
/>
31+
</template>

0 commit comments

Comments
 (0)