From 3ff7727026c1640a9f9b347218298929092ce127 Mon Sep 17 00:00:00 2001 From: lidong-sal Date: Wed, 3 Jun 2026 15:16:39 +0800 Subject: [PATCH 01/19] Modify the comments and translations of the slugify-string tool --- .eslintrc-auto-import.json | 16 +- .gitignore | 12 +- auto-imports.d.ts | 302 ++---------------------------------- components.d.ts | 37 ++++- locales/zh.yml | 4 +- package.json | 1 + src/layouts/tool.layout.vue | 1 + worker.js | 5 + wrangler.toml | 15 ++ 9 files changed, 101 insertions(+), 292 deletions(-) create mode 100644 worker.js create mode 100644 wrangler.toml diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json index 4084d922c4..789adf0eb6 100644 --- a/.eslintrc-auto-import.json +++ b/.eslintrc-auto-import.json @@ -286,6 +286,20 @@ "watchTriggerable": true, "watchWithFilter": true, "whenever": true, - "toValue": true + "toValue": true, + "DirectiveBinding": true, + "ExtractDefaultPropTypes": true, + "ExtractPropTypes": true, + "ExtractPublicPropTypes": true, + "MaybeRef": true, + "MaybeRefOrGetter": true, + "WritableComputedRef": true, + "injectLocal": true, + "onWatcherCleanup": true, + "provideLocal": true, + "useClipboardItems": true, + "useId": true, + "useModel": true, + "useTemplateRef": true } } diff --git a/.gitignore b/.gitignore index a3bbd94386..677eb41731 100644 --- a/.gitignore +++ b/.gitignore @@ -28,8 +28,18 @@ coverage *.sw? .env +.env.* /test-results/ /playwright-report/ /playwright/.cache/ # Webkit with playwright creates a salt file -salt \ No newline at end of file +salt + +# Cloudflare / Wrangler +.wrangler/ + +# Claude Code +.claude/ + +# Lock files (choose one to keep; delete this line if you want to commit yours) +package-lock.json diff --git a/auto-imports.d.ts b/auto-imports.d.ts index 186963f1d9..c1d37e15c9 100644 --- a/auto-imports.d.ts +++ b/auto-imports.d.ts @@ -1,6 +1,7 @@ /* eslint-disable */ /* prettier-ignore */ // @ts-nocheck +// noinspection JSUnusedGlobalSymbols // Generated by unplugin-auto-import export {} declare global { @@ -36,6 +37,7 @@ declare global { const h: typeof import('vue')['h'] const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch'] const inject: typeof import('vue')['inject'] + const injectLocal: typeof import('@vueuse/core')['injectLocal'] const isDefined: typeof import('@vueuse/core')['isDefined'] const isProxy: typeof import('vue')['isProxy'] const isReactive: typeof import('vue')['isReactive'] @@ -63,8 +65,10 @@ declare global { const onStartTyping: typeof import('@vueuse/core')['onStartTyping'] const onUnmounted: typeof import('vue')['onUnmounted'] const onUpdated: typeof import('vue')['onUpdated'] + const onWatcherCleanup: typeof import('vue')['onWatcherCleanup'] const pausableWatch: typeof import('@vueuse/core')['pausableWatch'] const provide: typeof import('vue')['provide'] + const provideLocal: typeof import('@vueuse/core')['provideLocal'] const reactify: typeof import('@vueuse/core')['reactify'] const reactifyObject: typeof import('@vueuse/core')['reactifyObject'] const reactive: typeof import('vue')['reactive'] @@ -128,6 +132,7 @@ declare global { const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation'] const useCached: typeof import('@vueuse/core')['useCached'] const useClipboard: typeof import('@vueuse/core')['useClipboard'] + const useClipboardItems: typeof import('@vueuse/core')['useClipboardItems'] const useCloned: typeof import('@vueuse/core')['useCloned'] const useColorMode: typeof import('@vueuse/core')['useColorMode'] const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog'] @@ -171,6 +176,7 @@ declare global { const useGamepad: typeof import('@vueuse/core')['useGamepad'] const useGeolocation: typeof import('@vueuse/core')['useGeolocation'] const useI18n: typeof import('vue-i18n')['useI18n'] + const useId: typeof import('vue')['useId'] const useIdle: typeof import('@vueuse/core')['useIdle'] const useImage: typeof import('@vueuse/core')['useImage'] const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll'] @@ -189,6 +195,7 @@ declare global { const useMemoize: typeof import('@vueuse/core')['useMemoize'] const useMemory: typeof import('@vueuse/core')['useMemory'] const useMessage: typeof import('naive-ui')['useMessage'] + const useModel: typeof import('vue')['useModel'] const useMounted: typeof import('@vueuse/core')['useMounted'] const useMouse: typeof import('@vueuse/core')['useMouse'] const useMouseInElement: typeof import('@vueuse/core')['useMouseInElement'] @@ -237,6 +244,7 @@ declare global { const useStyleTag: typeof import('@vueuse/core')['useStyleTag'] const useSupported: typeof import('@vueuse/core')['useSupported'] const useSwipe: typeof import('@vueuse/core')['useSwipe'] + const useTemplateRef: typeof import('vue')['useTemplateRef'] const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList'] const useTextDirection: typeof import('@vueuse/core')['useTextDirection'] const useTextSelection: typeof import('@vueuse/core')['useTextSelection'] @@ -288,7 +296,8 @@ declare global { // for type re-export declare global { // @ts-ignore - export type { Component, ComponentPublicInstance, ComputedRef, InjectionKey, PropType, Ref, VNode } from 'vue' + export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' + import('vue') } // for vue template auto import import { UnwrapRef } from 'vue' @@ -326,6 +335,7 @@ declare module 'vue' { readonly h: UnwrapRef readonly ignorableWatch: UnwrapRef readonly inject: UnwrapRef + readonly injectLocal: UnwrapRef readonly isDefined: UnwrapRef readonly isProxy: UnwrapRef readonly isReactive: UnwrapRef @@ -353,8 +363,10 @@ declare module 'vue' { readonly onStartTyping: UnwrapRef readonly onUnmounted: UnwrapRef readonly onUpdated: UnwrapRef + readonly onWatcherCleanup: UnwrapRef readonly pausableWatch: UnwrapRef readonly provide: UnwrapRef + readonly provideLocal: UnwrapRef readonly reactify: UnwrapRef readonly reactifyObject: UnwrapRef readonly reactive: UnwrapRef @@ -418,6 +430,7 @@ declare module 'vue' { readonly useBrowserLocation: UnwrapRef readonly useCached: UnwrapRef readonly useClipboard: UnwrapRef + readonly useClipboardItems: UnwrapRef readonly useCloned: UnwrapRef readonly useColorMode: UnwrapRef readonly useConfirmDialog: UnwrapRef @@ -461,6 +474,7 @@ declare module 'vue' { readonly useGamepad: UnwrapRef readonly useGeolocation: UnwrapRef readonly useI18n: UnwrapRef + readonly useId: UnwrapRef readonly useIdle: UnwrapRef readonly useImage: UnwrapRef readonly useInfiniteScroll: UnwrapRef @@ -479,6 +493,7 @@ declare module 'vue' { readonly useMemoize: UnwrapRef readonly useMemory: UnwrapRef readonly useMessage: UnwrapRef + readonly useModel: UnwrapRef readonly useMounted: UnwrapRef readonly useMouse: UnwrapRef readonly useMouseInElement: UnwrapRef @@ -527,290 +542,7 @@ declare module 'vue' { readonly useStyleTag: UnwrapRef readonly useSupported: UnwrapRef readonly useSwipe: UnwrapRef - readonly useTemplateRefsList: UnwrapRef - readonly useTextDirection: UnwrapRef - readonly useTextSelection: UnwrapRef - readonly useTextareaAutosize: UnwrapRef - readonly useThrottle: UnwrapRef - readonly useThrottleFn: UnwrapRef - readonly useThrottledRefHistory: UnwrapRef - readonly useTimeAgo: UnwrapRef - readonly useTimeout: UnwrapRef - readonly useTimeoutFn: UnwrapRef - readonly useTimeoutPoll: UnwrapRef - readonly useTimestamp: UnwrapRef - readonly useTitle: UnwrapRef - readonly useToNumber: UnwrapRef - readonly useToString: UnwrapRef - readonly useToggle: UnwrapRef - readonly useTransition: UnwrapRef - readonly useUrlSearchParams: UnwrapRef - readonly useUserMedia: UnwrapRef - readonly useVModel: UnwrapRef - readonly useVModels: UnwrapRef - readonly useVibrate: UnwrapRef - readonly useVirtualList: UnwrapRef - readonly useWakeLock: UnwrapRef - readonly useWebNotification: UnwrapRef - readonly useWebSocket: UnwrapRef - readonly useWebWorker: UnwrapRef - readonly useWebWorkerFn: UnwrapRef - readonly useWindowFocus: UnwrapRef - readonly useWindowScroll: UnwrapRef - readonly useWindowSize: UnwrapRef - readonly watch: UnwrapRef - readonly watchArray: UnwrapRef - readonly watchAtMost: UnwrapRef - readonly watchDebounced: UnwrapRef - readonly watchDeep: UnwrapRef - readonly watchEffect: UnwrapRef - readonly watchIgnorable: UnwrapRef - readonly watchImmediate: UnwrapRef - readonly watchOnce: UnwrapRef - readonly watchPausable: UnwrapRef - readonly watchPostEffect: UnwrapRef - readonly watchSyncEffect: UnwrapRef - readonly watchThrottled: UnwrapRef - readonly watchTriggerable: UnwrapRef - readonly watchWithFilter: UnwrapRef - readonly whenever: UnwrapRef - } -} -declare module '@vue/runtime-core' { - interface ComponentCustomProperties { - readonly EffectScope: UnwrapRef - readonly asyncComputed: UnwrapRef - readonly autoResetRef: UnwrapRef - readonly computed: UnwrapRef - readonly computedAsync: UnwrapRef - readonly computedEager: UnwrapRef - readonly computedInject: UnwrapRef - readonly computedWithControl: UnwrapRef - readonly controlledComputed: UnwrapRef - readonly controlledRef: UnwrapRef - readonly createApp: UnwrapRef - readonly createEventHook: UnwrapRef - readonly createGlobalState: UnwrapRef - readonly createInjectionState: UnwrapRef - readonly createReactiveFn: UnwrapRef - readonly createReusableTemplate: UnwrapRef - readonly createSharedComposable: UnwrapRef - readonly createTemplatePromise: UnwrapRef - readonly createUnrefFn: UnwrapRef - readonly customRef: UnwrapRef - readonly debouncedRef: UnwrapRef - readonly debouncedWatch: UnwrapRef - readonly defineAsyncComponent: UnwrapRef - readonly defineComponent: UnwrapRef - readonly eagerComputed: UnwrapRef - readonly effectScope: UnwrapRef - readonly extendRef: UnwrapRef - readonly getCurrentInstance: UnwrapRef - readonly getCurrentScope: UnwrapRef - readonly h: UnwrapRef - readonly ignorableWatch: UnwrapRef - readonly inject: UnwrapRef - readonly isDefined: UnwrapRef - readonly isProxy: UnwrapRef - readonly isReactive: UnwrapRef - readonly isReadonly: UnwrapRef - readonly isRef: UnwrapRef - readonly makeDestructurable: UnwrapRef - readonly markRaw: UnwrapRef - readonly nextTick: UnwrapRef - readonly onActivated: UnwrapRef - readonly onBeforeMount: UnwrapRef - readonly onBeforeRouteLeave: UnwrapRef - readonly onBeforeRouteUpdate: UnwrapRef - readonly onBeforeUnmount: UnwrapRef - readonly onBeforeUpdate: UnwrapRef - readonly onClickOutside: UnwrapRef - readonly onDeactivated: UnwrapRef - readonly onErrorCaptured: UnwrapRef - readonly onKeyStroke: UnwrapRef - readonly onLongPress: UnwrapRef - readonly onMounted: UnwrapRef - readonly onRenderTracked: UnwrapRef - readonly onRenderTriggered: UnwrapRef - readonly onScopeDispose: UnwrapRef - readonly onServerPrefetch: UnwrapRef - readonly onStartTyping: UnwrapRef - readonly onUnmounted: UnwrapRef - readonly onUpdated: UnwrapRef - readonly pausableWatch: UnwrapRef - readonly provide: UnwrapRef - readonly reactify: UnwrapRef - readonly reactifyObject: UnwrapRef - readonly reactive: UnwrapRef - readonly reactiveComputed: UnwrapRef - readonly reactiveOmit: UnwrapRef - readonly reactivePick: UnwrapRef - readonly readonly: UnwrapRef - readonly ref: UnwrapRef - readonly refAutoReset: UnwrapRef - readonly refDebounced: UnwrapRef - readonly refDefault: UnwrapRef - readonly refThrottled: UnwrapRef - readonly refWithControl: UnwrapRef - readonly resolveComponent: UnwrapRef - readonly resolveRef: UnwrapRef - readonly resolveUnref: UnwrapRef - readonly shallowReactive: UnwrapRef - readonly shallowReadonly: UnwrapRef - readonly shallowRef: UnwrapRef - readonly syncRef: UnwrapRef - readonly syncRefs: UnwrapRef - readonly templateRef: UnwrapRef - readonly throttledRef: UnwrapRef - readonly throttledWatch: UnwrapRef - readonly toRaw: UnwrapRef - readonly toReactive: UnwrapRef - readonly toRef: UnwrapRef - readonly toRefs: UnwrapRef - readonly toValue: UnwrapRef - readonly triggerRef: UnwrapRef - readonly tryOnBeforeMount: UnwrapRef - readonly tryOnBeforeUnmount: UnwrapRef - readonly tryOnMounted: UnwrapRef - readonly tryOnScopeDispose: UnwrapRef - readonly tryOnUnmounted: UnwrapRef - readonly unref: UnwrapRef - readonly unrefElement: UnwrapRef - readonly until: UnwrapRef - readonly useActiveElement: UnwrapRef - readonly useAnimate: UnwrapRef - readonly useArrayDifference: UnwrapRef - readonly useArrayEvery: UnwrapRef - readonly useArrayFilter: UnwrapRef - readonly useArrayFind: UnwrapRef - readonly useArrayFindIndex: UnwrapRef - readonly useArrayFindLast: UnwrapRef - readonly useArrayIncludes: UnwrapRef - readonly useArrayJoin: UnwrapRef - readonly useArrayMap: UnwrapRef - readonly useArrayReduce: UnwrapRef - readonly useArraySome: UnwrapRef - readonly useArrayUnique: UnwrapRef - readonly useAsyncQueue: UnwrapRef - readonly useAsyncState: UnwrapRef - readonly useAttrs: UnwrapRef - readonly useBase64: UnwrapRef - readonly useBattery: UnwrapRef - readonly useBluetooth: UnwrapRef - readonly useBreakpoints: UnwrapRef - readonly useBroadcastChannel: UnwrapRef - readonly useBrowserLocation: UnwrapRef - readonly useCached: UnwrapRef - readonly useClipboard: UnwrapRef - readonly useCloned: UnwrapRef - readonly useColorMode: UnwrapRef - readonly useConfirmDialog: UnwrapRef - readonly useCounter: UnwrapRef - readonly useCssModule: UnwrapRef - readonly useCssVar: UnwrapRef - readonly useCssVars: UnwrapRef - readonly useCurrentElement: UnwrapRef - readonly useCycleList: UnwrapRef - readonly useDark: UnwrapRef - readonly useDateFormat: UnwrapRef - readonly useDebounce: UnwrapRef - readonly useDebounceFn: UnwrapRef - readonly useDebouncedRefHistory: UnwrapRef - readonly useDeviceMotion: UnwrapRef - readonly useDeviceOrientation: UnwrapRef - readonly useDevicePixelRatio: UnwrapRef - readonly useDevicesList: UnwrapRef - readonly useDialog: UnwrapRef - readonly useDisplayMedia: UnwrapRef - readonly useDocumentVisibility: UnwrapRef - readonly useDraggable: UnwrapRef - readonly useDropZone: UnwrapRef - readonly useElementBounding: UnwrapRef - readonly useElementByPoint: UnwrapRef - readonly useElementHover: UnwrapRef - readonly useElementSize: UnwrapRef - readonly useElementVisibility: UnwrapRef - readonly useEventBus: UnwrapRef - readonly useEventListener: UnwrapRef - readonly useEventSource: UnwrapRef - readonly useEyeDropper: UnwrapRef - readonly useFavicon: UnwrapRef - readonly useFetch: UnwrapRef - readonly useFileDialog: UnwrapRef - readonly useFileSystemAccess: UnwrapRef - readonly useFocus: UnwrapRef - readonly useFocusWithin: UnwrapRef - readonly useFps: UnwrapRef - readonly useFullscreen: UnwrapRef - readonly useGamepad: UnwrapRef - readonly useGeolocation: UnwrapRef - readonly useI18n: UnwrapRef - readonly useIdle: UnwrapRef - readonly useImage: UnwrapRef - readonly useInfiniteScroll: UnwrapRef - readonly useIntersectionObserver: UnwrapRef - readonly useInterval: UnwrapRef - readonly useIntervalFn: UnwrapRef - readonly useKeyModifier: UnwrapRef - readonly useLastChanged: UnwrapRef - readonly useLink: UnwrapRef - readonly useLoadingBar: UnwrapRef - readonly useLocalStorage: UnwrapRef - readonly useMagicKeys: UnwrapRef - readonly useManualRefHistory: UnwrapRef - readonly useMediaControls: UnwrapRef - readonly useMediaQuery: UnwrapRef - readonly useMemoize: UnwrapRef - readonly useMemory: UnwrapRef - readonly useMessage: UnwrapRef - readonly useMounted: UnwrapRef - readonly useMouse: UnwrapRef - readonly useMouseInElement: UnwrapRef - readonly useMousePressed: UnwrapRef - readonly useMutationObserver: UnwrapRef - readonly useNavigatorLanguage: UnwrapRef - readonly useNetwork: UnwrapRef - readonly useNotification: UnwrapRef - readonly useNow: UnwrapRef - readonly useObjectUrl: UnwrapRef - readonly useOffsetPagination: UnwrapRef - readonly useOnline: UnwrapRef - readonly usePageLeave: UnwrapRef - readonly useParallax: UnwrapRef - readonly useParentElement: UnwrapRef - readonly usePerformanceObserver: UnwrapRef - readonly usePermission: UnwrapRef - readonly usePointer: UnwrapRef - readonly usePointerLock: UnwrapRef - readonly usePointerSwipe: UnwrapRef - readonly usePreferredColorScheme: UnwrapRef - readonly usePreferredContrast: UnwrapRef - readonly usePreferredDark: UnwrapRef - readonly usePreferredLanguages: UnwrapRef - readonly usePreferredReducedMotion: UnwrapRef - readonly usePrevious: UnwrapRef - readonly useRafFn: UnwrapRef - readonly useRefHistory: UnwrapRef - readonly useResizeObserver: UnwrapRef - readonly useRoute: UnwrapRef - readonly useRouter: UnwrapRef - readonly useScreenOrientation: UnwrapRef - readonly useScreenSafeArea: UnwrapRef - readonly useScriptTag: UnwrapRef - readonly useScroll: UnwrapRef - readonly useScrollLock: UnwrapRef - readonly useSessionStorage: UnwrapRef - readonly useShare: UnwrapRef - readonly useSlots: UnwrapRef - readonly useSorted: UnwrapRef - readonly useSpeechRecognition: UnwrapRef - readonly useSpeechSynthesis: UnwrapRef - readonly useStepper: UnwrapRef - readonly useStorage: UnwrapRef - readonly useStorageAsync: UnwrapRef - readonly useStyleTag: UnwrapRef - readonly useSupported: UnwrapRef - readonly useSwipe: UnwrapRef + readonly useTemplateRef: UnwrapRef readonly useTemplateRefsList: UnwrapRef readonly useTextDirection: UnwrapRef readonly useTextSelection: UnwrapRef diff --git a/components.d.ts b/components.d.ts index 3e65c3cc52..eac69e17c7 100644 --- a/components.d.ts +++ b/components.d.ts @@ -3,11 +3,9 @@ // @ts-nocheck // Generated by unplugin-vue-components // Read more: https://github.com/vuejs/core/pull/3399 -import '@vue/runtime-core' - export {} -declare module '@vue/runtime-core' { +declare module 'vue' { export interface GlobalComponents { '404.page': typeof import('./src/pages/404.page.vue')['default'] About: typeof import('./src/pages/About.vue')['default'] @@ -90,17 +88,28 @@ declare module '@vue/runtime-core' { HttpStatusCodes: typeof import('./src/tools/http-status-codes/http-status-codes.vue')['default'] IbanValidatorAndParser: typeof import('./src/tools/iban-validator-and-parser/iban-validator-and-parser.vue')['default'] 'IconMdi:brushVariant': typeof import('~icons/mdi/brush-variant')['default'] + 'IconMdi:contentCopy': typeof import('~icons/mdi/content-copy')['default'] 'IconMdi:kettleSteamOutline': typeof import('~icons/mdi/kettle-steam-outline')['default'] + IconMdiArrowDown: typeof import('~icons/mdi/arrow-down')['default'] + IconMdiArrowRightBottom: typeof import('~icons/mdi/arrow-right-bottom')['default'] + IconMdiCamera: typeof import('~icons/mdi/camera')['default'] IconMdiChevronDown: typeof import('~icons/mdi/chevron-down')['default'] IconMdiChevronRight: typeof import('~icons/mdi/chevron-right')['default'] IconMdiClose: typeof import('~icons/mdi/close')['default'] IconMdiContentCopy: typeof import('~icons/mdi/content-copy')['default'] + IconMdiDeleteOutline: typeof import('~icons/mdi/delete-outline')['default'] + IconMdiDownload: typeof import('~icons/mdi/download')['default'] IconMdiEye: typeof import('~icons/mdi/eye')['default'] IconMdiEyeOff: typeof import('~icons/mdi/eye-off')['default'] IconMdiHeart: typeof import('~icons/mdi/heart')['default'] + IconMdiPause: typeof import('~icons/mdi/pause')['default'] + IconMdiPlay: typeof import('~icons/mdi/play')['default'] + IconMdiRecord: typeof import('~icons/mdi/record')['default'] + IconMdiRefresh: typeof import('~icons/mdi/refresh')['default'] IconMdiSearch: typeof import('~icons/mdi/search')['default'] IconMdiTranslate: typeof import('~icons/mdi/translate')['default'] IconMdiTriangleDown: typeof import('~icons/mdi/triangle-down')['default'] + IconMdiVideo: typeof import('~icons/mdi/video')['default'] InputCopyable: typeof import('./src/components/InputCopyable.vue')['default'] IntegerBaseConverter: typeof import('./src/tools/integer-base-converter/integer-base-converter.vue')['default'] Ipv4AddressConverter: typeof import('./src/tools/ipv4-address-converter/ipv4-address-converter.vue')['default'] @@ -129,20 +138,42 @@ declare module '@vue/runtime-core' { MenuLayout: typeof import('./src/components/MenuLayout.vue')['default'] MetaTagGenerator: typeof import('./src/tools/meta-tag-generator/meta-tag-generator.vue')['default'] MimeTypes: typeof import('./src/tools/mime-types/mime-types.vue')['default'] + NAlert: typeof import('naive-ui')['NAlert'] NavbarButtons: typeof import('./src/components/NavbarButtons.vue')['default'] + NButton: typeof import('naive-ui')['NButton'] NCheckbox: typeof import('naive-ui')['NCheckbox'] + NCode: typeof import('naive-ui')['NCode'] NCollapseTransition: typeof import('naive-ui')['NCollapseTransition'] + NColorPicker: typeof import('naive-ui')['NColorPicker'] NConfigProvider: typeof import('naive-ui')['NConfigProvider'] + NDatePicker: typeof import('naive-ui')['NDatePicker'] NDivider: typeof import('naive-ui')['NDivider'] + NDynamicInput: typeof import('naive-ui')['NDynamicInput'] NEllipsis: typeof import('naive-ui')['NEllipsis'] + NForm: typeof import('naive-ui')['NForm'] + NFormItem: typeof import('naive-ui')['NFormItem'] + NGi: typeof import('naive-ui')['NGi'] + NGrid: typeof import('naive-ui')['NGrid'] NH1: typeof import('naive-ui')['NH1'] + NH2: typeof import('naive-ui')['NH2'] NH3: typeof import('naive-ui')['NH3'] NIcon: typeof import('naive-ui')['NIcon'] + NImage: typeof import('naive-ui')['NImage'] + NInputGroup: typeof import('naive-ui')['NInputGroup'] + NInputGroupLabel: typeof import('naive-ui')['NInputGroupLabel'] + NInputNumber: typeof import('naive-ui')['NInputNumber'] NLayout: typeof import('naive-ui')['NLayout'] NLayoutSider: typeof import('naive-ui')['NLayoutSider'] NMenu: typeof import('naive-ui')['NMenu'] + NProgress: typeof import('naive-ui')['NProgress'] + NScrollbar: typeof import('naive-ui')['NScrollbar'] + NSlider: typeof import('naive-ui')['NSlider'] NSpace: typeof import('naive-ui')['NSpace'] + NSpin: typeof import('naive-ui')['NSpin'] + NStatistic: typeof import('naive-ui')['NStatistic'] + NSwitch: typeof import('naive-ui')['NSwitch'] NTable: typeof import('naive-ui')['NTable'] + NTag: typeof import('naive-ui')['NTag'] NumeronymGenerator: typeof import('./src/tools/numeronym-generator/numeronym-generator.vue')['default'] OtpCodeGeneratorAndValidator: typeof import('./src/tools/otp-code-generator-and-validator/otp-code-generator-and-validator.vue')['default'] PasswordStrengthAnalyser: typeof import('./src/tools/password-strength-analyser/password-strength-analyser.vue')['default'] diff --git a/locales/zh.yml b/locales/zh.yml index 97968eb5ef..dc5d749ca9 100644 --- a/locales/zh.yml +++ b/locales/zh.yml @@ -144,8 +144,8 @@ tools: description: Git是一种去中心化的版本管理软件。使用此备忘单,您可以快速访问最常见的git命令. slugify-string: - title: 打乱字符串 - description: 确保字符串 url、文件名和 id 安全。 + title: 字符串 Slug 化 + description: "将任意字符串转换为 URL、文件名和 HTML id 安全的格式(slug)。\n转换规则:空格/换行转为连字符、大写转小写、去除重音符号、删除特殊字符。" encryption: title: 加密/解密文本 diff --git a/package.json b/package.json index 5738b6325a..6c6180e931 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "cronstrue": "^2.26.0", "crypto-js": "^4.1.1", "date-fns": "^2.29.3", + "date-fns-tz": "^2.0.1", "dompurify": "^3.0.6", "email-normalizer": "^1.0.0", "emojilib": "^3.0.10", diff --git a/src/layouts/tool.layout.vue b/src/layouts/tool.layout.vue index ad34c4a0dd..101c83f9b8 100644 --- a/src/layouts/tool.layout.vue +++ b/src/layouts/tool.layout.vue @@ -102,6 +102,7 @@ const toolDescription = computed(() => t(`tools.${i18nKey.value}.descrip margin: 0; opacity: 0.7; + white-space: pre-line; } } } diff --git a/worker.js b/worker.js new file mode 100644 index 0000000000..910f22e914 --- /dev/null +++ b/worker.js @@ -0,0 +1,5 @@ +export default { + async fetch(request, env) { + return env.ASSETS.fetch(request); + }, +}; diff --git a/wrangler.toml b/wrangler.toml new file mode 100644 index 0000000000..7798565ced --- /dev/null +++ b/wrangler.toml @@ -0,0 +1,15 @@ +name = "it-tools" +main = "worker.js" +compatibility_date = "2024-09-23" +compatibility_flags = ["nodejs_compat"] + +[assets] +directory = "./dist" +binding = "ASSETS" +html_handling = "auto-trailing-slash" +not_found_handling = "single-page-application" + +# Uncomment after adding 85886688.xyz to Cloudflare: +# [[routes]] +# pattern = "it-tools.85886688.xyz" +# custom_domain = true From 9ddb92ccc04a3428cd068f4e7f214e1c4bae43df Mon Sep 17 00:00:00 2001 From: lidong-sal Date: Wed, 3 Jun 2026 15:21:47 +0800 Subject: [PATCH 02/19] Modify the comments and translations of the slugify-string tool --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 677eb41731..4590f7c582 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,7 @@ salt # Cloudflare / Wrangler .wrangler/ +wrangler.toml # Claude Code .claude/ From be9d705c9660ff83ad5e2562ddf77a65d03e5cdb Mon Sep 17 00:00:00 2001 From: lidong-sal Date: Thu, 4 Jun 2026 16:14:36 +0800 Subject: [PATCH 03/19] add new funtion --- auto-imports.d.ts | 295 +++++++++- components.d.ts | 9 +- locales/en.yml | 20 + locales/zh.yml | 20 + package.json | 5 + pnpm-lock.yaml | 547 ++++++++++++------ public/tree-sitter-bash.wasm | Bin 0 -> 1364304 bytes public/tree-sitter.wasm | Bin 0 -> 190779 bytes src/components/TextareaCopyable.vue | 10 + .../byte-unit-converter.vue | 82 +++ src/tools/byte-unit-converter/index.ts | 13 + .../css-js-prettify-minify.vue | 111 ++++ src/tools/css-js-prettify-minify/index.ts | 13 + src/tools/curl-to-code/curl-to-code.vue | 68 +++ src/tools/curl-to-code/index.ts | 13 + .../html-to-markdown/html-to-markdown.vue | 28 + src/tools/html-to-markdown/index.ts | 13 + src/tools/index.ts | 11 +- src/tools/json-to-types/index.ts | 13 + .../json-to-types/json-to-types.service.ts | 115 ++++ src/tools/json-to-types/json-to-types.vue | 64 ++ vite.config.ts | 1 + 22 files changed, 1260 insertions(+), 191 deletions(-) create mode 100755 public/tree-sitter-bash.wasm create mode 100755 public/tree-sitter.wasm create mode 100644 src/tools/byte-unit-converter/byte-unit-converter.vue create mode 100644 src/tools/byte-unit-converter/index.ts create mode 100644 src/tools/css-js-prettify-minify/css-js-prettify-minify.vue create mode 100644 src/tools/css-js-prettify-minify/index.ts create mode 100644 src/tools/curl-to-code/curl-to-code.vue create mode 100644 src/tools/curl-to-code/index.ts create mode 100644 src/tools/html-to-markdown/html-to-markdown.vue create mode 100644 src/tools/html-to-markdown/index.ts create mode 100644 src/tools/json-to-types/index.ts create mode 100644 src/tools/json-to-types/json-to-types.service.ts create mode 100644 src/tools/json-to-types/json-to-types.vue diff --git a/auto-imports.d.ts b/auto-imports.d.ts index c1d37e15c9..d9c125c61a 100644 --- a/auto-imports.d.ts +++ b/auto-imports.d.ts @@ -1,7 +1,6 @@ /* eslint-disable */ /* prettier-ignore */ // @ts-nocheck -// noinspection JSUnusedGlobalSymbols // Generated by unplugin-auto-import export {} declare global { @@ -296,8 +295,7 @@ declare global { // for type re-export declare global { // @ts-ignore - export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' - import('vue') + export type { Component, ComponentPublicInstance, ComputedRef, InjectionKey, PropType, Ref, VNode } from 'vue' } // for vue template auto import import { UnwrapRef } from 'vue' @@ -335,7 +333,6 @@ declare module 'vue' { readonly h: UnwrapRef readonly ignorableWatch: UnwrapRef readonly inject: UnwrapRef - readonly injectLocal: UnwrapRef readonly isDefined: UnwrapRef readonly isProxy: UnwrapRef readonly isReactive: UnwrapRef @@ -363,10 +360,8 @@ declare module 'vue' { readonly onStartTyping: UnwrapRef readonly onUnmounted: UnwrapRef readonly onUpdated: UnwrapRef - readonly onWatcherCleanup: UnwrapRef readonly pausableWatch: UnwrapRef readonly provide: UnwrapRef - readonly provideLocal: UnwrapRef readonly reactify: UnwrapRef readonly reactifyObject: UnwrapRef readonly reactive: UnwrapRef @@ -430,7 +425,6 @@ declare module 'vue' { readonly useBrowserLocation: UnwrapRef readonly useCached: UnwrapRef readonly useClipboard: UnwrapRef - readonly useClipboardItems: UnwrapRef readonly useCloned: UnwrapRef readonly useColorMode: UnwrapRef readonly useConfirmDialog: UnwrapRef @@ -474,7 +468,6 @@ declare module 'vue' { readonly useGamepad: UnwrapRef readonly useGeolocation: UnwrapRef readonly useI18n: UnwrapRef - readonly useId: UnwrapRef readonly useIdle: UnwrapRef readonly useImage: UnwrapRef readonly useInfiniteScroll: UnwrapRef @@ -493,7 +486,6 @@ declare module 'vue' { readonly useMemoize: UnwrapRef readonly useMemory: UnwrapRef readonly useMessage: UnwrapRef - readonly useModel: UnwrapRef readonly useMounted: UnwrapRef readonly useMouse: UnwrapRef readonly useMouseInElement: UnwrapRef @@ -542,7 +534,290 @@ declare module 'vue' { readonly useStyleTag: UnwrapRef readonly useSupported: UnwrapRef readonly useSwipe: UnwrapRef - readonly useTemplateRef: UnwrapRef + readonly useTemplateRefsList: UnwrapRef + readonly useTextDirection: UnwrapRef + readonly useTextSelection: UnwrapRef + readonly useTextareaAutosize: UnwrapRef + readonly useThrottle: UnwrapRef + readonly useThrottleFn: UnwrapRef + readonly useThrottledRefHistory: UnwrapRef + readonly useTimeAgo: UnwrapRef + readonly useTimeout: UnwrapRef + readonly useTimeoutFn: UnwrapRef + readonly useTimeoutPoll: UnwrapRef + readonly useTimestamp: UnwrapRef + readonly useTitle: UnwrapRef + readonly useToNumber: UnwrapRef + readonly useToString: UnwrapRef + readonly useToggle: UnwrapRef + readonly useTransition: UnwrapRef + readonly useUrlSearchParams: UnwrapRef + readonly useUserMedia: UnwrapRef + readonly useVModel: UnwrapRef + readonly useVModels: UnwrapRef + readonly useVibrate: UnwrapRef + readonly useVirtualList: UnwrapRef + readonly useWakeLock: UnwrapRef + readonly useWebNotification: UnwrapRef + readonly useWebSocket: UnwrapRef + readonly useWebWorker: UnwrapRef + readonly useWebWorkerFn: UnwrapRef + readonly useWindowFocus: UnwrapRef + readonly useWindowScroll: UnwrapRef + readonly useWindowSize: UnwrapRef + readonly watch: UnwrapRef + readonly watchArray: UnwrapRef + readonly watchAtMost: UnwrapRef + readonly watchDebounced: UnwrapRef + readonly watchDeep: UnwrapRef + readonly watchEffect: UnwrapRef + readonly watchIgnorable: UnwrapRef + readonly watchImmediate: UnwrapRef + readonly watchOnce: UnwrapRef + readonly watchPausable: UnwrapRef + readonly watchPostEffect: UnwrapRef + readonly watchSyncEffect: UnwrapRef + readonly watchThrottled: UnwrapRef + readonly watchTriggerable: UnwrapRef + readonly watchWithFilter: UnwrapRef + readonly whenever: UnwrapRef + } +} +declare module '@vue/runtime-core' { + interface ComponentCustomProperties { + readonly EffectScope: UnwrapRef + readonly asyncComputed: UnwrapRef + readonly autoResetRef: UnwrapRef + readonly computed: UnwrapRef + readonly computedAsync: UnwrapRef + readonly computedEager: UnwrapRef + readonly computedInject: UnwrapRef + readonly computedWithControl: UnwrapRef + readonly controlledComputed: UnwrapRef + readonly controlledRef: UnwrapRef + readonly createApp: UnwrapRef + readonly createEventHook: UnwrapRef + readonly createGlobalState: UnwrapRef + readonly createInjectionState: UnwrapRef + readonly createReactiveFn: UnwrapRef + readonly createReusableTemplate: UnwrapRef + readonly createSharedComposable: UnwrapRef + readonly createTemplatePromise: UnwrapRef + readonly createUnrefFn: UnwrapRef + readonly customRef: UnwrapRef + readonly debouncedRef: UnwrapRef + readonly debouncedWatch: UnwrapRef + readonly defineAsyncComponent: UnwrapRef + readonly defineComponent: UnwrapRef + readonly eagerComputed: UnwrapRef + readonly effectScope: UnwrapRef + readonly extendRef: UnwrapRef + readonly getCurrentInstance: UnwrapRef + readonly getCurrentScope: UnwrapRef + readonly h: UnwrapRef + readonly ignorableWatch: UnwrapRef + readonly inject: UnwrapRef + readonly isDefined: UnwrapRef + readonly isProxy: UnwrapRef + readonly isReactive: UnwrapRef + readonly isReadonly: UnwrapRef + readonly isRef: UnwrapRef + readonly makeDestructurable: UnwrapRef + readonly markRaw: UnwrapRef + readonly nextTick: UnwrapRef + readonly onActivated: UnwrapRef + readonly onBeforeMount: UnwrapRef + readonly onBeforeRouteLeave: UnwrapRef + readonly onBeforeRouteUpdate: UnwrapRef + readonly onBeforeUnmount: UnwrapRef + readonly onBeforeUpdate: UnwrapRef + readonly onClickOutside: UnwrapRef + readonly onDeactivated: UnwrapRef + readonly onErrorCaptured: UnwrapRef + readonly onKeyStroke: UnwrapRef + readonly onLongPress: UnwrapRef + readonly onMounted: UnwrapRef + readonly onRenderTracked: UnwrapRef + readonly onRenderTriggered: UnwrapRef + readonly onScopeDispose: UnwrapRef + readonly onServerPrefetch: UnwrapRef + readonly onStartTyping: UnwrapRef + readonly onUnmounted: UnwrapRef + readonly onUpdated: UnwrapRef + readonly pausableWatch: UnwrapRef + readonly provide: UnwrapRef + readonly reactify: UnwrapRef + readonly reactifyObject: UnwrapRef + readonly reactive: UnwrapRef + readonly reactiveComputed: UnwrapRef + readonly reactiveOmit: UnwrapRef + readonly reactivePick: UnwrapRef + readonly readonly: UnwrapRef + readonly ref: UnwrapRef + readonly refAutoReset: UnwrapRef + readonly refDebounced: UnwrapRef + readonly refDefault: UnwrapRef + readonly refThrottled: UnwrapRef + readonly refWithControl: UnwrapRef + readonly resolveComponent: UnwrapRef + readonly resolveRef: UnwrapRef + readonly resolveUnref: UnwrapRef + readonly shallowReactive: UnwrapRef + readonly shallowReadonly: UnwrapRef + readonly shallowRef: UnwrapRef + readonly syncRef: UnwrapRef + readonly syncRefs: UnwrapRef + readonly templateRef: UnwrapRef + readonly throttledRef: UnwrapRef + readonly throttledWatch: UnwrapRef + readonly toRaw: UnwrapRef + readonly toReactive: UnwrapRef + readonly toRef: UnwrapRef + readonly toRefs: UnwrapRef + readonly toValue: UnwrapRef + readonly triggerRef: UnwrapRef + readonly tryOnBeforeMount: UnwrapRef + readonly tryOnBeforeUnmount: UnwrapRef + readonly tryOnMounted: UnwrapRef + readonly tryOnScopeDispose: UnwrapRef + readonly tryOnUnmounted: UnwrapRef + readonly unref: UnwrapRef + readonly unrefElement: UnwrapRef + readonly until: UnwrapRef + readonly useActiveElement: UnwrapRef + readonly useAnimate: UnwrapRef + readonly useArrayDifference: UnwrapRef + readonly useArrayEvery: UnwrapRef + readonly useArrayFilter: UnwrapRef + readonly useArrayFind: UnwrapRef + readonly useArrayFindIndex: UnwrapRef + readonly useArrayFindLast: UnwrapRef + readonly useArrayIncludes: UnwrapRef + readonly useArrayJoin: UnwrapRef + readonly useArrayMap: UnwrapRef + readonly useArrayReduce: UnwrapRef + readonly useArraySome: UnwrapRef + readonly useArrayUnique: UnwrapRef + readonly useAsyncQueue: UnwrapRef + readonly useAsyncState: UnwrapRef + readonly useAttrs: UnwrapRef + readonly useBase64: UnwrapRef + readonly useBattery: UnwrapRef + readonly useBluetooth: UnwrapRef + readonly useBreakpoints: UnwrapRef + readonly useBroadcastChannel: UnwrapRef + readonly useBrowserLocation: UnwrapRef + readonly useCached: UnwrapRef + readonly useClipboard: UnwrapRef + readonly useCloned: UnwrapRef + readonly useColorMode: UnwrapRef + readonly useConfirmDialog: UnwrapRef + readonly useCounter: UnwrapRef + readonly useCssModule: UnwrapRef + readonly useCssVar: UnwrapRef + readonly useCssVars: UnwrapRef + readonly useCurrentElement: UnwrapRef + readonly useCycleList: UnwrapRef + readonly useDark: UnwrapRef + readonly useDateFormat: UnwrapRef + readonly useDebounce: UnwrapRef + readonly useDebounceFn: UnwrapRef + readonly useDebouncedRefHistory: UnwrapRef + readonly useDeviceMotion: UnwrapRef + readonly useDeviceOrientation: UnwrapRef + readonly useDevicePixelRatio: UnwrapRef + readonly useDevicesList: UnwrapRef + readonly useDialog: UnwrapRef + readonly useDisplayMedia: UnwrapRef + readonly useDocumentVisibility: UnwrapRef + readonly useDraggable: UnwrapRef + readonly useDropZone: UnwrapRef + readonly useElementBounding: UnwrapRef + readonly useElementByPoint: UnwrapRef + readonly useElementHover: UnwrapRef + readonly useElementSize: UnwrapRef + readonly useElementVisibility: UnwrapRef + readonly useEventBus: UnwrapRef + readonly useEventListener: UnwrapRef + readonly useEventSource: UnwrapRef + readonly useEyeDropper: UnwrapRef + readonly useFavicon: UnwrapRef + readonly useFetch: UnwrapRef + readonly useFileDialog: UnwrapRef + readonly useFileSystemAccess: UnwrapRef + readonly useFocus: UnwrapRef + readonly useFocusWithin: UnwrapRef + readonly useFps: UnwrapRef + readonly useFullscreen: UnwrapRef + readonly useGamepad: UnwrapRef + readonly useGeolocation: UnwrapRef + readonly useI18n: UnwrapRef + readonly useIdle: UnwrapRef + readonly useImage: UnwrapRef + readonly useInfiniteScroll: UnwrapRef + readonly useIntersectionObserver: UnwrapRef + readonly useInterval: UnwrapRef + readonly useIntervalFn: UnwrapRef + readonly useKeyModifier: UnwrapRef + readonly useLastChanged: UnwrapRef + readonly useLink: UnwrapRef + readonly useLoadingBar: UnwrapRef + readonly useLocalStorage: UnwrapRef + readonly useMagicKeys: UnwrapRef + readonly useManualRefHistory: UnwrapRef + readonly useMediaControls: UnwrapRef + readonly useMediaQuery: UnwrapRef + readonly useMemoize: UnwrapRef + readonly useMemory: UnwrapRef + readonly useMessage: UnwrapRef + readonly useMounted: UnwrapRef + readonly useMouse: UnwrapRef + readonly useMouseInElement: UnwrapRef + readonly useMousePressed: UnwrapRef + readonly useMutationObserver: UnwrapRef + readonly useNavigatorLanguage: UnwrapRef + readonly useNetwork: UnwrapRef + readonly useNotification: UnwrapRef + readonly useNow: UnwrapRef + readonly useObjectUrl: UnwrapRef + readonly useOffsetPagination: UnwrapRef + readonly useOnline: UnwrapRef + readonly usePageLeave: UnwrapRef + readonly useParallax: UnwrapRef + readonly useParentElement: UnwrapRef + readonly usePerformanceObserver: UnwrapRef + readonly usePermission: UnwrapRef + readonly usePointer: UnwrapRef + readonly usePointerLock: UnwrapRef + readonly usePointerSwipe: UnwrapRef + readonly usePreferredColorScheme: UnwrapRef + readonly usePreferredContrast: UnwrapRef + readonly usePreferredDark: UnwrapRef + readonly usePreferredLanguages: UnwrapRef + readonly usePreferredReducedMotion: UnwrapRef + readonly usePrevious: UnwrapRef + readonly useRafFn: UnwrapRef + readonly useRefHistory: UnwrapRef + readonly useResizeObserver: UnwrapRef + readonly useRoute: UnwrapRef + readonly useRouter: UnwrapRef + readonly useScreenOrientation: UnwrapRef + readonly useScreenSafeArea: UnwrapRef + readonly useScriptTag: UnwrapRef + readonly useScroll: UnwrapRef + readonly useScrollLock: UnwrapRef + readonly useSessionStorage: UnwrapRef + readonly useShare: UnwrapRef + readonly useSlots: UnwrapRef + readonly useSorted: UnwrapRef + readonly useSpeechRecognition: UnwrapRef + readonly useSpeechSynthesis: UnwrapRef + readonly useStepper: UnwrapRef + readonly useStorage: UnwrapRef + readonly useStorageAsync: UnwrapRef + readonly useStyleTag: UnwrapRef + readonly useSupported: UnwrapRef + readonly useSwipe: UnwrapRef readonly useTemplateRefsList: UnwrapRef readonly useTextDirection: UnwrapRef readonly useTextSelection: UnwrapRef diff --git a/components.d.ts b/components.d.ts index eac69e17c7..7d84c7f6cd 100644 --- a/components.d.ts +++ b/components.d.ts @@ -3,9 +3,11 @@ // @ts-nocheck // Generated by unplugin-vue-components // Read more: https://github.com/vuejs/core/pull/3399 +import '@vue/runtime-core' + export {} -declare module 'vue' { +declare module '@vue/runtime-core' { export interface GlobalComponents { '404.page': typeof import('./src/pages/404.page.vue')['default'] About: typeof import('./src/pages/About.vue')['default'] @@ -18,6 +20,7 @@ declare module 'vue' { Bcrypt: typeof import('./src/tools/bcrypt/bcrypt.vue')['default'] BenchmarkBuilder: typeof import('./src/tools/benchmark-builder/benchmark-builder.vue')['default'] Bip39Generator: typeof import('./src/tools/bip39-generator/bip39-generator.vue')['default'] + ByteUnitConverter: typeof import('./src/tools/byte-unit-converter/byte-unit-converter.vue')['default'] CAlert: typeof import('./src/ui/c-alert/c-alert.vue')['default'] 'CAlert.demo': typeof import('./src/ui/c-alert/c-alert.demo.vue')['default'] CameraRecorder: typeof import('./src/tools/camera-recorder/camera-recorder.vue')['default'] @@ -56,12 +59,14 @@ declare module 'vue' { CrontabGenerator: typeof import('./src/tools/crontab-generator/crontab-generator.vue')['default'] CSelect: typeof import('./src/ui/c-select/c-select.vue')['default'] 'CSelect.demo': typeof import('./src/ui/c-select/c-select.demo.vue')['default'] + CssJsPrettifyMinify: typeof import('./src/tools/css-js-prettify-minify/css-js-prettify-minify.vue')['default'] CTable: typeof import('./src/ui/c-table/c-table.vue')['default'] 'CTable.demo': typeof import('./src/ui/c-table/c-table.demo.vue')['default'] CTextCopyable: typeof import('./src/ui/c-text-copyable/c-text-copyable.vue')['default'] 'CTextCopyable.demo': typeof import('./src/ui/c-text-copyable/c-text-copyable.demo.vue')['default'] CTooltip: typeof import('./src/ui/c-tooltip/c-tooltip.vue')['default'] 'CTooltip.demo': typeof import('./src/ui/c-tooltip/c-tooltip.demo.vue')['default'] + CurlToCode: typeof import('./src/tools/curl-to-code/curl-to-code.vue')['default'] DateTimeConverter: typeof import('./src/tools/date-time-converter/date-time-converter.vue')['default'] 'DemoHome.page': typeof import('./src/ui/demo/demo-home.page.vue')['default'] DemoWrapper: typeof import('./src/ui/demo/demo-wrapper.vue')['default'] @@ -84,6 +89,7 @@ declare module 'vue' { HmacGenerator: typeof import('./src/tools/hmac-generator/hmac-generator.vue')['default'] 'Home.page': typeof import('./src/pages/Home.page.vue')['default'] HtmlEntities: typeof import('./src/tools/html-entities/html-entities.vue')['default'] + HtmlToMarkdown: typeof import('./src/tools/html-to-markdown/html-to-markdown.vue')['default'] HtmlWysiwygEditor: typeof import('./src/tools/html-wysiwyg-editor/html-wysiwyg-editor.vue')['default'] HttpStatusCodes: typeof import('./src/tools/http-status-codes/http-status-codes.vue')['default'] IbanValidatorAndParser: typeof import('./src/tools/iban-validator-and-parser/iban-validator-and-parser.vue')['default'] @@ -120,6 +126,7 @@ declare module 'vue' { JsonMinify: typeof import('./src/tools/json-minify/json-minify.vue')['default'] JsonToCsv: typeof import('./src/tools/json-to-csv/json-to-csv.vue')['default'] JsonToToml: typeof import('./src/tools/json-to-toml/json-to-toml.vue')['default'] + JsonToTypes: typeof import('./src/tools/json-to-types/json-to-types.vue')['default'] JsonToXml: typeof import('./src/tools/json-to-xml/json-to-xml.vue')['default'] JsonToYaml: typeof import('./src/tools/json-to-yaml-converter/json-to-yaml.vue')['default'] JsonViewer: typeof import('./src/tools/json-viewer/json-viewer.vue')['default'] diff --git a/locales/en.yml b/locales/en.yml index d03d80d3f6..27fa353bfb 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -392,3 +392,23 @@ tools: text-to-binary: title: Text to ASCII binary description: Convert text to its ASCII binary representation and vice-versa. + + html-to-markdown: + title: HTML to Markdown + description: Convert HTML to Markdown with this online converter. + + byte-unit-converter: + title: Byte unit converter + description: Convert between data size units (bytes, KB, MB, GB, TB) in both decimal (SI) and binary (IEC) systems. + + json-to-types: + title: JSON to TypeScript/Go + description: Generate TypeScript interfaces or Go structs from a JSON sample. + + css-js-prettify-minify: + title: CSS/JS Prettify & Minify + description: Prettify or minify your CSS and JavaScript code online. + + curl-to-code: + title: cURL to Code + description: Convert cURL commands to code in various programming languages. diff --git a/locales/zh.yml b/locales/zh.yml index dc5d749ca9..a2be534a02 100644 --- a/locales/zh.yml +++ b/locales/zh.yml @@ -388,3 +388,23 @@ tools: text-to-binary: title: 文本到 ASCII 二进制 description: 将文本转换为其 ASCII 二进制表示形式,反之亦然。 + + html-to-markdown: + title: HTML 转 Markdown + description: 使用此在线转换器将 HTML 转换为 Markdown。 + + byte-unit-converter: + title: 字节单位转换器 + description: 在十进制(SI)和二进制(IEC)系统中转换数据大小单位(字节、KB、MB、GB、TB)。 + + json-to-types: + title: JSON 转 TypeScript/Go + description: 从 JSON 样本生成 TypeScript 接口或 Go 结构体。 + + css-js-prettify-minify: + title: CSS/JS 格式化与压缩 + description: 在线格式化或压缩您的 CSS 和 JavaScript 代码。 + + curl-to-code: + title: cURL 转代码 + description: 将 cURL 命令转换为多种编程语言的代码。 diff --git a/package.json b/package.json index 6c6180e931..57f9d2c34e 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "cron-validator": "^1.3.1", "cronstrue": "^2.26.0", "crypto-js": "^4.1.1", + "curlconverter": "^4.12.0", "date-fns": "^2.29.3", "date-fns-tz": "^2.0.1", "dompurify": "^3.0.6", @@ -72,6 +73,7 @@ "iarna-toml-esm": "^3.0.5", "ibantools": "^4.3.3", "js-base64": "^3.7.6", + "js-beautify": "^1.15.4", "json5": "^2.2.3", "jwt-decode": "^3.1.2", "libphonenumber-js": "^1.10.28", @@ -91,6 +93,7 @@ "qrcode": "^1.5.1", "randexp": "^0.5.3", "sql-formatter": "^13.0.0", + "turndown": "^7.2.4", "ua-parser-js": "^1.0.35", "ulid": "^2.3.0", "unicode-emoji-json": "^0.4.0", @@ -116,6 +119,7 @@ "@types/bcryptjs": "^2.4.2", "@types/crypto-js": "^4.1.1", "@types/dompurify": "^3.0.5", + "@types/js-beautify": "^1.14.3", "@types/jsdom": "^21.0.0", "@types/lodash": "^4.14.192", "@types/mime-types": "^2.1.1", @@ -123,6 +127,7 @@ "@types/node": "^18.15.11", "@types/node-forge": "^1.3.2", "@types/qrcode": "^1.5.0", + "@types/turndown": "^5.0.6", "@types/ua-parser-js": "^0.7.36", "@types/uuid": "^9.0.0", "@unocss/eslint-config": "^0.57.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5d11389323..78b12137f9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,7 +49,7 @@ importers: version: 10.3.0(vue@3.3.4) '@vueuse/head': specifier: ^1.0.0 - version: 1.0.0(typescript@5.2.2)(vue@3.3.4) + version: 1.0.0(vue@3.3.4) '@vueuse/router': specifier: ^10.0.0 version: 10.0.0(vue-router@4.1.6(vue@3.3.4))(vue@3.3.4) @@ -77,9 +77,15 @@ importers: crypto-js: specifier: ^4.1.1 version: 4.1.1 + curlconverter: + specifier: ^4.12.0 + version: 4.12.0 date-fns: specifier: ^2.29.3 version: 2.29.3 + date-fns-tz: + specifier: ^2.0.1 + version: 2.0.1(date-fns@2.29.3) dompurify: specifier: ^3.0.6 version: 3.0.6 @@ -110,6 +116,9 @@ importers: js-base64: specifier: ^3.7.6 version: 3.7.7 + js-beautify: + specifier: ^1.15.4 + version: 1.15.4 json5: specifier: ^2.2.3 version: 2.2.3 @@ -167,6 +176,9 @@ importers: sql-formatter: specifier: ^13.0.0 version: 13.0.0 + turndown: + specifier: ^7.2.4 + version: 7.2.4 ua-parser-js: specifier: ^1.0.35 version: 1.0.35 @@ -237,6 +249,9 @@ importers: '@types/dompurify': specifier: ^3.0.5 version: 3.0.5 + '@types/js-beautify': + specifier: ^1.14.3 + version: 1.14.3 '@types/jsdom': specifier: ^21.0.0 version: 21.1.0 @@ -258,6 +273,9 @@ importers: '@types/qrcode': specifier: ^1.5.0 version: 1.5.0 + '@types/turndown': + specifier: ^5.0.6 + version: 5.0.6 '@types/ua-parser-js': specifier: ^0.7.36 version: 0.7.36 @@ -1523,6 +1541,10 @@ packages: vue-i18n-bridge: optional: true + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + '@it-tools/bip39@0.0.4': resolution: {integrity: sha512-0PWO7VKi6VALiFcm8z2WgxzSZ5wAko0OctBZ0I5+jjtSIXm3t1d54yrrHfgFOZDTyMpCXi638oLpzqexcfRtbA==} @@ -1610,6 +1632,9 @@ packages: '@mdit-vue/types@0.12.0': resolution: {integrity: sha512-mrC4y8n88BYvgcgzq9bvTlDgFyi2zuvzmPilRvRc3Uz1iIvq8mDhxJ0rHKFUNzPEScpDvJdIujqiDrulMqiudA==} + '@mixmark-io/domino@2.2.0': + resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1622,6 +1647,13 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + '@pkgr/utils@2.3.1': resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -1913,6 +1945,9 @@ packages: '@types/fs-extra@11.0.1': resolution: {integrity: sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==} + '@types/js-beautify@1.14.3': + resolution: {integrity: sha512-FMbQHz+qd9DoGvgLHxeqqVPaNRffpIu5ZjozwV8hf9JAGpIOzuAf4wGbRSo8LNITHqGjmmVjaMggTT5P4v4IHg==} + '@types/jsdom@21.1.0': resolution: {integrity: sha512-leWreJOdnuIxq9Y70tBVm/bvTuh31DSlF/r4l7Cfi4uhVQqLHD0Q4v301GMisEMwwbMgF7ZKxuZ+Jbd4NcdmRw==} @@ -2000,6 +2035,9 @@ packages: '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/turndown@5.0.6': + resolution: {integrity: sha512-ru00MoyeeouE5BX4gRL+6m/BsDfbRayOskWqUvh7CLGW+UXxHQItqALa38kKnOiZPqJrtzJUgAC2+F0rL1S4Pg==} + '@types/ua-parser-js@0.7.36': resolution: {integrity: sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==} @@ -2303,9 +2341,6 @@ packages: '@vue/compiler-core@3.3.7': resolution: {integrity: sha512-pACdY6YnTNVLXsB86YD8OF9ihwpolzhhtdLVHhBL6do/ykr6kKXNYABRtNMGrsQXpEXXyAdwvWWkuTbs4MFtPQ==} - '@vue/compiler-core@3.5.13': - resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} - '@vue/compiler-dom@3.2.47': resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} @@ -2315,18 +2350,12 @@ packages: '@vue/compiler-dom@3.3.7': resolution: {integrity: sha512-0LwkyJjnUPssXv/d1vNJ0PKfBlDoQs7n81CbO6Q0zdL7H1EzqYRrTVXDqdBVqro0aJjo/FOa1qBAPVI4PGSHBw==} - '@vue/compiler-dom@3.5.13': - resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} - '@vue/compiler-sfc@3.2.47': resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} '@vue/compiler-sfc@3.3.4': resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} - '@vue/compiler-sfc@3.5.13': - resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} - '@vue/compiler-ssr@3.2.47': resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} @@ -2336,9 +2365,6 @@ packages: '@vue/compiler-ssr@3.3.7': resolution: {integrity: sha512-TxOfNVVeH3zgBc82kcUv+emNHo+vKnlRrkv8YvQU5+Y5LJGJwSNzcmLUoxD/dNzv0bhQ/F0s+InlgV0NrApJZg==} - '@vue/compiler-ssr@3.5.13': - resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} - '@vue/devtools-api@6.5.0': resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} @@ -2359,21 +2385,12 @@ packages: '@vue/reactivity@3.3.4': resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} - '@vue/reactivity@3.5.13': - resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} - '@vue/runtime-core@3.3.4': resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} - '@vue/runtime-core@3.5.13': - resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} - '@vue/runtime-dom@3.3.4': resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} - '@vue/runtime-dom@3.5.13': - resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} - '@vue/server-renderer@3.3.4': resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} peerDependencies: @@ -2384,11 +2401,6 @@ packages: peerDependencies: vue: 3.3.7 - '@vue/server-renderer@3.5.13': - resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} - peerDependencies: - vue: 3.5.13 - '@vue/shared@3.2.47': resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} @@ -2398,9 +2410,6 @@ packages: '@vue/shared@3.3.7': resolution: {integrity: sha512-N/tbkINRUDExgcPTBvxNkvHGu504k8lzlNQRITVnm6YjOjwa4r0nnbd4Jb01sNpur5hAllyRJzSK5PvB9PPwRg==} - '@vue/shared@3.5.13': - resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} - '@vue/test-utils@2.3.2': resolution: {integrity: sha512-hJnVaYhbrIm0yBS0+e1Y0Sj85cMyAi+PAbK4JHqMRUZ6S622Goa+G7QzkRSyvCteG8wop7tipuEbHoZo26wsSA==} peerDependencies: @@ -2434,8 +2443,10 @@ packages: '@vueuse/shared@10.3.0': resolution: {integrity: sha512-kGqCTEuFPMK4+fNWy6dUOiYmxGcUbtznMwBZLC1PubidF4VZY05B+Oht7Jh7/6x4VOWGpvu3R37WHi81cKpiqg==} - '@vueuse/shared@12.0.0': - resolution: {integrity: sha512-3i6qtcq2PIio5i/vVYidkkcgvmTjCqrf26u+Fd4LhnbBmIT6FN8y6q/GJERp8lfcB9zVEfjdV0Br0443qZuJpw==} + '@vueuse/shared@14.3.0': + resolution: {integrity: sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==} + peerDependencies: + vue: ^3.5.0 '@zhead/schema@1.0.0-beta.13': resolution: {integrity: sha512-P1A1vRGFBhITco8Iw4/hvnDYoE/SoVrd71dW1pBFdXJb3vP+pBtoOuhbEKy0ROJGOyzQuqvFibcwzyLlWMqNiQ==} @@ -2446,6 +2457,10 @@ packages: abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -2493,6 +2508,10 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -2505,6 +2524,10 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -2595,6 +2618,9 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} + braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} @@ -2848,6 +2874,10 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + crypto-js@4.1.1: resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==} @@ -2896,8 +2926,9 @@ packages: csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + curlconverter@4.12.0: + resolution: {integrity: sha512-NcwPKJgu9DkCH4gQsnjnXuUtPrhLhoNwvIYTTS5rRrsCC/X2flUswtgmeCyV9ePGszXzFReXk5y/CdBxrsAQ8Q==} + hasBin: true dash-get@1.0.2: resolution: {integrity: sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ==} @@ -2922,10 +2953,10 @@ packages: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} - date-fns-tz@2.0.0: - resolution: {integrity: sha512-OAtcLdB9vxSXTWHdT8b398ARImVwQMyjfYGkKD2zaGpHseG2UPHbHjXELReErZFxWdSLph3c2zOaaTyHfOhERQ==} + date-fns-tz@2.0.1: + resolution: {integrity: sha512-fJCG3Pwx8HUoLhkepdsP7Z5RsucUi+ZBOxyM5d0ZZ6c4SdYustq0VMmOu6Wf7bli+yS/Jwp91TOCqn9jMcVrUA==} peerDependencies: - date-fns: '>=2.0.0' + date-fns: 2.x date-fns@2.29.3: resolution: {integrity: sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==} @@ -3082,10 +3113,18 @@ packages: duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + editorconfig@0.15.3: resolution: {integrity: sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==} hasBin: true + editorconfig@1.0.7: + resolution: {integrity: sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==} + engines: {node: '>=14'} + hasBin: true + ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} @@ -3114,6 +3153,9 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + emojilib@3.0.10: resolution: {integrity: sha512-VQtCRroFykPTJaoEBEGFg5tI+rEluabjuaVDDbSftDtiRJ5GuqRG/LGV1mmDzkJP4bh5rzuEBOafMN68/YXQcQ==} @@ -3246,6 +3288,7 @@ packages: eslint-plugin-i@2.28.0-2: resolution: {integrity: sha512-z48kG4qmE4TmiLcxbmvxMT5ycwvPkXaWW0XpU1L768uZaTbiDbxsHMEdV24JHlOR1xDsPpKW39BfP/pRdYIwFA==} engines: {node: '>=12'} + deprecated: Please migrate to the brand new `eslint-plugin-import-x` instead peerDependencies: eslint: ^7.2.0 || ^8 @@ -3467,6 +3510,10 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -3564,12 +3611,18 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} @@ -3649,10 +3702,6 @@ packages: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} - hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -3817,9 +3866,6 @@ packages: is-core-module@2.13.0: resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - is-core-module@2.16.0: resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} engines: {node: '>= 0.4'} @@ -3984,6 +4030,9 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jake@10.8.7: resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} engines: {node: '>=10'} @@ -4017,6 +4066,14 @@ packages: engines: {node: '>=10'} hasBin: true + js-beautify@1.15.4: + resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.8: + resolution: {integrity: sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==} + js-sha256@0.9.0: resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} @@ -4170,6 +4227,9 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + lossless-json@4.3.0: + resolution: {integrity: sha512-ToxOC+SsduRmdSuoLZLYAr5zy1Qu7l5XhmPWM3zefCZ5IcrzW/h108qbJUKfOlDlhvhjUK84+8PSVX0kxnit0g==} + loupe@2.3.6: resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} @@ -4182,6 +4242,9 @@ packages: lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -4309,9 +4372,17 @@ packages: resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + mlly@1.4.0: resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} @@ -4377,6 +4448,10 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-addon-api@8.8.0: + resolution: {integrity: sha512-c5Ko1fZJIJmzhFIkhRN76WTq+fC6tWnGy9CXA0fA+XygsWZmEwG8vmbkNqxMyoaa0Tin4djul49NzdVcJJcjeA==} + engines: {node: ^18 || ^20 || >= 21} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -4392,6 +4467,10 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + node-releases@2.0.12: resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} @@ -4406,6 +4485,11 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} hasBin: true + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -4495,6 +4579,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@0.2.7: resolution: {integrity: sha512-g4+387DXDKlZzHkP+9FLt8yKj8+/3tOkPv7DVTJGGRm00RkEWgqbFstX1mXJ4M0VDYhUqsTOiISqNOJnhAu3PQ==} @@ -4549,6 +4636,10 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -4868,10 +4959,6 @@ packages: resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} hasBin: true - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - resolve@1.22.9: resolution: {integrity: sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==} hasBin: true @@ -5029,6 +5116,10 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + sirv@2.0.4: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} @@ -5071,6 +5162,7 @@ packages: source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} @@ -5116,6 +5208,10 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + string.prototype.matchall@4.0.11: resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} engines: {node: '>= 0.4'} @@ -5143,6 +5239,10 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + strip-bom-string@1.0.0: resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} engines: {node: '>=0.10.0'} @@ -5272,6 +5372,17 @@ packages: resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} engines: {node: '>=14'} + tree-sitter-bash@0.23.3: + resolution: {integrity: sha512-36cg/GQ2YmIbeiBeqeuh4fBJ6i4kgVouDaqTxqih5ysPag+zHufyIaxMOFeM8CeplwAK/Luj1o5XHqgdAfoCZg==} + peerDependencies: + tree-sitter: ^0.21.1 + peerDependenciesMeta: + tree-sitter: + optional: true + + tree-sitter@0.21.1: + resolution: {integrity: sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==} + treemate@0.3.11: resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==} @@ -5298,6 +5409,10 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + turndown@7.2.4: + resolution: {integrity: sha512-I8yFsfRzmzK0WV1pNNOA4A7y4RDfFxPRxb3t+e3ui14qSGOxGtiSP6GjeX+Y6CHb7HYaFj7ECUD7VE5kQMZWGQ==} + engines: {node: '>=18', npm: '>=9'} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -5701,14 +5816,6 @@ packages: vue@3.3.4: resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} - vue@3.5.13: - resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - vuedraggable@4.1.0: resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==} peerDependencies: @@ -5733,6 +5840,9 @@ packages: resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} engines: {node: '>= 8'} + web-tree-sitter@0.24.7: + resolution: {integrity: sha512-CdC/TqVFbXqR+C51v38hv6wOPatKEUGxa39scAeFSm98wIhZxAYonhRQPSMmfZ2w7JDI0zQDdzdmgtNk06/krQ==} + webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} @@ -5859,6 +5969,14 @@ packages: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -6117,7 +6235,7 @@ snapshots: '@babel/traverse': 7.23.2 '@babel/types': 7.23.0 convert-source-map: 2.0.0 - debug: 4.3.4 + debug: 4.4.0 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -7000,7 +7118,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.22.10 '@babel/types': 7.22.10 - debug: 4.3.4 + debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -7015,7 +7133,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.22.5 '@babel/parser': 7.22.5 '@babel/types': 7.22.5 - debug: 4.3.4 + debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -7030,7 +7148,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.23.0 '@babel/types': 7.23.0 - debug: 4.3.4 + debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -7228,7 +7346,7 @@ snapshots: '@eslint/eslintrc@2.1.2': dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.4.0 espree: 9.6.1 globals: 13.20.0 ignore: 5.2.4 @@ -7244,7 +7362,7 @@ snapshots: '@humanwhocodes/config-array@0.11.10': dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -7330,6 +7448,15 @@ snapshots: - rollup - supports-color + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.2.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + '@it-tools/bip39@0.0.4': dependencies: js-sha256: 0.9.0 @@ -7401,7 +7528,7 @@ snapshots: '@linaria/logger@4.0.0': dependencies: - debug: 4.3.4 + debug: 4.4.0 picocolors: 1.0.0 transitivePeerDependencies: - supports-color @@ -7441,6 +7568,8 @@ snapshots: '@mdit-vue/types@0.12.0': {} + '@mixmark-io/domino@2.2.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -7453,6 +7582,11 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + '@one-ini/wasm@0.1.1': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + '@pkgr/utils@2.3.1': dependencies: cross-spawn: 7.0.3 @@ -7782,6 +7916,8 @@ snapshots: '@types/jsonfile': 6.1.1 '@types/node': 18.15.11 + '@types/js-beautify@1.14.3': {} + '@types/jsdom@21.1.0': dependencies: '@types/node': 18.15.11 @@ -7860,6 +7996,8 @@ snapshots: '@types/trusted-types@2.0.7': {} + '@types/turndown@5.0.6': {} + '@types/ua-parser-js@0.7.36': {} '@types/unist@2.0.6': {} @@ -7922,7 +8060,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.2.2) '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.2.2) - debug: 4.3.4 + debug: 4.4.0 eslint: 8.47.0 ts-api-utils: 1.0.1(typescript@5.2.2) optionalDependencies: @@ -7940,10 +8078,10 @@ snapshots: dependencies: '@typescript-eslint/types': 5.60.0 '@typescript-eslint/visitor-keys': 5.60.0 - debug: 4.3.4 + debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 + semver: 7.6.3 tsutils: 3.21.0(typescript@5.2.2) optionalDependencies: typescript: 5.2.2 @@ -7954,10 +8092,10 @@ snapshots: dependencies: '@typescript-eslint/types': 6.4.1 '@typescript-eslint/visitor-keys': 6.4.1 - debug: 4.3.4 + debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 + semver: 7.6.3 ts-api-utils: 1.0.1(typescript@5.2.2) optionalDependencies: typescript: 5.2.2 @@ -7968,10 +8106,10 @@ snapshots: dependencies: '@typescript-eslint/types': 6.9.1 '@typescript-eslint/visitor-keys': 6.9.1 - debug: 4.3.4 + debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 + semver: 7.6.3 ts-api-utils: 1.0.1(typescript@5.2.2) optionalDependencies: typescript: 5.2.2 @@ -7988,7 +8126,7 @@ snapshots: '@typescript-eslint/typescript-estree': 5.60.0(typescript@5.2.2) eslint: 8.47.0 eslint-scope: 5.1.1 - semver: 7.5.4 + semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript @@ -8002,7 +8140,7 @@ snapshots: '@typescript-eslint/types': 6.4.1 '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.2.2) eslint: 8.47.0 - semver: 7.5.4 + semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript @@ -8016,7 +8154,7 @@ snapshots: '@typescript-eslint/types': 6.9.1 '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) eslint: 8.47.0 - semver: 7.5.4 + semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript @@ -8049,15 +8187,13 @@ snapshots: dependencies: '@unhead/schema': 0.5.1 - '@unhead/vue@0.5.1(typescript@5.2.2)(vue@3.3.4)': + '@unhead/vue@0.5.1(vue@3.3.4)': dependencies: '@unhead/dom': 0.5.1 '@unhead/schema': 0.5.1 - '@vueuse/shared': 12.0.0(typescript@5.2.2) + '@vueuse/shared': 14.3.0(vue@3.3.4) unhead: 0.5.1 vue: 3.3.4 - transitivePeerDependencies: - - typescript '@unocss/astro@0.65.1(rollup@2.79.2)(vite@4.4.9(@types/node@18.15.11)(less@4.1.3)(terser@5.37.0))(vue@3.3.4)': dependencies: @@ -8341,14 +8477,6 @@ snapshots: source-map-js: 1.0.2 optional: true - '@vue/compiler-core@3.5.13': - dependencies: - '@babel/parser': 7.26.3 - '@vue/shared': 3.5.13 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - '@vue/compiler-dom@3.2.47': dependencies: '@vue/compiler-core': 3.2.47 @@ -8365,11 +8493,6 @@ snapshots: '@vue/shared': 3.3.7 optional: true - '@vue/compiler-dom@3.5.13': - dependencies: - '@vue/compiler-core': 3.5.13 - '@vue/shared': 3.5.13 - '@vue/compiler-sfc@3.2.47': dependencies: '@babel/parser': 7.21.4 @@ -8396,18 +8519,6 @@ snapshots: postcss: 8.4.28 source-map-js: 1.0.2 - '@vue/compiler-sfc@3.5.13': - dependencies: - '@babel/parser': 7.26.3 - '@vue/compiler-core': 3.5.13 - '@vue/compiler-dom': 3.5.13 - '@vue/compiler-ssr': 3.5.13 - '@vue/shared': 3.5.13 - estree-walker: 2.0.2 - magic-string: 0.30.15 - postcss: 8.4.49 - source-map-js: 1.2.1 - '@vue/compiler-ssr@3.2.47': dependencies: '@vue/compiler-dom': 3.2.47 @@ -8424,11 +8535,6 @@ snapshots: '@vue/shared': 3.3.7 optional: true - '@vue/compiler-ssr@3.5.13': - dependencies: - '@vue/compiler-dom': 3.5.13 - '@vue/shared': 3.5.13 - '@vue/devtools-api@6.5.0': {} '@vue/language-core@1.8.1(typescript@5.2.2)': @@ -8438,7 +8544,7 @@ snapshots: '@vue/compiler-dom': 3.3.4 '@vue/reactivity': 3.3.4 '@vue/shared': 3.3.4 - minimatch: 9.0.1 + minimatch: 9.0.9 muggle-string: 0.3.1 vue-template-compiler: 2.7.14 optionalDependencies: @@ -8464,33 +8570,17 @@ snapshots: dependencies: '@vue/shared': 3.3.4 - '@vue/reactivity@3.5.13': - dependencies: - '@vue/shared': 3.5.13 - '@vue/runtime-core@3.3.4': dependencies: '@vue/reactivity': 3.3.4 '@vue/shared': 3.3.4 - '@vue/runtime-core@3.5.13': - dependencies: - '@vue/reactivity': 3.5.13 - '@vue/shared': 3.5.13 - '@vue/runtime-dom@3.3.4': dependencies: '@vue/runtime-core': 3.3.4 '@vue/shared': 3.3.4 csstype: 3.1.2 - '@vue/runtime-dom@3.5.13': - dependencies: - '@vue/reactivity': 3.5.13 - '@vue/runtime-core': 3.5.13 - '@vue/shared': 3.5.13 - csstype: 3.1.3 - '@vue/server-renderer@3.3.4(vue@3.3.4)': dependencies: '@vue/compiler-ssr': 3.3.4 @@ -8504,12 +8594,6 @@ snapshots: vue: 3.3.4 optional: true - '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.2.2))': - dependencies: - '@vue/compiler-ssr': 3.5.13 - '@vue/shared': 3.5.13 - vue: 3.5.13(typescript@5.2.2) - '@vue/shared@3.2.47': {} '@vue/shared@3.3.4': {} @@ -8517,8 +8601,6 @@ snapshots: '@vue/shared@3.3.7': optional: true - '@vue/shared@3.5.13': {} - '@vue/test-utils@2.3.2(vue@3.3.4)': dependencies: js-beautify: 1.14.6 @@ -8546,14 +8628,12 @@ snapshots: - '@vue/composition-api' - vue - '@vueuse/head@1.0.0(typescript@5.2.2)(vue@3.3.4)': + '@vueuse/head@1.0.0(vue@3.3.4)': dependencies: '@unhead/schema': 0.5.1 '@unhead/ssr': 0.5.1 - '@unhead/vue': 0.5.1(typescript@5.2.2)(vue@3.3.4) + '@unhead/vue': 0.5.1(vue@3.3.4) vue: 3.3.4 - transitivePeerDependencies: - - typescript '@vueuse/metadata@10.3.0': {} @@ -8580,11 +8660,9 @@ snapshots: - '@vue/composition-api' - vue - '@vueuse/shared@12.0.0(typescript@5.2.2)': + '@vueuse/shared@14.3.0(vue@3.3.4)': dependencies: - vue: 3.5.13(typescript@5.2.2) - transitivePeerDependencies: - - typescript + vue: 3.3.4 '@zhead/schema@1.0.0-beta.13': {} @@ -8592,6 +8670,8 @@ snapshots: abbrev@1.1.1: {} + abbrev@2.0.0: {} + acorn-jsx@5.3.2(acorn@8.10.0): dependencies: acorn: 8.10.0 @@ -8608,7 +8688,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.4 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -8630,6 +8710,8 @@ snapshots: ansi-regex@5.0.1: {} + ansi-regex@6.2.2: {} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 @@ -8640,6 +8722,8 @@ snapshots: ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -8740,6 +8824,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@2.1.1: + dependencies: + balanced-match: 1.0.2 + braces@3.0.2: dependencies: fill-range: 7.0.1 @@ -8780,7 +8868,7 @@ snapshots: builtins@5.0.1: dependencies: - semver: 7.5.4 + semver: 7.6.3 bundle-require@5.0.0(esbuild@0.23.1): dependencies: @@ -9036,6 +9124,12 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + crypto-js@4.1.1: {} crypto-random-string@2.0.0: {} @@ -9084,7 +9178,14 @@ snapshots: csstype@3.1.2: {} - csstype@3.1.3: {} + curlconverter@4.12.0: + dependencies: + jsesc: 3.1.0 + lossless-json: 4.3.0 + tree-sitter: 0.21.1 + tree-sitter-bash: 0.23.3(tree-sitter@0.21.1) + web-tree-sitter: 0.24.7 + yamljs: 0.3.0 dash-get@1.0.2: {} @@ -9114,7 +9215,11 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - date-fns-tz@2.0.0(date-fns@2.30.0): + date-fns-tz@2.0.1(date-fns@2.29.3): + dependencies: + date-fns: 2.29.3 + + date-fns-tz@2.0.1(date-fns@2.30.0): dependencies: date-fns: 2.30.0 @@ -9243,6 +9348,8 @@ snapshots: duplexer@0.1.2: {} + eastasianwidth@0.2.0: {} + editorconfig@0.15.3: dependencies: commander: 2.20.3 @@ -9250,6 +9357,13 @@ snapshots: semver: 5.7.2 sigmund: 1.0.1 + editorconfig@1.0.7: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.0 + minimatch: 9.0.9 + semver: 7.6.3 + ejs@3.1.10: dependencies: jake: 10.9.2 @@ -9272,6 +9386,8 @@ snapshots: emoji-regex@8.0.0: {} + emoji-regex@9.2.2: {} + emojilib@3.0.10: {} encode-utf8@1.0.3: {} @@ -9547,7 +9663,7 @@ snapshots: esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 - jsesc: 3.0.2 + jsesc: 3.1.0 lodash: 4.17.21 pluralize: 8.0.0 read-pkg-up: 7.0.1 @@ -9778,6 +9894,11 @@ snapshots: dependencies: is-callable: 1.2.7 + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + form-data@4.0.0: dependencies: asynckit: 0.4.0 @@ -9879,6 +10000,15 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.9 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -9971,10 +10101,6 @@ snapshots: dependencies: function-bind: 1.1.2 - hasown@2.0.0: - dependencies: - function-bind: 1.1.2 - hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -10016,14 +10142,14 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.4.0 transitivePeerDependencies: - supports-color https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -10160,10 +10286,6 @@ snapshots: dependencies: has: 1.0.3 - is-core-module@2.13.1: - dependencies: - hasown: 2.0.0 - is-core-module@2.16.0: dependencies: hasown: 2.0.2 @@ -10299,6 +10421,12 @@ snapshots: isobject@3.0.1: {} + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + jake@10.8.7: dependencies: async: 3.2.4 @@ -10330,6 +10458,16 @@ snapshots: glob: 8.1.0 nopt: 6.0.0 + js-beautify@1.15.4: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.7 + glob: 10.4.5 + js-cookie: 3.0.8 + nopt: 7.2.1 + + js-cookie@3.0.8: {} + js-sha256@0.9.0: {} js-tokens@4.0.0: {} @@ -10485,6 +10623,8 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + lossless-json@4.3.0: {} + loupe@2.3.6: dependencies: get-func-name: 2.0.0 @@ -10499,6 +10639,8 @@ snapshots: dependencies: tslib: 2.5.0 + lru-cache@10.4.3: {} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 @@ -10632,14 +10774,20 @@ snapshots: minimatch@5.1.6: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.1.1 minimatch@9.0.1: dependencies: brace-expansion: 2.0.1 + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.1 + minimist@1.2.8: {} + minipass@7.1.3: {} + mlly@1.4.0: dependencies: acorn: 8.11.2 @@ -10683,7 +10831,7 @@ snapshots: async-validator: 4.2.5 css-render: 0.15.12 date-fns: 2.30.0 - date-fns-tz: 2.0.0(date-fns@2.30.0) + date-fns-tz: 2.0.1(date-fns@2.30.0) evtd: 0.2.4 highlight.js: 11.9.0 lodash: 4.17.21 @@ -10728,6 +10876,8 @@ snapshots: lower-case: 2.0.2 tslib: 2.5.0 + node-addon-api@8.8.0: {} + node-domexception@1.0.0: {} node-fetch-native@1.6.4: {} @@ -10740,6 +10890,8 @@ snapshots: node-forge@1.3.1: {} + node-gyp-build@4.8.4: {} + node-releases@2.0.12: {} node-releases@2.0.13: {} @@ -10750,10 +10902,14 @@ snapshots: dependencies: abbrev: 1.1.1 + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.8 + resolve: 1.22.9 semver: 5.7.2 validate-npm-package-license: 3.0.4 @@ -10855,6 +11011,8 @@ snapshots: p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} + package-manager-detector@0.2.7: {} param-case@2.1.1: @@ -10919,6 +11077,11 @@ snapshots: path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 + path-type@4.0.0: {} pathe@1.1.1: {} @@ -11261,19 +11424,13 @@ snapshots: resolve@1.22.2: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.16.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 resolve@1.22.4: dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - resolve@1.22.8: - dependencies: - is-core-module: 2.13.1 + is-core-module: 2.16.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -11441,6 +11598,8 @@ snapshots: signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + sirv@2.0.4: dependencies: '@polka/url': 1.0.0-next.28 @@ -11527,6 +11686,12 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.2.0 + string.prototype.matchall@4.0.11: dependencies: call-bind: 1.0.8 @@ -11579,6 +11744,10 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + strip-bom-string@1.0.0: {} strip-comments@2.0.1: {} @@ -11702,6 +11871,18 @@ snapshots: dependencies: punycode: 2.3.0 + tree-sitter-bash@0.23.3(tree-sitter@0.21.1): + dependencies: + node-addon-api: 8.8.0 + node-gyp-build: 4.8.4 + optionalDependencies: + tree-sitter: 0.21.1 + + tree-sitter@0.21.1: + dependencies: + node-addon-api: 8.8.0 + node-gyp-build: 4.8.4 + treemate@0.3.11: {} ts-api-utils@1.0.1(typescript@5.2.2): @@ -11724,6 +11905,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + turndown@7.2.4: + dependencies: + '@mixmark-io/domino': 2.2.0 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -12018,7 +12203,7 @@ snapshots: vite-node@0.34.0(@types/node@18.15.11)(less@4.1.3)(terser@5.37.0): dependencies: cac: 6.7.14 - debug: 4.3.4 + debug: 4.4.0 mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 @@ -12125,14 +12310,14 @@ snapshots: vue-eslint-parser@9.3.1(eslint@8.47.0): dependencies: - debug: 4.3.4 + debug: 4.4.0 eslint: 8.47.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 esquery: 1.5.0 lodash: 4.17.21 - semver: 7.5.4 + semver: 7.6.3 transitivePeerDependencies: - supports-color @@ -12180,16 +12365,6 @@ snapshots: '@vue/server-renderer': 3.3.4(vue@3.3.4) '@vue/shared': 3.3.4 - vue@3.5.13(typescript@5.2.2): - dependencies: - '@vue/compiler-dom': 3.5.13 - '@vue/compiler-sfc': 3.5.13 - '@vue/runtime-dom': 3.5.13 - '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.2.2)) - '@vue/shared': 3.5.13 - optionalDependencies: - typescript: 5.2.2 - vuedraggable@4.1.0(vue@3.3.4): dependencies: sortablejs: 1.14.0 @@ -12218,6 +12393,8 @@ snapshots: web-streams-polyfill@3.2.1: {} + web-tree-sitter@0.24.7: {} + webidl-conversions@4.0.2: {} webidl-conversions@7.0.0: {} @@ -12425,6 +12602,18 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.2.0 + wrappy@1.0.2: {} ws@8.13.0: {} diff --git a/public/tree-sitter-bash.wasm b/public/tree-sitter-bash.wasm new file mode 100755 index 0000000000000000000000000000000000000000..e6f8540ef59df0af0e1af8cba0145d13fc76f3c5 GIT binary patch literal 1364304 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 z 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 RGo}3ebM)%>O#EMp`+qC$s1X1F literal 0 HcmV?d00001 diff --git a/public/tree-sitter.wasm b/public/tree-sitter.wasm new file mode 100755 index 0000000000000000000000000000000000000000..8f6156796b12def65ae239e155d39822260c0c35 GIT binary patch literal 190779 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 +import _ from 'lodash'; + +interface UnitDef { + title: string + unit: string + ref: number + factor: number +} + +const decimalUnits = reactive>({ + b: { title: 'Bytes', unit: 'B', ref: 0, factor: 1 }, + kb: { title: 'Kilobytes', unit: 'KB', ref: 0, factor: 1e3 }, + mb: { title: 'Megabytes', unit: 'MB', ref: 0, factor: 1e6 }, + gb: { title: 'Gigabytes', unit: 'GB', ref: 0, factor: 1e9 }, + tb: { title: 'Terabytes', unit: 'TB', ref: 0, factor: 1e12 }, + pb: { title: 'Petabytes', unit: 'PB', ref: 0, factor: 1e15 }, +}); + +const binaryUnits = reactive>({ + b: { title: 'Bytes', unit: 'B', ref: 0, factor: 1 }, + kib: { title: 'Kibibytes', unit: 'KiB', ref: 0, factor: 1024 }, + mib: { title: 'Mebibytes', unit: 'MiB', ref: 0, factor: 1024 ** 2 }, + gib: { title: 'Gibibytes', unit: 'GiB', ref: 0, factor: 1024 ** 3 }, + tib: { title: 'Tebibytes', unit: 'TiB', ref: 0, factor: 1024 ** 4 }, + pib: { title: 'Pebibytes', unit: 'PiB', ref: 0, factor: 1024 ** 5 }, +}); + +function update(key: string, source: Record) { + const bytes = (source[key].ref ?? 0) * source[key].factor; + + _.forEach(decimalUnits, (unit, k) => { + if (source === decimalUnits && k === key) { + return; + } + unit.ref = bytes / unit.factor; + }); + + _.forEach(binaryUnits, (unit, k) => { + if (source === binaryUnits && k === key) { + return; + } + unit.ref = bytes / unit.factor; + }); +} + + + diff --git a/src/tools/byte-unit-converter/index.ts b/src/tools/byte-unit-converter/index.ts new file mode 100644 index 0000000000..e6663efa23 --- /dev/null +++ b/src/tools/byte-unit-converter/index.ts @@ -0,0 +1,13 @@ +import { Binary } from '@vicons/tabler'; +import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; + +export const tool = defineTool({ + name: translate('tools.byte-unit-converter.title'), + path: '/byte-unit-converter', + description: translate('tools.byte-unit-converter.description'), + keywords: ['byte', 'data', 'unit', 'converter', 'KB', 'MB', 'GB', 'TB', 'PB', 'kibibyte', 'mebibyte', 'gibibyte', 'size'], + component: () => import('./byte-unit-converter.vue'), + icon: Binary, + createdAt: new Date('2026-06-04'), +}); diff --git a/src/tools/css-js-prettify-minify/css-js-prettify-minify.vue b/src/tools/css-js-prettify-minify/css-js-prettify-minify.vue new file mode 100644 index 0000000000..73852a6e9b --- /dev/null +++ b/src/tools/css-js-prettify-minify/css-js-prettify-minify.vue @@ -0,0 +1,111 @@ + + + diff --git a/src/tools/css-js-prettify-minify/index.ts b/src/tools/css-js-prettify-minify/index.ts new file mode 100644 index 0000000000..be1e37030f --- /dev/null +++ b/src/tools/css-js-prettify-minify/index.ts @@ -0,0 +1,13 @@ +import { Code } from '@vicons/tabler'; +import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; + +export const tool = defineTool({ + name: translate('tools.css-js-prettify-minify.title'), + path: '/css-js-prettify-minify', + description: translate('tools.css-js-prettify-minify.description'), + keywords: ['css', 'javascript', 'js', 'prettify', 'minify', 'beautify', 'format', 'uglify', 'compress', 'formatter'], + component: () => import('./css-js-prettify-minify.vue'), + icon: Code, + createdAt: new Date('2026-06-04'), +}); diff --git a/src/tools/curl-to-code/curl-to-code.vue b/src/tools/curl-to-code/curl-to-code.vue new file mode 100644 index 0000000000..2ad0a664cd --- /dev/null +++ b/src/tools/curl-to-code/curl-to-code.vue @@ -0,0 +1,68 @@ + + + diff --git a/src/tools/curl-to-code/index.ts b/src/tools/curl-to-code/index.ts new file mode 100644 index 0000000000..e237b36d2c --- /dev/null +++ b/src/tools/curl-to-code/index.ts @@ -0,0 +1,13 @@ +import { Terminal } from '@vicons/tabler'; +import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; + +export const tool = defineTool({ + name: translate('tools.curl-to-code.title'), + path: '/curl-to-code', + description: translate('tools.curl-to-code.description'), + keywords: ['curl', 'code', 'converter', 'python', 'javascript', 'go', 'fetch', 'requests', 'http', 'api'], + component: () => import('./curl-to-code.vue'), + icon: Terminal, + createdAt: new Date('2026-06-04'), +}); diff --git a/src/tools/html-to-markdown/html-to-markdown.vue b/src/tools/html-to-markdown/html-to-markdown.vue new file mode 100644 index 0000000000..ea64944a32 --- /dev/null +++ b/src/tools/html-to-markdown/html-to-markdown.vue @@ -0,0 +1,28 @@ + + + diff --git a/src/tools/html-to-markdown/index.ts b/src/tools/html-to-markdown/index.ts new file mode 100644 index 0000000000..4fa2ac2407 --- /dev/null +++ b/src/tools/html-to-markdown/index.ts @@ -0,0 +1,13 @@ +import { Markdown } from '@vicons/tabler'; +import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; + +export const tool = defineTool({ + name: translate('tools.html-to-markdown.title'), + path: '/html-to-markdown', + description: translate('tools.html-to-markdown.description'), + keywords: ['html', 'markdown', 'converter', 'turndown', 'markup'], + component: () => import('./html-to-markdown.vue'), + icon: Markdown, + createdAt: new Date('2026-06-04'), +}); diff --git a/src/tools/index.ts b/src/tools/index.ts index 388cfaf494..66a2f54a65 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -1,7 +1,12 @@ import { tool as base64FileConverter } from './base64-file-converter'; import { tool as base64StringConverter } from './base64-string-converter'; import { tool as basicAuthGenerator } from './basic-auth-generator'; +import { tool as byteUnitConverter } from './byte-unit-converter'; +import { tool as cssJsPrettifyMinify } from './css-js-prettify-minify'; +import { tool as curlToCode } from './curl-to-code'; import { tool as emailNormalizer } from './email-normalizer'; +import { tool as htmlToMarkdown } from './html-to-markdown'; +import { tool as jsonToTypes } from './json-to-types'; import { tool as asciiTextDrawer } from './ascii-text-drawer'; @@ -116,6 +121,7 @@ export const toolsByCategory: ToolCategory[] = [ xmlToJson, jsonToXml, markdownToHtml, + htmlToMarkdown, ], }, { @@ -160,6 +166,9 @@ export const toolsByCategory: ToolCategory[] = [ emailNormalizer, regexTester, regexMemo, + curlToCode, + jsonToTypes, + cssJsPrettifyMinify, ], }, { @@ -172,7 +181,7 @@ export const toolsByCategory: ToolCategory[] = [ }, { name: 'Measurement', - components: [chronometer, temperatureConverter, benchmarkBuilder], + components: [chronometer, temperatureConverter, benchmarkBuilder, byteUnitConverter], }, { name: 'Text', diff --git a/src/tools/json-to-types/index.ts b/src/tools/json-to-types/index.ts new file mode 100644 index 0000000000..6e698f155c --- /dev/null +++ b/src/tools/json-to-types/index.ts @@ -0,0 +1,13 @@ +import { Braces } from '@vicons/tabler'; +import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; + +export const tool = defineTool({ + name: translate('tools.json-to-types.title'), + path: '/json-to-types', + description: translate('tools.json-to-types.description'), + keywords: ['json', 'typescript', 'go', 'struct', 'interface', 'type', 'convert', 'generate', 'definition'], + component: () => import('./json-to-types.vue'), + icon: Braces, + createdAt: new Date('2026-06-04'), +}); diff --git a/src/tools/json-to-types/json-to-types.service.ts b/src/tools/json-to-types/json-to-types.service.ts new file mode 100644 index 0000000000..49e6beb572 --- /dev/null +++ b/src/tools/json-to-types/json-to-types.service.ts @@ -0,0 +1,115 @@ +function capitalize(str: string): string { + return str.charAt(0).toUpperCase() + str.slice(1); +} + +function toPascalCase(str: string): string { + return str + .replace(/[-_\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : '')) + .replace(/^./, s => s.toUpperCase()); +} + +function inferTsType(value: unknown, name: string, interfaces: Map): string { + if (value === null) { + return 'null'; + } + + switch (typeof value) { + case 'string': + return 'string'; + case 'number': + return 'number'; + case 'boolean': + return 'boolean'; + default: + break; + } + + if (Array.isArray(value)) { + if (value.length === 0) { + return 'unknown[]'; + } + const elementTypes = new Set(value.map(item => inferTsType(item, `${name}Item`, interfaces))); + const uniqueTypes = [...elementTypes]; + if (uniqueTypes.length === 1) { + return `${uniqueTypes[0]}[]`; + } + return `(${uniqueTypes.join(' | ')})[]`; + } + + if (typeof value === 'object') { + const interfaceName = capitalize(toPascalCase(name)); + const entries = Object.entries(value as Record); + const fields = entries.map(([key, val]) => { + const type = inferTsType(val, key, interfaces); + const safeKey = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key) ? key : `'${key}'`; + return ` ${safeKey}: ${type};`; + }); + interfaces.set(interfaceName, `interface ${interfaceName} {\n${fields.join('\n')}\n}`); + return interfaceName; + } + + return 'unknown'; +} + +export function jsonToTypeScript(json: unknown, rootName: string = 'RootType'): string { + const interfaces = new Map(); + inferTsType(json, rootName, interfaces); + + if (interfaces.size === 0) { + const simpleType = inferTsType(json, rootName, interfaces); + return `type ${toPascalCase(rootName)} = ${simpleType};`; + } + + return [...interfaces.values()].reverse().join('\n\n'); +} + +function inferGoType(value: unknown, name: string, structs: Map): string { + if (value === null) { + return 'interface{}'; + } + + switch (typeof value) { + case 'string': + return 'string'; + case 'number': + return Number.isInteger(value) ? 'int64' : 'float64'; + case 'boolean': + return 'bool'; + default: + break; + } + + if (Array.isArray(value)) { + if (value.length === 0) { + return '[]interface{}'; + } + const elementType = inferGoType(value[0], `${name}Item`, structs); + return `[]${elementType}`; + } + + if (typeof value === 'object') { + const structName = toPascalCase(name); + const entries = Object.entries(value as Record); + const fields = entries.map(([key, val]) => { + const goType = inferGoType(val, key, structs); + const fieldName = toPascalCase(key); + return `\t${fieldName} ${goType} \`json:"${key}"\``; + }); + structs.set(structName, `type ${structName} struct {\n${fields.join('\n')}\n}`); + return structName; + } + + return 'interface{}'; +} + +export function jsonToGoStruct(json: unknown, rootName: string = 'RootType'): string { + const structs = new Map(); + inferGoType(json, rootName, structs); + + if (structs.size === 0) { + const simpleType = inferGoType(json, rootName, structs); + return `type ${toPascalCase(rootName)} ${simpleType}`; + } + + return [...structs.values()].reverse().join('\n\n'); +} diff --git a/src/tools/json-to-types/json-to-types.vue b/src/tools/json-to-types/json-to-types.vue new file mode 100644 index 0000000000..e19711177c --- /dev/null +++ b/src/tools/json-to-types/json-to-types.vue @@ -0,0 +1,64 @@ + + + diff --git a/vite.config.ts b/vite.config.ts index 42a2cb29f7..f609167076 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -102,6 +102,7 @@ export default defineConfig({ resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)), + '@vueuse/shared': fileURLToPath(new URL('./node_modules/@vueuse/shared/index.mjs', import.meta.url)), }, }, define: { From 70d0b20ac155e6de561e02b17597c801487c4fd9 Mon Sep 17 00:00:00 2001 From: lidong-sal Date: Thu, 4 Jun 2026 16:41:00 +0800 Subject: [PATCH 04/19] fix: replace ReDoS-vulnerable regex in CSS/JS minify functions Use single-space matching ` ?` instead of `\s*` to avoid super-linear backtracking. Safe because preceding step already collapses all whitespace to single spaces. Co-Authored-By: Claude Opus 4.6 --- src/tools/css-js-prettify-minify/css-js-prettify-minify.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tools/css-js-prettify-minify/css-js-prettify-minify.vue b/src/tools/css-js-prettify-minify/css-js-prettify-minify.vue index 73852a6e9b..56548794d8 100644 --- a/src/tools/css-js-prettify-minify/css-js-prettify-minify.vue +++ b/src/tools/css-js-prettify-minify/css-js-prettify-minify.vue @@ -33,7 +33,7 @@ function minifyCss(input: string): string { return input .replace(/\/\*[\s\S]*?\*\//g, '') .replace(/\s+/g, ' ') - .replace(/\s*([{}:;,>~+])\s*/g, '$1') + .replace(/ ?([{}:;,>~+]) ?/g, '$1') .replace(/;}/g, '}') .trim(); } @@ -43,7 +43,7 @@ function minifyJs(input: string): string { .replace(/\/\*[\s\S]*?\*\//g, '') .replace(/\/\/.*$/gm, '') .replace(/\s+/g, ' ') - .replace(/\s*([{}();,=:+\-*/<>!&|?])\s*/g, '$1') + .replace(/ ?([{}();,=:+\-*/<>!&|?]) ?/g, '$1') .trim(); } From e2e7d39cf123bb71626569f8626ae9e1bf4a9b3e Mon Sep 17 00:00:00 2001 From: lidong-sal Date: Thu, 4 Jun 2026 16:49:01 +0800 Subject: [PATCH 05/19] fix: replace remaining ReDoS-vulnerable regex in JS minify Change `\/\/.*$/gm` to `\/\/[^\n]*/g` to avoid backtracking with `.*` and `$` anchor in multiline mode. Co-Authored-By: Claude Opus 4.6 --- src/tools/css-js-prettify-minify/css-js-prettify-minify.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/css-js-prettify-minify/css-js-prettify-minify.vue b/src/tools/css-js-prettify-minify/css-js-prettify-minify.vue index 56548794d8..8f2e657655 100644 --- a/src/tools/css-js-prettify-minify/css-js-prettify-minify.vue +++ b/src/tools/css-js-prettify-minify/css-js-prettify-minify.vue @@ -41,7 +41,7 @@ function minifyCss(input: string): string { function minifyJs(input: string): string { return input .replace(/\/\*[\s\S]*?\*\//g, '') - .replace(/\/\/.*$/gm, '') + .replace(/\/\/[^\n]*/g, '') .replace(/\s+/g, ' ') .replace(/ ?([{}();,=:+\-*/<>!&|?]) ?/g, '$1') .trim(); From 83fd1f3801a27a4484898d9619496acda2b84991 Mon Sep 17 00:00:00 2001 From: lidong-sal Date: Thu, 4 Jun 2026 17:14:52 +0800 Subject: [PATCH 06/19] fix: add vite alias for @vueuse/shared to fix build compatibility The @unhead/vue@0.5.1 package resolves @vueuse/shared@14 which removed the resolveUnref export. Alias @vueuse/shared to the hoisted v10 version that still exports it. Co-Authored-By: Claude Opus 4.6 --- pnpm-lock.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 78b12137f9..0cb882249d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + '@vue/runtime-core': 3.3.4 + importers: .: From 7dcc575b76b03cb04c228adbe59794201bbe19de Mon Sep 17 00:00:00 2001 From: lidong-sal Date: Thu, 4 Jun 2026 17:29:14 +0800 Subject: [PATCH 07/19] fix: update pnpm-lock.yaml with new dependencies The lockfile was out of sync with package.json after adding curlconverter, turndown, and js-beautify, causing CI install to fail. Co-Authored-By: Claude Opus 4.6 --- pnpm-lock.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0cb882249d..78b12137f9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,9 +4,6 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - '@vue/runtime-core': 3.3.4 - importers: .: From 23d9e89d7301e77fbb00dc1624b54647c4fe8881 Mon Sep 17 00:00:00 2001 From: lidong-sal Date: Fri, 5 Jun 2026 15:22:24 +0800 Subject: [PATCH 08/19] Add new tool:SSL Certificate Parser --- components.d.ts | 7 + locales/en.yml | 38 +++ locales/zh.yml | 38 +++ src/tools/index.ts | 3 +- src/tools/ssl-certificate-parser/index.ts | 13 + .../ssl-certificate-parser.service.ts | 108 +++++++++ .../ssl-certificate-parser.vue | 222 ++++++++++++++++++ wrangler.toml | 7 +- 8 files changed, 431 insertions(+), 5 deletions(-) create mode 100644 src/tools/ssl-certificate-parser/index.ts create mode 100644 src/tools/ssl-certificate-parser/ssl-certificate-parser.service.ts create mode 100644 src/tools/ssl-certificate-parser/ssl-certificate-parser.vue diff --git a/components.d.ts b/components.d.ts index 7d84c7f6cd..b6177c6da5 100644 --- a/components.d.ts +++ b/components.d.ts @@ -150,6 +150,8 @@ declare module '@vue/runtime-core' { NButton: typeof import('naive-ui')['NButton'] NCheckbox: typeof import('naive-ui')['NCheckbox'] NCode: typeof import('naive-ui')['NCode'] + NCollapse: typeof import('naive-ui')['NCollapse'] + NCollapseItem: typeof import('naive-ui')['NCollapseItem'] NCollapseTransition: typeof import('naive-ui')['NCollapseTransition'] NColorPicker: typeof import('naive-ui')['NColorPicker'] NConfigProvider: typeof import('naive-ui')['NConfigProvider'] @@ -164,6 +166,7 @@ declare module '@vue/runtime-core' { NH1: typeof import('naive-ui')['NH1'] NH2: typeof import('naive-ui')['NH2'] NH3: typeof import('naive-ui')['NH3'] + NH4: typeof import('naive-ui')['NH4'] NIcon: typeof import('naive-ui')['NIcon'] NImage: typeof import('naive-ui')['NImage'] NInputGroup: typeof import('naive-ui')['NInputGroup'] @@ -171,7 +174,9 @@ declare module '@vue/runtime-core' { NInputNumber: typeof import('naive-ui')['NInputNumber'] NLayout: typeof import('naive-ui')['NLayout'] NLayoutSider: typeof import('naive-ui')['NLayoutSider'] + NLi: typeof import('naive-ui')['NLi'] NMenu: typeof import('naive-ui')['NMenu'] + NP: typeof import('naive-ui')['NP'] NProgress: typeof import('naive-ui')['NProgress'] NScrollbar: typeof import('naive-ui')['NScrollbar'] NSlider: typeof import('naive-ui')['NSlider'] @@ -181,6 +186,7 @@ declare module '@vue/runtime-core' { NSwitch: typeof import('naive-ui')['NSwitch'] NTable: typeof import('naive-ui')['NTable'] NTag: typeof import('naive-ui')['NTag'] + NUl: typeof import('naive-ui')['NUl'] NumeronymGenerator: typeof import('./src/tools/numeronym-generator/numeronym-generator.vue')['default'] OtpCodeGeneratorAndValidator: typeof import('./src/tools/otp-code-generator-and-validator/otp-code-generator-and-validator.vue')['default'] PasswordStrengthAnalyser: typeof import('./src/tools/password-strength-analyser/password-strength-analyser.vue')['default'] @@ -202,6 +208,7 @@ declare module '@vue/runtime-core' { SlugifyString: typeof import('./src/tools/slugify-string/slugify-string.vue')['default'] SpanCopyable: typeof import('./src/components/SpanCopyable.vue')['default'] SqlPrettify: typeof import('./src/tools/sql-prettify/sql-prettify.vue')['default'] + SslCertificateParser: typeof import('./src/tools/ssl-certificate-parser/ssl-certificate-parser.vue')['default'] StringObfuscator: typeof import('./src/tools/string-obfuscator/string-obfuscator.vue')['default'] SvgPlaceholderGenerator: typeof import('./src/tools/svg-placeholder-generator/svg-placeholder-generator.vue')['default'] TemperatureConverter: typeof import('./src/tools/temperature-converter/temperature-converter.vue')['default'] diff --git a/locales/en.yml b/locales/en.yml index 27fa353bfb..7f62f90ec7 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -412,3 +412,41 @@ tools: curl-to-code: title: cURL to Code description: Convert cURL commands to code in various programming languages. + + ssl-certificate-parser: + title: SSL Certificate Parser + description: Parse and decode PEM certificates to view expiry date, domain, issuer and other details. + inputLabel: PEM certificate + inputPlaceholder: 'Paste your PEM certificate here (-----BEGIN CERTIFICATE-----...)' + invalidPem: Invalid PEM certificate + validity: Validity + status: Status + valid: Valid + expired: Expired + expiredAgo: '(expired {days} days ago)' + daysRemaining: '({days} days remaining)' + validFrom: Valid From + validTo: Valid To + subject: Subject + san: Subject Alternative Names (SAN) + issuer: Issuer + details: Details + version: Version + serialNumber: Serial Number + signatureAlgorithm: Signature Algorithm + publicKey: Public Key + fingerprint: Public Key Fingerprint (SHA-256) + keyUsage: Key Usage + basicConstraints: Basic Constraints + help: + title: How to get a PEM certificate? + section1Title: 1. Export from a website + section1Desc: 'This outputs content from -----BEGIN CERTIFICATE----- to -----END CERTIFICATE-----, which is the PEM certificate.' + section2Title: 2. Export from browser + section2Step1: 'Chrome/Edge: Click the lock icon in the address bar → Connection is secure → Certificate is valid → Details → Export' + section2Step2: Choose Base-64 encoded (.pem/.crt) format when exporting + section3Title: 3. From server files + section3Nginx: 'Nginx: Check the file pointed to by ssl_certificate (usually .pem or .crt)' + section3Apache: 'Apache: Check SSLCertificateFile' + section3Paths: 'Common paths: /etc/ssl/certs/, /etc/letsencrypt/live//fullchain.pem' + section4Title: 4. PEM format example diff --git a/locales/zh.yml b/locales/zh.yml index a2be534a02..2e50b488da 100644 --- a/locales/zh.yml +++ b/locales/zh.yml @@ -408,3 +408,41 @@ tools: curl-to-code: title: cURL 转代码 description: 将 cURL 命令转换为多种编程语言的代码。 + + ssl-certificate-parser: + title: SSL 证书解析器 + description: 解析 PEM 证书,查看过期时间、域名、颁发者等详细信息。 + inputLabel: PEM 证书 + inputPlaceholder: '在此粘贴 PEM 证书(-----BEGIN CERTIFICATE-----...)' + invalidPem: 无效的 PEM 证书 + validity: 有效期 + status: 状态 + valid: 有效 + expired: 已过期 + expiredAgo: '(已过期 {days} 天)' + daysRemaining: '(剩余 {days} 天)' + validFrom: 生效时间 + validTo: 过期时间 + subject: 主体信息 + san: 主体备用名称 (SAN) + issuer: 颁发者 + details: 详细信息 + version: 版本 + serialNumber: 序列号 + signatureAlgorithm: 签名算法 + publicKey: 公钥 + fingerprint: 公钥指纹 (SHA-256) + keyUsage: 密钥用途 + basicConstraints: 基本约束 + help: + title: 如何获取 PEM 证书? + section1Title: 1. 从网站导出 + section1Desc: '这会输出从 -----BEGIN CERTIFICATE----- 到 -----END CERTIFICATE----- 的内容,这就是 PEM 证书。' + section2Title: 2. 从浏览器导出 + section2Step1: Chrome/Edge:点击地址栏锁图标 → 连接是安全的 → 证书有效 → 详细信息 → 导出 + section2Step2: 导出时选择 Base-64 编码(.pem/.crt)格式 + section3Title: 3. 从服务器文件获取 + section3Nginx: Nginx:查看 ssl_certificate 配置项指向的文件(通常是 .pem 或 .crt) + section3Apache: Apache:查看 SSLCertificateFile 配置项 + section3Paths: 常见路径:/etc/ssl/certs/、/etc/letsencrypt/live/<域名>/fullchain.pem + section4Title: 4. PEM 格式示例 diff --git a/src/tools/index.ts b/src/tools/index.ts index 66a2f54a65..5944d32c61 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -48,6 +48,7 @@ import { tool as ipv4SubnetCalculator } from './ipv4-subnet-calculator'; import { tool as dockerRunToDockerComposeConverter } from './docker-run-to-docker-compose-converter'; import { tool as htmlWysiwygEditor } from './html-wysiwyg-editor'; import { tool as rsaKeyPairGenerator } from './rsa-key-pair-generator'; +import { tool as sslCertificateParser } from './ssl-certificate-parser'; import { tool as textToNatoAlphabet } from './text-to-nato-alphabet'; import { tool as slugifyString } from './slugify-string'; import { tool as keycodeInfo } from './keycode-info'; @@ -96,7 +97,7 @@ import { tool as yamlViewer } from './yaml-viewer'; export const toolsByCategory: ToolCategory[] = [ { name: 'Crypto', - components: [tokenGenerator, hashText, bcrypt, uuidGenerator, ulidGenerator, cypher, bip39, hmacGenerator, rsaKeyPairGenerator, passwordStrengthAnalyser, pdfSignatureChecker], + components: [tokenGenerator, hashText, bcrypt, uuidGenerator, ulidGenerator, cypher, bip39, hmacGenerator, rsaKeyPairGenerator, passwordStrengthAnalyser, pdfSignatureChecker, sslCertificateParser], }, { name: 'Converter', diff --git a/src/tools/ssl-certificate-parser/index.ts b/src/tools/ssl-certificate-parser/index.ts new file mode 100644 index 0000000000..3464b500d7 --- /dev/null +++ b/src/tools/ssl-certificate-parser/index.ts @@ -0,0 +1,13 @@ +import { FileCertificate } from '@vicons/tabler'; +import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; + +export const tool = defineTool({ + name: translate('tools.ssl-certificate-parser.title'), + path: '/ssl-certificate-parser', + description: translate('tools.ssl-certificate-parser.description'), + keywords: ['ssl', 'certificate', 'x509', 'pem', 'cert', 'tls', 'https', 'expiry', 'issuer', 'subject', 'domain'], + component: () => import('./ssl-certificate-parser.vue'), + icon: FileCertificate, + createdAt: new Date('2026-06-05'), +}); diff --git a/src/tools/ssl-certificate-parser/ssl-certificate-parser.service.ts b/src/tools/ssl-certificate-parser/ssl-certificate-parser.service.ts new file mode 100644 index 0000000000..f4aabaa01f --- /dev/null +++ b/src/tools/ssl-certificate-parser/ssl-certificate-parser.service.ts @@ -0,0 +1,108 @@ +import forge from 'node-forge'; + +const { pki } = forge; + +export interface CertificateInfo { + subject: { key: string; value: string }[] + issuer: { key: string; value: string }[] + serialNumber: string + validFrom: string + validTo: string + isExpired: boolean + daysUntilExpiry: number + version: number + signatureAlgorithm: string + thumbprint: string + subjectAltNames: string[] + keyUsage: string[] + basicConstraints: string + publicKeyAlgorithm: string + publicKeySize: string +} + +const fieldLabels: Record = { + commonName: 'Common Name (CN)', + organizationName: 'Organization (O)', + organizationalUnitName: 'Organizational Unit (OU)', + countryName: 'Country (C)', + stateOrProvinceName: 'State/Province (ST)', + localityName: 'Locality (L)', + emailAddress: 'Email', +}; + +function formatDN(attrs: pki.CertificateField[]) { + return attrs.map((attr) => { + const label = (attr.name && fieldLabels[attr.name]) || attr.shortName || attr.name || attr.type || 'Unknown'; + return { key: label, value: String(attr.value) }; + }); +} + +function getSubjectAltNames(cert: pki.Certificate): string[] { + const ext = cert.getExtension('subjectAltName') as { altNames?: { type: number; value: string }[] } | null; + if (!ext?.altNames) { + return []; + } + return ext.altNames.map(an => an.value); +} + +function getKeyUsage(cert: pki.Certificate): string[] { + const ext = cert.getExtension('keyUsage') as Record | null; + if (!ext) { + return []; + } + const usages = [ + 'digitalSignature', 'nonRepudiation', 'keyEncipherment', 'dataEncipherment', + 'keyAgreement', 'keyCertSign', 'cRLSign', 'encipherOnly', 'decipherOnly', + ]; + return usages.filter(u => ext[u]); +} + +function getBasicConstraints(cert: pki.Certificate): string { + const ext = cert.getExtension('basicConstraints') as { cA?: boolean; pathLenConstraint?: number } | null; + if (!ext) { + return 'Not present'; + } + const ca = ext.cA ? 'CA: TRUE' : 'CA: FALSE'; + const pathLen = ext.pathLenConstraint !== undefined ? `, Path Length: ${ext.pathLenConstraint}` : ''; + return `${ca}${pathLen}`; +} + +export function parseCertificate(pem: string): CertificateInfo { + const cert = pki.certificateFromPem(pem); + + const now = new Date(); + const validTo = cert.validity.notAfter; + const isExpired = now > validTo; + const daysUntilExpiry = Math.floor((validTo.getTime() - now.getTime()) / (1000 * 60 * 60 * 24)); + + const md = pki.getPublicKeyFingerprint(cert.publicKey, { + md: forge.md.sha256.create(), + encoding: 'hex', + delimiter: ':', + }); + + const pubKey = cert.publicKey as pki.rsa.PublicKey; + let publicKeyAlgorithm = 'RSA'; + let publicKeySize = ''; + if ('n' in pubKey && pubKey.n) { + publicKeySize = `${pubKey.n.bitLength()} bits`; + } + + return { + subject: formatDN(cert.subject.attributes), + issuer: formatDN(cert.issuer.attributes), + serialNumber: cert.serialNumber, + validFrom: cert.validity.notBefore.toISOString(), + validTo: cert.validity.notAfter.toISOString(), + isExpired, + daysUntilExpiry, + version: cert.version + 1, + signatureAlgorithm: (pki as any).oids[cert.siginfo.algorithmOid] || cert.siginfo.algorithmOid, + thumbprint: String(md), + subjectAltNames: getSubjectAltNames(cert), + keyUsage: getKeyUsage(cert), + basicConstraints: getBasicConstraints(cert), + publicKeyAlgorithm, + publicKeySize, + }; +} diff --git a/src/tools/ssl-certificate-parser/ssl-certificate-parser.vue b/src/tools/ssl-certificate-parser/ssl-certificate-parser.vue new file mode 100644 index 0000000000..6b89d4c16a --- /dev/null +++ b/src/tools/ssl-certificate-parser/ssl-certificate-parser.vue @@ -0,0 +1,222 @@ + + + diff --git a/wrangler.toml b/wrangler.toml index 7798565ced..9a60ae9ae4 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -9,7 +9,6 @@ binding = "ASSETS" html_handling = "auto-trailing-slash" not_found_handling = "single-page-application" -# Uncomment after adding 85886688.xyz to Cloudflare: -# [[routes]] -# pattern = "it-tools.85886688.xyz" -# custom_domain = true +[[routes]] +pattern = "it-tools.88586688.xyz" +custom_domain = true From 22f9a781da0d13b6a05039a95cf7f08ba792fdf0 Mon Sep 17 00:00:00 2001 From: lidong-sal Date: Fri, 12 Jun 2026 15:37:47 +0800 Subject: [PATCH 09/19] =?UTF-8?q?Add=20new=20tool:=20DNS=20=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=B7=A5=E5=85=B7=20=E2=80=94=20=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E6=9F=A5=20A/AAAA/CNAME/MX/TXT=20=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../page-2026-06-12T07-21-42-619Z.yml | 0 .../page-2026-06-12T07-24-10-708Z.yml | 574 ++++++++++++++++ .../page-2026-06-12T07-24-44-587Z.yml | 616 ++++++++++++++++++ .../page-2026-06-12T07-24-51-311Z.yml | 596 +++++++++++++++++ .../page-2026-06-12T07-25-13-336Z.yml | 616 ++++++++++++++++++ .../page-2026-06-12T07-25-19-177Z.yml | 596 +++++++++++++++++ .../page-2026-06-12T07-29-28-690Z.yml | 616 ++++++++++++++++++ components.d.ts | 1 + locales/en.yml | 4 + locales/zh.yml | 4 + src/tools/dns-query/dns-query.service.ts | 85 +++ src/tools/dns-query/dns-query.vue | 121 ++++ src/tools/dns-query/index.ts | 13 + src/tools/index.ts | 3 +- vite.config.ts | 5 + 15 files changed, 3849 insertions(+), 1 deletion(-) create mode 100644 .playwright-mcp/page-2026-06-12T07-21-42-619Z.yml create mode 100644 .playwright-mcp/page-2026-06-12T07-24-10-708Z.yml create mode 100644 .playwright-mcp/page-2026-06-12T07-24-44-587Z.yml create mode 100644 .playwright-mcp/page-2026-06-12T07-24-51-311Z.yml create mode 100644 .playwright-mcp/page-2026-06-12T07-25-13-336Z.yml create mode 100644 .playwright-mcp/page-2026-06-12T07-25-19-177Z.yml create mode 100644 .playwright-mcp/page-2026-06-12T07-29-28-690Z.yml create mode 100644 src/tools/dns-query/dns-query.service.ts create mode 100644 src/tools/dns-query/dns-query.vue create mode 100644 src/tools/dns-query/index.ts diff --git a/.playwright-mcp/page-2026-06-12T07-21-42-619Z.yml b/.playwright-mcp/page-2026-06-12T07-21-42-619Z.yml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.playwright-mcp/page-2026-06-12T07-24-10-708Z.yml b/.playwright-mcp/page-2026-06-12T07-24-10-708Z.yml new file mode 100644 index 0000000000..64a53325c5 --- /dev/null +++ b/.playwright-mcp/page-2026-06-12T07-24-10-708Z.yml @@ -0,0 +1,574 @@ +- generic [ref=e5]: + - complementary [ref=e6]: + - link "IT - TOOLS Handy tools for developers" [ref=e7] [cursor=pointer]: + - /url: / + - img [ref=e8] + - generic [ref=e13]: + - generic [ref=e14]: IT - TOOLS + - generic [ref=e16]: Handy tools for developers + - generic [ref=e17]: + - generic [ref=e18]: + - generic [ref=e19] [cursor=pointer]: + - img [ref=e21] + - generic [ref=e23]: Crypto + - menu [ref=e27]: + - menuitem "Token generator" [ref=e28]: + - img [ref=e30] [cursor=pointer]: + - img [ref=e31] + - link "Token generator" [ref=e37] [cursor=pointer]: + - /url: /token-generator + - menuitem "Hash text" [ref=e38]: + - img [ref=e40] [cursor=pointer]: + - img [ref=e41] + - link "Hash text" [ref=e46] [cursor=pointer]: + - /url: /hash-text + - menuitem "Bcrypt" [ref=e47]: + - img [ref=e49] [cursor=pointer]: + - img [ref=e50] + - link "Bcrypt" [ref=e55] [cursor=pointer]: + - /url: /bcrypt + - menuitem "UUIDs generator" [ref=e56]: + - img [ref=e58] [cursor=pointer]: + - img [ref=e59] + - link "UUIDs generator" [ref=e66] [cursor=pointer]: + - /url: /uuid-generator + - menuitem "ULID generator" [ref=e67]: + - img [ref=e69] [cursor=pointer]: + - img [ref=e70] + - link "ULID generator" [ref=e76] [cursor=pointer]: + - /url: /ulid-generator + - menuitem "Encrypt / decrypt text" [ref=e77]: + - img [ref=e79] [cursor=pointer]: + - img [ref=e80] + - link "Encrypt / decrypt text" [ref=e85] [cursor=pointer]: + - /url: /encryption + - menuitem "BIP39 passphrase generator" [ref=e86]: + - img [ref=e88] [cursor=pointer]: + - img [ref=e89] + - link "BIP39 passphrase generator" [ref=e91] [cursor=pointer]: + - /url: /bip39-generator + - menuitem "Hmac generator" [ref=e92]: + - img [ref=e94] [cursor=pointer]: + - img [ref=e95] + - link "Hmac generator" [ref=e97] [cursor=pointer]: + - /url: /hmac-generator + - menuitem "RSA key pair generator" [ref=e98]: + - img [ref=e100] [cursor=pointer]: + - img [ref=e101] + - link "RSA key pair generator" [ref=e106] [cursor=pointer]: + - /url: /rsa-key-pair-generator + - menuitem "Password strength analyser" [ref=e107]: + - img [ref=e109] [cursor=pointer]: + - img [ref=e110] + - link "Password strength analyser" [ref=e112] [cursor=pointer]: + - /url: /password-strength-analyser + - menuitem "PDF signature checker" [ref=e113]: + - img [ref=e115] [cursor=pointer]: + - img [ref=e116] + - link "PDF signature checker" [ref=e118] [cursor=pointer]: + - /url: /pdf-signature-checker + - menuitem "SSL Certificate Parser" [ref=e119]: + - img [ref=e121] [cursor=pointer]: + - img [ref=e122] + - link "SSL Certificate Parser" [ref=e129] [cursor=pointer]: + - /url: /ssl-certificate-parser + - generic [ref=e130]: + - generic [ref=e131] [cursor=pointer]: + - img [ref=e133] + - generic [ref=e135]: Converter + - menu [ref=e139]: + - menuitem "Date-time converter" [ref=e140]: + - img [ref=e142] [cursor=pointer]: + - img [ref=e143] + - link "Date-time converter" [ref=e146] [cursor=pointer]: + - /url: /date-converter + - menuitem "Integer base converter" [ref=e147]: + - img [ref=e149] [cursor=pointer]: + - img [ref=e150] + - link "Integer base converter" [ref=e154] [cursor=pointer]: + - /url: /base-converter + - menuitem "Roman numeral converter" [ref=e155]: + - img [ref=e157] [cursor=pointer]: + - img [ref=e158] + - link "Roman numeral converter" [ref=e162] [cursor=pointer]: + - /url: /roman-numeral-converter + - menuitem "Base64 string encoder/decoder" [ref=e163]: + - img [ref=e165] [cursor=pointer]: + - img [ref=e166] + - link "Base64 string encoder/decoder" [ref=e171] [cursor=pointer]: + - /url: /base64-string-converter + - menuitem "Base64 file converter" [ref=e172]: + - img [ref=e174] [cursor=pointer]: + - img [ref=e175] + - link "Base64 file converter" [ref=e180] [cursor=pointer]: + - /url: /base64-file-converter + - menuitem "Color converter" [ref=e181]: + - img [ref=e183] [cursor=pointer]: + - img [ref=e184] + - link "Color converter" [ref=e190] [cursor=pointer]: + - /url: /color-converter + - menuitem "Case converter" [ref=e191]: + - img [ref=e193] [cursor=pointer]: + - img [ref=e194] + - link "Case converter" [ref=e198] [cursor=pointer]: + - /url: /case-converter + - menuitem "Text to NATO alphabet" [ref=e199]: + - img [ref=e201] [cursor=pointer]: + - img [ref=e202] + - link "Text to NATO alphabet" [ref=e207] [cursor=pointer]: + - /url: /text-to-nato-alphabet + - menuitem "Text to ASCII binary" [ref=e208]: + - img [ref=e210] [cursor=pointer]: + - img [ref=e211] + - link "Text to ASCII binary" [ref=e217] [cursor=pointer]: + - /url: /text-to-binary + - menuitem "Text to Unicode" [ref=e218]: + - img [ref=e220] [cursor=pointer]: + - img [ref=e221] + - link "Text to Unicode" [ref=e224] [cursor=pointer]: + - /url: /text-to-unicode + - menuitem "YAML to JSON converter" [ref=e225]: + - img [ref=e227] [cursor=pointer]: + - img [ref=e228] + - link "YAML to JSON converter" [ref=e230] [cursor=pointer]: + - /url: /yaml-to-json-converter + - menuitem "YAML to TOML" [ref=e231]: + - img [ref=e233] [cursor=pointer]: + - img [ref=e234] + - link "YAML to TOML" [ref=e236] [cursor=pointer]: + - /url: /yaml-to-toml + - menuitem "JSON to YAML converter" [ref=e237]: + - img [ref=e239] [cursor=pointer]: + - img [ref=e240] + - link "JSON to YAML converter" [ref=e244] [cursor=pointer]: + - /url: /json-to-yaml-converter + - menuitem "JSON to TOML" [ref=e245]: + - img [ref=e247] [cursor=pointer]: + - img [ref=e248] + - link "JSON to TOML" [ref=e252] [cursor=pointer]: + - /url: /json-to-toml + - menuitem "List converter" [ref=e253]: + - img [ref=e255] [cursor=pointer]: + - img [ref=e256] + - link "List converter" [ref=e258] [cursor=pointer]: + - /url: /list-converter + - menuitem "TOML to JSON" [ref=e259]: + - img [ref=e261] [cursor=pointer]: + - img [ref=e262] + - link "TOML to JSON" [ref=e264] [cursor=pointer]: + - /url: /toml-to-json + - menuitem "TOML to YAML" [ref=e265]: + - img [ref=e267] [cursor=pointer]: + - img [ref=e268] + - link "TOML to YAML" [ref=e270] [cursor=pointer]: + - /url: /toml-to-yaml + - menuitem "XML to JSON" [ref=e271]: + - img [ref=e273] [cursor=pointer]: + - img [ref=e274] + - link "XML to JSON" [ref=e278] [cursor=pointer]: + - /url: /xml-to-json + - menuitem "JSON to XML" [ref=e279]: + - img [ref=e281] [cursor=pointer]: + - img [ref=e282] + - link "JSON to XML" [ref=e286] [cursor=pointer]: + - /url: /json-to-xml + - menuitem "Markdown to HTML" [ref=e287]: + - img [ref=e289] [cursor=pointer]: + - img [ref=e290] + - link "Markdown to HTML" [ref=e295] [cursor=pointer]: + - /url: /markdown-to-html + - menuitem "HTML to Markdown" [ref=e296]: + - img [ref=e298] [cursor=pointer]: + - img [ref=e299] + - link "HTML to Markdown" [ref=e305] [cursor=pointer]: + - /url: /html-to-markdown + - generic [ref=e306]: + - generic [ref=e307] [cursor=pointer]: + - img [ref=e309] + - generic [ref=e311]: Web + - menu [ref=e315]: + - menuitem "Encode/decode URL-formatted strings" [ref=e316]: + - img [ref=e318] [cursor=pointer]: + - img [ref=e319] + - link "Encode/decode URL-formatted strings" [ref=e323] [cursor=pointer]: + - /url: /url-encoder + - menuitem "Escape HTML entities" [ref=e324]: + - img [ref=e326] [cursor=pointer]: + - img [ref=e327] + - link "Escape HTML entities" [ref=e332] [cursor=pointer]: + - /url: /html-entities + - menuitem "URL parser" [ref=e333]: + - img [ref=e335] [cursor=pointer]: + - img [ref=e336] + - link "URL parser" [ref=e340] [cursor=pointer]: + - /url: /url-parser + - menuitem "Device information" [ref=e341]: + - img [ref=e343] [cursor=pointer]: + - img [ref=e344] + - link "Device information" [ref=e347] [cursor=pointer]: + - /url: /device-information + - menuitem "Basic auth generator" [ref=e348]: + - img [ref=e350] [cursor=pointer]: + - img [ref=e351] + - link "Basic auth generator" [ref=e353] [cursor=pointer]: + - /url: /basic-auth-generator + - menuitem "Open graph meta generator" [ref=e354]: + - img [ref=e356] [cursor=pointer]: + - img [ref=e357] + - link "Open graph meta generator" [ref=e361] [cursor=pointer]: + - /url: /og-meta-generator + - menuitem "OTP code generator" [ref=e362]: + - img [ref=e364] [cursor=pointer]: + - img [ref=e365] + - link "OTP code generator" [ref=e368] [cursor=pointer]: + - /url: /otp-generator + - menuitem "MIME types" [ref=e369]: + - img [ref=e371] [cursor=pointer]: + - img [ref=e372] + - link "MIME types" [ref=e377] [cursor=pointer]: + - /url: /mime-types + - menuitem "JWT parser" [ref=e378]: + - img [ref=e380] [cursor=pointer]: + - img [ref=e381] + - link "JWT parser" [ref=e387] [cursor=pointer]: + - /url: /jwt-parser + - menuitem "Keycode info" [ref=e388]: + - img [ref=e390] [cursor=pointer]: + - img [ref=e391] + - link "Keycode info" [ref=e394] [cursor=pointer]: + - /url: /keycode-info + - menuitem "Slugify string" [ref=e395]: + - img [ref=e397] [cursor=pointer]: + - img [ref=e398] + - link "Slugify string" [ref=e400] [cursor=pointer]: + - /url: /slugify-string + - menuitem "HTML WYSIWYG editor" [ref=e401]: + - img [ref=e403] [cursor=pointer]: + - img [ref=e404] + - link "HTML WYSIWYG editor" [ref=e409] [cursor=pointer]: + - /url: /html-wysiwyg-editor + - menuitem "User-agent parser" [ref=e410]: + - img [ref=e412] [cursor=pointer]: + - img [ref=e413] + - link "User-agent parser" [ref=e416] [cursor=pointer]: + - /url: /user-agent-parser + - menuitem "HTTP status codes" [ref=e417]: + - img [ref=e419] [cursor=pointer]: + - img [ref=e420] + - link "HTTP status codes" [ref=e422] [cursor=pointer]: + - /url: /http-status-codes + - menuitem "JSON diff" [ref=e423]: + - img [ref=e425] [cursor=pointer]: + - img [ref=e426] + - link "JSON diff" [ref=e428] [cursor=pointer]: + - /url: /json-diff + - menuitem "Outlook Safelink decoder" [ref=e429]: + - img [ref=e431] [cursor=pointer]: + - img [ref=e432] + - link "Outlook Safelink decoder" [ref=e436] [cursor=pointer]: + - /url: /safelink-decoder + - generic [ref=e437]: + - generic [ref=e438] [cursor=pointer]: + - img [ref=e440] + - generic [ref=e442]: Images & Videos + - menu [ref=e446]: + - menuitem "QR Code generator" [ref=e447]: + - img [ref=e449] [cursor=pointer]: + - img [ref=e450] + - link "QR Code generator" [ref=e455] [cursor=pointer]: + - /url: /qrcode-generator + - menuitem "WiFi QR Code generator" [ref=e456]: + - img [ref=e458] [cursor=pointer]: + - img [ref=e459] + - link "WiFi QR Code generator" [ref=e464] [cursor=pointer]: + - /url: /wifi-qrcode-generator + - menuitem "SVG placeholder generator" [ref=e465]: + - img [ref=e467] [cursor=pointer]: + - img [ref=e468] + - link "SVG placeholder generator" [ref=e470] [cursor=pointer]: + - /url: /svg-placeholder-generator + - menuitem "Camera recorder" [ref=e471]: + - img [ref=e473] [cursor=pointer]: + - img [ref=e474] + - link "Camera recorder" [ref=e478] [cursor=pointer]: + - /url: /camera-recorder + - generic [ref=e479]: + - generic [ref=e480] [cursor=pointer]: + - img [ref=e482] + - generic [ref=e484]: Development + - menu [ref=e488]: + - menuitem "Git cheatsheet" [ref=e489]: + - img [ref=e491] [cursor=pointer]: + - img [ref=e492] + - link "Git cheatsheet" [ref=e500] [cursor=pointer]: + - /url: /git-memo + - menuitem "Random port generator" [ref=e501]: + - img [ref=e503] [cursor=pointer]: + - img [ref=e504] + - link "Random port generator" [ref=e508] [cursor=pointer]: + - /url: /random-port-generator + - menuitem "Crontab generator" [ref=e509]: + - img [ref=e511] [cursor=pointer]: + - img [ref=e512] + - link "Crontab generator" [ref=e518] [cursor=pointer]: + - /url: /crontab-generator + - menuitem "JSON prettify and format" [ref=e519]: + - img [ref=e521] [cursor=pointer]: + - img [ref=e522] + - link "JSON prettify and format" [ref=e526] [cursor=pointer]: + - /url: /json-prettify + - menuitem "JSON minify" [ref=e527]: + - img [ref=e529] [cursor=pointer]: + - img [ref=e530] + - link "JSON minify" [ref=e534] [cursor=pointer]: + - /url: /json-minify + - menuitem "JSON to CSV" [ref=e535]: + - img [ref=e537] [cursor=pointer]: + - img [ref=e538] + - link "JSON to CSV" [ref=e540] [cursor=pointer]: + - /url: /json-to-csv + - menuitem "SQL prettify and format" [ref=e541]: + - img [ref=e543] [cursor=pointer]: + - img [ref=e544] + - link "SQL prettify and format" [ref=e549] [cursor=pointer]: + - /url: /sql-prettify + - menuitem "Chmod calculator" [ref=e550]: + - img [ref=e552] [cursor=pointer]: + - img [ref=e553] + - link "Chmod calculator" [ref=e557] [cursor=pointer]: + - /url: /chmod-calculator + - menuitem "Docker run to Docker compose converter" [ref=e558]: + - img [ref=e560] [cursor=pointer]: + - img [ref=e561] + - link "Docker run to Docker compose converter" [ref=e571] [cursor=pointer]: + - /url: /docker-run-to-docker-compose-converter + - menuitem "XML formatter" [ref=e572]: + - img [ref=e574] [cursor=pointer]: + - img [ref=e575] + - link "XML formatter" [ref=e580] [cursor=pointer]: + - /url: /xml-formatter + - menuitem "YAML prettify and format" [ref=e581]: + - img [ref=e583] [cursor=pointer]: + - img [ref=e584] + - link "YAML prettify and format" [ref=e586] [cursor=pointer]: + - /url: /yaml-prettify + - menuitem "Email normalizer" [ref=e587]: + - img [ref=e589] [cursor=pointer]: + - img [ref=e590] + - link "Email normalizer" [ref=e594] [cursor=pointer]: + - /url: /email-normalizer + - menuitem "Regex Tester" [ref=e595]: + - img [ref=e597] [cursor=pointer]: + - img [ref=e598] + - link "Regex Tester" [ref=e603] [cursor=pointer]: + - /url: /regex-tester + - menuitem "Regex cheatsheet" [ref=e604]: + - img [ref=e606] [cursor=pointer]: + - img [ref=e607] + - link "Regex cheatsheet" [ref=e612] [cursor=pointer]: + - /url: /regex-memo + - menuitem "cURL to Code" [ref=e613]: + - img [ref=e615] [cursor=pointer]: + - img [ref=e616] + - link "cURL to Code" [ref=e620] [cursor=pointer]: + - /url: /curl-to-code + - menuitem "JSON to TypeScript/Go" [ref=e621]: + - img [ref=e623] [cursor=pointer]: + - img [ref=e624] + - link "JSON to TypeScript/Go" [ref=e629] [cursor=pointer]: + - /url: /json-to-types + - menuitem "CSS/JS Prettify & Minify" [ref=e630]: + - img [ref=e632] [cursor=pointer]: + - img [ref=e633] + - link "CSS/JS Prettify & Minify" [ref=e639] [cursor=pointer]: + - /url: /css-js-prettify-minify + - generic [ref=e640]: + - generic [ref=e641] [cursor=pointer]: + - img [ref=e643] + - generic [ref=e645]: Network + - menu [ref=e649]: + - menuitem "IPv4 subnet calculator" [ref=e650]: + - img [ref=e652] [cursor=pointer]: + - img [ref=e653] + - link "IPv4 subnet calculator" [ref=e655] [cursor=pointer]: + - /url: /ipv4-subnet-calculator + - menuitem "IPv4 address converter" [ref=e656]: + - img [ref=e658] [cursor=pointer]: + - img [ref=e659] + - link "IPv4 address converter" [ref=e665] [cursor=pointer]: + - /url: /ipv4-address-converter + - menuitem "IPv4 range expander" [ref=e666]: + - img [ref=e668] [cursor=pointer]: + - img [ref=e669] + - link "IPv4 range expander" [ref=e671] [cursor=pointer]: + - /url: /ipv4-range-expander + - menuitem "MAC address lookup" [ref=e672]: + - img [ref=e674] [cursor=pointer]: + - img [ref=e675] + - link "MAC address lookup" [ref=e679] [cursor=pointer]: + - /url: /mac-address-lookup + - menuitem "MAC address generator" [ref=e680]: + - img [ref=e682] [cursor=pointer]: + - img [ref=e683] + - link "MAC address generator" [ref=e687] [cursor=pointer]: + - /url: /mac-address-generator + - menuitem "IPv6 ULA generator" [ref=e688]: + - img [ref=e690] [cursor=pointer]: + - img [ref=e691] + - link "IPv6 ULA generator" [ref=e696] [cursor=pointer]: + - /url: /ipv6-ula-generator + - menuitem "DNS Query" [ref=e697]: + - img [ref=e699] [cursor=pointer]: + - img [ref=e700] + - link "DNS Query" [ref=e706] [cursor=pointer]: + - /url: /dns-query + - generic [ref=e707]: + - generic [ref=e708] [cursor=pointer]: + - img [ref=e710] + - generic [ref=e712]: Math + - menu [ref=e716]: + - menuitem "Math evaluator" [ref=e717]: + - img [ref=e719] [cursor=pointer]: + - img [ref=e720] + - link "Math evaluator" [ref=e724] [cursor=pointer]: + - /url: /math-evaluator + - menuitem "ETA calculator" [ref=e725]: + - img [ref=e727] [cursor=pointer]: + - img [ref=e728] + - link "ETA calculator" [ref=e732] [cursor=pointer]: + - /url: /eta-calculator + - menuitem "Percentage calculator" [ref=e733]: + - img [ref=e735] [cursor=pointer]: + - img [ref=e736] + - link "Percentage calculator" [ref=e741] [cursor=pointer]: + - /url: /percentage-calculator + - generic [ref=e742]: + - generic [ref=e743] [cursor=pointer]: + - img [ref=e745] + - generic [ref=e747]: Measurement + - menu [ref=e751]: + - menuitem "Chronometer" [ref=e752]: + - img [ref=e754] [cursor=pointer]: + - img [ref=e755] + - link "Chronometer" [ref=e757] [cursor=pointer]: + - /url: /chronometer + - menuitem "Temperature converter" [ref=e758]: + - img [ref=e760] [cursor=pointer]: + - img [ref=e761] + - link "Temperature converter" [ref=e764] [cursor=pointer]: + - /url: /temperature-converter + - menuitem "Benchmark builder" [ref=e765]: + - img [ref=e767] [cursor=pointer]: + - img [ref=e768] + - link "Benchmark builder" [ref=e770] [cursor=pointer]: + - /url: /benchmark-builder + - menuitem "Byte unit converter" [ref=e771]: + - img [ref=e773] [cursor=pointer]: + - img [ref=e774] + - link "Byte unit converter" [ref=e781] [cursor=pointer]: + - /url: /byte-unit-converter + - generic [ref=e782]: + - generic [ref=e783] [cursor=pointer]: + - img [ref=e785] + - generic [ref=e787]: Text + - menu [ref=e791]: + - menuitem "Lorem ipsum generator" [ref=e792]: + - img [ref=e794] [cursor=pointer]: + - img [ref=e795] + - link "Lorem ipsum generator" [ref=e797] [cursor=pointer]: + - /url: /lorem-ipsum-generator + - menuitem "Text statistics" [ref=e798]: + - img [ref=e800] [cursor=pointer]: + - img [ref=e801] + - link "Text statistics" [ref=e805] [cursor=pointer]: + - /url: /text-statistics + - menuitem "Emoji picker" [ref=e806]: + - img [ref=e808] [cursor=pointer]: + - img [ref=e809] + - link "Emoji picker" [ref=e813] [cursor=pointer]: + - /url: /emoji-picker + - menuitem "String obfuscator" [ref=e814]: + - img [ref=e816] [cursor=pointer]: + - img [ref=e817] + - link "String obfuscator" [ref=e822] [cursor=pointer]: + - /url: /string-obfuscator + - menuitem "Text diff" [ref=e823]: + - img [ref=e825] [cursor=pointer]: + - img [ref=e826] + - link "Text diff" [ref=e830] [cursor=pointer]: + - /url: /text-diff + - menuitem "Numeronym generator" [ref=e831]: + - img [ref=e833] [cursor=pointer]: + - img [ref=e834]: + - generic "n7m" [ref=e835] + - link "Numeronym generator" [ref=e836] [cursor=pointer]: + - /url: /numeronym-generator + - menuitem "ASCII Art Text Generator" [ref=e837]: + - img [ref=e839] [cursor=pointer]: + - img [ref=e840] + - link "ASCII Art Text Generator" [ref=e843] [cursor=pointer]: + - /url: /ascii-text-drawer + - generic [ref=e844]: + - generic [ref=e845] [cursor=pointer]: + - img [ref=e847] + - generic [ref=e849]: Data + - menu [ref=e853]: + - menuitem "Phone parser and formatter" [ref=e854]: + - img [ref=e856] [cursor=pointer]: + - img [ref=e857] + - link "Phone parser and formatter" [ref=e859] [cursor=pointer]: + - /url: /phone-parser-and-formatter + - menuitem "IBAN validator and parser" [ref=e860]: + - img [ref=e862] [cursor=pointer]: + - img [ref=e863] + - link "IBAN validator and parser" [ref=e865] [cursor=pointer]: + - /url: /iban-validator-and-parser + - generic [ref=e866]: + - generic [ref=e867]: + - text: IT-Tools + - link "v2024.10.22-7ca5933" [ref=e868] [cursor=pointer]: + - /url: https://github.com/CorentinTh/it-tools/tree/v2024.10.22-7ca5933 + - generic [ref=e869]: + - text: © 2026 + - link "Corentin Thomasset" [ref=e870] [cursor=pointer]: + - /url: https://corentin.tech?utm_source=it-tools&utm_medium=footer + - generic [ref=e874]: + - button "Toggle menu" [ref=e875] [cursor=pointer]: + - img [ref=e876]: + - img [ref=e877] + - link "Home" [ref=e881] [cursor=pointer]: + - /url: / + - img [ref=e882]: + - img [ref=e883] + - link "UI Lib" [ref=e890] [cursor=pointer]: + - /url: /c-lib + - img [ref=e891] + - button "Search Cmd + K" [ref=e894] [cursor=pointer]: + - generic [ref=e895]: + - img [ref=e896] + - text: Search + - generic [ref=e898]: Cmd + K + - generic [ref=e901] [cursor=pointer]: + - generic [ref=e902]: English + - img [ref=e903] + - generic [ref=e905]: + - link "IT-Tools GitHub repository" [ref=e908] [cursor=pointer]: + - /url: https://github.com/CorentinTh/it-tools + - img [ref=e909]: + - img [ref=e910] + - link "IT Tools X account" [ref=e914] [cursor=pointer]: + - /url: https://x.com/ittoolsdottech + - img [ref=e915]: + - img [ref=e916] + - link "About" [ref=e921] [cursor=pointer]: + - /url: /about + - img [ref=e922]: + - img [ref=e923] + - button "Toggle dark/light mode" [ref=e928] [cursor=pointer]: + - img [ref=e929]: + - img [ref=e930] + - link "Buy me a coffee" [ref=e934] [cursor=pointer]: + - /url: https://www.buymeacoffee.com/cthmsst + - text: Buy me a coffee + - img [ref=e935]: + - img [ref=e936] \ No newline at end of file diff --git a/.playwright-mcp/page-2026-06-12T07-24-44-587Z.yml b/.playwright-mcp/page-2026-06-12T07-24-44-587Z.yml new file mode 100644 index 0000000000..43bd94fbee --- /dev/null +++ b/.playwright-mcp/page-2026-06-12T07-24-44-587Z.yml @@ -0,0 +1,616 @@ +- generic [ref=e5]: + - complementary [ref=e6]: + - link "IT - TOOLS Handy tools for developers" [ref=e7] [cursor=pointer]: + - /url: / + - img [ref=e8] + - generic [ref=e13]: + - generic [ref=e14]: IT - TOOLS + - generic [ref=e16]: Handy tools for developers + - generic [ref=e17]: + - generic [ref=e18]: + - generic [ref=e19] [cursor=pointer]: + - img [ref=e21] + - generic [ref=e23]: Crypto + - menu [ref=e27]: + - menuitem "Token generator" [ref=e28]: + - img [ref=e30] [cursor=pointer]: + - img [ref=e31] + - link "Token generator" [ref=e37] [cursor=pointer]: + - /url: /token-generator + - menuitem "Hash text" [ref=e38]: + - img [ref=e40] [cursor=pointer]: + - img [ref=e41] + - link "Hash text" [ref=e46] [cursor=pointer]: + - /url: /hash-text + - menuitem "Bcrypt" [ref=e47]: + - img [ref=e49] [cursor=pointer]: + - img [ref=e50] + - link "Bcrypt" [ref=e55] [cursor=pointer]: + - /url: /bcrypt + - menuitem "UUIDs generator" [ref=e56]: + - img [ref=e58] [cursor=pointer]: + - img [ref=e59] + - link "UUIDs generator" [ref=e66] [cursor=pointer]: + - /url: /uuid-generator + - menuitem "ULID generator" [ref=e67]: + - img [ref=e69] [cursor=pointer]: + - img [ref=e70] + - link "ULID generator" [ref=e76] [cursor=pointer]: + - /url: /ulid-generator + - menuitem "Encrypt / decrypt text" [ref=e77]: + - img [ref=e79] [cursor=pointer]: + - img [ref=e80] + - link "Encrypt / decrypt text" [ref=e85] [cursor=pointer]: + - /url: /encryption + - menuitem "BIP39 passphrase generator" [ref=e86]: + - img [ref=e88] [cursor=pointer]: + - img [ref=e89] + - link "BIP39 passphrase generator" [ref=e91] [cursor=pointer]: + - /url: /bip39-generator + - menuitem "Hmac generator" [ref=e92]: + - img [ref=e94] [cursor=pointer]: + - img [ref=e95] + - link "Hmac generator" [ref=e97] [cursor=pointer]: + - /url: /hmac-generator + - menuitem "RSA key pair generator" [ref=e98]: + - img [ref=e100] [cursor=pointer]: + - img [ref=e101] + - link "RSA key pair generator" [ref=e106] [cursor=pointer]: + - /url: /rsa-key-pair-generator + - menuitem "Password strength analyser" [ref=e107]: + - img [ref=e109] [cursor=pointer]: + - img [ref=e110] + - link "Password strength analyser" [ref=e112] [cursor=pointer]: + - /url: /password-strength-analyser + - menuitem "PDF signature checker" [ref=e113]: + - img [ref=e115] [cursor=pointer]: + - img [ref=e116] + - link "PDF signature checker" [ref=e118] [cursor=pointer]: + - /url: /pdf-signature-checker + - menuitem "SSL Certificate Parser" [ref=e119]: + - img [ref=e121] [cursor=pointer]: + - img [ref=e122] + - link "SSL Certificate Parser" [ref=e129] [cursor=pointer]: + - /url: /ssl-certificate-parser + - generic [ref=e130]: + - generic [ref=e131] [cursor=pointer]: + - img [ref=e133] + - generic [ref=e135]: Converter + - menu [ref=e139]: + - menuitem "Date-time converter" [ref=e140]: + - img [ref=e142] [cursor=pointer]: + - img [ref=e143] + - link "Date-time converter" [ref=e146] [cursor=pointer]: + - /url: /date-converter + - menuitem "Integer base converter" [ref=e147]: + - img [ref=e149] [cursor=pointer]: + - img [ref=e150] + - link "Integer base converter" [ref=e154] [cursor=pointer]: + - /url: /base-converter + - menuitem "Roman numeral converter" [ref=e155]: + - img [ref=e157] [cursor=pointer]: + - img [ref=e158] + - link "Roman numeral converter" [ref=e162] [cursor=pointer]: + - /url: /roman-numeral-converter + - menuitem "Base64 string encoder/decoder" [ref=e163]: + - img [ref=e165] [cursor=pointer]: + - img [ref=e166] + - link "Base64 string encoder/decoder" [ref=e171] [cursor=pointer]: + - /url: /base64-string-converter + - menuitem "Base64 file converter" [ref=e172]: + - img [ref=e174] [cursor=pointer]: + - img [ref=e175] + - link "Base64 file converter" [ref=e180] [cursor=pointer]: + - /url: /base64-file-converter + - menuitem "Color converter" [ref=e181]: + - img [ref=e183] [cursor=pointer]: + - img [ref=e184] + - link "Color converter" [ref=e190] [cursor=pointer]: + - /url: /color-converter + - menuitem "Case converter" [ref=e191]: + - img [ref=e193] [cursor=pointer]: + - img [ref=e194] + - link "Case converter" [ref=e198] [cursor=pointer]: + - /url: /case-converter + - menuitem "Text to NATO alphabet" [ref=e199]: + - img [ref=e201] [cursor=pointer]: + - img [ref=e202] + - link "Text to NATO alphabet" [ref=e207] [cursor=pointer]: + - /url: /text-to-nato-alphabet + - menuitem "Text to ASCII binary" [ref=e208]: + - img [ref=e210] [cursor=pointer]: + - img [ref=e211] + - link "Text to ASCII binary" [ref=e217] [cursor=pointer]: + - /url: /text-to-binary + - menuitem "Text to Unicode" [ref=e218]: + - img [ref=e220] [cursor=pointer]: + - img [ref=e221] + - link "Text to Unicode" [ref=e224] [cursor=pointer]: + - /url: /text-to-unicode + - menuitem "YAML to JSON converter" [ref=e225]: + - img [ref=e227] [cursor=pointer]: + - img [ref=e228] + - link "YAML to JSON converter" [ref=e230] [cursor=pointer]: + - /url: /yaml-to-json-converter + - menuitem "YAML to TOML" [ref=e231]: + - img [ref=e233] [cursor=pointer]: + - img [ref=e234] + - link "YAML to TOML" [ref=e236] [cursor=pointer]: + - /url: /yaml-to-toml + - menuitem "JSON to YAML converter" [ref=e237]: + - img [ref=e239] [cursor=pointer]: + - img [ref=e240] + - link "JSON to YAML converter" [ref=e244] [cursor=pointer]: + - /url: /json-to-yaml-converter + - menuitem "JSON to TOML" [ref=e245]: + - img [ref=e247] [cursor=pointer]: + - img [ref=e248] + - link "JSON to TOML" [ref=e252] [cursor=pointer]: + - /url: /json-to-toml + - menuitem "List converter" [ref=e253]: + - img [ref=e255] [cursor=pointer]: + - img [ref=e256] + - link "List converter" [ref=e258] [cursor=pointer]: + - /url: /list-converter + - menuitem "TOML to JSON" [ref=e259]: + - img [ref=e261] [cursor=pointer]: + - img [ref=e262] + - link "TOML to JSON" [ref=e264] [cursor=pointer]: + - /url: /toml-to-json + - menuitem "TOML to YAML" [ref=e265]: + - img [ref=e267] [cursor=pointer]: + - img [ref=e268] + - link "TOML to YAML" [ref=e270] [cursor=pointer]: + - /url: /toml-to-yaml + - menuitem "XML to JSON" [ref=e271]: + - img [ref=e273] [cursor=pointer]: + - img [ref=e274] + - link "XML to JSON" [ref=e278] [cursor=pointer]: + - /url: /xml-to-json + - menuitem "JSON to XML" [ref=e279]: + - img [ref=e281] [cursor=pointer]: + - img [ref=e282] + - link "JSON to XML" [ref=e286] [cursor=pointer]: + - /url: /json-to-xml + - menuitem "Markdown to HTML" [ref=e287]: + - img [ref=e289] [cursor=pointer]: + - img [ref=e290] + - link "Markdown to HTML" [ref=e295] [cursor=pointer]: + - /url: /markdown-to-html + - menuitem "HTML to Markdown" [ref=e296]: + - img [ref=e298] [cursor=pointer]: + - img [ref=e299] + - link "HTML to Markdown" [ref=e305] [cursor=pointer]: + - /url: /html-to-markdown + - generic [ref=e306]: + - generic [ref=e307] [cursor=pointer]: + - img [ref=e309] + - generic [ref=e311]: Web + - menu [ref=e315]: + - menuitem "Encode/decode URL-formatted strings" [ref=e316]: + - img [ref=e318] [cursor=pointer]: + - img [ref=e319] + - link "Encode/decode URL-formatted strings" [ref=e323] [cursor=pointer]: + - /url: /url-encoder + - menuitem "Escape HTML entities" [ref=e324]: + - img [ref=e326] [cursor=pointer]: + - img [ref=e327] + - link "Escape HTML entities" [ref=e332] [cursor=pointer]: + - /url: /html-entities + - menuitem "URL parser" [ref=e333]: + - img [ref=e335] [cursor=pointer]: + - img [ref=e336] + - link "URL parser" [ref=e340] [cursor=pointer]: + - /url: /url-parser + - menuitem "Device information" [ref=e341]: + - img [ref=e343] [cursor=pointer]: + - img [ref=e344] + - link "Device information" [ref=e347] [cursor=pointer]: + - /url: /device-information + - menuitem "Basic auth generator" [ref=e348]: + - img [ref=e350] [cursor=pointer]: + - img [ref=e351] + - link "Basic auth generator" [ref=e353] [cursor=pointer]: + - /url: /basic-auth-generator + - menuitem "Open graph meta generator" [ref=e354]: + - img [ref=e356] [cursor=pointer]: + - img [ref=e357] + - link "Open graph meta generator" [ref=e361] [cursor=pointer]: + - /url: /og-meta-generator + - menuitem "OTP code generator" [ref=e362]: + - img [ref=e364] [cursor=pointer]: + - img [ref=e365] + - link "OTP code generator" [ref=e368] [cursor=pointer]: + - /url: /otp-generator + - menuitem "MIME types" [ref=e369]: + - img [ref=e371] [cursor=pointer]: + - img [ref=e372] + - link "MIME types" [ref=e377] [cursor=pointer]: + - /url: /mime-types + - menuitem "JWT parser" [ref=e378]: + - img [ref=e380] [cursor=pointer]: + - img [ref=e381] + - link "JWT parser" [ref=e387] [cursor=pointer]: + - /url: /jwt-parser + - menuitem "Keycode info" [ref=e388]: + - img [ref=e390] [cursor=pointer]: + - img [ref=e391] + - link "Keycode info" [ref=e394] [cursor=pointer]: + - /url: /keycode-info + - menuitem "Slugify string" [ref=e395]: + - img [ref=e397] [cursor=pointer]: + - img [ref=e398] + - link "Slugify string" [ref=e400] [cursor=pointer]: + - /url: /slugify-string + - menuitem "HTML WYSIWYG editor" [ref=e401]: + - img [ref=e403] [cursor=pointer]: + - img [ref=e404] + - link "HTML WYSIWYG editor" [ref=e409] [cursor=pointer]: + - /url: /html-wysiwyg-editor + - menuitem "User-agent parser" [ref=e410]: + - img [ref=e412] [cursor=pointer]: + - img [ref=e413] + - link "User-agent parser" [ref=e416] [cursor=pointer]: + - /url: /user-agent-parser + - menuitem "HTTP status codes" [ref=e417]: + - img [ref=e419] [cursor=pointer]: + - img [ref=e420] + - link "HTTP status codes" [ref=e422] [cursor=pointer]: + - /url: /http-status-codes + - menuitem "JSON diff" [ref=e423]: + - img [ref=e425] [cursor=pointer]: + - img [ref=e426] + - link "JSON diff" [ref=e428] [cursor=pointer]: + - /url: /json-diff + - menuitem "Outlook Safelink decoder" [ref=e429]: + - img [ref=e431] [cursor=pointer]: + - img [ref=e432] + - link "Outlook Safelink decoder" [ref=e436] [cursor=pointer]: + - /url: /safelink-decoder + - generic [ref=e437]: + - generic [ref=e438] [cursor=pointer]: + - img [ref=e440] + - generic [ref=e442]: Images & Videos + - menu [ref=e446]: + - menuitem "QR Code generator" [ref=e447]: + - img [ref=e449] [cursor=pointer]: + - img [ref=e450] + - link "QR Code generator" [ref=e455] [cursor=pointer]: + - /url: /qrcode-generator + - menuitem "WiFi QR Code generator" [ref=e456]: + - img [ref=e458] [cursor=pointer]: + - img [ref=e459] + - link "WiFi QR Code generator" [ref=e464] [cursor=pointer]: + - /url: /wifi-qrcode-generator + - menuitem "SVG placeholder generator" [ref=e465]: + - img [ref=e467] [cursor=pointer]: + - img [ref=e468] + - link "SVG placeholder generator" [ref=e470] [cursor=pointer]: + - /url: /svg-placeholder-generator + - menuitem "Camera recorder" [ref=e471]: + - img [ref=e473] [cursor=pointer]: + - img [ref=e474] + - link "Camera recorder" [ref=e478] [cursor=pointer]: + - /url: /camera-recorder + - generic [ref=e479]: + - generic [ref=e480] [cursor=pointer]: + - img [ref=e482] + - generic [ref=e484]: Development + - menu [ref=e488]: + - menuitem "Git cheatsheet" [ref=e489]: + - img [ref=e491] [cursor=pointer]: + - img [ref=e492] + - link "Git cheatsheet" [ref=e500] [cursor=pointer]: + - /url: /git-memo + - menuitem "Random port generator" [ref=e501]: + - img [ref=e503] [cursor=pointer]: + - img [ref=e504] + - link "Random port generator" [ref=e508] [cursor=pointer]: + - /url: /random-port-generator + - menuitem "Crontab generator" [ref=e509]: + - img [ref=e511] [cursor=pointer]: + - img [ref=e512] + - link "Crontab generator" [ref=e518] [cursor=pointer]: + - /url: /crontab-generator + - menuitem "JSON prettify and format" [ref=e519]: + - img [ref=e521] [cursor=pointer]: + - img [ref=e522] + - link "JSON prettify and format" [ref=e526] [cursor=pointer]: + - /url: /json-prettify + - menuitem "JSON minify" [ref=e527]: + - img [ref=e529] [cursor=pointer]: + - img [ref=e530] + - link "JSON minify" [ref=e534] [cursor=pointer]: + - /url: /json-minify + - menuitem "JSON to CSV" [ref=e535]: + - img [ref=e537] [cursor=pointer]: + - img [ref=e538] + - link "JSON to CSV" [ref=e540] [cursor=pointer]: + - /url: /json-to-csv + - menuitem "SQL prettify and format" [ref=e541]: + - img [ref=e543] [cursor=pointer]: + - img [ref=e544] + - link "SQL prettify and format" [ref=e549] [cursor=pointer]: + - /url: /sql-prettify + - menuitem "Chmod calculator" [ref=e550]: + - img [ref=e552] [cursor=pointer]: + - img [ref=e553] + - link "Chmod calculator" [ref=e557] [cursor=pointer]: + - /url: /chmod-calculator + - menuitem "Docker run to Docker compose converter" [ref=e558]: + - img [ref=e560] [cursor=pointer]: + - img [ref=e561] + - link "Docker run to Docker compose converter" [ref=e571] [cursor=pointer]: + - /url: /docker-run-to-docker-compose-converter + - menuitem "XML formatter" [ref=e572]: + - img [ref=e574] [cursor=pointer]: + - img [ref=e575] + - link "XML formatter" [ref=e580] [cursor=pointer]: + - /url: /xml-formatter + - menuitem "YAML prettify and format" [ref=e581]: + - img [ref=e583] [cursor=pointer]: + - img [ref=e584] + - link "YAML prettify and format" [ref=e586] [cursor=pointer]: + - /url: /yaml-prettify + - menuitem "Email normalizer" [ref=e587]: + - img [ref=e589] [cursor=pointer]: + - img [ref=e590] + - link "Email normalizer" [ref=e594] [cursor=pointer]: + - /url: /email-normalizer + - menuitem "Regex Tester" [ref=e595]: + - img [ref=e597] [cursor=pointer]: + - img [ref=e598] + - link "Regex Tester" [ref=e603] [cursor=pointer]: + - /url: /regex-tester + - menuitem "Regex cheatsheet" [ref=e604]: + - img [ref=e606] [cursor=pointer]: + - img [ref=e607] + - link "Regex cheatsheet" [ref=e612] [cursor=pointer]: + - /url: /regex-memo + - menuitem "cURL to Code" [ref=e613]: + - img [ref=e615] [cursor=pointer]: + - img [ref=e616] + - link "cURL to Code" [ref=e620] [cursor=pointer]: + - /url: /curl-to-code + - menuitem "JSON to TypeScript/Go" [ref=e621]: + - img [ref=e623] [cursor=pointer]: + - img [ref=e624] + - link "JSON to TypeScript/Go" [ref=e629] [cursor=pointer]: + - /url: /json-to-types + - menuitem "CSS/JS Prettify & Minify" [ref=e630]: + - img [ref=e632] [cursor=pointer]: + - img [ref=e633] + - link "CSS/JS Prettify & Minify" [ref=e639] [cursor=pointer]: + - /url: /css-js-prettify-minify + - generic [ref=e640]: + - generic [ref=e641] [cursor=pointer]: + - img [ref=e643] + - generic [ref=e645]: Network + - menu [ref=e649]: + - menuitem "IPv4 subnet calculator" [ref=e650]: + - img [ref=e652] [cursor=pointer]: + - img [ref=e653] + - link "IPv4 subnet calculator" [ref=e655] [cursor=pointer]: + - /url: /ipv4-subnet-calculator + - menuitem "IPv4 address converter" [ref=e656]: + - img [ref=e658] [cursor=pointer]: + - img [ref=e659] + - link "IPv4 address converter" [ref=e665] [cursor=pointer]: + - /url: /ipv4-address-converter + - menuitem "IPv4 range expander" [ref=e666]: + - img [ref=e668] [cursor=pointer]: + - img [ref=e669] + - link "IPv4 range expander" [ref=e671] [cursor=pointer]: + - /url: /ipv4-range-expander + - menuitem "MAC address lookup" [ref=e672]: + - img [ref=e674] [cursor=pointer]: + - img [ref=e675] + - link "MAC address lookup" [ref=e679] [cursor=pointer]: + - /url: /mac-address-lookup + - menuitem "MAC address generator" [ref=e680]: + - img [ref=e682] [cursor=pointer]: + - img [ref=e683] + - link "MAC address generator" [ref=e687] [cursor=pointer]: + - /url: /mac-address-generator + - menuitem "IPv6 ULA generator" [ref=e688]: + - img [ref=e690] [cursor=pointer]: + - img [ref=e691] + - link "IPv6 ULA generator" [ref=e696] [cursor=pointer]: + - /url: /ipv6-ula-generator + - menuitem "DNS Query" [ref=e697]: + - img [ref=e699] [cursor=pointer]: + - img [ref=e700] + - link "DNS Query" [ref=e706] [cursor=pointer]: + - /url: /dns-query + - generic [ref=e707]: + - generic [ref=e708] [cursor=pointer]: + - img [ref=e710] + - generic [ref=e712]: Math + - menu [ref=e716]: + - menuitem "Math evaluator" [ref=e717]: + - img [ref=e719] [cursor=pointer]: + - img [ref=e720] + - link "Math evaluator" [ref=e724] [cursor=pointer]: + - /url: /math-evaluator + - menuitem "ETA calculator" [ref=e725]: + - img [ref=e727] [cursor=pointer]: + - img [ref=e728] + - link "ETA calculator" [ref=e732] [cursor=pointer]: + - /url: /eta-calculator + - menuitem "Percentage calculator" [ref=e733]: + - img [ref=e735] [cursor=pointer]: + - img [ref=e736] + - link "Percentage calculator" [ref=e741] [cursor=pointer]: + - /url: /percentage-calculator + - generic [ref=e742]: + - generic [ref=e743] [cursor=pointer]: + - img [ref=e745] + - generic [ref=e747]: Measurement + - menu [ref=e751]: + - menuitem "Chronometer" [ref=e752]: + - img [ref=e754] [cursor=pointer]: + - img [ref=e755] + - link "Chronometer" [ref=e757] [cursor=pointer]: + - /url: /chronometer + - menuitem "Temperature converter" [ref=e758]: + - img [ref=e760] [cursor=pointer]: + - img [ref=e761] + - link "Temperature converter" [ref=e764] [cursor=pointer]: + - /url: /temperature-converter + - menuitem "Benchmark builder" [ref=e765]: + - img [ref=e767] [cursor=pointer]: + - img [ref=e768] + - link "Benchmark builder" [ref=e770] [cursor=pointer]: + - /url: /benchmark-builder + - menuitem "Byte unit converter" [ref=e771]: + - img [ref=e773] [cursor=pointer]: + - img [ref=e774] + - link "Byte unit converter" [ref=e781] [cursor=pointer]: + - /url: /byte-unit-converter + - generic [ref=e782]: + - generic [ref=e783] [cursor=pointer]: + - img [ref=e785] + - generic [ref=e787]: Text + - menu [ref=e791]: + - menuitem "Lorem ipsum generator" [ref=e792]: + - img [ref=e794] [cursor=pointer]: + - img [ref=e795] + - link "Lorem ipsum generator" [ref=e797] [cursor=pointer]: + - /url: /lorem-ipsum-generator + - menuitem "Text statistics" [ref=e798]: + - img [ref=e800] [cursor=pointer]: + - img [ref=e801] + - link "Text statistics" [ref=e805] [cursor=pointer]: + - /url: /text-statistics + - menuitem "Emoji picker" [ref=e806]: + - img [ref=e808] [cursor=pointer]: + - img [ref=e809] + - link "Emoji picker" [ref=e813] [cursor=pointer]: + - /url: /emoji-picker + - menuitem "String obfuscator" [ref=e814]: + - img [ref=e816] [cursor=pointer]: + - img [ref=e817] + - link "String obfuscator" [ref=e822] [cursor=pointer]: + - /url: /string-obfuscator + - menuitem "Text diff" [ref=e823]: + - img [ref=e825] [cursor=pointer]: + - img [ref=e826] + - link "Text diff" [ref=e830] [cursor=pointer]: + - /url: /text-diff + - menuitem "Numeronym generator" [ref=e831]: + - img [ref=e833] [cursor=pointer]: + - img [ref=e834]: + - generic "n7m" [ref=e835] + - link "Numeronym generator" [ref=e836] [cursor=pointer]: + - /url: /numeronym-generator + - menuitem "ASCII Art Text Generator" [ref=e837]: + - img [ref=e839] [cursor=pointer]: + - img [ref=e840] + - link "ASCII Art Text Generator" [ref=e843] [cursor=pointer]: + - /url: /ascii-text-drawer + - generic [ref=e844]: + - generic [ref=e845] [cursor=pointer]: + - img [ref=e847] + - generic [ref=e849]: Data + - menu [ref=e853]: + - menuitem "Phone parser and formatter" [ref=e854]: + - img [ref=e856] [cursor=pointer]: + - img [ref=e857] + - link "Phone parser and formatter" [ref=e859] [cursor=pointer]: + - /url: /phone-parser-and-formatter + - menuitem "IBAN validator and parser" [ref=e860]: + - img [ref=e862] [cursor=pointer]: + - img [ref=e863] + - link "IBAN validator and parser" [ref=e865] [cursor=pointer]: + - /url: /iban-validator-and-parser + - generic [ref=e866]: + - generic [ref=e867]: + - text: IT-Tools + - link "v2024.10.22-7ca5933" [ref=e868] [cursor=pointer]: + - /url: https://github.com/CorentinTh/it-tools/tree/v2024.10.22-7ca5933 + - generic [ref=e869]: + - text: © 2026 + - link "Corentin Thomasset" [ref=e870] [cursor=pointer]: + - /url: https://corentin.tech?utm_source=it-tools&utm_medium=footer + - generic [ref=e873]: + - generic [ref=e874]: + - button "Toggle menu" [ref=e875] [cursor=pointer]: + - img [ref=e876]: + - img [ref=e877] + - link "Home" [ref=e881] [cursor=pointer]: + - /url: / + - img [ref=e882]: + - img [ref=e883] + - link "UI Lib" [ref=e890] [cursor=pointer]: + - /url: /c-lib + - img [ref=e891] + - button "Search Cmd + K" [ref=e894] [cursor=pointer]: + - generic [ref=e895]: + - img [ref=e896] + - text: Search + - generic [ref=e898]: Cmd + K + - generic [ref=e901] [cursor=pointer]: + - generic [ref=e902]: English + - img [ref=e903] + - generic [ref=e905]: + - link "IT-Tools GitHub repository" [ref=e908] [cursor=pointer]: + - /url: https://github.com/CorentinTh/it-tools + - img [ref=e909]: + - img [ref=e910] + - link "IT Tools X account" [ref=e914] [cursor=pointer]: + - /url: https://x.com/ittoolsdottech + - img [ref=e915]: + - img [ref=e916] + - link "About" [ref=e921] [cursor=pointer]: + - /url: /about + - img [ref=e922]: + - img [ref=e923] + - button "Toggle dark/light mode" [ref=e928] [cursor=pointer]: + - img [ref=e929]: + - img [ref=e930] + - link "Buy me a coffee" [ref=e934] [cursor=pointer]: + - /url: https://www.buymeacoffee.com/cthmsst + - text: Buy me a coffee + - img [ref=e935]: + - img [ref=e936] + - generic [ref=e939]: + - generic [ref=e940]: + - heading "DNS Query" [level=1] [ref=e941] + - button [ref=e945] [cursor=pointer]: + - img [ref=e946] + - generic [ref=e949]: Query DNS records (A, AAAA, CNAME, MX, TXT, NS, SOA, ...) for any domain name online using Cloudflare DNS. + - generic [ref=e951]: + - generic [ref=e952]: + - generic [ref=e953]: Domain name + - generic [ref=e955]: + - textbox "Domain name" [ref=e956]: + - /placeholder: e.g. example.com + - text: example.com + - button [ref=e957] [cursor=pointer]: + - img [ref=e958] + - generic [ref=e960]: + - generic [ref=e961]: Record type + - generic [ref=e963] [cursor=pointer]: + - generic [ref=e964]: A + - img [ref=e965] + - button "Query DNS" [active] [ref=e968] [cursor=pointer] + - generic [ref=e969]: + - generic [ref=e970]: + - generic [ref=e971]: "Status:" + - generic [ref=e972]: NOERROR + - table [ref=e973]: + - rowgroup [ref=e974]: + - row "Name TTL Data" [ref=e975]: + - columnheader "Name" [ref=e976] + - columnheader "TTL" [ref=e977] + - columnheader "Data" [ref=e978] + - rowgroup [ref=e979]: + - row "example.com 158s 104.20.23.154" [ref=e980]: + - cell "example.com" [ref=e981] + - cell "158s" [ref=e982] + - cell "104.20.23.154" [ref=e983] + - row "example.com 158s 172.66.147.243" [ref=e984]: + - cell "example.com" [ref=e985] + - cell "158s" [ref=e986] + - cell "172.66.147.243" [ref=e987] + - button "Copy results" [ref=e989] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-mcp/page-2026-06-12T07-24-51-311Z.yml b/.playwright-mcp/page-2026-06-12T07-24-51-311Z.yml new file mode 100644 index 0000000000..ab899c10fa --- /dev/null +++ b/.playwright-mcp/page-2026-06-12T07-24-51-311Z.yml @@ -0,0 +1,596 @@ +- generic [ref=e5]: + - complementary [ref=e6]: + - link "IT - TOOLS Handy tools for developers" [ref=e7] [cursor=pointer]: + - /url: / + - img [ref=e8] + - generic [ref=e13]: + - generic [ref=e14]: IT - TOOLS + - generic [ref=e16]: Handy tools for developers + - generic [ref=e17]: + - generic [ref=e18]: + - generic [ref=e19] [cursor=pointer]: + - img [ref=e21] + - generic [ref=e23]: Crypto + - menu [ref=e27]: + - menuitem "Token generator" [ref=e28]: + - img [ref=e30] [cursor=pointer]: + - img [ref=e31] + - link "Token generator" [ref=e37] [cursor=pointer]: + - /url: /token-generator + - menuitem "Hash text" [ref=e38]: + - img [ref=e40] [cursor=pointer]: + - img [ref=e41] + - link "Hash text" [ref=e46] [cursor=pointer]: + - /url: /hash-text + - menuitem "Bcrypt" [ref=e47]: + - img [ref=e49] [cursor=pointer]: + - img [ref=e50] + - link "Bcrypt" [ref=e55] [cursor=pointer]: + - /url: /bcrypt + - menuitem "UUIDs generator" [ref=e56]: + - img [ref=e58] [cursor=pointer]: + - img [ref=e59] + - link "UUIDs generator" [ref=e66] [cursor=pointer]: + - /url: /uuid-generator + - menuitem "ULID generator" [ref=e67]: + - img [ref=e69] [cursor=pointer]: + - img [ref=e70] + - link "ULID generator" [ref=e76] [cursor=pointer]: + - /url: /ulid-generator + - menuitem "Encrypt / decrypt text" [ref=e77]: + - img [ref=e79] [cursor=pointer]: + - img [ref=e80] + - link "Encrypt / decrypt text" [ref=e85] [cursor=pointer]: + - /url: /encryption + - menuitem "BIP39 passphrase generator" [ref=e86]: + - img [ref=e88] [cursor=pointer]: + - img [ref=e89] + - link "BIP39 passphrase generator" [ref=e91] [cursor=pointer]: + - /url: /bip39-generator + - menuitem "Hmac generator" [ref=e92]: + - img [ref=e94] [cursor=pointer]: + - img [ref=e95] + - link "Hmac generator" [ref=e97] [cursor=pointer]: + - /url: /hmac-generator + - menuitem "RSA key pair generator" [ref=e98]: + - img [ref=e100] [cursor=pointer]: + - img [ref=e101] + - link "RSA key pair generator" [ref=e106] [cursor=pointer]: + - /url: /rsa-key-pair-generator + - menuitem "Password strength analyser" [ref=e107]: + - img [ref=e109] [cursor=pointer]: + - img [ref=e110] + - link "Password strength analyser" [ref=e112] [cursor=pointer]: + - /url: /password-strength-analyser + - menuitem "PDF signature checker" [ref=e113]: + - img [ref=e115] [cursor=pointer]: + - img [ref=e116] + - link "PDF signature checker" [ref=e118] [cursor=pointer]: + - /url: /pdf-signature-checker + - menuitem "SSL Certificate Parser" [ref=e119]: + - img [ref=e121] [cursor=pointer]: + - img [ref=e122] + - link "SSL Certificate Parser" [ref=e129] [cursor=pointer]: + - /url: /ssl-certificate-parser + - generic [ref=e130]: + - generic [ref=e131] [cursor=pointer]: + - img [ref=e133] + - generic [ref=e135]: Converter + - menu [ref=e139]: + - menuitem "Date-time converter" [ref=e140]: + - img [ref=e142] [cursor=pointer]: + - img [ref=e143] + - link "Date-time converter" [ref=e146] [cursor=pointer]: + - /url: /date-converter + - menuitem "Integer base converter" [ref=e147]: + - img [ref=e149] [cursor=pointer]: + - img [ref=e150] + - link "Integer base converter" [ref=e154] [cursor=pointer]: + - /url: /base-converter + - menuitem "Roman numeral converter" [ref=e155]: + - img [ref=e157] [cursor=pointer]: + - img [ref=e158] + - link "Roman numeral converter" [ref=e162] [cursor=pointer]: + - /url: /roman-numeral-converter + - menuitem "Base64 string encoder/decoder" [ref=e163]: + - img [ref=e165] [cursor=pointer]: + - img [ref=e166] + - link "Base64 string encoder/decoder" [ref=e171] [cursor=pointer]: + - /url: /base64-string-converter + - menuitem "Base64 file converter" [ref=e172]: + - img [ref=e174] [cursor=pointer]: + - img [ref=e175] + - link "Base64 file converter" [ref=e180] [cursor=pointer]: + - /url: /base64-file-converter + - menuitem "Color converter" [ref=e181]: + - img [ref=e183] [cursor=pointer]: + - img [ref=e184] + - link "Color converter" [ref=e190] [cursor=pointer]: + - /url: /color-converter + - menuitem "Case converter" [ref=e191]: + - img [ref=e193] [cursor=pointer]: + - img [ref=e194] + - link "Case converter" [ref=e198] [cursor=pointer]: + - /url: /case-converter + - menuitem "Text to NATO alphabet" [ref=e199]: + - img [ref=e201] [cursor=pointer]: + - img [ref=e202] + - link "Text to NATO alphabet" [ref=e207] [cursor=pointer]: + - /url: /text-to-nato-alphabet + - menuitem "Text to ASCII binary" [ref=e208]: + - img [ref=e210] [cursor=pointer]: + - img [ref=e211] + - link "Text to ASCII binary" [ref=e217] [cursor=pointer]: + - /url: /text-to-binary + - menuitem "Text to Unicode" [ref=e218]: + - img [ref=e220] [cursor=pointer]: + - img [ref=e221] + - link "Text to Unicode" [ref=e224] [cursor=pointer]: + - /url: /text-to-unicode + - menuitem "YAML to JSON converter" [ref=e225]: + - img [ref=e227] [cursor=pointer]: + - img [ref=e228] + - link "YAML to JSON converter" [ref=e230] [cursor=pointer]: + - /url: /yaml-to-json-converter + - menuitem "YAML to TOML" [ref=e231]: + - img [ref=e233] [cursor=pointer]: + - img [ref=e234] + - link "YAML to TOML" [ref=e236] [cursor=pointer]: + - /url: /yaml-to-toml + - menuitem "JSON to YAML converter" [ref=e237]: + - img [ref=e239] [cursor=pointer]: + - img [ref=e240] + - link "JSON to YAML converter" [ref=e244] [cursor=pointer]: + - /url: /json-to-yaml-converter + - menuitem "JSON to TOML" [ref=e245]: + - img [ref=e247] [cursor=pointer]: + - img [ref=e248] + - link "JSON to TOML" [ref=e252] [cursor=pointer]: + - /url: /json-to-toml + - menuitem "List converter" [ref=e253]: + - img [ref=e255] [cursor=pointer]: + - img [ref=e256] + - link "List converter" [ref=e258] [cursor=pointer]: + - /url: /list-converter + - menuitem "TOML to JSON" [ref=e259]: + - img [ref=e261] [cursor=pointer]: + - img [ref=e262] + - link "TOML to JSON" [ref=e264] [cursor=pointer]: + - /url: /toml-to-json + - menuitem "TOML to YAML" [ref=e265]: + - img [ref=e267] [cursor=pointer]: + - img [ref=e268] + - link "TOML to YAML" [ref=e270] [cursor=pointer]: + - /url: /toml-to-yaml + - menuitem "XML to JSON" [ref=e271]: + - img [ref=e273] [cursor=pointer]: + - img [ref=e274] + - link "XML to JSON" [ref=e278] [cursor=pointer]: + - /url: /xml-to-json + - menuitem "JSON to XML" [ref=e279]: + - img [ref=e281] [cursor=pointer]: + - img [ref=e282] + - link "JSON to XML" [ref=e286] [cursor=pointer]: + - /url: /json-to-xml + - menuitem "Markdown to HTML" [ref=e287]: + - img [ref=e289] [cursor=pointer]: + - img [ref=e290] + - link "Markdown to HTML" [ref=e295] [cursor=pointer]: + - /url: /markdown-to-html + - menuitem "HTML to Markdown" [ref=e296]: + - img [ref=e298] [cursor=pointer]: + - img [ref=e299] + - link "HTML to Markdown" [ref=e305] [cursor=pointer]: + - /url: /html-to-markdown + - generic [ref=e306]: + - generic [ref=e307] [cursor=pointer]: + - img [ref=e309] + - generic [ref=e311]: Web + - menu [ref=e315]: + - menuitem "Encode/decode URL-formatted strings" [ref=e316]: + - img [ref=e318] [cursor=pointer]: + - img [ref=e319] + - link "Encode/decode URL-formatted strings" [ref=e323] [cursor=pointer]: + - /url: /url-encoder + - menuitem "Escape HTML entities" [ref=e324]: + - img [ref=e326] [cursor=pointer]: + - img [ref=e327] + - link "Escape HTML entities" [ref=e332] [cursor=pointer]: + - /url: /html-entities + - menuitem "URL parser" [ref=e333]: + - img [ref=e335] [cursor=pointer]: + - img [ref=e336] + - link "URL parser" [ref=e340] [cursor=pointer]: + - /url: /url-parser + - menuitem "Device information" [ref=e341]: + - img [ref=e343] [cursor=pointer]: + - img [ref=e344] + - link "Device information" [ref=e347] [cursor=pointer]: + - /url: /device-information + - menuitem "Basic auth generator" [ref=e348]: + - img [ref=e350] [cursor=pointer]: + - img [ref=e351] + - link "Basic auth generator" [ref=e353] [cursor=pointer]: + - /url: /basic-auth-generator + - menuitem "Open graph meta generator" [ref=e354]: + - img [ref=e356] [cursor=pointer]: + - img [ref=e357] + - link "Open graph meta generator" [ref=e361] [cursor=pointer]: + - /url: /og-meta-generator + - menuitem "OTP code generator" [ref=e362]: + - img [ref=e364] [cursor=pointer]: + - img [ref=e365] + - link "OTP code generator" [ref=e368] [cursor=pointer]: + - /url: /otp-generator + - menuitem "MIME types" [ref=e369]: + - img [ref=e371] [cursor=pointer]: + - img [ref=e372] + - link "MIME types" [ref=e377] [cursor=pointer]: + - /url: /mime-types + - menuitem "JWT parser" [ref=e378]: + - img [ref=e380] [cursor=pointer]: + - img [ref=e381] + - link "JWT parser" [ref=e387] [cursor=pointer]: + - /url: /jwt-parser + - menuitem "Keycode info" [ref=e388]: + - img [ref=e390] [cursor=pointer]: + - img [ref=e391] + - link "Keycode info" [ref=e394] [cursor=pointer]: + - /url: /keycode-info + - menuitem "Slugify string" [ref=e395]: + - img [ref=e397] [cursor=pointer]: + - img [ref=e398] + - link "Slugify string" [ref=e400] [cursor=pointer]: + - /url: /slugify-string + - menuitem "HTML WYSIWYG editor" [ref=e401]: + - img [ref=e403] [cursor=pointer]: + - img [ref=e404] + - link "HTML WYSIWYG editor" [ref=e409] [cursor=pointer]: + - /url: /html-wysiwyg-editor + - menuitem "User-agent parser" [ref=e410]: + - img [ref=e412] [cursor=pointer]: + - img [ref=e413] + - link "User-agent parser" [ref=e416] [cursor=pointer]: + - /url: /user-agent-parser + - menuitem "HTTP status codes" [ref=e417]: + - img [ref=e419] [cursor=pointer]: + - img [ref=e420] + - link "HTTP status codes" [ref=e422] [cursor=pointer]: + - /url: /http-status-codes + - menuitem "JSON diff" [ref=e423]: + - img [ref=e425] [cursor=pointer]: + - img [ref=e426] + - link "JSON diff" [ref=e428] [cursor=pointer]: + - /url: /json-diff + - menuitem "Outlook Safelink decoder" [ref=e429]: + - img [ref=e431] [cursor=pointer]: + - img [ref=e432] + - link "Outlook Safelink decoder" [ref=e436] [cursor=pointer]: + - /url: /safelink-decoder + - generic [ref=e437]: + - generic [ref=e438] [cursor=pointer]: + - img [ref=e440] + - generic [ref=e442]: Images & Videos + - menu [ref=e446]: + - menuitem "QR Code generator" [ref=e447]: + - img [ref=e449] [cursor=pointer]: + - img [ref=e450] + - link "QR Code generator" [ref=e455] [cursor=pointer]: + - /url: /qrcode-generator + - menuitem "WiFi QR Code generator" [ref=e456]: + - img [ref=e458] [cursor=pointer]: + - img [ref=e459] + - link "WiFi QR Code generator" [ref=e464] [cursor=pointer]: + - /url: /wifi-qrcode-generator + - menuitem "SVG placeholder generator" [ref=e465]: + - img [ref=e467] [cursor=pointer]: + - img [ref=e468] + - link "SVG placeholder generator" [ref=e470] [cursor=pointer]: + - /url: /svg-placeholder-generator + - menuitem "Camera recorder" [ref=e471]: + - img [ref=e473] [cursor=pointer]: + - img [ref=e474] + - link "Camera recorder" [ref=e478] [cursor=pointer]: + - /url: /camera-recorder + - generic [ref=e479]: + - generic [ref=e480] [cursor=pointer]: + - img [ref=e482] + - generic [ref=e484]: Development + - menu [ref=e488]: + - menuitem "Git cheatsheet" [ref=e489]: + - img [ref=e491] [cursor=pointer]: + - img [ref=e492] + - link "Git cheatsheet" [ref=e500] [cursor=pointer]: + - /url: /git-memo + - menuitem "Random port generator" [ref=e501]: + - img [ref=e503] [cursor=pointer]: + - img [ref=e504] + - link "Random port generator" [ref=e508] [cursor=pointer]: + - /url: /random-port-generator + - menuitem "Crontab generator" [ref=e509]: + - img [ref=e511] [cursor=pointer]: + - img [ref=e512] + - link "Crontab generator" [ref=e518] [cursor=pointer]: + - /url: /crontab-generator + - menuitem "JSON prettify and format" [ref=e519]: + - img [ref=e521] [cursor=pointer]: + - img [ref=e522] + - link "JSON prettify and format" [ref=e526] [cursor=pointer]: + - /url: /json-prettify + - menuitem "JSON minify" [ref=e527]: + - img [ref=e529] [cursor=pointer]: + - img [ref=e530] + - link "JSON minify" [ref=e534] [cursor=pointer]: + - /url: /json-minify + - menuitem "JSON to CSV" [ref=e535]: + - img [ref=e537] [cursor=pointer]: + - img [ref=e538] + - link "JSON to CSV" [ref=e540] [cursor=pointer]: + - /url: /json-to-csv + - menuitem "SQL prettify and format" [ref=e541]: + - img [ref=e543] [cursor=pointer]: + - img [ref=e544] + - link "SQL prettify and format" [ref=e549] [cursor=pointer]: + - /url: /sql-prettify + - menuitem "Chmod calculator" [ref=e550]: + - img [ref=e552] [cursor=pointer]: + - img [ref=e553] + - link "Chmod calculator" [ref=e557] [cursor=pointer]: + - /url: /chmod-calculator + - menuitem "Docker run to Docker compose converter" [ref=e558]: + - img [ref=e560] [cursor=pointer]: + - img [ref=e561] + - link "Docker run to Docker compose converter" [ref=e571] [cursor=pointer]: + - /url: /docker-run-to-docker-compose-converter + - menuitem "XML formatter" [ref=e572]: + - img [ref=e574] [cursor=pointer]: + - img [ref=e575] + - link "XML formatter" [ref=e580] [cursor=pointer]: + - /url: /xml-formatter + - menuitem "YAML prettify and format" [ref=e581]: + - img [ref=e583] [cursor=pointer]: + - img [ref=e584] + - link "YAML prettify and format" [ref=e586] [cursor=pointer]: + - /url: /yaml-prettify + - menuitem "Email normalizer" [ref=e587]: + - img [ref=e589] [cursor=pointer]: + - img [ref=e590] + - link "Email normalizer" [ref=e594] [cursor=pointer]: + - /url: /email-normalizer + - menuitem "Regex Tester" [ref=e595]: + - img [ref=e597] [cursor=pointer]: + - img [ref=e598] + - link "Regex Tester" [ref=e603] [cursor=pointer]: + - /url: /regex-tester + - menuitem "Regex cheatsheet" [ref=e604]: + - img [ref=e606] [cursor=pointer]: + - img [ref=e607] + - link "Regex cheatsheet" [ref=e612] [cursor=pointer]: + - /url: /regex-memo + - menuitem "cURL to Code" [ref=e613]: + - img [ref=e615] [cursor=pointer]: + - img [ref=e616] + - link "cURL to Code" [ref=e620] [cursor=pointer]: + - /url: /curl-to-code + - menuitem "JSON to TypeScript/Go" [ref=e621]: + - img [ref=e623] [cursor=pointer]: + - img [ref=e624] + - link "JSON to TypeScript/Go" [ref=e629] [cursor=pointer]: + - /url: /json-to-types + - menuitem "CSS/JS Prettify & Minify" [ref=e630]: + - img [ref=e632] [cursor=pointer]: + - img [ref=e633] + - link "CSS/JS Prettify & Minify" [ref=e639] [cursor=pointer]: + - /url: /css-js-prettify-minify + - generic [ref=e640]: + - generic [ref=e641] [cursor=pointer]: + - img [ref=e643] + - generic [ref=e645]: Network + - menu [ref=e649]: + - menuitem "IPv4 subnet calculator" [ref=e650]: + - img [ref=e652] [cursor=pointer]: + - img [ref=e653] + - link "IPv4 subnet calculator" [ref=e655] [cursor=pointer]: + - /url: /ipv4-subnet-calculator + - menuitem "IPv4 address converter" [ref=e656]: + - img [ref=e658] [cursor=pointer]: + - img [ref=e659] + - link "IPv4 address converter" [ref=e665] [cursor=pointer]: + - /url: /ipv4-address-converter + - menuitem "IPv4 range expander" [ref=e666]: + - img [ref=e668] [cursor=pointer]: + - img [ref=e669] + - link "IPv4 range expander" [ref=e671] [cursor=pointer]: + - /url: /ipv4-range-expander + - menuitem "MAC address lookup" [ref=e672]: + - img [ref=e674] [cursor=pointer]: + - img [ref=e675] + - link "MAC address lookup" [ref=e679] [cursor=pointer]: + - /url: /mac-address-lookup + - menuitem "MAC address generator" [ref=e680]: + - img [ref=e682] [cursor=pointer]: + - img [ref=e683] + - link "MAC address generator" [ref=e687] [cursor=pointer]: + - /url: /mac-address-generator + - menuitem "IPv6 ULA generator" [ref=e688]: + - img [ref=e690] [cursor=pointer]: + - img [ref=e691] + - link "IPv6 ULA generator" [ref=e696] [cursor=pointer]: + - /url: /ipv6-ula-generator + - menuitem "DNS Query" [ref=e697]: + - img [ref=e699] [cursor=pointer]: + - img [ref=e700] + - link "DNS Query" [ref=e706] [cursor=pointer]: + - /url: /dns-query + - generic [ref=e707]: + - generic [ref=e708] [cursor=pointer]: + - img [ref=e710] + - generic [ref=e712]: Math + - menu [ref=e716]: + - menuitem "Math evaluator" [ref=e717]: + - img [ref=e719] [cursor=pointer]: + - img [ref=e720] + - link "Math evaluator" [ref=e724] [cursor=pointer]: + - /url: /math-evaluator + - menuitem "ETA calculator" [ref=e725]: + - img [ref=e727] [cursor=pointer]: + - img [ref=e728] + - link "ETA calculator" [ref=e732] [cursor=pointer]: + - /url: /eta-calculator + - menuitem "Percentage calculator" [ref=e733]: + - img [ref=e735] [cursor=pointer]: + - img [ref=e736] + - link "Percentage calculator" [ref=e741] [cursor=pointer]: + - /url: /percentage-calculator + - generic [ref=e742]: + - generic [ref=e743] [cursor=pointer]: + - img [ref=e745] + - generic [ref=e747]: Measurement + - menu [ref=e751]: + - menuitem "Chronometer" [ref=e752]: + - img [ref=e754] [cursor=pointer]: + - img [ref=e755] + - link "Chronometer" [ref=e757] [cursor=pointer]: + - /url: /chronometer + - menuitem "Temperature converter" [ref=e758]: + - img [ref=e760] [cursor=pointer]: + - img [ref=e761] + - link "Temperature converter" [ref=e764] [cursor=pointer]: + - /url: /temperature-converter + - menuitem "Benchmark builder" [ref=e765]: + - img [ref=e767] [cursor=pointer]: + - img [ref=e768] + - link "Benchmark builder" [ref=e770] [cursor=pointer]: + - /url: /benchmark-builder + - menuitem "Byte unit converter" [ref=e771]: + - img [ref=e773] [cursor=pointer]: + - img [ref=e774] + - link "Byte unit converter" [ref=e781] [cursor=pointer]: + - /url: /byte-unit-converter + - generic [ref=e782]: + - generic [ref=e783] [cursor=pointer]: + - img [ref=e785] + - generic [ref=e787]: Text + - menu [ref=e791]: + - menuitem "Lorem ipsum generator" [ref=e792]: + - img [ref=e794] [cursor=pointer]: + - img [ref=e795] + - link "Lorem ipsum generator" [ref=e797] [cursor=pointer]: + - /url: /lorem-ipsum-generator + - menuitem "Text statistics" [ref=e798]: + - img [ref=e800] [cursor=pointer]: + - img [ref=e801] + - link "Text statistics" [ref=e805] [cursor=pointer]: + - /url: /text-statistics + - menuitem "Emoji picker" [ref=e806]: + - img [ref=e808] [cursor=pointer]: + - img [ref=e809] + - link "Emoji picker" [ref=e813] [cursor=pointer]: + - /url: /emoji-picker + - menuitem "String obfuscator" [ref=e814]: + - img [ref=e816] [cursor=pointer]: + - img [ref=e817] + - link "String obfuscator" [ref=e822] [cursor=pointer]: + - /url: /string-obfuscator + - menuitem "Text diff" [ref=e823]: + - img [ref=e825] [cursor=pointer]: + - img [ref=e826] + - link "Text diff" [ref=e830] [cursor=pointer]: + - /url: /text-diff + - menuitem "Numeronym generator" [ref=e831]: + - img [ref=e833] [cursor=pointer]: + - img [ref=e834]: + - generic "n7m" [ref=e835] + - link "Numeronym generator" [ref=e836] [cursor=pointer]: + - /url: /numeronym-generator + - menuitem "ASCII Art Text Generator" [ref=e837]: + - img [ref=e839] [cursor=pointer]: + - img [ref=e840] + - link "ASCII Art Text Generator" [ref=e843] [cursor=pointer]: + - /url: /ascii-text-drawer + - generic [ref=e844]: + - generic [ref=e845] [cursor=pointer]: + - img [ref=e847] + - generic [ref=e849]: Data + - menu [ref=e853]: + - menuitem "Phone parser and formatter" [ref=e854]: + - img [ref=e856] [cursor=pointer]: + - img [ref=e857] + - link "Phone parser and formatter" [ref=e859] [cursor=pointer]: + - /url: /phone-parser-and-formatter + - menuitem "IBAN validator and parser" [ref=e860]: + - img [ref=e862] [cursor=pointer]: + - img [ref=e863] + - link "IBAN validator and parser" [ref=e865] [cursor=pointer]: + - /url: /iban-validator-and-parser + - generic [ref=e866]: + - generic [ref=e867]: + - text: IT-Tools + - link "v2024.10.22-7ca5933" [ref=e868] [cursor=pointer]: + - /url: https://github.com/CorentinTh/it-tools/tree/v2024.10.22-7ca5933 + - generic [ref=e869]: + - text: © 2026 + - link "Corentin Thomasset" [ref=e870] [cursor=pointer]: + - /url: https://corentin.tech?utm_source=it-tools&utm_medium=footer + - generic [ref=e873]: + - generic [ref=e874]: + - button "Toggle menu" [ref=e875] [cursor=pointer]: + - img [ref=e876]: + - img [ref=e877] + - link "Home" [ref=e881] [cursor=pointer]: + - /url: / + - img [ref=e882]: + - img [ref=e883] + - link "UI Lib" [ref=e890] [cursor=pointer]: + - /url: /c-lib + - img [ref=e891] + - button "Search Cmd + K" [ref=e894] [cursor=pointer]: + - generic [ref=e895]: + - img [ref=e896] + - text: Search + - generic [ref=e898]: Cmd + K + - generic [ref=e901] [cursor=pointer]: + - generic [ref=e902]: English + - img [ref=e903] + - generic [ref=e905]: + - link "IT-Tools GitHub repository" [ref=e908] [cursor=pointer]: + - /url: https://github.com/CorentinTh/it-tools + - img [ref=e909]: + - img [ref=e910] + - link "IT Tools X account" [ref=e914] [cursor=pointer]: + - /url: https://x.com/ittoolsdottech + - img [ref=e915]: + - img [ref=e916] + - link "About" [ref=e921] [cursor=pointer]: + - /url: /about + - img [ref=e922]: + - img [ref=e923] + - button "Toggle dark/light mode" [ref=e928] [cursor=pointer]: + - img [ref=e929]: + - img [ref=e930] + - link "Buy me a coffee" [ref=e934] [cursor=pointer]: + - /url: https://www.buymeacoffee.com/cthmsst + - text: Buy me a coffee + - img [ref=e935]: + - img [ref=e936] + - generic [ref=e939]: + - generic [ref=e940]: + - heading "DNS Query" [level=1] [ref=e941] + - button [ref=e945] [cursor=pointer]: + - img [ref=e946] + - generic [ref=e949]: Query DNS records (A, AAAA, CNAME, MX, TXT, NS, SOA, ...) for any domain name online using Cloudflare DNS. + - generic [ref=e951]: + - generic [ref=e952]: + - generic [ref=e953]: Domain name + - generic [ref=e955]: + - textbox "Domain name" [ref=e956]: + - /placeholder: e.g. example.com + - text: example.com + - button [ref=e957] [cursor=pointer]: + - img [ref=e958] + - generic [ref=e960]: + - generic [ref=e961]: Record type + - generic [ref=e963] [cursor=pointer]: + - generic [ref=e964]: A + - img [ref=e965] + - button "Query DNS" [ref=e968] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-mcp/page-2026-06-12T07-25-13-336Z.yml b/.playwright-mcp/page-2026-06-12T07-25-13-336Z.yml new file mode 100644 index 0000000000..556d4062d6 --- /dev/null +++ b/.playwright-mcp/page-2026-06-12T07-25-13-336Z.yml @@ -0,0 +1,616 @@ +- generic [ref=e5]: + - complementary [ref=e6]: + - link "IT - TOOLS Handy tools for developers" [ref=e7] [cursor=pointer]: + - /url: / + - img [ref=e8] + - generic [ref=e13]: + - generic [ref=e14]: IT - TOOLS + - generic [ref=e16]: Handy tools for developers + - generic [ref=e17]: + - generic [ref=e18]: + - generic [ref=e19] [cursor=pointer]: + - img [ref=e21] + - generic [ref=e23]: Crypto + - menu [ref=e27]: + - menuitem "Token generator" [ref=e28]: + - img [ref=e30] [cursor=pointer]: + - img [ref=e31] + - link "Token generator" [ref=e37] [cursor=pointer]: + - /url: /token-generator + - menuitem "Hash text" [ref=e38]: + - img [ref=e40] [cursor=pointer]: + - img [ref=e41] + - link "Hash text" [ref=e46] [cursor=pointer]: + - /url: /hash-text + - menuitem "Bcrypt" [ref=e47]: + - img [ref=e49] [cursor=pointer]: + - img [ref=e50] + - link "Bcrypt" [ref=e55] [cursor=pointer]: + - /url: /bcrypt + - menuitem "UUIDs generator" [ref=e56]: + - img [ref=e58] [cursor=pointer]: + - img [ref=e59] + - link "UUIDs generator" [ref=e66] [cursor=pointer]: + - /url: /uuid-generator + - menuitem "ULID generator" [ref=e67]: + - img [ref=e69] [cursor=pointer]: + - img [ref=e70] + - link "ULID generator" [ref=e76] [cursor=pointer]: + - /url: /ulid-generator + - menuitem "Encrypt / decrypt text" [ref=e77]: + - img [ref=e79] [cursor=pointer]: + - img [ref=e80] + - link "Encrypt / decrypt text" [ref=e85] [cursor=pointer]: + - /url: /encryption + - menuitem "BIP39 passphrase generator" [ref=e86]: + - img [ref=e88] [cursor=pointer]: + - img [ref=e89] + - link "BIP39 passphrase generator" [ref=e91] [cursor=pointer]: + - /url: /bip39-generator + - menuitem "Hmac generator" [ref=e92]: + - img [ref=e94] [cursor=pointer]: + - img [ref=e95] + - link "Hmac generator" [ref=e97] [cursor=pointer]: + - /url: /hmac-generator + - menuitem "RSA key pair generator" [ref=e98]: + - img [ref=e100] [cursor=pointer]: + - img [ref=e101] + - link "RSA key pair generator" [ref=e106] [cursor=pointer]: + - /url: /rsa-key-pair-generator + - menuitem "Password strength analyser" [ref=e107]: + - img [ref=e109] [cursor=pointer]: + - img [ref=e110] + - link "Password strength analyser" [ref=e112] [cursor=pointer]: + - /url: /password-strength-analyser + - menuitem "PDF signature checker" [ref=e113]: + - img [ref=e115] [cursor=pointer]: + - img [ref=e116] + - link "PDF signature checker" [ref=e118] [cursor=pointer]: + - /url: /pdf-signature-checker + - menuitem "SSL Certificate Parser" [ref=e119]: + - img [ref=e121] [cursor=pointer]: + - img [ref=e122] + - link "SSL Certificate Parser" [ref=e129] [cursor=pointer]: + - /url: /ssl-certificate-parser + - generic [ref=e130]: + - generic [ref=e131] [cursor=pointer]: + - img [ref=e133] + - generic [ref=e135]: Converter + - menu [ref=e139]: + - menuitem "Date-time converter" [ref=e140]: + - img [ref=e142] [cursor=pointer]: + - img [ref=e143] + - link "Date-time converter" [ref=e146] [cursor=pointer]: + - /url: /date-converter + - menuitem "Integer base converter" [ref=e147]: + - img [ref=e149] [cursor=pointer]: + - img [ref=e150] + - link "Integer base converter" [ref=e154] [cursor=pointer]: + - /url: /base-converter + - menuitem "Roman numeral converter" [ref=e155]: + - img [ref=e157] [cursor=pointer]: + - img [ref=e158] + - link "Roman numeral converter" [ref=e162] [cursor=pointer]: + - /url: /roman-numeral-converter + - menuitem "Base64 string encoder/decoder" [ref=e163]: + - img [ref=e165] [cursor=pointer]: + - img [ref=e166] + - link "Base64 string encoder/decoder" [ref=e171] [cursor=pointer]: + - /url: /base64-string-converter + - menuitem "Base64 file converter" [ref=e172]: + - img [ref=e174] [cursor=pointer]: + - img [ref=e175] + - link "Base64 file converter" [ref=e180] [cursor=pointer]: + - /url: /base64-file-converter + - menuitem "Color converter" [ref=e181]: + - img [ref=e183] [cursor=pointer]: + - img [ref=e184] + - link "Color converter" [ref=e190] [cursor=pointer]: + - /url: /color-converter + - menuitem "Case converter" [ref=e191]: + - img [ref=e193] [cursor=pointer]: + - img [ref=e194] + - link "Case converter" [ref=e198] [cursor=pointer]: + - /url: /case-converter + - menuitem "Text to NATO alphabet" [ref=e199]: + - img [ref=e201] [cursor=pointer]: + - img [ref=e202] + - link "Text to NATO alphabet" [ref=e207] [cursor=pointer]: + - /url: /text-to-nato-alphabet + - menuitem "Text to ASCII binary" [ref=e208]: + - img [ref=e210] [cursor=pointer]: + - img [ref=e211] + - link "Text to ASCII binary" [ref=e217] [cursor=pointer]: + - /url: /text-to-binary + - menuitem "Text to Unicode" [ref=e218]: + - img [ref=e220] [cursor=pointer]: + - img [ref=e221] + - link "Text to Unicode" [ref=e224] [cursor=pointer]: + - /url: /text-to-unicode + - menuitem "YAML to JSON converter" [ref=e225]: + - img [ref=e227] [cursor=pointer]: + - img [ref=e228] + - link "YAML to JSON converter" [ref=e230] [cursor=pointer]: + - /url: /yaml-to-json-converter + - menuitem "YAML to TOML" [ref=e231]: + - img [ref=e233] [cursor=pointer]: + - img [ref=e234] + - link "YAML to TOML" [ref=e236] [cursor=pointer]: + - /url: /yaml-to-toml + - menuitem "JSON to YAML converter" [ref=e237]: + - img [ref=e239] [cursor=pointer]: + - img [ref=e240] + - link "JSON to YAML converter" [ref=e244] [cursor=pointer]: + - /url: /json-to-yaml-converter + - menuitem "JSON to TOML" [ref=e245]: + - img [ref=e247] [cursor=pointer]: + - img [ref=e248] + - link "JSON to TOML" [ref=e252] [cursor=pointer]: + - /url: /json-to-toml + - menuitem "List converter" [ref=e253]: + - img [ref=e255] [cursor=pointer]: + - img [ref=e256] + - link "List converter" [ref=e258] [cursor=pointer]: + - /url: /list-converter + - menuitem "TOML to JSON" [ref=e259]: + - img [ref=e261] [cursor=pointer]: + - img [ref=e262] + - link "TOML to JSON" [ref=e264] [cursor=pointer]: + - /url: /toml-to-json + - menuitem "TOML to YAML" [ref=e265]: + - img [ref=e267] [cursor=pointer]: + - img [ref=e268] + - link "TOML to YAML" [ref=e270] [cursor=pointer]: + - /url: /toml-to-yaml + - menuitem "XML to JSON" [ref=e271]: + - img [ref=e273] [cursor=pointer]: + - img [ref=e274] + - link "XML to JSON" [ref=e278] [cursor=pointer]: + - /url: /xml-to-json + - menuitem "JSON to XML" [ref=e279]: + - img [ref=e281] [cursor=pointer]: + - img [ref=e282] + - link "JSON to XML" [ref=e286] [cursor=pointer]: + - /url: /json-to-xml + - menuitem "Markdown to HTML" [ref=e287]: + - img [ref=e289] [cursor=pointer]: + - img [ref=e290] + - link "Markdown to HTML" [ref=e295] [cursor=pointer]: + - /url: /markdown-to-html + - menuitem "HTML to Markdown" [ref=e296]: + - img [ref=e298] [cursor=pointer]: + - img [ref=e299] + - link "HTML to Markdown" [ref=e305] [cursor=pointer]: + - /url: /html-to-markdown + - generic [ref=e306]: + - generic [ref=e307] [cursor=pointer]: + - img [ref=e309] + - generic [ref=e311]: Web + - menu [ref=e315]: + - menuitem "Encode/decode URL-formatted strings" [ref=e316]: + - img [ref=e318] [cursor=pointer]: + - img [ref=e319] + - link "Encode/decode URL-formatted strings" [ref=e323] [cursor=pointer]: + - /url: /url-encoder + - menuitem "Escape HTML entities" [ref=e324]: + - img [ref=e326] [cursor=pointer]: + - img [ref=e327] + - link "Escape HTML entities" [ref=e332] [cursor=pointer]: + - /url: /html-entities + - menuitem "URL parser" [ref=e333]: + - img [ref=e335] [cursor=pointer]: + - img [ref=e336] + - link "URL parser" [ref=e340] [cursor=pointer]: + - /url: /url-parser + - menuitem "Device information" [ref=e341]: + - img [ref=e343] [cursor=pointer]: + - img [ref=e344] + - link "Device information" [ref=e347] [cursor=pointer]: + - /url: /device-information + - menuitem "Basic auth generator" [ref=e348]: + - img [ref=e350] [cursor=pointer]: + - img [ref=e351] + - link "Basic auth generator" [ref=e353] [cursor=pointer]: + - /url: /basic-auth-generator + - menuitem "Open graph meta generator" [ref=e354]: + - img [ref=e356] [cursor=pointer]: + - img [ref=e357] + - link "Open graph meta generator" [ref=e361] [cursor=pointer]: + - /url: /og-meta-generator + - menuitem "OTP code generator" [ref=e362]: + - img [ref=e364] [cursor=pointer]: + - img [ref=e365] + - link "OTP code generator" [ref=e368] [cursor=pointer]: + - /url: /otp-generator + - menuitem "MIME types" [ref=e369]: + - img [ref=e371] [cursor=pointer]: + - img [ref=e372] + - link "MIME types" [ref=e377] [cursor=pointer]: + - /url: /mime-types + - menuitem "JWT parser" [ref=e378]: + - img [ref=e380] [cursor=pointer]: + - img [ref=e381] + - link "JWT parser" [ref=e387] [cursor=pointer]: + - /url: /jwt-parser + - menuitem "Keycode info" [ref=e388]: + - img [ref=e390] [cursor=pointer]: + - img [ref=e391] + - link "Keycode info" [ref=e394] [cursor=pointer]: + - /url: /keycode-info + - menuitem "Slugify string" [ref=e395]: + - img [ref=e397] [cursor=pointer]: + - img [ref=e398] + - link "Slugify string" [ref=e400] [cursor=pointer]: + - /url: /slugify-string + - menuitem "HTML WYSIWYG editor" [ref=e401]: + - img [ref=e403] [cursor=pointer]: + - img [ref=e404] + - link "HTML WYSIWYG editor" [ref=e409] [cursor=pointer]: + - /url: /html-wysiwyg-editor + - menuitem "User-agent parser" [ref=e410]: + - img [ref=e412] [cursor=pointer]: + - img [ref=e413] + - link "User-agent parser" [ref=e416] [cursor=pointer]: + - /url: /user-agent-parser + - menuitem "HTTP status codes" [ref=e417]: + - img [ref=e419] [cursor=pointer]: + - img [ref=e420] + - link "HTTP status codes" [ref=e422] [cursor=pointer]: + - /url: /http-status-codes + - menuitem "JSON diff" [ref=e423]: + - img [ref=e425] [cursor=pointer]: + - img [ref=e426] + - link "JSON diff" [ref=e428] [cursor=pointer]: + - /url: /json-diff + - menuitem "Outlook Safelink decoder" [ref=e429]: + - img [ref=e431] [cursor=pointer]: + - img [ref=e432] + - link "Outlook Safelink decoder" [ref=e436] [cursor=pointer]: + - /url: /safelink-decoder + - generic [ref=e437]: + - generic [ref=e438] [cursor=pointer]: + - img [ref=e440] + - generic [ref=e442]: Images & Videos + - menu [ref=e446]: + - menuitem "QR Code generator" [ref=e447]: + - img [ref=e449] [cursor=pointer]: + - img [ref=e450] + - link "QR Code generator" [ref=e455] [cursor=pointer]: + - /url: /qrcode-generator + - menuitem "WiFi QR Code generator" [ref=e456]: + - img [ref=e458] [cursor=pointer]: + - img [ref=e459] + - link "WiFi QR Code generator" [ref=e464] [cursor=pointer]: + - /url: /wifi-qrcode-generator + - menuitem "SVG placeholder generator" [ref=e465]: + - img [ref=e467] [cursor=pointer]: + - img [ref=e468] + - link "SVG placeholder generator" [ref=e470] [cursor=pointer]: + - /url: /svg-placeholder-generator + - menuitem "Camera recorder" [ref=e471]: + - img [ref=e473] [cursor=pointer]: + - img [ref=e474] + - link "Camera recorder" [ref=e478] [cursor=pointer]: + - /url: /camera-recorder + - generic [ref=e479]: + - generic [ref=e480] [cursor=pointer]: + - img [ref=e482] + - generic [ref=e484]: Development + - menu [ref=e488]: + - menuitem "Git cheatsheet" [ref=e489]: + - img [ref=e491] [cursor=pointer]: + - img [ref=e492] + - link "Git cheatsheet" [ref=e500] [cursor=pointer]: + - /url: /git-memo + - menuitem "Random port generator" [ref=e501]: + - img [ref=e503] [cursor=pointer]: + - img [ref=e504] + - link "Random port generator" [ref=e508] [cursor=pointer]: + - /url: /random-port-generator + - menuitem "Crontab generator" [ref=e509]: + - img [ref=e511] [cursor=pointer]: + - img [ref=e512] + - link "Crontab generator" [ref=e518] [cursor=pointer]: + - /url: /crontab-generator + - menuitem "JSON prettify and format" [ref=e519]: + - img [ref=e521] [cursor=pointer]: + - img [ref=e522] + - link "JSON prettify and format" [ref=e526] [cursor=pointer]: + - /url: /json-prettify + - menuitem "JSON minify" [ref=e527]: + - img [ref=e529] [cursor=pointer]: + - img [ref=e530] + - link "JSON minify" [ref=e534] [cursor=pointer]: + - /url: /json-minify + - menuitem "JSON to CSV" [ref=e535]: + - img [ref=e537] [cursor=pointer]: + - img [ref=e538] + - link "JSON to CSV" [ref=e540] [cursor=pointer]: + - /url: /json-to-csv + - menuitem "SQL prettify and format" [ref=e541]: + - img [ref=e543] [cursor=pointer]: + - img [ref=e544] + - link "SQL prettify and format" [ref=e549] [cursor=pointer]: + - /url: /sql-prettify + - menuitem "Chmod calculator" [ref=e550]: + - img [ref=e552] [cursor=pointer]: + - img [ref=e553] + - link "Chmod calculator" [ref=e557] [cursor=pointer]: + - /url: /chmod-calculator + - menuitem "Docker run to Docker compose converter" [ref=e558]: + - img [ref=e560] [cursor=pointer]: + - img [ref=e561] + - link "Docker run to Docker compose converter" [ref=e571] [cursor=pointer]: + - /url: /docker-run-to-docker-compose-converter + - menuitem "XML formatter" [ref=e572]: + - img [ref=e574] [cursor=pointer]: + - img [ref=e575] + - link "XML formatter" [ref=e580] [cursor=pointer]: + - /url: /xml-formatter + - menuitem "YAML prettify and format" [ref=e581]: + - img [ref=e583] [cursor=pointer]: + - img [ref=e584] + - link "YAML prettify and format" [ref=e586] [cursor=pointer]: + - /url: /yaml-prettify + - menuitem "Email normalizer" [ref=e587]: + - img [ref=e589] [cursor=pointer]: + - img [ref=e590] + - link "Email normalizer" [ref=e594] [cursor=pointer]: + - /url: /email-normalizer + - menuitem "Regex Tester" [ref=e595]: + - img [ref=e597] [cursor=pointer]: + - img [ref=e598] + - link "Regex Tester" [ref=e603] [cursor=pointer]: + - /url: /regex-tester + - menuitem "Regex cheatsheet" [ref=e604]: + - img [ref=e606] [cursor=pointer]: + - img [ref=e607] + - link "Regex cheatsheet" [ref=e612] [cursor=pointer]: + - /url: /regex-memo + - menuitem "cURL to Code" [ref=e613]: + - img [ref=e615] [cursor=pointer]: + - img [ref=e616] + - link "cURL to Code" [ref=e620] [cursor=pointer]: + - /url: /curl-to-code + - menuitem "JSON to TypeScript/Go" [ref=e621]: + - img [ref=e623] [cursor=pointer]: + - img [ref=e624] + - link "JSON to TypeScript/Go" [ref=e629] [cursor=pointer]: + - /url: /json-to-types + - menuitem "CSS/JS Prettify & Minify" [ref=e630]: + - img [ref=e632] [cursor=pointer]: + - img [ref=e633] + - link "CSS/JS Prettify & Minify" [ref=e639] [cursor=pointer]: + - /url: /css-js-prettify-minify + - generic [ref=e640]: + - generic [ref=e641] [cursor=pointer]: + - img [ref=e643] + - generic [ref=e645]: Network + - menu [ref=e649]: + - menuitem "IPv4 subnet calculator" [ref=e650]: + - img [ref=e652] [cursor=pointer]: + - img [ref=e653] + - link "IPv4 subnet calculator" [ref=e655] [cursor=pointer]: + - /url: /ipv4-subnet-calculator + - menuitem "IPv4 address converter" [ref=e656]: + - img [ref=e658] [cursor=pointer]: + - img [ref=e659] + - link "IPv4 address converter" [ref=e665] [cursor=pointer]: + - /url: /ipv4-address-converter + - menuitem "IPv4 range expander" [ref=e666]: + - img [ref=e668] [cursor=pointer]: + - img [ref=e669] + - link "IPv4 range expander" [ref=e671] [cursor=pointer]: + - /url: /ipv4-range-expander + - menuitem "MAC address lookup" [ref=e672]: + - img [ref=e674] [cursor=pointer]: + - img [ref=e675] + - link "MAC address lookup" [ref=e679] [cursor=pointer]: + - /url: /mac-address-lookup + - menuitem "MAC address generator" [ref=e680]: + - img [ref=e682] [cursor=pointer]: + - img [ref=e683] + - link "MAC address generator" [ref=e687] [cursor=pointer]: + - /url: /mac-address-generator + - menuitem "IPv6 ULA generator" [ref=e688]: + - img [ref=e690] [cursor=pointer]: + - img [ref=e691] + - link "IPv6 ULA generator" [ref=e696] [cursor=pointer]: + - /url: /ipv6-ula-generator + - menuitem "DNS Query" [ref=e697]: + - img [ref=e699] [cursor=pointer]: + - img [ref=e700] + - link "DNS Query" [ref=e706] [cursor=pointer]: + - /url: /dns-query + - generic [ref=e707]: + - generic [ref=e708] [cursor=pointer]: + - img [ref=e710] + - generic [ref=e712]: Math + - menu [ref=e716]: + - menuitem "Math evaluator" [ref=e717]: + - img [ref=e719] [cursor=pointer]: + - img [ref=e720] + - link "Math evaluator" [ref=e724] [cursor=pointer]: + - /url: /math-evaluator + - menuitem "ETA calculator" [ref=e725]: + - img [ref=e727] [cursor=pointer]: + - img [ref=e728] + - link "ETA calculator" [ref=e732] [cursor=pointer]: + - /url: /eta-calculator + - menuitem "Percentage calculator" [ref=e733]: + - img [ref=e735] [cursor=pointer]: + - img [ref=e736] + - link "Percentage calculator" [ref=e741] [cursor=pointer]: + - /url: /percentage-calculator + - generic [ref=e742]: + - generic [ref=e743] [cursor=pointer]: + - img [ref=e745] + - generic [ref=e747]: Measurement + - menu [ref=e751]: + - menuitem "Chronometer" [ref=e752]: + - img [ref=e754] [cursor=pointer]: + - img [ref=e755] + - link "Chronometer" [ref=e757] [cursor=pointer]: + - /url: /chronometer + - menuitem "Temperature converter" [ref=e758]: + - img [ref=e760] [cursor=pointer]: + - img [ref=e761] + - link "Temperature converter" [ref=e764] [cursor=pointer]: + - /url: /temperature-converter + - menuitem "Benchmark builder" [ref=e765]: + - img [ref=e767] [cursor=pointer]: + - img [ref=e768] + - link "Benchmark builder" [ref=e770] [cursor=pointer]: + - /url: /benchmark-builder + - menuitem "Byte unit converter" [ref=e771]: + - img [ref=e773] [cursor=pointer]: + - img [ref=e774] + - link "Byte unit converter" [ref=e781] [cursor=pointer]: + - /url: /byte-unit-converter + - generic [ref=e782]: + - generic [ref=e783] [cursor=pointer]: + - img [ref=e785] + - generic [ref=e787]: Text + - menu [ref=e791]: + - menuitem "Lorem ipsum generator" [ref=e792]: + - img [ref=e794] [cursor=pointer]: + - img [ref=e795] + - link "Lorem ipsum generator" [ref=e797] [cursor=pointer]: + - /url: /lorem-ipsum-generator + - menuitem "Text statistics" [ref=e798]: + - img [ref=e800] [cursor=pointer]: + - img [ref=e801] + - link "Text statistics" [ref=e805] [cursor=pointer]: + - /url: /text-statistics + - menuitem "Emoji picker" [ref=e806]: + - img [ref=e808] [cursor=pointer]: + - img [ref=e809] + - link "Emoji picker" [ref=e813] [cursor=pointer]: + - /url: /emoji-picker + - menuitem "String obfuscator" [ref=e814]: + - img [ref=e816] [cursor=pointer]: + - img [ref=e817] + - link "String obfuscator" [ref=e822] [cursor=pointer]: + - /url: /string-obfuscator + - menuitem "Text diff" [ref=e823]: + - img [ref=e825] [cursor=pointer]: + - img [ref=e826] + - link "Text diff" [ref=e830] [cursor=pointer]: + - /url: /text-diff + - menuitem "Numeronym generator" [ref=e831]: + - img [ref=e833] [cursor=pointer]: + - img [ref=e834]: + - generic "n7m" [ref=e835] + - link "Numeronym generator" [ref=e836] [cursor=pointer]: + - /url: /numeronym-generator + - menuitem "ASCII Art Text Generator" [ref=e837]: + - img [ref=e839] [cursor=pointer]: + - img [ref=e840] + - link "ASCII Art Text Generator" [ref=e843] [cursor=pointer]: + - /url: /ascii-text-drawer + - generic [ref=e844]: + - generic [ref=e845] [cursor=pointer]: + - img [ref=e847] + - generic [ref=e849]: Data + - menu [ref=e853]: + - menuitem "Phone parser and formatter" [ref=e854]: + - img [ref=e856] [cursor=pointer]: + - img [ref=e857] + - link "Phone parser and formatter" [ref=e859] [cursor=pointer]: + - /url: /phone-parser-and-formatter + - menuitem "IBAN validator and parser" [ref=e860]: + - img [ref=e862] [cursor=pointer]: + - img [ref=e863] + - link "IBAN validator and parser" [ref=e865] [cursor=pointer]: + - /url: /iban-validator-and-parser + - generic [ref=e866]: + - generic [ref=e867]: + - text: IT-Tools + - link "v2024.10.22-7ca5933" [ref=e868] [cursor=pointer]: + - /url: https://github.com/CorentinTh/it-tools/tree/v2024.10.22-7ca5933 + - generic [ref=e869]: + - text: © 2026 + - link "Corentin Thomasset" [ref=e870] [cursor=pointer]: + - /url: https://corentin.tech?utm_source=it-tools&utm_medium=footer + - generic [ref=e873]: + - generic [ref=e874]: + - button "Toggle menu" [ref=e875] [cursor=pointer]: + - img [ref=e876]: + - img [ref=e877] + - link "Home" [ref=e881] [cursor=pointer]: + - /url: / + - img [ref=e882]: + - img [ref=e883] + - link "UI Lib" [ref=e890] [cursor=pointer]: + - /url: /c-lib + - img [ref=e891] + - button "Search Cmd + K" [ref=e894] [cursor=pointer]: + - generic [ref=e895]: + - img [ref=e896] + - text: Search + - generic [ref=e898]: Cmd + K + - generic [ref=e901] [cursor=pointer]: + - generic [ref=e902]: English + - img [ref=e903] + - generic [ref=e905]: + - link "IT-Tools GitHub repository" [ref=e908] [cursor=pointer]: + - /url: https://github.com/CorentinTh/it-tools + - img [ref=e909]: + - img [ref=e910] + - link "IT Tools X account" [ref=e914] [cursor=pointer]: + - /url: https://x.com/ittoolsdottech + - img [ref=e915]: + - img [ref=e916] + - link "About" [ref=e921] [cursor=pointer]: + - /url: /about + - img [ref=e922]: + - img [ref=e923] + - button "Toggle dark/light mode" [ref=e928] [cursor=pointer]: + - img [ref=e929]: + - img [ref=e930] + - link "Buy me a coffee" [ref=e934] [cursor=pointer]: + - /url: https://www.buymeacoffee.com/cthmsst + - text: Buy me a coffee + - img [ref=e935]: + - img [ref=e936] + - generic [ref=e939]: + - generic [ref=e940]: + - heading "DNS Query" [level=1] [ref=e941] + - button [ref=e945] [cursor=pointer]: + - img [ref=e946] + - generic [ref=e949]: Query DNS records (A, AAAA, CNAME, MX, TXT, NS, SOA, ...) for any domain name online using Cloudflare DNS. + - generic [ref=e951]: + - generic [ref=e952]: + - generic [ref=e953]: Domain name + - generic [ref=e955]: + - textbox "Domain name" [ref=e956]: + - /placeholder: e.g. example.com + - text: example.com + - button [ref=e957] [cursor=pointer]: + - img [ref=e958] + - generic [ref=e960]: + - generic [ref=e961]: Record type + - generic [ref=e963] [cursor=pointer]: + - generic [ref=e964]: A + - img [ref=e965] + - button "Query DNS" [active] [ref=e968] [cursor=pointer] + - generic [ref=e969]: + - generic [ref=e970]: + - generic [ref=e971]: "Status:" + - generic [ref=e972]: NOERROR + - table [ref=e973]: + - rowgroup [ref=e974]: + - row "Name TTL Data" [ref=e975]: + - columnheader "Name" [ref=e976] + - columnheader "TTL" [ref=e977] + - columnheader "Data" [ref=e978] + - rowgroup [ref=e979]: + - row "example.com 130s 172.66.147.243" [ref=e980]: + - cell "example.com" [ref=e981] + - cell "130s" [ref=e982] + - cell "172.66.147.243" [ref=e983] + - row "example.com 130s 104.20.23.154" [ref=e984]: + - cell "example.com" [ref=e985] + - cell "130s" [ref=e986] + - cell "104.20.23.154" [ref=e987] + - button "Copy results" [ref=e989] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-mcp/page-2026-06-12T07-25-19-177Z.yml b/.playwright-mcp/page-2026-06-12T07-25-19-177Z.yml new file mode 100644 index 0000000000..ab899c10fa --- /dev/null +++ b/.playwright-mcp/page-2026-06-12T07-25-19-177Z.yml @@ -0,0 +1,596 @@ +- generic [ref=e5]: + - complementary [ref=e6]: + - link "IT - TOOLS Handy tools for developers" [ref=e7] [cursor=pointer]: + - /url: / + - img [ref=e8] + - generic [ref=e13]: + - generic [ref=e14]: IT - TOOLS + - generic [ref=e16]: Handy tools for developers + - generic [ref=e17]: + - generic [ref=e18]: + - generic [ref=e19] [cursor=pointer]: + - img [ref=e21] + - generic [ref=e23]: Crypto + - menu [ref=e27]: + - menuitem "Token generator" [ref=e28]: + - img [ref=e30] [cursor=pointer]: + - img [ref=e31] + - link "Token generator" [ref=e37] [cursor=pointer]: + - /url: /token-generator + - menuitem "Hash text" [ref=e38]: + - img [ref=e40] [cursor=pointer]: + - img [ref=e41] + - link "Hash text" [ref=e46] [cursor=pointer]: + - /url: /hash-text + - menuitem "Bcrypt" [ref=e47]: + - img [ref=e49] [cursor=pointer]: + - img [ref=e50] + - link "Bcrypt" [ref=e55] [cursor=pointer]: + - /url: /bcrypt + - menuitem "UUIDs generator" [ref=e56]: + - img [ref=e58] [cursor=pointer]: + - img [ref=e59] + - link "UUIDs generator" [ref=e66] [cursor=pointer]: + - /url: /uuid-generator + - menuitem "ULID generator" [ref=e67]: + - img [ref=e69] [cursor=pointer]: + - img [ref=e70] + - link "ULID generator" [ref=e76] [cursor=pointer]: + - /url: /ulid-generator + - menuitem "Encrypt / decrypt text" [ref=e77]: + - img [ref=e79] [cursor=pointer]: + - img [ref=e80] + - link "Encrypt / decrypt text" [ref=e85] [cursor=pointer]: + - /url: /encryption + - menuitem "BIP39 passphrase generator" [ref=e86]: + - img [ref=e88] [cursor=pointer]: + - img [ref=e89] + - link "BIP39 passphrase generator" [ref=e91] [cursor=pointer]: + - /url: /bip39-generator + - menuitem "Hmac generator" [ref=e92]: + - img [ref=e94] [cursor=pointer]: + - img [ref=e95] + - link "Hmac generator" [ref=e97] [cursor=pointer]: + - /url: /hmac-generator + - menuitem "RSA key pair generator" [ref=e98]: + - img [ref=e100] [cursor=pointer]: + - img [ref=e101] + - link "RSA key pair generator" [ref=e106] [cursor=pointer]: + - /url: /rsa-key-pair-generator + - menuitem "Password strength analyser" [ref=e107]: + - img [ref=e109] [cursor=pointer]: + - img [ref=e110] + - link "Password strength analyser" [ref=e112] [cursor=pointer]: + - /url: /password-strength-analyser + - menuitem "PDF signature checker" [ref=e113]: + - img [ref=e115] [cursor=pointer]: + - img [ref=e116] + - link "PDF signature checker" [ref=e118] [cursor=pointer]: + - /url: /pdf-signature-checker + - menuitem "SSL Certificate Parser" [ref=e119]: + - img [ref=e121] [cursor=pointer]: + - img [ref=e122] + - link "SSL Certificate Parser" [ref=e129] [cursor=pointer]: + - /url: /ssl-certificate-parser + - generic [ref=e130]: + - generic [ref=e131] [cursor=pointer]: + - img [ref=e133] + - generic [ref=e135]: Converter + - menu [ref=e139]: + - menuitem "Date-time converter" [ref=e140]: + - img [ref=e142] [cursor=pointer]: + - img [ref=e143] + - link "Date-time converter" [ref=e146] [cursor=pointer]: + - /url: /date-converter + - menuitem "Integer base converter" [ref=e147]: + - img [ref=e149] [cursor=pointer]: + - img [ref=e150] + - link "Integer base converter" [ref=e154] [cursor=pointer]: + - /url: /base-converter + - menuitem "Roman numeral converter" [ref=e155]: + - img [ref=e157] [cursor=pointer]: + - img [ref=e158] + - link "Roman numeral converter" [ref=e162] [cursor=pointer]: + - /url: /roman-numeral-converter + - menuitem "Base64 string encoder/decoder" [ref=e163]: + - img [ref=e165] [cursor=pointer]: + - img [ref=e166] + - link "Base64 string encoder/decoder" [ref=e171] [cursor=pointer]: + - /url: /base64-string-converter + - menuitem "Base64 file converter" [ref=e172]: + - img [ref=e174] [cursor=pointer]: + - img [ref=e175] + - link "Base64 file converter" [ref=e180] [cursor=pointer]: + - /url: /base64-file-converter + - menuitem "Color converter" [ref=e181]: + - img [ref=e183] [cursor=pointer]: + - img [ref=e184] + - link "Color converter" [ref=e190] [cursor=pointer]: + - /url: /color-converter + - menuitem "Case converter" [ref=e191]: + - img [ref=e193] [cursor=pointer]: + - img [ref=e194] + - link "Case converter" [ref=e198] [cursor=pointer]: + - /url: /case-converter + - menuitem "Text to NATO alphabet" [ref=e199]: + - img [ref=e201] [cursor=pointer]: + - img [ref=e202] + - link "Text to NATO alphabet" [ref=e207] [cursor=pointer]: + - /url: /text-to-nato-alphabet + - menuitem "Text to ASCII binary" [ref=e208]: + - img [ref=e210] [cursor=pointer]: + - img [ref=e211] + - link "Text to ASCII binary" [ref=e217] [cursor=pointer]: + - /url: /text-to-binary + - menuitem "Text to Unicode" [ref=e218]: + - img [ref=e220] [cursor=pointer]: + - img [ref=e221] + - link "Text to Unicode" [ref=e224] [cursor=pointer]: + - /url: /text-to-unicode + - menuitem "YAML to JSON converter" [ref=e225]: + - img [ref=e227] [cursor=pointer]: + - img [ref=e228] + - link "YAML to JSON converter" [ref=e230] [cursor=pointer]: + - /url: /yaml-to-json-converter + - menuitem "YAML to TOML" [ref=e231]: + - img [ref=e233] [cursor=pointer]: + - img [ref=e234] + - link "YAML to TOML" [ref=e236] [cursor=pointer]: + - /url: /yaml-to-toml + - menuitem "JSON to YAML converter" [ref=e237]: + - img [ref=e239] [cursor=pointer]: + - img [ref=e240] + - link "JSON to YAML converter" [ref=e244] [cursor=pointer]: + - /url: /json-to-yaml-converter + - menuitem "JSON to TOML" [ref=e245]: + - img [ref=e247] [cursor=pointer]: + - img [ref=e248] + - link "JSON to TOML" [ref=e252] [cursor=pointer]: + - /url: /json-to-toml + - menuitem "List converter" [ref=e253]: + - img [ref=e255] [cursor=pointer]: + - img [ref=e256] + - link "List converter" [ref=e258] [cursor=pointer]: + - /url: /list-converter + - menuitem "TOML to JSON" [ref=e259]: + - img [ref=e261] [cursor=pointer]: + - img [ref=e262] + - link "TOML to JSON" [ref=e264] [cursor=pointer]: + - /url: /toml-to-json + - menuitem "TOML to YAML" [ref=e265]: + - img [ref=e267] [cursor=pointer]: + - img [ref=e268] + - link "TOML to YAML" [ref=e270] [cursor=pointer]: + - /url: /toml-to-yaml + - menuitem "XML to JSON" [ref=e271]: + - img [ref=e273] [cursor=pointer]: + - img [ref=e274] + - link "XML to JSON" [ref=e278] [cursor=pointer]: + - /url: /xml-to-json + - menuitem "JSON to XML" [ref=e279]: + - img [ref=e281] [cursor=pointer]: + - img [ref=e282] + - link "JSON to XML" [ref=e286] [cursor=pointer]: + - /url: /json-to-xml + - menuitem "Markdown to HTML" [ref=e287]: + - img [ref=e289] [cursor=pointer]: + - img [ref=e290] + - link "Markdown to HTML" [ref=e295] [cursor=pointer]: + - /url: /markdown-to-html + - menuitem "HTML to Markdown" [ref=e296]: + - img [ref=e298] [cursor=pointer]: + - img [ref=e299] + - link "HTML to Markdown" [ref=e305] [cursor=pointer]: + - /url: /html-to-markdown + - generic [ref=e306]: + - generic [ref=e307] [cursor=pointer]: + - img [ref=e309] + - generic [ref=e311]: Web + - menu [ref=e315]: + - menuitem "Encode/decode URL-formatted strings" [ref=e316]: + - img [ref=e318] [cursor=pointer]: + - img [ref=e319] + - link "Encode/decode URL-formatted strings" [ref=e323] [cursor=pointer]: + - /url: /url-encoder + - menuitem "Escape HTML entities" [ref=e324]: + - img [ref=e326] [cursor=pointer]: + - img [ref=e327] + - link "Escape HTML entities" [ref=e332] [cursor=pointer]: + - /url: /html-entities + - menuitem "URL parser" [ref=e333]: + - img [ref=e335] [cursor=pointer]: + - img [ref=e336] + - link "URL parser" [ref=e340] [cursor=pointer]: + - /url: /url-parser + - menuitem "Device information" [ref=e341]: + - img [ref=e343] [cursor=pointer]: + - img [ref=e344] + - link "Device information" [ref=e347] [cursor=pointer]: + - /url: /device-information + - menuitem "Basic auth generator" [ref=e348]: + - img [ref=e350] [cursor=pointer]: + - img [ref=e351] + - link "Basic auth generator" [ref=e353] [cursor=pointer]: + - /url: /basic-auth-generator + - menuitem "Open graph meta generator" [ref=e354]: + - img [ref=e356] [cursor=pointer]: + - img [ref=e357] + - link "Open graph meta generator" [ref=e361] [cursor=pointer]: + - /url: /og-meta-generator + - menuitem "OTP code generator" [ref=e362]: + - img [ref=e364] [cursor=pointer]: + - img [ref=e365] + - link "OTP code generator" [ref=e368] [cursor=pointer]: + - /url: /otp-generator + - menuitem "MIME types" [ref=e369]: + - img [ref=e371] [cursor=pointer]: + - img [ref=e372] + - link "MIME types" [ref=e377] [cursor=pointer]: + - /url: /mime-types + - menuitem "JWT parser" [ref=e378]: + - img [ref=e380] [cursor=pointer]: + - img [ref=e381] + - link "JWT parser" [ref=e387] [cursor=pointer]: + - /url: /jwt-parser + - menuitem "Keycode info" [ref=e388]: + - img [ref=e390] [cursor=pointer]: + - img [ref=e391] + - link "Keycode info" [ref=e394] [cursor=pointer]: + - /url: /keycode-info + - menuitem "Slugify string" [ref=e395]: + - img [ref=e397] [cursor=pointer]: + - img [ref=e398] + - link "Slugify string" [ref=e400] [cursor=pointer]: + - /url: /slugify-string + - menuitem "HTML WYSIWYG editor" [ref=e401]: + - img [ref=e403] [cursor=pointer]: + - img [ref=e404] + - link "HTML WYSIWYG editor" [ref=e409] [cursor=pointer]: + - /url: /html-wysiwyg-editor + - menuitem "User-agent parser" [ref=e410]: + - img [ref=e412] [cursor=pointer]: + - img [ref=e413] + - link "User-agent parser" [ref=e416] [cursor=pointer]: + - /url: /user-agent-parser + - menuitem "HTTP status codes" [ref=e417]: + - img [ref=e419] [cursor=pointer]: + - img [ref=e420] + - link "HTTP status codes" [ref=e422] [cursor=pointer]: + - /url: /http-status-codes + - menuitem "JSON diff" [ref=e423]: + - img [ref=e425] [cursor=pointer]: + - img [ref=e426] + - link "JSON diff" [ref=e428] [cursor=pointer]: + - /url: /json-diff + - menuitem "Outlook Safelink decoder" [ref=e429]: + - img [ref=e431] [cursor=pointer]: + - img [ref=e432] + - link "Outlook Safelink decoder" [ref=e436] [cursor=pointer]: + - /url: /safelink-decoder + - generic [ref=e437]: + - generic [ref=e438] [cursor=pointer]: + - img [ref=e440] + - generic [ref=e442]: Images & Videos + - menu [ref=e446]: + - menuitem "QR Code generator" [ref=e447]: + - img [ref=e449] [cursor=pointer]: + - img [ref=e450] + - link "QR Code generator" [ref=e455] [cursor=pointer]: + - /url: /qrcode-generator + - menuitem "WiFi QR Code generator" [ref=e456]: + - img [ref=e458] [cursor=pointer]: + - img [ref=e459] + - link "WiFi QR Code generator" [ref=e464] [cursor=pointer]: + - /url: /wifi-qrcode-generator + - menuitem "SVG placeholder generator" [ref=e465]: + - img [ref=e467] [cursor=pointer]: + - img [ref=e468] + - link "SVG placeholder generator" [ref=e470] [cursor=pointer]: + - /url: /svg-placeholder-generator + - menuitem "Camera recorder" [ref=e471]: + - img [ref=e473] [cursor=pointer]: + - img [ref=e474] + - link "Camera recorder" [ref=e478] [cursor=pointer]: + - /url: /camera-recorder + - generic [ref=e479]: + - generic [ref=e480] [cursor=pointer]: + - img [ref=e482] + - generic [ref=e484]: Development + - menu [ref=e488]: + - menuitem "Git cheatsheet" [ref=e489]: + - img [ref=e491] [cursor=pointer]: + - img [ref=e492] + - link "Git cheatsheet" [ref=e500] [cursor=pointer]: + - /url: /git-memo + - menuitem "Random port generator" [ref=e501]: + - img [ref=e503] [cursor=pointer]: + - img [ref=e504] + - link "Random port generator" [ref=e508] [cursor=pointer]: + - /url: /random-port-generator + - menuitem "Crontab generator" [ref=e509]: + - img [ref=e511] [cursor=pointer]: + - img [ref=e512] + - link "Crontab generator" [ref=e518] [cursor=pointer]: + - /url: /crontab-generator + - menuitem "JSON prettify and format" [ref=e519]: + - img [ref=e521] [cursor=pointer]: + - img [ref=e522] + - link "JSON prettify and format" [ref=e526] [cursor=pointer]: + - /url: /json-prettify + - menuitem "JSON minify" [ref=e527]: + - img [ref=e529] [cursor=pointer]: + - img [ref=e530] + - link "JSON minify" [ref=e534] [cursor=pointer]: + - /url: /json-minify + - menuitem "JSON to CSV" [ref=e535]: + - img [ref=e537] [cursor=pointer]: + - img [ref=e538] + - link "JSON to CSV" [ref=e540] [cursor=pointer]: + - /url: /json-to-csv + - menuitem "SQL prettify and format" [ref=e541]: + - img [ref=e543] [cursor=pointer]: + - img [ref=e544] + - link "SQL prettify and format" [ref=e549] [cursor=pointer]: + - /url: /sql-prettify + - menuitem "Chmod calculator" [ref=e550]: + - img [ref=e552] [cursor=pointer]: + - img [ref=e553] + - link "Chmod calculator" [ref=e557] [cursor=pointer]: + - /url: /chmod-calculator + - menuitem "Docker run to Docker compose converter" [ref=e558]: + - img [ref=e560] [cursor=pointer]: + - img [ref=e561] + - link "Docker run to Docker compose converter" [ref=e571] [cursor=pointer]: + - /url: /docker-run-to-docker-compose-converter + - menuitem "XML formatter" [ref=e572]: + - img [ref=e574] [cursor=pointer]: + - img [ref=e575] + - link "XML formatter" [ref=e580] [cursor=pointer]: + - /url: /xml-formatter + - menuitem "YAML prettify and format" [ref=e581]: + - img [ref=e583] [cursor=pointer]: + - img [ref=e584] + - link "YAML prettify and format" [ref=e586] [cursor=pointer]: + - /url: /yaml-prettify + - menuitem "Email normalizer" [ref=e587]: + - img [ref=e589] [cursor=pointer]: + - img [ref=e590] + - link "Email normalizer" [ref=e594] [cursor=pointer]: + - /url: /email-normalizer + - menuitem "Regex Tester" [ref=e595]: + - img [ref=e597] [cursor=pointer]: + - img [ref=e598] + - link "Regex Tester" [ref=e603] [cursor=pointer]: + - /url: /regex-tester + - menuitem "Regex cheatsheet" [ref=e604]: + - img [ref=e606] [cursor=pointer]: + - img [ref=e607] + - link "Regex cheatsheet" [ref=e612] [cursor=pointer]: + - /url: /regex-memo + - menuitem "cURL to Code" [ref=e613]: + - img [ref=e615] [cursor=pointer]: + - img [ref=e616] + - link "cURL to Code" [ref=e620] [cursor=pointer]: + - /url: /curl-to-code + - menuitem "JSON to TypeScript/Go" [ref=e621]: + - img [ref=e623] [cursor=pointer]: + - img [ref=e624] + - link "JSON to TypeScript/Go" [ref=e629] [cursor=pointer]: + - /url: /json-to-types + - menuitem "CSS/JS Prettify & Minify" [ref=e630]: + - img [ref=e632] [cursor=pointer]: + - img [ref=e633] + - link "CSS/JS Prettify & Minify" [ref=e639] [cursor=pointer]: + - /url: /css-js-prettify-minify + - generic [ref=e640]: + - generic [ref=e641] [cursor=pointer]: + - img [ref=e643] + - generic [ref=e645]: Network + - menu [ref=e649]: + - menuitem "IPv4 subnet calculator" [ref=e650]: + - img [ref=e652] [cursor=pointer]: + - img [ref=e653] + - link "IPv4 subnet calculator" [ref=e655] [cursor=pointer]: + - /url: /ipv4-subnet-calculator + - menuitem "IPv4 address converter" [ref=e656]: + - img [ref=e658] [cursor=pointer]: + - img [ref=e659] + - link "IPv4 address converter" [ref=e665] [cursor=pointer]: + - /url: /ipv4-address-converter + - menuitem "IPv4 range expander" [ref=e666]: + - img [ref=e668] [cursor=pointer]: + - img [ref=e669] + - link "IPv4 range expander" [ref=e671] [cursor=pointer]: + - /url: /ipv4-range-expander + - menuitem "MAC address lookup" [ref=e672]: + - img [ref=e674] [cursor=pointer]: + - img [ref=e675] + - link "MAC address lookup" [ref=e679] [cursor=pointer]: + - /url: /mac-address-lookup + - menuitem "MAC address generator" [ref=e680]: + - img [ref=e682] [cursor=pointer]: + - img [ref=e683] + - link "MAC address generator" [ref=e687] [cursor=pointer]: + - /url: /mac-address-generator + - menuitem "IPv6 ULA generator" [ref=e688]: + - img [ref=e690] [cursor=pointer]: + - img [ref=e691] + - link "IPv6 ULA generator" [ref=e696] [cursor=pointer]: + - /url: /ipv6-ula-generator + - menuitem "DNS Query" [ref=e697]: + - img [ref=e699] [cursor=pointer]: + - img [ref=e700] + - link "DNS Query" [ref=e706] [cursor=pointer]: + - /url: /dns-query + - generic [ref=e707]: + - generic [ref=e708] [cursor=pointer]: + - img [ref=e710] + - generic [ref=e712]: Math + - menu [ref=e716]: + - menuitem "Math evaluator" [ref=e717]: + - img [ref=e719] [cursor=pointer]: + - img [ref=e720] + - link "Math evaluator" [ref=e724] [cursor=pointer]: + - /url: /math-evaluator + - menuitem "ETA calculator" [ref=e725]: + - img [ref=e727] [cursor=pointer]: + - img [ref=e728] + - link "ETA calculator" [ref=e732] [cursor=pointer]: + - /url: /eta-calculator + - menuitem "Percentage calculator" [ref=e733]: + - img [ref=e735] [cursor=pointer]: + - img [ref=e736] + - link "Percentage calculator" [ref=e741] [cursor=pointer]: + - /url: /percentage-calculator + - generic [ref=e742]: + - generic [ref=e743] [cursor=pointer]: + - img [ref=e745] + - generic [ref=e747]: Measurement + - menu [ref=e751]: + - menuitem "Chronometer" [ref=e752]: + - img [ref=e754] [cursor=pointer]: + - img [ref=e755] + - link "Chronometer" [ref=e757] [cursor=pointer]: + - /url: /chronometer + - menuitem "Temperature converter" [ref=e758]: + - img [ref=e760] [cursor=pointer]: + - img [ref=e761] + - link "Temperature converter" [ref=e764] [cursor=pointer]: + - /url: /temperature-converter + - menuitem "Benchmark builder" [ref=e765]: + - img [ref=e767] [cursor=pointer]: + - img [ref=e768] + - link "Benchmark builder" [ref=e770] [cursor=pointer]: + - /url: /benchmark-builder + - menuitem "Byte unit converter" [ref=e771]: + - img [ref=e773] [cursor=pointer]: + - img [ref=e774] + - link "Byte unit converter" [ref=e781] [cursor=pointer]: + - /url: /byte-unit-converter + - generic [ref=e782]: + - generic [ref=e783] [cursor=pointer]: + - img [ref=e785] + - generic [ref=e787]: Text + - menu [ref=e791]: + - menuitem "Lorem ipsum generator" [ref=e792]: + - img [ref=e794] [cursor=pointer]: + - img [ref=e795] + - link "Lorem ipsum generator" [ref=e797] [cursor=pointer]: + - /url: /lorem-ipsum-generator + - menuitem "Text statistics" [ref=e798]: + - img [ref=e800] [cursor=pointer]: + - img [ref=e801] + - link "Text statistics" [ref=e805] [cursor=pointer]: + - /url: /text-statistics + - menuitem "Emoji picker" [ref=e806]: + - img [ref=e808] [cursor=pointer]: + - img [ref=e809] + - link "Emoji picker" [ref=e813] [cursor=pointer]: + - /url: /emoji-picker + - menuitem "String obfuscator" [ref=e814]: + - img [ref=e816] [cursor=pointer]: + - img [ref=e817] + - link "String obfuscator" [ref=e822] [cursor=pointer]: + - /url: /string-obfuscator + - menuitem "Text diff" [ref=e823]: + - img [ref=e825] [cursor=pointer]: + - img [ref=e826] + - link "Text diff" [ref=e830] [cursor=pointer]: + - /url: /text-diff + - menuitem "Numeronym generator" [ref=e831]: + - img [ref=e833] [cursor=pointer]: + - img [ref=e834]: + - generic "n7m" [ref=e835] + - link "Numeronym generator" [ref=e836] [cursor=pointer]: + - /url: /numeronym-generator + - menuitem "ASCII Art Text Generator" [ref=e837]: + - img [ref=e839] [cursor=pointer]: + - img [ref=e840] + - link "ASCII Art Text Generator" [ref=e843] [cursor=pointer]: + - /url: /ascii-text-drawer + - generic [ref=e844]: + - generic [ref=e845] [cursor=pointer]: + - img [ref=e847] + - generic [ref=e849]: Data + - menu [ref=e853]: + - menuitem "Phone parser and formatter" [ref=e854]: + - img [ref=e856] [cursor=pointer]: + - img [ref=e857] + - link "Phone parser and formatter" [ref=e859] [cursor=pointer]: + - /url: /phone-parser-and-formatter + - menuitem "IBAN validator and parser" [ref=e860]: + - img [ref=e862] [cursor=pointer]: + - img [ref=e863] + - link "IBAN validator and parser" [ref=e865] [cursor=pointer]: + - /url: /iban-validator-and-parser + - generic [ref=e866]: + - generic [ref=e867]: + - text: IT-Tools + - link "v2024.10.22-7ca5933" [ref=e868] [cursor=pointer]: + - /url: https://github.com/CorentinTh/it-tools/tree/v2024.10.22-7ca5933 + - generic [ref=e869]: + - text: © 2026 + - link "Corentin Thomasset" [ref=e870] [cursor=pointer]: + - /url: https://corentin.tech?utm_source=it-tools&utm_medium=footer + - generic [ref=e873]: + - generic [ref=e874]: + - button "Toggle menu" [ref=e875] [cursor=pointer]: + - img [ref=e876]: + - img [ref=e877] + - link "Home" [ref=e881] [cursor=pointer]: + - /url: / + - img [ref=e882]: + - img [ref=e883] + - link "UI Lib" [ref=e890] [cursor=pointer]: + - /url: /c-lib + - img [ref=e891] + - button "Search Cmd + K" [ref=e894] [cursor=pointer]: + - generic [ref=e895]: + - img [ref=e896] + - text: Search + - generic [ref=e898]: Cmd + K + - generic [ref=e901] [cursor=pointer]: + - generic [ref=e902]: English + - img [ref=e903] + - generic [ref=e905]: + - link "IT-Tools GitHub repository" [ref=e908] [cursor=pointer]: + - /url: https://github.com/CorentinTh/it-tools + - img [ref=e909]: + - img [ref=e910] + - link "IT Tools X account" [ref=e914] [cursor=pointer]: + - /url: https://x.com/ittoolsdottech + - img [ref=e915]: + - img [ref=e916] + - link "About" [ref=e921] [cursor=pointer]: + - /url: /about + - img [ref=e922]: + - img [ref=e923] + - button "Toggle dark/light mode" [ref=e928] [cursor=pointer]: + - img [ref=e929]: + - img [ref=e930] + - link "Buy me a coffee" [ref=e934] [cursor=pointer]: + - /url: https://www.buymeacoffee.com/cthmsst + - text: Buy me a coffee + - img [ref=e935]: + - img [ref=e936] + - generic [ref=e939]: + - generic [ref=e940]: + - heading "DNS Query" [level=1] [ref=e941] + - button [ref=e945] [cursor=pointer]: + - img [ref=e946] + - generic [ref=e949]: Query DNS records (A, AAAA, CNAME, MX, TXT, NS, SOA, ...) for any domain name online using Cloudflare DNS. + - generic [ref=e951]: + - generic [ref=e952]: + - generic [ref=e953]: Domain name + - generic [ref=e955]: + - textbox "Domain name" [ref=e956]: + - /placeholder: e.g. example.com + - text: example.com + - button [ref=e957] [cursor=pointer]: + - img [ref=e958] + - generic [ref=e960]: + - generic [ref=e961]: Record type + - generic [ref=e963] [cursor=pointer]: + - generic [ref=e964]: A + - img [ref=e965] + - button "Query DNS" [ref=e968] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-mcp/page-2026-06-12T07-29-28-690Z.yml b/.playwright-mcp/page-2026-06-12T07-29-28-690Z.yml new file mode 100644 index 0000000000..c7d31a12bd --- /dev/null +++ b/.playwright-mcp/page-2026-06-12T07-29-28-690Z.yml @@ -0,0 +1,616 @@ +- generic [ref=e5]: + - complementary [ref=e6]: + - link "IT - TOOLS Handy tools for developers" [ref=e7] [cursor=pointer]: + - /url: / + - img [ref=e8] + - generic [ref=e13]: + - generic [ref=e14]: IT - TOOLS + - generic [ref=e16]: Handy tools for developers + - generic [ref=e17]: + - generic [ref=e18]: + - generic [ref=e19] [cursor=pointer]: + - img [ref=e21] + - generic [ref=e23]: Crypto + - menu [ref=e27]: + - menuitem "Token generator" [ref=e28]: + - img [ref=e30] [cursor=pointer]: + - img [ref=e31] + - link "Token generator" [ref=e37] [cursor=pointer]: + - /url: /token-generator + - menuitem "Hash text" [ref=e38]: + - img [ref=e40] [cursor=pointer]: + - img [ref=e41] + - link "Hash text" [ref=e46] [cursor=pointer]: + - /url: /hash-text + - menuitem "Bcrypt" [ref=e47]: + - img [ref=e49] [cursor=pointer]: + - img [ref=e50] + - link "Bcrypt" [ref=e55] [cursor=pointer]: + - /url: /bcrypt + - menuitem "UUIDs generator" [ref=e56]: + - img [ref=e58] [cursor=pointer]: + - img [ref=e59] + - link "UUIDs generator" [ref=e66] [cursor=pointer]: + - /url: /uuid-generator + - menuitem "ULID generator" [ref=e67]: + - img [ref=e69] [cursor=pointer]: + - img [ref=e70] + - link "ULID generator" [ref=e76] [cursor=pointer]: + - /url: /ulid-generator + - menuitem "Encrypt / decrypt text" [ref=e77]: + - img [ref=e79] [cursor=pointer]: + - img [ref=e80] + - link "Encrypt / decrypt text" [ref=e85] [cursor=pointer]: + - /url: /encryption + - menuitem "BIP39 passphrase generator" [ref=e86]: + - img [ref=e88] [cursor=pointer]: + - img [ref=e89] + - link "BIP39 passphrase generator" [ref=e91] [cursor=pointer]: + - /url: /bip39-generator + - menuitem "Hmac generator" [ref=e92]: + - img [ref=e94] [cursor=pointer]: + - img [ref=e95] + - link "Hmac generator" [ref=e97] [cursor=pointer]: + - /url: /hmac-generator + - menuitem "RSA key pair generator" [ref=e98]: + - img [ref=e100] [cursor=pointer]: + - img [ref=e101] + - link "RSA key pair generator" [ref=e106] [cursor=pointer]: + - /url: /rsa-key-pair-generator + - menuitem "Password strength analyser" [ref=e107]: + - img [ref=e109] [cursor=pointer]: + - img [ref=e110] + - link "Password strength analyser" [ref=e112] [cursor=pointer]: + - /url: /password-strength-analyser + - menuitem "PDF signature checker" [ref=e113]: + - img [ref=e115] [cursor=pointer]: + - img [ref=e116] + - link "PDF signature checker" [ref=e118] [cursor=pointer]: + - /url: /pdf-signature-checker + - menuitem "SSL Certificate Parser" [ref=e119]: + - img [ref=e121] [cursor=pointer]: + - img [ref=e122] + - link "SSL Certificate Parser" [ref=e129] [cursor=pointer]: + - /url: /ssl-certificate-parser + - generic [ref=e130]: + - generic [ref=e131] [cursor=pointer]: + - img [ref=e133] + - generic [ref=e135]: Converter + - menu [ref=e139]: + - menuitem "Date-time converter" [ref=e140]: + - img [ref=e142] [cursor=pointer]: + - img [ref=e143] + - link "Date-time converter" [ref=e146] [cursor=pointer]: + - /url: /date-converter + - menuitem "Integer base converter" [ref=e147]: + - img [ref=e149] [cursor=pointer]: + - img [ref=e150] + - link "Integer base converter" [ref=e154] [cursor=pointer]: + - /url: /base-converter + - menuitem "Roman numeral converter" [ref=e155]: + - img [ref=e157] [cursor=pointer]: + - img [ref=e158] + - link "Roman numeral converter" [ref=e162] [cursor=pointer]: + - /url: /roman-numeral-converter + - menuitem "Base64 string encoder/decoder" [ref=e163]: + - img [ref=e165] [cursor=pointer]: + - img [ref=e166] + - link "Base64 string encoder/decoder" [ref=e171] [cursor=pointer]: + - /url: /base64-string-converter + - menuitem "Base64 file converter" [ref=e172]: + - img [ref=e174] [cursor=pointer]: + - img [ref=e175] + - link "Base64 file converter" [ref=e180] [cursor=pointer]: + - /url: /base64-file-converter + - menuitem "Color converter" [ref=e181]: + - img [ref=e183] [cursor=pointer]: + - img [ref=e184] + - link "Color converter" [ref=e190] [cursor=pointer]: + - /url: /color-converter + - menuitem "Case converter" [ref=e191]: + - img [ref=e193] [cursor=pointer]: + - img [ref=e194] + - link "Case converter" [ref=e198] [cursor=pointer]: + - /url: /case-converter + - menuitem "Text to NATO alphabet" [ref=e199]: + - img [ref=e201] [cursor=pointer]: + - img [ref=e202] + - link "Text to NATO alphabet" [ref=e207] [cursor=pointer]: + - /url: /text-to-nato-alphabet + - menuitem "Text to ASCII binary" [ref=e208]: + - img [ref=e210] [cursor=pointer]: + - img [ref=e211] + - link "Text to ASCII binary" [ref=e217] [cursor=pointer]: + - /url: /text-to-binary + - menuitem "Text to Unicode" [ref=e218]: + - img [ref=e220] [cursor=pointer]: + - img [ref=e221] + - link "Text to Unicode" [ref=e224] [cursor=pointer]: + - /url: /text-to-unicode + - menuitem "YAML to JSON converter" [ref=e225]: + - img [ref=e227] [cursor=pointer]: + - img [ref=e228] + - link "YAML to JSON converter" [ref=e230] [cursor=pointer]: + - /url: /yaml-to-json-converter + - menuitem "YAML to TOML" [ref=e231]: + - img [ref=e233] [cursor=pointer]: + - img [ref=e234] + - link "YAML to TOML" [ref=e236] [cursor=pointer]: + - /url: /yaml-to-toml + - menuitem "JSON to YAML converter" [ref=e237]: + - img [ref=e239] [cursor=pointer]: + - img [ref=e240] + - link "JSON to YAML converter" [ref=e244] [cursor=pointer]: + - /url: /json-to-yaml-converter + - menuitem "JSON to TOML" [ref=e245]: + - img [ref=e247] [cursor=pointer]: + - img [ref=e248] + - link "JSON to TOML" [ref=e252] [cursor=pointer]: + - /url: /json-to-toml + - menuitem "List converter" [ref=e253]: + - img [ref=e255] [cursor=pointer]: + - img [ref=e256] + - link "List converter" [ref=e258] [cursor=pointer]: + - /url: /list-converter + - menuitem "TOML to JSON" [ref=e259]: + - img [ref=e261] [cursor=pointer]: + - img [ref=e262] + - link "TOML to JSON" [ref=e264] [cursor=pointer]: + - /url: /toml-to-json + - menuitem "TOML to YAML" [ref=e265]: + - img [ref=e267] [cursor=pointer]: + - img [ref=e268] + - link "TOML to YAML" [ref=e270] [cursor=pointer]: + - /url: /toml-to-yaml + - menuitem "XML to JSON" [ref=e271]: + - img [ref=e273] [cursor=pointer]: + - img [ref=e274] + - link "XML to JSON" [ref=e278] [cursor=pointer]: + - /url: /xml-to-json + - menuitem "JSON to XML" [ref=e279]: + - img [ref=e281] [cursor=pointer]: + - img [ref=e282] + - link "JSON to XML" [ref=e286] [cursor=pointer]: + - /url: /json-to-xml + - menuitem "Markdown to HTML" [ref=e287]: + - img [ref=e289] [cursor=pointer]: + - img [ref=e290] + - link "Markdown to HTML" [ref=e295] [cursor=pointer]: + - /url: /markdown-to-html + - menuitem "HTML to Markdown" [ref=e296]: + - img [ref=e298] [cursor=pointer]: + - img [ref=e299] + - link "HTML to Markdown" [ref=e305] [cursor=pointer]: + - /url: /html-to-markdown + - generic [ref=e306]: + - generic [ref=e307] [cursor=pointer]: + - img [ref=e309] + - generic [ref=e311]: Web + - menu [ref=e315]: + - menuitem "Encode/decode URL-formatted strings" [ref=e316]: + - img [ref=e318] [cursor=pointer]: + - img [ref=e319] + - link "Encode/decode URL-formatted strings" [ref=e323] [cursor=pointer]: + - /url: /url-encoder + - menuitem "Escape HTML entities" [ref=e324]: + - img [ref=e326] [cursor=pointer]: + - img [ref=e327] + - link "Escape HTML entities" [ref=e332] [cursor=pointer]: + - /url: /html-entities + - menuitem "URL parser" [ref=e333]: + - img [ref=e335] [cursor=pointer]: + - img [ref=e336] + - link "URL parser" [ref=e340] [cursor=pointer]: + - /url: /url-parser + - menuitem "Device information" [ref=e341]: + - img [ref=e343] [cursor=pointer]: + - img [ref=e344] + - link "Device information" [ref=e347] [cursor=pointer]: + - /url: /device-information + - menuitem "Basic auth generator" [ref=e348]: + - img [ref=e350] [cursor=pointer]: + - img [ref=e351] + - link "Basic auth generator" [ref=e353] [cursor=pointer]: + - /url: /basic-auth-generator + - menuitem "Open graph meta generator" [ref=e354]: + - img [ref=e356] [cursor=pointer]: + - img [ref=e357] + - link "Open graph meta generator" [ref=e361] [cursor=pointer]: + - /url: /og-meta-generator + - menuitem "OTP code generator" [ref=e362]: + - img [ref=e364] [cursor=pointer]: + - img [ref=e365] + - link "OTP code generator" [ref=e368] [cursor=pointer]: + - /url: /otp-generator + - menuitem "MIME types" [ref=e369]: + - img [ref=e371] [cursor=pointer]: + - img [ref=e372] + - link "MIME types" [ref=e377] [cursor=pointer]: + - /url: /mime-types + - menuitem "JWT parser" [ref=e378]: + - img [ref=e380] [cursor=pointer]: + - img [ref=e381] + - link "JWT parser" [ref=e387] [cursor=pointer]: + - /url: /jwt-parser + - menuitem "Keycode info" [ref=e388]: + - img [ref=e390] [cursor=pointer]: + - img [ref=e391] + - link "Keycode info" [ref=e394] [cursor=pointer]: + - /url: /keycode-info + - menuitem "Slugify string" [ref=e395]: + - img [ref=e397] [cursor=pointer]: + - img [ref=e398] + - link "Slugify string" [ref=e400] [cursor=pointer]: + - /url: /slugify-string + - menuitem "HTML WYSIWYG editor" [ref=e401]: + - img [ref=e403] [cursor=pointer]: + - img [ref=e404] + - link "HTML WYSIWYG editor" [ref=e409] [cursor=pointer]: + - /url: /html-wysiwyg-editor + - menuitem "User-agent parser" [ref=e410]: + - img [ref=e412] [cursor=pointer]: + - img [ref=e413] + - link "User-agent parser" [ref=e416] [cursor=pointer]: + - /url: /user-agent-parser + - menuitem "HTTP status codes" [ref=e417]: + - img [ref=e419] [cursor=pointer]: + - img [ref=e420] + - link "HTTP status codes" [ref=e422] [cursor=pointer]: + - /url: /http-status-codes + - menuitem "JSON diff" [ref=e423]: + - img [ref=e425] [cursor=pointer]: + - img [ref=e426] + - link "JSON diff" [ref=e428] [cursor=pointer]: + - /url: /json-diff + - menuitem "Outlook Safelink decoder" [ref=e429]: + - img [ref=e431] [cursor=pointer]: + - img [ref=e432] + - link "Outlook Safelink decoder" [ref=e436] [cursor=pointer]: + - /url: /safelink-decoder + - generic [ref=e437]: + - generic [ref=e438] [cursor=pointer]: + - img [ref=e440] + - generic [ref=e442]: Images & Videos + - menu [ref=e446]: + - menuitem "QR Code generator" [ref=e447]: + - img [ref=e449] [cursor=pointer]: + - img [ref=e450] + - link "QR Code generator" [ref=e455] [cursor=pointer]: + - /url: /qrcode-generator + - menuitem "WiFi QR Code generator" [ref=e456]: + - img [ref=e458] [cursor=pointer]: + - img [ref=e459] + - link "WiFi QR Code generator" [ref=e464] [cursor=pointer]: + - /url: /wifi-qrcode-generator + - menuitem "SVG placeholder generator" [ref=e465]: + - img [ref=e467] [cursor=pointer]: + - img [ref=e468] + - link "SVG placeholder generator" [ref=e470] [cursor=pointer]: + - /url: /svg-placeholder-generator + - menuitem "Camera recorder" [ref=e471]: + - img [ref=e473] [cursor=pointer]: + - img [ref=e474] + - link "Camera recorder" [ref=e478] [cursor=pointer]: + - /url: /camera-recorder + - generic [ref=e479]: + - generic [ref=e480] [cursor=pointer]: + - img [ref=e482] + - generic [ref=e484]: Development + - menu [ref=e488]: + - menuitem "Git cheatsheet" [ref=e489]: + - img [ref=e491] [cursor=pointer]: + - img [ref=e492] + - link "Git cheatsheet" [ref=e500] [cursor=pointer]: + - /url: /git-memo + - menuitem "Random port generator" [ref=e501]: + - img [ref=e503] [cursor=pointer]: + - img [ref=e504] + - link "Random port generator" [ref=e508] [cursor=pointer]: + - /url: /random-port-generator + - menuitem "Crontab generator" [ref=e509]: + - img [ref=e511] [cursor=pointer]: + - img [ref=e512] + - link "Crontab generator" [ref=e518] [cursor=pointer]: + - /url: /crontab-generator + - menuitem "JSON prettify and format" [ref=e519]: + - img [ref=e521] [cursor=pointer]: + - img [ref=e522] + - link "JSON prettify and format" [ref=e526] [cursor=pointer]: + - /url: /json-prettify + - menuitem "JSON minify" [ref=e527]: + - img [ref=e529] [cursor=pointer]: + - img [ref=e530] + - link "JSON minify" [ref=e534] [cursor=pointer]: + - /url: /json-minify + - menuitem "JSON to CSV" [ref=e535]: + - img [ref=e537] [cursor=pointer]: + - img [ref=e538] + - link "JSON to CSV" [ref=e540] [cursor=pointer]: + - /url: /json-to-csv + - menuitem "SQL prettify and format" [ref=e541]: + - img [ref=e543] [cursor=pointer]: + - img [ref=e544] + - link "SQL prettify and format" [ref=e549] [cursor=pointer]: + - /url: /sql-prettify + - menuitem "Chmod calculator" [ref=e550]: + - img [ref=e552] [cursor=pointer]: + - img [ref=e553] + - link "Chmod calculator" [ref=e557] [cursor=pointer]: + - /url: /chmod-calculator + - menuitem "Docker run to Docker compose converter" [ref=e558]: + - img [ref=e560] [cursor=pointer]: + - img [ref=e561] + - link "Docker run to Docker compose converter" [ref=e571] [cursor=pointer]: + - /url: /docker-run-to-docker-compose-converter + - menuitem "XML formatter" [ref=e572]: + - img [ref=e574] [cursor=pointer]: + - img [ref=e575] + - link "XML formatter" [ref=e580] [cursor=pointer]: + - /url: /xml-formatter + - menuitem "YAML prettify and format" [ref=e581]: + - img [ref=e583] [cursor=pointer]: + - img [ref=e584] + - link "YAML prettify and format" [ref=e586] [cursor=pointer]: + - /url: /yaml-prettify + - menuitem "Email normalizer" [ref=e587]: + - img [ref=e589] [cursor=pointer]: + - img [ref=e590] + - link "Email normalizer" [ref=e594] [cursor=pointer]: + - /url: /email-normalizer + - menuitem "Regex Tester" [ref=e595]: + - img [ref=e597] [cursor=pointer]: + - img [ref=e598] + - link "Regex Tester" [ref=e603] [cursor=pointer]: + - /url: /regex-tester + - menuitem "Regex cheatsheet" [ref=e604]: + - img [ref=e606] [cursor=pointer]: + - img [ref=e607] + - link "Regex cheatsheet" [ref=e612] [cursor=pointer]: + - /url: /regex-memo + - menuitem "cURL to Code" [ref=e613]: + - img [ref=e615] [cursor=pointer]: + - img [ref=e616] + - link "cURL to Code" [ref=e620] [cursor=pointer]: + - /url: /curl-to-code + - menuitem "JSON to TypeScript/Go" [ref=e621]: + - img [ref=e623] [cursor=pointer]: + - img [ref=e624] + - link "JSON to TypeScript/Go" [ref=e629] [cursor=pointer]: + - /url: /json-to-types + - menuitem "CSS/JS Prettify & Minify" [ref=e630]: + - img [ref=e632] [cursor=pointer]: + - img [ref=e633] + - link "CSS/JS Prettify & Minify" [ref=e639] [cursor=pointer]: + - /url: /css-js-prettify-minify + - generic [ref=e640]: + - generic [ref=e641] [cursor=pointer]: + - img [ref=e643] + - generic [ref=e645]: Network + - menu [ref=e649]: + - menuitem "IPv4 subnet calculator" [ref=e650]: + - img [ref=e652] [cursor=pointer]: + - img [ref=e653] + - link "IPv4 subnet calculator" [ref=e655] [cursor=pointer]: + - /url: /ipv4-subnet-calculator + - menuitem "IPv4 address converter" [ref=e656]: + - img [ref=e658] [cursor=pointer]: + - img [ref=e659] + - link "IPv4 address converter" [ref=e665] [cursor=pointer]: + - /url: /ipv4-address-converter + - menuitem "IPv4 range expander" [ref=e666]: + - img [ref=e668] [cursor=pointer]: + - img [ref=e669] + - link "IPv4 range expander" [ref=e671] [cursor=pointer]: + - /url: /ipv4-range-expander + - menuitem "MAC address lookup" [ref=e672]: + - img [ref=e674] [cursor=pointer]: + - img [ref=e675] + - link "MAC address lookup" [ref=e679] [cursor=pointer]: + - /url: /mac-address-lookup + - menuitem "MAC address generator" [ref=e680]: + - img [ref=e682] [cursor=pointer]: + - img [ref=e683] + - link "MAC address generator" [ref=e687] [cursor=pointer]: + - /url: /mac-address-generator + - menuitem "IPv6 ULA generator" [ref=e688]: + - img [ref=e690] [cursor=pointer]: + - img [ref=e691] + - link "IPv6 ULA generator" [ref=e696] [cursor=pointer]: + - /url: /ipv6-ula-generator + - menuitem "DNS Query" [ref=e697]: + - img [ref=e699] [cursor=pointer]: + - img [ref=e700] + - link "DNS Query" [ref=e706] [cursor=pointer]: + - /url: /dns-query + - generic [ref=e707]: + - generic [ref=e708] [cursor=pointer]: + - img [ref=e710] + - generic [ref=e712]: Math + - menu [ref=e716]: + - menuitem "Math evaluator" [ref=e717]: + - img [ref=e719] [cursor=pointer]: + - img [ref=e720] + - link "Math evaluator" [ref=e724] [cursor=pointer]: + - /url: /math-evaluator + - menuitem "ETA calculator" [ref=e725]: + - img [ref=e727] [cursor=pointer]: + - img [ref=e728] + - link "ETA calculator" [ref=e732] [cursor=pointer]: + - /url: /eta-calculator + - menuitem "Percentage calculator" [ref=e733]: + - img [ref=e735] [cursor=pointer]: + - img [ref=e736] + - link "Percentage calculator" [ref=e741] [cursor=pointer]: + - /url: /percentage-calculator + - generic [ref=e742]: + - generic [ref=e743] [cursor=pointer]: + - img [ref=e745] + - generic [ref=e747]: Measurement + - menu [ref=e751]: + - menuitem "Chronometer" [ref=e752]: + - img [ref=e754] [cursor=pointer]: + - img [ref=e755] + - link "Chronometer" [ref=e757] [cursor=pointer]: + - /url: /chronometer + - menuitem "Temperature converter" [ref=e758]: + - img [ref=e760] [cursor=pointer]: + - img [ref=e761] + - link "Temperature converter" [ref=e764] [cursor=pointer]: + - /url: /temperature-converter + - menuitem "Benchmark builder" [ref=e765]: + - img [ref=e767] [cursor=pointer]: + - img [ref=e768] + - link "Benchmark builder" [ref=e770] [cursor=pointer]: + - /url: /benchmark-builder + - menuitem "Byte unit converter" [ref=e771]: + - img [ref=e773] [cursor=pointer]: + - img [ref=e774] + - link "Byte unit converter" [ref=e781] [cursor=pointer]: + - /url: /byte-unit-converter + - generic [ref=e782]: + - generic [ref=e783] [cursor=pointer]: + - img [ref=e785] + - generic [ref=e787]: Text + - menu [ref=e791]: + - menuitem "Lorem ipsum generator" [ref=e792]: + - img [ref=e794] [cursor=pointer]: + - img [ref=e795] + - link "Lorem ipsum generator" [ref=e797] [cursor=pointer]: + - /url: /lorem-ipsum-generator + - menuitem "Text statistics" [ref=e798]: + - img [ref=e800] [cursor=pointer]: + - img [ref=e801] + - link "Text statistics" [ref=e805] [cursor=pointer]: + - /url: /text-statistics + - menuitem "Emoji picker" [ref=e806]: + - img [ref=e808] [cursor=pointer]: + - img [ref=e809] + - link "Emoji picker" [ref=e813] [cursor=pointer]: + - /url: /emoji-picker + - menuitem "String obfuscator" [ref=e814]: + - img [ref=e816] [cursor=pointer]: + - img [ref=e817] + - link "String obfuscator" [ref=e822] [cursor=pointer]: + - /url: /string-obfuscator + - menuitem "Text diff" [ref=e823]: + - img [ref=e825] [cursor=pointer]: + - img [ref=e826] + - link "Text diff" [ref=e830] [cursor=pointer]: + - /url: /text-diff + - menuitem "Numeronym generator" [ref=e831]: + - img [ref=e833] [cursor=pointer]: + - img [ref=e834]: + - generic "n7m" [ref=e835] + - link "Numeronym generator" [ref=e836] [cursor=pointer]: + - /url: /numeronym-generator + - menuitem "ASCII Art Text Generator" [ref=e837]: + - img [ref=e839] [cursor=pointer]: + - img [ref=e840] + - link "ASCII Art Text Generator" [ref=e843] [cursor=pointer]: + - /url: /ascii-text-drawer + - generic [ref=e844]: + - generic [ref=e845] [cursor=pointer]: + - img [ref=e847] + - generic [ref=e849]: Data + - menu [ref=e853]: + - menuitem "Phone parser and formatter" [ref=e854]: + - img [ref=e856] [cursor=pointer]: + - img [ref=e857] + - link "Phone parser and formatter" [ref=e859] [cursor=pointer]: + - /url: /phone-parser-and-formatter + - menuitem "IBAN validator and parser" [ref=e860]: + - img [ref=e862] [cursor=pointer]: + - img [ref=e863] + - link "IBAN validator and parser" [ref=e865] [cursor=pointer]: + - /url: /iban-validator-and-parser + - generic [ref=e866]: + - generic [ref=e867]: + - text: IT-Tools + - link "v2024.10.22-7ca5933" [ref=e868] [cursor=pointer]: + - /url: https://github.com/CorentinTh/it-tools/tree/v2024.10.22-7ca5933 + - generic [ref=e869]: + - text: © 2026 + - link "Corentin Thomasset" [ref=e870] [cursor=pointer]: + - /url: https://corentin.tech?utm_source=it-tools&utm_medium=footer + - generic [ref=e873]: + - generic [ref=e874]: + - button "Toggle menu" [ref=e875] [cursor=pointer]: + - img [ref=e876]: + - img [ref=e877] + - link "Home" [ref=e881] [cursor=pointer]: + - /url: / + - img [ref=e882]: + - img [ref=e883] + - link "UI Lib" [ref=e890] [cursor=pointer]: + - /url: /c-lib + - img [ref=e891] + - button "Search Cmd + K" [ref=e894] [cursor=pointer]: + - generic [ref=e895]: + - img [ref=e896] + - text: Search + - generic [ref=e898]: Cmd + K + - generic [ref=e901] [cursor=pointer]: + - generic [ref=e902]: English + - img [ref=e903] + - generic [ref=e905]: + - link "IT-Tools GitHub repository" [ref=e908] [cursor=pointer]: + - /url: https://github.com/CorentinTh/it-tools + - img [ref=e909]: + - img [ref=e910] + - link "IT Tools X account" [ref=e914] [cursor=pointer]: + - /url: https://x.com/ittoolsdottech + - img [ref=e915]: + - img [ref=e916] + - link "About" [ref=e921] [cursor=pointer]: + - /url: /about + - img [ref=e922]: + - img [ref=e923] + - button "Toggle dark/light mode" [ref=e928] [cursor=pointer]: + - img [ref=e929]: + - img [ref=e930] + - link "Buy me a coffee" [ref=e934] [cursor=pointer]: + - /url: https://www.buymeacoffee.com/cthmsst + - text: Buy me a coffee + - img [ref=e935]: + - img [ref=e936] + - generic [ref=e939]: + - generic [ref=e940]: + - heading "DNS Query" [level=1] [ref=e941] + - button [ref=e945] [cursor=pointer]: + - img [ref=e946] + - generic [ref=e949]: Query DNS records (A, AAAA, CNAME, MX, TXT, NS, SOA, ...) for any domain name online using Cloudflare DNS. + - generic [ref=e951]: + - generic [ref=e952]: + - generic [ref=e953]: Domain name + - generic [ref=e955]: + - textbox "Domain name" [ref=e956]: + - /placeholder: e.g. example.com + - text: example.com + - button [ref=e957] [cursor=pointer]: + - img [ref=e958] + - generic [ref=e960]: + - generic [ref=e961]: Record type + - generic [ref=e963] [cursor=pointer]: + - generic [ref=e964]: A + - img [ref=e965] + - button "Query DNS" [ref=e968] [cursor=pointer] + - generic [ref=e969]: + - generic [ref=e970]: + - generic [ref=e971]: "Status:" + - generic [ref=e972]: NOERROR + - table [ref=e973]: + - rowgroup [ref=e974]: + - row "Name TTL Data" [ref=e975]: + - columnheader "Name" [ref=e976] + - columnheader "TTL" [ref=e977] + - columnheader "Data" [ref=e978] + - rowgroup [ref=e979]: + - row "example.com 123s 104.20.23.154" [ref=e980]: + - cell "example.com" [ref=e981] + - cell "123s" [ref=e982] + - cell "104.20.23.154" [ref=e983] + - row "example.com 123s 172.66.147.243" [ref=e984]: + - cell "example.com" [ref=e985] + - cell "123s" [ref=e986] + - cell "172.66.147.243" [ref=e987] + - button "Copy results" [ref=e989] [cursor=pointer] \ No newline at end of file diff --git a/components.d.ts b/components.d.ts index b6177c6da5..c171978711 100644 --- a/components.d.ts +++ b/components.d.ts @@ -72,6 +72,7 @@ declare module '@vue/runtime-core' { DemoWrapper: typeof import('./src/ui/demo/demo-wrapper.vue')['default'] DeviceInformation: typeof import('./src/tools/device-information/device-information.vue')['default'] DiffViewer: typeof import('./src/tools/json-diff/diff-viewer/diff-viewer.vue')['default'] + DnsQuery: typeof import('./src/tools/dns-query/dns-query.vue')['default'] DockerRunToDockerComposeConverter: typeof import('./src/tools/docker-run-to-docker-compose-converter/docker-run-to-docker-compose-converter.vue')['default'] DynamicValues: typeof import('./src/tools/benchmark-builder/dynamic-values.vue')['default'] Editor: typeof import('./src/tools/html-wysiwyg-editor/editor/editor.vue')['default'] diff --git a/locales/en.yml b/locales/en.yml index 7f62f90ec7..cab2c61897 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -101,6 +101,10 @@ tools: title: SVG placeholder generator description: Generate svg images to use as a placeholder in your applications. + dns-query: + title: DNS Query + description: Query DNS records (A, AAAA, CNAME, MX, TXT, NS, SOA, ...) for any domain name online using Cloudflare DNS. + json-to-csv: title: JSON to CSV description: Convert JSON to CSV with automatic header detection. diff --git a/locales/zh.yml b/locales/zh.yml index 2e50b488da..9135b32bbf 100644 --- a/locales/zh.yml +++ b/locales/zh.yml @@ -100,6 +100,10 @@ tools: title: SVG 占位符生成器 description: 生成 svg 图像以用作应用程序中的占位符。 + dns-query: + title: DNS 查询 + description: 在线查询任意域名的 DNS 记录(A、AAAA、CNAME、MX、TXT、NS、SOA 等),使用 Cloudflare DNS 解析。 + json-to-csv: title: JSON 转 CSV description: 使用自动标头检测将JSON转换为CSV。 diff --git a/src/tools/dns-query/dns-query.service.ts b/src/tools/dns-query/dns-query.service.ts new file mode 100644 index 0000000000..8f0c820b81 --- /dev/null +++ b/src/tools/dns-query/dns-query.service.ts @@ -0,0 +1,85 @@ +export const dnsRecordTypes = [ + { label: 'A', value: 'A' }, + { label: 'AAAA', value: 'AAAA' }, + { label: 'CNAME', value: 'CNAME' }, + { label: 'MX', value: 'MX' }, + { label: 'TXT', value: 'TXT' }, + { label: 'NS', value: 'NS' }, + { label: 'SOA', value: 'SOA' }, + { label: 'SRV', value: 'SRV' }, + { label: 'CAA', value: 'CAA' }, + { label: 'PTR', value: 'PTR' }, +] as const; + +export type DnsRecordType = typeof dnsRecordTypes[number]['value']; + +export interface DnsAnswer { + name: string + type: number + TTL: number + data: string +} + +export interface DnsResponse { + Status: number + TC: boolean + RD: boolean + RA: boolean + AD: boolean + CD: boolean + Question: { name: string; type: number }[] + Answer?: DnsAnswer[] + Authority?: DnsAnswer[] +} + +const dnsStatusCodes: Record = { + 0: 'NOERROR', + 1: 'FORMERR', + 2: 'SERVFAIL', + 3: 'NXDOMAIN', + 4: 'NOTIMP', + 5: 'REFUSED', +}; + +export function getDnsStatusText(status: number): string { + return dnsStatusCodes[status] ?? `UNKNOWN (${status})`; +} + +export async function queryDns({ domain, type }: { domain: string; type: DnsRecordType }): Promise { + const url = `https://cloudflare-dns.com/dns-query?name=${encodeURIComponent(domain)}&type=${encodeURIComponent(type)}`; + + const response = await fetch(url, { + headers: { Accept: 'application/dns-json' }, + }); + + if (!response.ok) { + throw new Error(`DNS query failed: ${response.status} ${response.statusText}`); + } + + return response.json(); +} + +export function formatDnsRecords(answers: DnsAnswer[]): string { + if (answers.length === 0) { + return 'No records found'; + } + + const lines = answers.map((answer) => { + const ttl = formatTTL(answer.TTL); + return `${answer.name} ${ttl} ${answer.data}`; + }); + + return lines.join('\n'); +} + +function formatTTL(seconds: number): string { + if (seconds < 60) { + return `${seconds}s`; + } + if (seconds < 3600) { + return `${Math.floor(seconds / 60)}m${seconds % 60 ? ` ${seconds % 60}s` : ''}`; + } + const h = Math.floor(seconds / 3600); + const m = Math.floor((seconds % 3600) / 60); + return `${h}h${m ? ` ${m}m` : ''}`; +} diff --git a/src/tools/dns-query/dns-query.vue b/src/tools/dns-query/dns-query.vue new file mode 100644 index 0000000000..76b3ea373d --- /dev/null +++ b/src/tools/dns-query/dns-query.vue @@ -0,0 +1,121 @@ + + + diff --git a/src/tools/dns-query/index.ts b/src/tools/dns-query/index.ts new file mode 100644 index 0000000000..51e068bda2 --- /dev/null +++ b/src/tools/dns-query/index.ts @@ -0,0 +1,13 @@ +import { World } from '@vicons/tabler'; +import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; + +export const tool = defineTool({ + name: translate('tools.dns-query.title'), + path: '/dns-query', + description: translate('tools.dns-query.description'), + keywords: ['dns', 'query', 'lookup', 'resolve', 'domain', 'A', 'AAAA', 'CNAME', 'MX', 'TXT', 'NS', 'SOA', 'network', 'devops'], + component: () => import('./dns-query.vue'), + icon: World, + createdAt: new Date('2026-06-12'), +}); diff --git a/src/tools/index.ts b/src/tools/index.ts index 5944d32c61..e48bcc1b00 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -4,6 +4,7 @@ import { tool as basicAuthGenerator } from './basic-auth-generator'; import { tool as byteUnitConverter } from './byte-unit-converter'; import { tool as cssJsPrettifyMinify } from './css-js-prettify-minify'; import { tool as curlToCode } from './curl-to-code'; +import { tool as dnsQuery } from './dns-query'; import { tool as emailNormalizer } from './email-normalizer'; import { tool as htmlToMarkdown } from './html-to-markdown'; import { tool as jsonToTypes } from './json-to-types'; @@ -174,7 +175,7 @@ export const toolsByCategory: ToolCategory[] = [ }, { name: 'Network', - components: [ipv4SubnetCalculator, ipv4AddressConverter, ipv4RangeExpander, macAddressLookup, macAddressGenerator, ipv6UlaGenerator], + components: [ipv4SubnetCalculator, ipv4AddressConverter, ipv4RangeExpander, macAddressLookup, macAddressGenerator, ipv6UlaGenerator, dnsQuery], }, { name: 'Math', diff --git a/vite.config.ts b/vite.config.ts index f609167076..981e1847ca 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -111,6 +111,11 @@ export default defineConfig({ test: { exclude: [...configDefaults.exclude, '**/*.e2e.spec.ts'], }, + optimizeDeps: { + esbuildOptions: { + target: 'esnext', + }, + }, build: { target: 'esnext', }, From 148867e456448c2650e31e89940bcb8f55a1b390 Mon Sep 17 00:00:00 2001 From: lidong-sal Date: Fri, 12 Jun 2026 15:56:39 +0800 Subject: [PATCH 10/19] =?UTF-8?q?Add=20new=20tool:=20DNS=20=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=B7=A5=E5=85=B7=20=E2=80=94=20=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E6=9F=A5=20A/AAAA/CNAME/MX/TXT=20=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tools/index.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/tools/index.ts b/src/tools/index.ts index e48bcc1b00..94845b4d29 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -98,7 +98,7 @@ import { tool as yamlViewer } from './yaml-viewer'; export const toolsByCategory: ToolCategory[] = [ { name: 'Crypto', - components: [tokenGenerator, hashText, bcrypt, uuidGenerator, ulidGenerator, cypher, bip39, hmacGenerator, rsaKeyPairGenerator, passwordStrengthAnalyser, pdfSignatureChecker, sslCertificateParser], + components: [tokenGenerator, hashText, bcrypt, uuidGenerator, ulidGenerator, cypher, bip39, hmacGenerator, rsaKeyPairGenerator, passwordStrengthAnalyser, pdfSignatureChecker, dnsQuery, sslCertificateParser, byteUnitConverter, cssJsPrettifyMinify, htmlToMarkdown, jsonToTypes, curlToCode], }, { name: 'Converter', @@ -123,7 +123,6 @@ export const toolsByCategory: ToolCategory[] = [ xmlToJson, jsonToXml, markdownToHtml, - htmlToMarkdown, ], }, { @@ -168,14 +167,11 @@ export const toolsByCategory: ToolCategory[] = [ emailNormalizer, regexTester, regexMemo, - curlToCode, - jsonToTypes, - cssJsPrettifyMinify, ], }, { name: 'Network', - components: [ipv4SubnetCalculator, ipv4AddressConverter, ipv4RangeExpander, macAddressLookup, macAddressGenerator, ipv6UlaGenerator, dnsQuery], + components: [ipv4SubnetCalculator, ipv4AddressConverter, ipv4RangeExpander, macAddressLookup, macAddressGenerator, ipv6UlaGenerator], }, { name: 'Math', @@ -183,7 +179,7 @@ export const toolsByCategory: ToolCategory[] = [ }, { name: 'Measurement', - components: [chronometer, temperatureConverter, benchmarkBuilder, byteUnitConverter], + components: [chronometer, temperatureConverter, benchmarkBuilder], }, { name: 'Text', From 3ca1fea0c305e4f51e8a09256bc9253e588fa742 Mon Sep 17 00:00:00 2001 From: lidong-sal Date: Fri, 12 Jun 2026 16:12:07 +0800 Subject: [PATCH 11/19] =?UTF-8?q?Add=20new=20tool:=20DNS=20=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=B7=A5=E5=85=B7=20=E2=80=94=20=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E6=9F=A5=20A/AAAA/CNAME/MX/TXT=20=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tools/index.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/tools/index.ts b/src/tools/index.ts index 94845b4d29..290875c345 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -98,7 +98,7 @@ import { tool as yamlViewer } from './yaml-viewer'; export const toolsByCategory: ToolCategory[] = [ { name: 'Crypto', - components: [tokenGenerator, hashText, bcrypt, uuidGenerator, ulidGenerator, cypher, bip39, hmacGenerator, rsaKeyPairGenerator, passwordStrengthAnalyser, pdfSignatureChecker, dnsQuery, sslCertificateParser, byteUnitConverter, cssJsPrettifyMinify, htmlToMarkdown, jsonToTypes, curlToCode], + components: [tokenGenerator, hashText, bcrypt, uuidGenerator, ulidGenerator, cypher, bip39, hmacGenerator, rsaKeyPairGenerator, passwordStrengthAnalyser, pdfSignatureChecker], }, { name: 'Converter', @@ -128,6 +128,13 @@ export const toolsByCategory: ToolCategory[] = [ { name: 'Web', components: [ + dnsQuery, + sslCertificateParser, + byteUnitConverter, + cssJsPrettifyMinify, + htmlToMarkdown, + jsonToTypes, + curlToCode, urlEncoder, htmlEntities, urlParser, From f7eef656d77b334213f6e1d2b0154aff5f57e08d Mon Sep 17 00:00:00 2001 From: lidong-sal Date: Fri, 12 Jun 2026 16:20:19 +0800 Subject: [PATCH 12/19] Adjustment of tool classification --- src/tools/index.ts | 58 +++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/tools/index.ts b/src/tools/index.ts index 290875c345..4bc036c146 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -100,9 +100,33 @@ export const toolsByCategory: ToolCategory[] = [ name: 'Crypto', components: [tokenGenerator, hashText, bcrypt, uuidGenerator, ulidGenerator, cypher, bip39, hmacGenerator, rsaKeyPairGenerator, passwordStrengthAnalyser, pdfSignatureChecker], }, + { + name: 'Web', + components: [ + dnsQuery, + sslCertificateParser, + urlEncoder, + htmlEntities, + urlParser, + deviceInformation, + basicAuthGenerator, + metaTagGenerator, + otpCodeGeneratorAndValidator, + mimeTypes, + jwtParser, + keycodeInfo, + slugifyString, + htmlWysiwygEditor, + userAgentParser, + httpStatusCodes, + jsonDiff, + safelinkDecoder, + ], + }, { name: 'Converter', components: [ + byteUnitConverter, dateTimeConverter, baseConverter, romanNumeralConverter, @@ -126,40 +150,12 @@ export const toolsByCategory: ToolCategory[] = [ ], }, { - name: 'Web', + name: 'Development', components: [ - dnsQuery, - sslCertificateParser, - byteUnitConverter, cssJsPrettifyMinify, htmlToMarkdown, jsonToTypes, curlToCode, - urlEncoder, - htmlEntities, - urlParser, - deviceInformation, - basicAuthGenerator, - metaTagGenerator, - otpCodeGeneratorAndValidator, - mimeTypes, - jwtParser, - keycodeInfo, - slugifyString, - htmlWysiwygEditor, - userAgentParser, - httpStatusCodes, - jsonDiff, - safelinkDecoder, - ], - }, - { - name: 'Images and videos', - components: [qrCodeGenerator, wifiQrCodeGenerator, svgPlaceholderGenerator, cameraRecorder], - }, - { - name: 'Development', - components: [ gitMemo, randomPortGenerator, crontabGenerator, @@ -176,6 +172,10 @@ export const toolsByCategory: ToolCategory[] = [ regexMemo, ], }, + { + name: 'Images and videos', + components: [qrCodeGenerator, wifiQrCodeGenerator, svgPlaceholderGenerator, cameraRecorder], + }, { name: 'Network', components: [ipv4SubnetCalculator, ipv4AddressConverter, ipv4RangeExpander, macAddressLookup, macAddressGenerator, ipv6UlaGenerator], From cb327a5d87f7454c60e3cb07f433c587267decb3 Mon Sep 17 00:00:00 2001 From: lidong-sal Date: Fri, 12 Jun 2026 16:39:08 +0800 Subject: [PATCH 13/19] =?UTF-8?q?Add=20new=20tool:=20DNS=20=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=B7=A5=E5=85=B7=20=E2=80=94=20=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E6=9F=A5=20A/AAAA/CNAME/MX/TXT=20=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tools/dns-query/dns-query.service.ts | 89 ++++++++++++---------- src/tools/dns-query/dns-query.vue | 97 +++++++++++++----------- 2 files changed, 99 insertions(+), 87 deletions(-) diff --git a/src/tools/dns-query/dns-query.service.ts b/src/tools/dns-query/dns-query.service.ts index 8f0c820b81..51a445f2b9 100644 --- a/src/tools/dns-query/dns-query.service.ts +++ b/src/tools/dns-query/dns-query.service.ts @@ -1,17 +1,25 @@ -export const dnsRecordTypes = [ - { label: 'A', value: 'A' }, - { label: 'AAAA', value: 'AAAA' }, - { label: 'CNAME', value: 'CNAME' }, - { label: 'MX', value: 'MX' }, - { label: 'TXT', value: 'TXT' }, - { label: 'NS', value: 'NS' }, - { label: 'SOA', value: 'SOA' }, - { label: 'SRV', value: 'SRV' }, - { label: 'CAA', value: 'CAA' }, - { label: 'PTR', value: 'PTR' }, -] as const; - -export type DnsRecordType = typeof dnsRecordTypes[number]['value']; +export const defaultRecordTypes = ['A', 'AAAA', 'CNAME', 'MX', 'TXT', 'NS', 'SOA'] as const; + +export const allRecordTypes = ['A', 'AAAA', 'CNAME', 'MX', 'TXT', 'NS', 'SOA', 'SRV', 'CAA', 'PTR'] as const; + +export type DnsRecordType = typeof allRecordTypes[number]; + +const dnsTypeNumberToName: Record = { + 1: 'A', + 2: 'NS', + 5: 'CNAME', + 6: 'SOA', + 12: 'PTR', + 15: 'MX', + 16: 'TXT', + 28: 'AAAA', + 33: 'SRV', + 257: 'CAA', +}; + +export function getTypeName(typeNumber: number): string { + return dnsTypeNumberToName[typeNumber] ?? `TYPE${typeNumber}`; +} export interface DnsAnswer { name: string @@ -32,20 +40,7 @@ export interface DnsResponse { Authority?: DnsAnswer[] } -const dnsStatusCodes: Record = { - 0: 'NOERROR', - 1: 'FORMERR', - 2: 'SERVFAIL', - 3: 'NXDOMAIN', - 4: 'NOTIMP', - 5: 'REFUSED', -}; - -export function getDnsStatusText(status: number): string { - return dnsStatusCodes[status] ?? `UNKNOWN (${status})`; -} - -export async function queryDns({ domain, type }: { domain: string; type: DnsRecordType }): Promise { +export async function queryDns({ domain, type }: { domain: string; type: string }): Promise { const url = `https://cloudflare-dns.com/dns-query?name=${encodeURIComponent(domain)}&type=${encodeURIComponent(type)}`; const response = await fetch(url, { @@ -59,27 +54,37 @@ export async function queryDns({ domain, type }: { domain: string; type: DnsReco return response.json(); } +export async function queryAllDns(domain: string, types: readonly string[]): Promise { + const results = await Promise.allSettled( + types.map(type => queryDns({ domain, type })), + ); + + const seen = new Set(); + const answers: DnsAnswer[] = []; + for (const result of results) { + if (result.status === 'fulfilled' && result.value.Answer) { + for (const answer of result.value.Answer) { + const key = `${answer.type}|${answer.name}|${answer.data}`; + if (!seen.has(key)) { + seen.add(key); + answers.push(answer); + } + } + } + } + + return answers; +} + export function formatDnsRecords(answers: DnsAnswer[]): string { if (answers.length === 0) { return 'No records found'; } const lines = answers.map((answer) => { - const ttl = formatTTL(answer.TTL); - return `${answer.name} ${ttl} ${answer.data}`; + const typeName = getTypeName(answer.type); + return `${typeName}\t${answer.name}\t${answer.TTL}s\t${answer.data}`; }); return lines.join('\n'); } - -function formatTTL(seconds: number): string { - if (seconds < 60) { - return `${seconds}s`; - } - if (seconds < 3600) { - return `${Math.floor(seconds / 60)}m${seconds % 60 ? ` ${seconds % 60}s` : ''}`; - } - const h = Math.floor(seconds / 3600); - const m = Math.floor((seconds % 3600) / 60); - return `${h}h${m ? ` ${m}m` : ''}`; -} diff --git a/src/tools/dns-query/dns-query.vue b/src/tools/dns-query/dns-query.vue index 76b3ea373d..58371b273c 100644 --- a/src/tools/dns-query/dns-query.vue +++ b/src/tools/dns-query/dns-query.vue @@ -1,14 +1,12 @@ @@ -111,7 +125,7 @@ async function doQuery() { -

