Skip to content

Commit c07d63e

Browse files
committed
feat(code): add xml formatter and validator
1 parent c129327 commit c07d63e

24 files changed

Lines changed: 2154 additions & 3 deletions

pnpm-lock.yaml

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

pnpm-workspace.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ catalog:
6161
'@vitest/coverage-istanbul': ^4.0.16
6262
'@vitest/coverage-v8': ^4.0.18
6363
'@vitest/eslint-plugin': ^1.6.9
64+
'@vue/compiler-dom': ^3.5.29
6465
'@vue/eslint-config-prettier': ^10.2.0
6566
'@vue/eslint-config-typescript': ^14.7.0
66-
'@vue/compiler-dom': ^3.5.29
6767
'@vue/test-utils': ^2.4.6
6868
'@vue/tsconfig': ^0.8.1
6969
'@vueuse/core': 14.2.1
@@ -94,6 +94,7 @@ catalog:
9494
eslint-plugin-playwright: ^2.7.1
9595
eslint-plugin-vue: ~10.8.0
9696
exifr: ^7.1.3
97+
fast-xml-parser: ^5.5.1
9798
figlet: ^1.10.0
9899
filesize: ^11.0.13
99100
gifuct-js: ^2.1.2
@@ -165,6 +166,7 @@ catalog:
165166
webpxmux: ^0.0.2
166167
webrtc-ips: ^0.2.0
167168
wrangler: 4.69.0
169+
xml-formatter: ^3.6.7
168170
xml-js: ^1.6.11
169171
xxhash-wasm: ^1.1.0
170172

registry/tools/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,14 @@
8383
"@tools/html-entity-encoder-decoder": "workspace:*",
8484
"@tools/html-to-markdown-converter": "workspace:*",
8585
"@tools/http-status-code-lookup": "workspace:*",
86-
"@tools/image-to-pdf-converter": "workspace:*",
8786
"@tools/iban-validator": "workspace:*",
8887
"@tools/ical-event-generator": "workspace:*",
8988
"@tools/image-metadata-cleaner": "workspace:*",
9089
"@tools/image-palette-extractor": "workspace:*",
9190
"@tools/image-resizer": "workspace:*",
9291
"@tools/image-to-avif-converter": "workspace:*",
9392
"@tools/image-to-ico": "workspace:*",
93+
"@tools/image-to-pdf-converter": "workspace:*",
9494
"@tools/image-to-webp-converter": "workspace:*",
9595
"@tools/image-tools": "workspace:*",
9696
"@tools/imei-validator": "workspace:*",
@@ -136,8 +136,8 @@
136136
"@tools/pbkdf2-key-derivation": "workspace:*",
137137
"@tools/pdf-info-viewer": "workspace:*",
138138
"@tools/pdf-merger": "workspace:*",
139-
"@tools/pdf-page-organizer": "workspace:*",
140139
"@tools/pdf-page-number-adder": "workspace:*",
140+
"@tools/pdf-page-organizer": "workspace:*",
141141
"@tools/pdf-splitter": "workspace:*",
142142
"@tools/pdf-text-extractor": "workspace:*",
143143
"@tools/pdf-to-image-converter": "workspace:*",
@@ -209,6 +209,7 @@
209209
"@tools/vat-validator": "workspace:*",
210210
"@tools/vin-validator": "workspace:*",
211211
"@tools/whirlpool-hash-text-or-file": "workspace:*",
212+
"@tools/xml-formatter": "workspace:*",
212213
"@tools/xml-to-json-converter": "workspace:*",
213214
"@tools/xxhash-xxh3-128-hash-text-or-file": "workspace:*",
214215
"@tools/xxhash-xxh3-64-hash-text-or-file": "workspace:*",

