From 3a99642fd67e6cb37e75716746eb4dcc39e9bf43 Mon Sep 17 00:00:00 2001 From: Isaiah Date: Mon, 27 Nov 2023 16:14:31 -0500 Subject: [PATCH] validating if yaml is correct and collecting format options --- components.d.ts | 1 + package.json | 1 + pnpm-lock.yaml | 4 +- src/tools/index.ts | 2 + src/tools/yaml-viewer/index.ts | 12 +++++ src/tools/yaml-viewer/yaml-models.ts | 37 +++++++++++++ src/tools/yaml-viewer/yaml-viewer.vue | 76 +++++++++++++++++++++++++++ 7 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 src/tools/yaml-viewer/index.ts create mode 100644 src/tools/yaml-viewer/yaml-models.ts create mode 100644 src/tools/yaml-viewer/yaml-viewer.vue diff --git a/components.d.ts b/components.d.ts index d034fc78..335d3bc8 100644 --- a/components.d.ts +++ b/components.d.ts @@ -213,5 +213,6 @@ declare module '@vue/runtime-core' { XmlFormatter: typeof import('./src/tools/xml-formatter/xml-formatter.vue')['default'] YamlToJson: typeof import('./src/tools/yaml-to-json-converter/yaml-to-json.vue')['default'] YamlToToml: typeof import('./src/tools/yaml-to-toml/yaml-to-toml.vue')['default'] + YamlViewer: typeof import('./src/tools/yaml-viewer/yaml-viewer.vue')['default'] } } diff --git a/package.json b/package.json index ffa7bd4e..1a622977 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "highlight.js": "^11.7.0", "iarna-toml-esm": "^3.0.5", "ibantools": "^4.3.3", + "js-yaml": "^4.1.0", "json5": "^2.2.3", "jwt-decode": "^3.1.2", "libphonenumber-js": "^1.10.28", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dfacabd4..5255f376 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -86,6 +86,9 @@ dependencies: ibantools: specifier: ^4.3.3 version: 4.3.3 + js-yaml: + specifier: ^4.1.0 + version: 4.1.0 json5: specifier: ^2.2.3 version: 2.2.3 @@ -6520,7 +6523,6 @@ packages: hasBin: true dependencies: argparse: 2.0.1 - dev: true /jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} diff --git a/src/tools/index.ts b/src/tools/index.ts index 52bdf8e3..78837711 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -75,6 +75,7 @@ import { tool as urlParser } from './url-parser'; import { tool as uuidGenerator } from './uuid-generator'; import { tool as macAddressLookup } from './mac-address-lookup'; import { tool as xmlFormatter } from './xml-formatter'; +import { tool as yamlViewer } from './yaml-viewer'; export const toolsByCategory: ToolCategory[] = [ { @@ -139,6 +140,7 @@ export const toolsByCategory: ToolCategory[] = [ chmodCalculator, dockerRunToDockerComposeConverter, xmlFormatter, + yamlViewer ], }, { diff --git a/src/tools/yaml-viewer/index.ts b/src/tools/yaml-viewer/index.ts new file mode 100644 index 00000000..b5060a31 --- /dev/null +++ b/src/tools/yaml-viewer/index.ts @@ -0,0 +1,12 @@ +import { AlignJustified } from '@vicons/tabler'; +import { defineTool } from '../tool'; + +export const tool = defineTool({ + name: 'YAML prettify and format', + path: '/yaml-prettify', + description: 'Prettify your YAML string to a human friendly readable format.', + keywords: ['yaml', 'viewer', 'prettify', 'format'], + component: () => import('./yaml-viewer.vue'), + icon: AlignJustified, + redirectFrom: ['/yaml-viewer'], +}); diff --git a/src/tools/yaml-viewer/yaml-models.ts b/src/tools/yaml-viewer/yaml-models.ts new file mode 100644 index 00000000..9ab30431 --- /dev/null +++ b/src/tools/yaml-viewer/yaml-models.ts @@ -0,0 +1,37 @@ +import { type MaybeRef, get } from '@vueuse/core'; +import JSON5 from 'json5'; + +export { sortObjectKeys, formatYaml }; + +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 formatYaml({ + rawYaml, + sortKeys = false, + stripComments = false, + indentSize = 3, + }: { + rawYaml: MaybeRef + sortKeys?: MaybeRef + stripComments?: MaybeRef + indentSize?: MaybeRef +}) { + const parsedObject = JSON5.parse(get(rawYaml)); + + return JSON.stringify(get(sortKeys) ? sortObjectKeys(parsedObject) : parsedObject, null, get(indentSize)); +} diff --git a/src/tools/yaml-viewer/yaml-viewer.vue b/src/tools/yaml-viewer/yaml-viewer.vue new file mode 100644 index 00000000..d2c216b1 --- /dev/null +++ b/src/tools/yaml-viewer/yaml-viewer.vue @@ -0,0 +1,76 @@ + + + + +