+
Copy results @@ -124,5 +138,79 @@ async function doQuery() {
+ +
+ Loading WHOIS info... +
+ +
+ +
+ WHOIS +
+ + + + + + Domain Name + + {{ whoisInfo.domainName }} + + + + Registrar + + {{ whoisInfo.registrar }} + + + + Registration Date + + {{ whoisInfo.registrationDate }} + + + + Expiration Date + + {{ whoisInfo.expirationDate }} + + + + Updated Date + + {{ whoisInfo.updatedDate }} + + + + Registrant + + {{ [whoisInfo.registrantProvince, whoisInfo.registrantCountry].filter(Boolean).join(', ') }} + + + + Name Servers + + {{ whoisInfo.nameServers.join(', ') }} + + + + Domain Status + + +
+ {{ s }} +
+ + + + + DNSSEC + + {{ whoisInfo.dnssec }} + + +
+
From 07fecf055547c4f8b0ba47b4b7d447c7c263d13a Mon Sep 17 00:00:00 2001 From: lidong-sal Date: Fri, 12 Jun 2026 18:11:54 +0800 Subject: [PATCH 15/19] Enable PWA skipWaiting and clientsClaim for instant updates --- vite.config.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/vite.config.ts b/vite.config.ts index 981e1847ca..eaf7736a73 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -56,6 +56,10 @@ export default defineConfig({ VitePWA({ registerType: 'autoUpdate', strategies: 'generateSW', + workbox: { + skipWaiting: true, + clientsClaim: true, + }, manifest: { name: 'IT Tools', description: 'Aggregated set of useful tools for developers.', From fb4f9bbb606bd6b72034de5834f442a6b45b8668 Mon Sep 17 00:00:00 2001 From: lidong-sal Date: Tue, 16 Jun 2026 10:52:46 +0800 Subject: [PATCH 16/19] =?UTF-8?q?Add=20new=20tool:=20=E6=97=A5=E6=9C=9F?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E5=99=A8=20=E2=80=94=20=E6=97=A5=E6=9C=9F?= =?UTF-8?q?=E5=8A=A0=E5=87=8F=E4=B8=8E=E4=B8=A4=E4=B8=AA=E6=97=A5=E6=9C=9F?= =?UTF-8?q?=E9=97=B4=E9=9A=94=E5=A4=A9=E6=95=B0=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components.d.ts | 1 + locales/en.yml | 19 +++ locales/zh.yml | 19 +++ src/tools/date-calculator/date-calculator.vue | 141 ++++++++++++++++++ src/tools/date-calculator/index.ts | 13 ++ src/tools/index.ts | 2 + 6 files changed, 195 insertions(+) create mode 100644 src/tools/date-calculator/date-calculator.vue create mode 100644 src/tools/date-calculator/index.ts diff --git a/components.d.ts b/components.d.ts index c171978711..5da666971c 100644 --- a/components.d.ts +++ b/components.d.ts @@ -67,6 +67,7 @@ declare module '@vue/runtime-core' { CTooltip: typeof import('./src/ui/c-tooltip/c-tooltip.vue')['default'] 'CTooltip.demo': typeof import('./src/ui/c-tooltip/c-tooltip.demo.vue')['default'] CurlToCode: typeof import('./src/tools/curl-to-code/curl-to-code.vue')['default'] + DateCalculator: typeof import('./src/tools/date-calculator/date-calculator.vue')['default'] DateTimeConverter: typeof import('./src/tools/date-time-converter/date-time-converter.vue')['default'] 'DemoHome.page': typeof import('./src/ui/demo/demo-home.page.vue')['default'] DemoWrapper: typeof import('./src/ui/demo/demo-wrapper.vue')['default'] diff --git a/locales/en.yml b/locales/en.yml index cab2c61897..befdf93785 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -297,6 +297,25 @@ tools: title: JWT parser description: Parse and decode your JSON Web Token (jwt) and display its content. + date-calculator: + title: Date calculator + description: Add or subtract days from a date, or calculate the number of days between two dates. + offset: + sectionTitle: Date after / before N days + baseDate: Start date + days: Days offset + daysHint: Use a negative number to go backwards + resultLabel: Result date + diff: + sectionTitle: Days between two dates + startDate: Start date + targetDate: Target date + resultLabel: Difference + dayUnit: days + directionAfter: Target date is after the start date + directionBefore: Target date is before the start date + directionSame: Same date + date-converter: title: Date-time converter description: Convert date and time into the various different formats diff --git a/locales/zh.yml b/locales/zh.yml index 9135b32bbf..65d24c170e 100644 --- a/locales/zh.yml +++ b/locales/zh.yml @@ -293,6 +293,25 @@ tools: title: JWT 解析器 description: 解析和解码JSON Web Token(jwt)并显示其内容。 + date-calculator: + title: 日期计算器 + description: 推算几天前/后的日期,或计算两个日期之间相差的天数。 + offset: + sectionTitle: 推算几天前 / 后的日期 + baseDate: 起始日期 + days: 偏移天数 + daysHint: 输入负数则往前推算 + resultLabel: 结果日期 + diff: + sectionTitle: 计算两个日期相差 + startDate: 开始日期 + targetDate: 目标日期 + resultLabel: 相差 + dayUnit: 天 + directionAfter: 目标日期比起始日期晚 + directionBefore: 目标日期比起始日期早 + directionSame: 两个日期为同一天 + date-converter: title: 日期时间转换器 description: 将日期和时间转换为各种不同的格式 diff --git a/src/tools/date-calculator/date-calculator.vue b/src/tools/date-calculator/date-calculator.vue new file mode 100644 index 0000000000..621b2c4de4 --- /dev/null +++ b/src/tools/date-calculator/date-calculator.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/src/tools/date-calculator/index.ts b/src/tools/date-calculator/index.ts new file mode 100644 index 0000000000..2ab05e53cc --- /dev/null +++ b/src/tools/date-calculator/index.ts @@ -0,0 +1,13 @@ +import { Calculator } from '@vicons/tabler'; +import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; + +export const tool = defineTool({ + name: translate('tools.date-calculator.title'), + path: '/date-calculator', + description: translate('tools.date-calculator.description'), + keywords: ['date', 'difference', 'days', 'calculator', 'add', 'subtract', 'duration', 'between', 'offset'], + component: () => import('./date-calculator.vue'), + icon: Calculator, + createdAt: new Date('2026-06-15'), +}); diff --git a/src/tools/index.ts b/src/tools/index.ts index 4bc036c146..3414b67556 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -61,6 +61,7 @@ import { tool as chmodCalculator } from './chmod-calculator'; import { tool as chronometer } from './chronometer'; import { tool as colorConverter } from './color-converter'; import { tool as crontabGenerator } from './crontab-generator'; +import { tool as dateCalculator } from './date-calculator'; import { tool as dateTimeConverter } from './date-time-converter'; import { tool as deviceInformation } from './device-information'; import { tool as cypher } from './encryption'; @@ -127,6 +128,7 @@ export const toolsByCategory: ToolCategory[] = [ name: 'Converter', components: [ byteUnitConverter, + dateCalculator, dateTimeConverter, baseConverter, romanNumeralConverter, From e52e33ac4f398153a77b663d6819f88ffbb1ec80 Mon Sep 17 00:00:00 2001 From: lidong-sal Date: Tue, 16 Jun 2026 10:52:46 +0800 Subject: [PATCH 17/19] Order newest tools by createdAt so the latest tool shows first --- src/tools/tools.store.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/tools/tools.store.ts b/src/tools/tools.store.ts index fb12450dfe..32c7308b30 100644 --- a/src/tools/tools.store.ts +++ b/src/tools/tools.store.ts @@ -42,7 +42,9 @@ export const useToolStore = defineStore('tools', () => { tools, favoriteTools, toolsByCategory, - newTools: computed(() => tools.value.filter(({ isNew }) => isNew)), + newTools: computed(() => tools.value + .filter(({ isNew }) => isNew) + .sort((a, b) => (b.createdAt?.getTime() ?? 0) - (a.createdAt?.getTime() ?? 0))), addToolToFavorites({ tool }: { tool: MaybeRef }) { const toolPath = get(tool).path; From dc07fd41db4878c02ee56f9970710426885351e5 Mon Sep 17 00:00:00 2001 From: lidong-sal Date: Tue, 16 Jun 2026 10:52:46 +0800 Subject: [PATCH 18/19] Reload on service-worker takeover (controllerchange) for reliable PWA auto-update --- src/main.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main.ts b/src/main.ts index 19d28bf2ee..69aae022f6 100644 --- a/src/main.ts +++ b/src/main.ts @@ -16,6 +16,26 @@ import { i18nPlugin } from './plugins/i18n.plugin'; registerSW(); +// Reload the page the moment a newly installed service worker takes control. +// vite-plugin-pwa's autoUpdate relies on the Workbox `activated(isUpdate)` event, but +// with `skipWaiting` the new SW can install→activate so fast that Workbox-window never +// attaches its lifecycle listeners and `activated` is missed — leaving users stuck on +// stale content until a hard refresh. `controllerchange` is fired directly by the +// browser when the new SW calls `clients.claim()`, so it fires reliably regardless of +// that race. We only reload on an actual handover (controller already existed), not on +// the very first install. +if ('serviceWorker' in navigator) { + const hadController = navigator.serviceWorker.controller !== null; + let refreshing = false; + navigator.serviceWorker.addEventListener('controllerchange', () => { + if (!hadController || refreshing) { + return; + } + refreshing = true; + window.location.reload(); + }); +} + const app = createApp(App); app.use(createPinia()); From 30384f2713902d3d271827fe93e8dc8d5c3cb8f6 Mon Sep 17 00:00:00 2001 From: lidong-sal Date: Tue, 16 Jun 2026 11:08:32 +0800 Subject: [PATCH 19/19] Fix SonarCloud warnings: replaceAll, th scope, globalThis - Use String#replaceAll() over String#replace() for plain string patterns - Add scope="col" to tags for accessibility - Prefer globalThis over window Co-Authored-By: Claude Opus 4.6 --- src/main.ts | 2 +- src/tools/css-js-prettify-minify/css-js-prettify-minify.vue | 2 +- src/tools/dns-query/dns-query.service.ts | 2 +- src/tools/dns-query/dns-query.vue | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main.ts b/src/main.ts index 69aae022f6..8105ca4c30 100644 --- a/src/main.ts +++ b/src/main.ts @@ -32,7 +32,7 @@ if ('serviceWorker' in navigator) { return; } refreshing = true; - window.location.reload(); + globalThis.location.reload(); }); } diff --git a/src/tools/css-js-prettify-minify/css-js-prettify-minify.vue b/src/tools/css-js-prettify-minify/css-js-prettify-minify.vue index 8f2e657655..53569f51e2 100644 --- a/src/tools/css-js-prettify-minify/css-js-prettify-minify.vue +++ b/src/tools/css-js-prettify-minify/css-js-prettify-minify.vue @@ -34,7 +34,7 @@ function minifyCss(input: string): string { .replace(/\/\*[\s\S]*?\*\//g, '') .replace(/\s+/g, ' ') .replace(/ ?([{}:;,>~+]) ?/g, '$1') - .replace(/;}/g, '}') + .replaceAll(';}', '}') .trim(); } diff --git a/src/tools/dns-query/dns-query.service.ts b/src/tools/dns-query/dns-query.service.ts index ed7af6ee8e..d22213881b 100644 --- a/src/tools/dns-query/dns-query.service.ts +++ b/src/tools/dns-query/dns-query.service.ts @@ -137,7 +137,7 @@ function parseRdapResponse(data: any, domain: string): WhoisInfo { .map((ns: any) => (ns.ldhName ?? '').replace(/\.$/, '')) .filter(Boolean); - const status = (data.status ?? []).map((s: string) => s.replace(/ /g, '')); + const status = (data.status ?? []).map((s: string) => s.replaceAll(' ', '')); const dnssec = data.secureDNS?.delegationSigned ? 'signed' : 'unsigned'; diff --git a/src/tools/dns-query/dns-query.vue b/src/tools/dns-query/dns-query.vue index a55ce7817d..9082754383 100644 --- a/src/tools/dns-query/dns-query.vue +++ b/src/tools/dns-query/dns-query.vue @@ -108,9 +108,9 @@ async function doQuery() { - Name - TTL - Data + Name + TTL + Data