registry/tools/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ import { toolInfo as yamlToTomlConverterToolInfo } from '@tools/yaml-to-toml-con
126126
import { toolInfo as tomlToYamlConverterToolInfo } from '@tools/toml-to-yaml-converter'
127127
import { toolInfo as xmlToJsonConverterToolInfo } from '@tools/xml-to-json-converter'
128128
import { toolInfo as jsonToXmlConverterToolInfo } from '@tools/json-to-xml-converter'
129+
import { toolInfo as xmlFormatterToolInfo } from '@tools/xml-formatter'
129130
import { toolInfo as csvToJsonConverterToolInfo } from '@tools/csv-to-json-converter'
130131
import { toolInfo as jsonToCsvConverterToolInfo } from '@tools/json-to-csv-converter'
131132
import { toolInfo as jsonFormatterToolInfo } from '@tools/json-formatter'
@@ -259,6 +260,7 @@ export const tools: ToolInfo[] = [
259260
tomlToYamlConverterToolInfo,
260261
xmlToJsonConverterToolInfo,
261262
jsonToXmlConverterToolInfo,
263+
xmlFormatterToolInfo,
262264
csvToJsonConverterToolInfo,
263265
jsonToCsvConverterToolInfo,
264266
jsonFormatterToolInfo,

registry/tools/src/routes.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ import { routes as yamlToTomlConverterRoutes } from '@tools/yaml-to-toml-convert
124124
import { routes as tomlToYamlConverterRoutes } from '@tools/toml-to-yaml-converter/routes'
125125
import { routes as xmlToJsonConverterRoutes } from '@tools/xml-to-json-converter/routes'
126126
import { routes as jsonToXmlConverterRoutes } from '@tools/json-to-xml-converter/routes'
127+
import { routes as xmlFormatterRoutes } from '@tools/xml-formatter/routes'
127128
import { routes as csvToJsonConverterRoutes } from '@tools/csv-to-json-converter/routes'
128129
import { routes as jsonToCsvConverterRoutes } from '@tools/json-to-csv-converter/routes'
129130
import { routes as jsonFormatterRoutes } from '@tools/json-formatter/routes'
@@ -331,6 +332,7 @@ export const routes: ToolRoute[] = [
331332
...tomlToYamlConverterRoutes,
332333
...xmlToJsonConverterRoutes,
333334
...jsonToXmlConverterRoutes,
335+
...xmlFormatterRoutes,
334336
...csvToJsonConverterRoutes,
335337
...jsonToCsvConverterRoutes,
336338
...jsonFormatterRoutes,
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"name": "@tools/xml-formatter",
3+
"version": "0.0.0",
4+
"private": true,
5+
"type": "module",
6+
"exports": {
7+
".": "./src/index.ts",
8+
"./routes": "./src/routes.ts"
9+
},
10+
"dependencies": {
11+
"@shared/tools": "workspace:*",
12+
"@shared/ui": "workspace:*",
13+
"@vicons/fluent": "catalog:",
14+
"@vueuse/core": "catalog:",
15+
"browser-fs-access": "catalog:",
16+
"fast-xml-parser": "catalog:",
17+
"highlight.js": "catalog:",
18+
"naive-ui": "catalog:",
19+
"vue": "catalog:",
20+
"vue-i18n": "catalog:",
21+
"vue-router": "catalog:",
22+
"xml-formatter": "catalog:"
23+
}
24+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { describe, expect, it } from 'vitest'
2+
import { mount } from '@vue/test-utils'
3+
import { defineComponent } from 'vue'
4+
import XmlFormatterView from './XmlFormatterView.vue'
5+
import * as toolInfo from './info'
6+
7+
const ToolDefaultPageLayoutStub = defineComponent({
8+
name: 'ToolDefaultPageLayout',
9+
props: {
10+
info: {
11+
type: Object,
12+
required: true,
13+
},
14+
},
15+
template: '<div class="layout"><slot /></div>',
16+
})
17+
18+
const XmlFormatterStub = defineComponent({
19+
name: 'XmlFormatter',
20+
template: '<div class="xml-formatter" />',
21+
})
22+
23+
describe('XmlFormatterView', () => {
24+
it('renders the layout with tool info', () => {
25+
const wrapper = mount(XmlFormatterView, {
26+
global: {
27+
stubs: {
28+
ToolDefaultPageLayout: ToolDefaultPageLayoutStub,
29+
XmlFormatter: XmlFormatterStub,
30+
},
31+
},
32+
})
33+
34+
const layout = wrapper.findComponent(ToolDefaultPageLayoutStub)
35+
expect(layout.exists()).toBe(true)
36+
expect(layout.props('info')).toEqual(toolInfo)
37+
expect(wrapper.find('.xml-formatter').exists()).toBe(true)
38+
})
39+
})
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<template>
2+
<ToolDefaultPageLayout :info="toolInfo">
3+
<XmlFormatter />
4+
</ToolDefaultPageLayout>
5+
</template>
6+
7+
<script setup lang="ts">
8+
import * as toolInfo from './info'
9+
import { ToolDefaultPageLayout } from '@shared/ui/tool'
10+
import XmlFormatter from './components/XmlFormatter.vue'
11+
</script>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { describe, expect, it } from 'vitest'
2+
import { mount } from '@vue/test-utils'
3+
import { defineComponent } from 'vue'
4+
import WhatIsXmlFormatter from './WhatIsXmlFormatter.vue'
5+
6+
const DescriptionMarkdownStub = defineComponent({
7+
name: 'DescriptionMarkdown',
8+
props: {
9+
title: {
10+
type: String,
11+
required: true,
12+
},
13+
description: {
14+
type: String,
15+
required: true,
16+
},
17+
},
18+
template: '<div class="description">{{ title }}|{{ description }}</div>',
19+
})
20+
21+
describe('WhatIsXmlFormatter', () => {
22+
it('renders the explanation block', () => {
23+
const wrapper = mount(WhatIsXmlFormatter, {
24+
global: {
25+
stubs: {
26+
DescriptionMarkdown: DescriptionMarkdownStub,
27+
},
28+
},
29+
})
30+
31+
expect(wrapper.text()).toContain('What is XML formatting and validation?')
32+
expect(wrapper.text()).toContain('Everything runs locally in your browser')
33+
})
34+
})

0 commit comments

Comments
 (0)