diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json index 363273af..744e14d2 100644 --- a/.eslintrc-auto-import.json +++ b/.eslintrc-auto-import.json @@ -22,7 +22,9 @@ "createGlobalState": true, "createInjectionState": true, "createReactiveFn": true, + "createReusableTemplate": true, "createSharedComposable": true, + "createTemplatePromise": true, "createUnrefFn": true, "customRef": true, "debouncedRef": true, @@ -42,9 +44,6 @@ "isReactive": true, "isReadonly": true, "isRef": true, - "logicAnd": true, - "logicNot": true, - "logicOr": true, "makeDestructurable": true, "markRaw": true, "nextTick": true, @@ -97,6 +96,7 @@ "toReactive": true, "toRef": true, "toRefs": true, + "toValue": true, "triggerRef": true, "tryOnBeforeMount": true, "tryOnBeforeUnmount": true, @@ -107,6 +107,19 @@ "unrefElement": true, "until": true, "useActiveElement": true, + "useAnimate": true, + "useArrayDifference": true, + "useArrayEvery": true, + "useArrayFilter": true, + "useArrayFind": true, + "useArrayFindIndex": true, + "useArrayFindLast": true, + "useArrayIncludes": true, + "useArrayJoin": true, + "useArrayMap": true, + "useArrayReduce": true, + "useArraySome": true, + "useArrayUnique": true, "useAsyncQueue": true, "useAsyncState": true, "useAttrs": true, @@ -117,8 +130,8 @@ "useBroadcastChannel": true, "useBrowserLocation": true, "useCached": true, - "useClamp": true, "useClipboard": true, + "useCloned": true, "useColorMode": true, "useConfirmDialog": true, "useCounter": true, @@ -192,12 +205,18 @@ "useOnline": true, "usePageLeave": true, "useParallax": true, + "useParentElement": true, + "usePerformanceObserver": true, "usePermission": true, "usePointer": true, + "usePointerLock": true, "usePointerSwipe": true, "usePreferredColorScheme": true, + "usePreferredContrast": true, "usePreferredDark": true, "usePreferredLanguages": true, + "usePreferredReducedMotion": true, + "usePrevious": true, "useRafFn": true, "useRefHistory": true, "useResizeObserver": true, @@ -211,14 +230,17 @@ "useSessionStorage": true, "useShare": true, "useSlots": true, + "useSorted": true, "useSpeechRecognition": true, "useSpeechSynthesis": true, "useStepper": true, "useStorage": true, "useStorageAsync": true, "useStyleTag": true, + "useSupported": true, "useSwipe": true, "useTemplateRefsList": true, + "useTextDirection": true, "useTextSelection": true, "useTextareaAutosize": true, "useThrottle": true, @@ -230,6 +252,8 @@ "useTimeoutPoll": true, "useTimestamp": true, "useTitle": true, + "useToNumber": true, + "useToString": true, "useToggle": true, "useTransition": true, "useUrlSearchParams": true, @@ -250,8 +274,10 @@ "watchArray": true, "watchAtMost": true, "watchDebounced": true, + "watchDeep": true, "watchEffect": true, "watchIgnorable": true, + "watchImmediate": true, "watchOnce": true, "watchPausable": true, "watchPostEffect": true, diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 5f9c7417..8155910c 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,39 +1,14 @@ -/* eslint-env node */ -require('@rushstack/eslint-patch/modern-module-resolution'); - +/** + * @type {import('eslint').Linter.Config} + */ module.exports = { root: true, - extends: [ - 'plugin:vue/vue3-essential', - 'eslint:recommended', - 'plugin:vue/vue3-recommended', - '@vue/eslint-config-typescript/recommended', - '@vue/eslint-config-prettier', - 'plugin:import/recommended', - './.eslintrc-auto-import.json', - '@unocss', - ], + extends: ['@antfu', './.eslintrc-auto-import.json', '@unocss'], - settings: { - 'import/resolver': { typescript: { project: './tsconfig.app.json' } }, - }, - env: { - 'vue/setup-compiler-macros': true, - }, rules: { - 'vue/multi-word-component-names': ['off'], - 'prettier/prettier': ['error'], - 'import/no-duplicates': ['error', { considerQueryString: true }], - 'import/order': ['error', { groups: [['builtin', 'external', 'internal']] }], - 'import/extensions': [ - 'error', - 'ignorePackages', - { - js: 'never', - ts: 'never', - tsx: 'never', - }, - ], - 'import/no-unresolved': ['error', { ignore: ['^virtual:'] }], + 'curly': ['error', 'all'], + '@typescript-eslint/semi': ['error', 'always'], + '@typescript-eslint/no-use-before-define': ['error', { allowNamedExports: true, functions: false }], + 'vue/no-empty-component-block': ['error'], }, }; diff --git a/.github/ISSUE_TEMPLATE/new-tool-request.md b/.github/ISSUE_TEMPLATE/new-tool-request.md index 58775d1a..a67a9cd0 100644 --- a/.github/ISSUE_TEMPLATE/new-tool-request.md +++ b/.github/ISSUE_TEMPLATE/new-tool-request.md @@ -6,8 +6,8 @@ labels: new tool assignees: CorentinTh --- -**Which tool is impacted?** -Example: the token generator +**What tool do you want?** +Example: a token generator **Describe the solution you'd like** A clear and concise description of what you want to happen. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f251edd3..5f5a9b6a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,5 +27,8 @@ jobs: - name: Run unit test run: pnpm test + - name: Type check + run: pnpm typecheck + - name: Build the app run: pnpm build diff --git a/CHANGELOG.md b/CHANGELOG.md index a07b04e6..d0a1e826 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,45 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## Version 2023.05.14-77f2efc + +### Features +- **list-converter**: a small converter who deals with column based data and do some stuff with it (#387) (83a7b3b) +- **new tool**: phone parser and normalizer (ce3150c) + +### Bug fixes +- **phone-parser**: use default country code (a43c546) +- **home**: prevent weird blue border on card (3f6c8f0) + +### Refactoring +- **ui**: replaced some n-input with c-input-text (77f2efc) + +### Chores +- **issues**: updated new tool request issue template (edae4c6) + +### Ui-lib +- **new-component**: added text input component in the c-lib (aad8d84) +- **button**: size variants (401f13f) + +## Version 2023.04.23-92bd835 + +### Features +- **ui-lib**: demo pages for c-lib components (92bd835) +- **new-tool**: diff of two json objects (362f2fa) +- **ipv4-range-expander**: expands a given IPv4 start and end address to a valid IPv4 subnet (#366) (df989e2) +- **date converter**: auto focus main input (6d22025) + +### Bug fixes +- **ts**: cleaned legacy typechecking warning (e88c1d5) +- **mac-address-lookup**: added copy handler on button click (c311e38) + +### Refactoring +- **ui-lib**: prevent c-button to shrink (61ece23) +- **ui**: replaced naive ui cards with custom ones (f080933) +- **clean**: removed unused lodash import (bb32513) +- **clean**: removed useless br tags (74073f5) +- **ui**: getting ride of naive ui buttons (c45bce3) + ## Version 2023.04.14-dbad773 ### Features diff --git a/README.md b/README.md index 2f8ee8c2..1d17dce1 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ To create a new tool, there is a script that generate the boilerplate of the new pnpm run script:create-new-tool my-tool-name ``` -It will create a directory in `src/tools` with the correct files, and a the import in `src/tools/index.ts`. You will just need to add the inported tool in the proper category and develop the tool. +It will create a directory in `src/tools` with the correct files, and a the import in `src/tools/index.ts`. You will just need to add the imported tool in the proper category and develop the tool. ## Credits diff --git a/auto-imports.d.ts b/auto-imports.d.ts index 2850890b..9dccb44a 100644 --- a/auto-imports.d.ts +++ b/auto-imports.d.ts @@ -19,7 +19,9 @@ declare global { const createGlobalState: typeof import('@vueuse/core')['createGlobalState'] const createInjectionState: typeof import('@vueuse/core')['createInjectionState'] const createReactiveFn: typeof import('@vueuse/core')['createReactiveFn'] + const createReusableTemplate: typeof import('@vueuse/core')['createReusableTemplate'] const createSharedComposable: typeof import('@vueuse/core')['createSharedComposable'] + const createTemplatePromise: typeof import('@vueuse/core')['createTemplatePromise'] const createUnrefFn: typeof import('@vueuse/core')['createUnrefFn'] const customRef: typeof import('vue')['customRef'] const debouncedRef: typeof import('@vueuse/core')['debouncedRef'] @@ -39,9 +41,6 @@ declare global { const isReactive: typeof import('vue')['isReactive'] const isReadonly: typeof import('vue')['isReadonly'] const isRef: typeof import('vue')['isRef'] - const logicAnd: typeof import('@vueuse/core')['logicAnd'] - const logicNot: typeof import('@vueuse/core')['logicNot'] - const logicOr: typeof import('@vueuse/core')['logicOr'] const makeDestructurable: typeof import('@vueuse/core')['makeDestructurable'] const markRaw: typeof import('vue')['markRaw'] const nextTick: typeof import('vue')['nextTick'] @@ -92,8 +91,9 @@ declare global { const throttledWatch: typeof import('@vueuse/core')['throttledWatch'] const toRaw: typeof import('vue')['toRaw'] const toReactive: typeof import('@vueuse/core')['toReactive'] - const toRef: typeof import('vue')['toRef'] + const toRef: typeof import('@vueuse/core')['toRef'] const toRefs: typeof import('vue')['toRefs'] + const toValue: typeof import('@vueuse/core')['toValue'] const triggerRef: typeof import('vue')['triggerRef'] const tryOnBeforeMount: typeof import('@vueuse/core')['tryOnBeforeMount'] const tryOnBeforeUnmount: typeof import('@vueuse/core')['tryOnBeforeUnmount'] @@ -104,6 +104,19 @@ declare global { const unrefElement: typeof import('@vueuse/core')['unrefElement'] const until: typeof import('@vueuse/core')['until'] const useActiveElement: typeof import('@vueuse/core')['useActiveElement'] + const useAnimate: typeof import('@vueuse/core')['useAnimate'] + const useArrayDifference: typeof import('@vueuse/core')['useArrayDifference'] + const useArrayEvery: typeof import('@vueuse/core')['useArrayEvery'] + const useArrayFilter: typeof import('@vueuse/core')['useArrayFilter'] + const useArrayFind: typeof import('@vueuse/core')['useArrayFind'] + const useArrayFindIndex: typeof import('@vueuse/core')['useArrayFindIndex'] + const useArrayFindLast: typeof import('@vueuse/core')['useArrayFindLast'] + const useArrayIncludes: typeof import('@vueuse/core')['useArrayIncludes'] + const useArrayJoin: typeof import('@vueuse/core')['useArrayJoin'] + const useArrayMap: typeof import('@vueuse/core')['useArrayMap'] + const useArrayReduce: typeof import('@vueuse/core')['useArrayReduce'] + const useArraySome: typeof import('@vueuse/core')['useArraySome'] + const useArrayUnique: typeof import('@vueuse/core')['useArrayUnique'] const useAsyncQueue: typeof import('@vueuse/core')['useAsyncQueue'] const useAsyncState: typeof import('@vueuse/core')['useAsyncState'] const useAttrs: typeof import('vue')['useAttrs'] @@ -114,8 +127,8 @@ declare global { const useBroadcastChannel: typeof import('@vueuse/core')['useBroadcastChannel'] const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation'] const useCached: typeof import('@vueuse/core')['useCached'] - const useClamp: typeof import('@vueuse/core')['useClamp'] const useClipboard: typeof import('@vueuse/core')['useClipboard'] + const useCloned: typeof import('@vueuse/core')['useCloned'] const useColorMode: typeof import('@vueuse/core')['useColorMode'] const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog'] const useCounter: typeof import('@vueuse/core')['useCounter'] @@ -189,12 +202,18 @@ declare global { const useOnline: typeof import('@vueuse/core')['useOnline'] const usePageLeave: typeof import('@vueuse/core')['usePageLeave'] const useParallax: typeof import('@vueuse/core')['useParallax'] + const useParentElement: typeof import('@vueuse/core')['useParentElement'] + const usePerformanceObserver: typeof import('@vueuse/core')['usePerformanceObserver'] const usePermission: typeof import('@vueuse/core')['usePermission'] const usePointer: typeof import('@vueuse/core')['usePointer'] + const usePointerLock: typeof import('@vueuse/core')['usePointerLock'] const usePointerSwipe: typeof import('@vueuse/core')['usePointerSwipe'] const usePreferredColorScheme: typeof import('@vueuse/core')['usePreferredColorScheme'] + const usePreferredContrast: typeof import('@vueuse/core')['usePreferredContrast'] const usePreferredDark: typeof import('@vueuse/core')['usePreferredDark'] const usePreferredLanguages: typeof import('@vueuse/core')['usePreferredLanguages'] + const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion'] + const usePrevious: typeof import('@vueuse/core')['usePrevious'] const useRafFn: typeof import('@vueuse/core')['useRafFn'] const useRefHistory: typeof import('@vueuse/core')['useRefHistory'] const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver'] @@ -208,14 +227,17 @@ declare global { const useSessionStorage: typeof import('@vueuse/core')['useSessionStorage'] const useShare: typeof import('@vueuse/core')['useShare'] const useSlots: typeof import('vue')['useSlots'] + const useSorted: typeof import('@vueuse/core')['useSorted'] const useSpeechRecognition: typeof import('@vueuse/core')['useSpeechRecognition'] const useSpeechSynthesis: typeof import('@vueuse/core')['useSpeechSynthesis'] const useStepper: typeof import('@vueuse/core')['useStepper'] const useStorage: typeof import('@vueuse/core')['useStorage'] const useStorageAsync: typeof import('@vueuse/core')['useStorageAsync'] const useStyleTag: typeof import('@vueuse/core')['useStyleTag'] + const useSupported: typeof import('@vueuse/core')['useSupported'] const useSwipe: typeof import('@vueuse/core')['useSwipe'] const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList'] + const useTextDirection: typeof import('@vueuse/core')['useTextDirection'] const useTextSelection: typeof import('@vueuse/core')['useTextSelection'] const useTextareaAutosize: typeof import('@vueuse/core')['useTextareaAutosize'] const useThrottle: typeof import('@vueuse/core')['useThrottle'] @@ -227,6 +249,8 @@ declare global { const useTimeoutPoll: typeof import('@vueuse/core')['useTimeoutPoll'] const useTimestamp: typeof import('@vueuse/core')['useTimestamp'] const useTitle: typeof import('@vueuse/core')['useTitle'] + const useToNumber: typeof import('@vueuse/core')['useToNumber'] + const useToString: typeof import('@vueuse/core')['useToString'] const useToggle: typeof import('@vueuse/core')['useToggle'] const useTransition: typeof import('@vueuse/core')['useTransition'] const useUrlSearchParams: typeof import('@vueuse/core')['useUrlSearchParams'] @@ -247,8 +271,10 @@ declare global { const watchArray: typeof import('@vueuse/core')['watchArray'] const watchAtMost: typeof import('@vueuse/core')['watchAtMost'] const watchDebounced: typeof import('@vueuse/core')['watchDebounced'] + const watchDeep: typeof import('@vueuse/core')['watchDeep'] const watchEffect: typeof import('vue')['watchEffect'] const watchIgnorable: typeof import('@vueuse/core')['watchIgnorable'] + const watchImmediate: typeof import('@vueuse/core')['watchImmediate'] const watchOnce: typeof import('@vueuse/core')['watchOnce'] const watchPausable: typeof import('@vueuse/core')['watchPausable'] const watchPostEffect: typeof import('vue')['watchPostEffect'] @@ -282,7 +308,9 @@ declare module 'vue' { 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 @@ -302,9 +330,6 @@ declare module 'vue' { readonly isReactive: UnwrapRef readonly isReadonly: UnwrapRef readonly isRef: UnwrapRef - readonly logicAnd: UnwrapRef - readonly logicNot: UnwrapRef - readonly logicOr: UnwrapRef readonly makeDestructurable: UnwrapRef readonly markRaw: UnwrapRef readonly nextTick: UnwrapRef @@ -355,8 +380,9 @@ declare module 'vue' { readonly throttledWatch: UnwrapRef readonly toRaw: UnwrapRef readonly toReactive: UnwrapRef - readonly toRef: UnwrapRef + readonly toRef: UnwrapRef readonly toRefs: UnwrapRef + readonly toValue: UnwrapRef readonly triggerRef: UnwrapRef readonly tryOnBeforeMount: UnwrapRef readonly tryOnBeforeUnmount: UnwrapRef @@ -367,6 +393,19 @@ declare module 'vue' { 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 @@ -377,8 +416,8 @@ declare module 'vue' { readonly useBroadcastChannel: UnwrapRef readonly useBrowserLocation: UnwrapRef readonly useCached: UnwrapRef - readonly useClamp: UnwrapRef readonly useClipboard: UnwrapRef + readonly useCloned: UnwrapRef readonly useColorMode: UnwrapRef readonly useConfirmDialog: UnwrapRef readonly useCounter: UnwrapRef @@ -452,12 +491,18 @@ declare module 'vue' { 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 @@ -471,14 +516,17 @@ declare module 'vue' { 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 readonly useTextareaAutosize: UnwrapRef readonly useThrottle: UnwrapRef @@ -490,6 +538,8 @@ declare module 'vue' { readonly useTimeoutPoll: UnwrapRef readonly useTimestamp: UnwrapRef readonly useTitle: UnwrapRef + readonly useToNumber: UnwrapRef + readonly useToString: UnwrapRef readonly useToggle: UnwrapRef readonly useTransition: UnwrapRef readonly useUrlSearchParams: UnwrapRef @@ -510,8 +560,10 @@ declare module 'vue' { 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 diff --git a/components.d.ts b/components.d.ts index 8c75790d..212a3bca 100644 --- a/components.d.ts +++ b/components.d.ts @@ -9,18 +9,90 @@ export {} 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'] + App: typeof import('./src/App.vue')['default'] + 'Base.layout': typeof import('./src/layouts/base.layout.vue')['default'] + Base64FileConverter: typeof import('./src/tools/base64-file-converter/base64-file-converter.vue')['default'] + Base64StringConverter: typeof import('./src/tools/base64-string-converter/base64-string-converter.vue')['default'] + BasicAuthGenerator: typeof import('./src/tools/basic-auth-generator/basic-auth-generator.vue')['default'] + 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'] + 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'] + CaseConverter: typeof import('./src/tools/case-converter/case-converter.vue')['default'] + CButton: typeof import('./src/ui/c-button/c-button.vue')['default'] + 'CButton.demo': typeof import('./src/ui/c-button/c-button.demo.vue')['default'] + CCard: typeof import('./src/ui/c-card/c-card.vue')['default'] + 'CCard.demo': typeof import('./src/ui/c-card/c-card.demo.vue')['default'] + ChmodCalculator: typeof import('./src/tools/chmod-calculator/chmod-calculator.vue')['default'] + Chronometer: typeof import('./src/tools/chronometer/chronometer.vue')['default'] + CInputText: typeof import('./src/ui/c-input-text/c-input-text.vue')['default'] + 'CInputText.demo': typeof import('./src/ui/c-input-text/c-input-text.demo.vue')['default'] + CLink: typeof import('./src/ui/c-link/c-link.vue')['default'] + 'CLink.demo': typeof import('./src/ui/c-link/c-link.demo.vue')['default'] CollapsibleToolMenu: typeof import('./src/components/CollapsibleToolMenu.vue')['default'] + ColorConverter: typeof import('./src/tools/color-converter/color-converter.vue')['default'] ColoredCard: typeof import('./src/components/ColoredCard.vue')['default'] + CrontabGenerator: typeof import('./src/tools/crontab-generator/crontab-generator.vue')['default'] + DateTimeConverter: typeof import('./src/tools/date-time-converter/date-time-converter.vue')['default'] + 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'] + 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'] + Encryption: typeof import('./src/tools/encryption/encryption.vue')['default'] + EtaCalculator: typeof import('./src/tools/eta-calculator/eta-calculator.vue')['default'] FavoriteButton: typeof import('./src/components/FavoriteButton.vue')['default'] FormatTransformer: typeof import('./src/components/FormatTransformer.vue')['default'] + GitMemo: typeof import('./src/tools/git-memo/git-memo.md')['default'] + HashText: typeof import('./src/tools/hash-text/hash-text.vue')['default'] + 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'] + 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'] + IconMdiArrowRightBottom: typeof import('~icons/mdi/arrow-right-bottom')['default'] + IconMdiCamera: typeof import('~icons/mdi/camera')['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'] + 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'] + 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'] + Ipv4RangeExpander: typeof import('./src/tools/ipv4-range-expander/ipv4-range-expander.vue')['default'] + Ipv4SubnetCalculator: typeof import('./src/tools/ipv4-subnet-calculator/ipv4-subnet-calculator.vue')['default'] + Ipv6UlaGenerator: typeof import('./src/tools/ipv6-ula-generator/ipv6-ula-generator.vue')['default'] + JsonDiff: typeof import('./src/tools/json-diff/json-diff.vue')['default'] + JsonMinify: typeof import('./src/tools/json-minify/json-minify.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'] + JwtParser: typeof import('./src/tools/jwt-parser/jwt-parser.vue')['default'] + KeycodeInfo: typeof import('./src/tools/keycode-info/keycode-info.vue')['default'] + ListConverter: typeof import('./src/tools/list-converter/list-converter.vue')['default'] + LoremIpsumGenerator: typeof import('./src/tools/lorem-ipsum-generator/lorem-ipsum-generator.vue')['default'] + MacAddressLookup: typeof import('./src/tools/mac-address-lookup/mac-address-lookup.vue')['default'] + MathEvaluator: typeof import('./src/tools/math-evaluator/math-evaluator.vue')['default'] + MenuBar: typeof import('./src/tools/html-wysiwyg-editor/editor/menu-bar.vue')['default'] + MenuBarItem: typeof import('./src/tools/html-wysiwyg-editor/editor/menu-bar-item.vue')['default'] MenuIconItem: typeof import('./src/components/MenuIconItem.vue')['default'] 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'] NAutoComplete: typeof import('naive-ui')['NAutoComplete'] NavbarButtons: typeof import('./src/components/NavbarButtons.vue')['default'] - NButton: typeof import('naive-ui')['NButton'] - NCard: typeof import('naive-ui')['NCard'] NCheckbox: typeof import('naive-ui')['NCheckbox'] NCode: typeof import('naive-ui')['NCode'] NCollapseTransition: typeof import('naive-ui')['NCollapseTransition'] @@ -37,7 +109,6 @@ 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'] NInput: typeof import('naive-ui')['NInput'] @@ -50,11 +121,9 @@ declare module '@vue/runtime-core' { NP: typeof import('naive-ui')['NP'] NPageHeader: typeof import('naive-ui')['NPageHeader'] NProgress: typeof import('naive-ui')['NProgress'] - NResult: typeof import('naive-ui')['NResult'] NScrollbar: typeof import('naive-ui')['NScrollbar'] NSelect: typeof import('naive-ui')['NSelect'] NSlider: typeof import('naive-ui')['NSlider'] - NSpace: typeof import('naive-ui')['NSpace'] NStatistic: typeof import('naive-ui')['NStatistic'] NSwitch: typeof import('naive-ui')['NSwitch'] NTable: typeof import('naive-ui')['NTable'] @@ -63,11 +132,34 @@ declare module '@vue/runtime-core' { NTooltip: typeof import('naive-ui')['NTooltip'] NUpload: typeof import('naive-ui')['NUpload'] NUploadDragger: typeof import('naive-ui')['NUploadDragger'] + OtpCodeGeneratorAndValidator: typeof import('./src/tools/otp-code-generator-and-validator/otp-code-generator-and-validator.vue')['default'] + PhoneParserAndFormatter: typeof import('./src/tools/phone-parser-and-formatter/phone-parser-and-formatter.vue')['default'] + QrCodeGenerator: typeof import('./src/tools/qr-code-generator/qr-code-generator.vue')['default'] + RandomPortGenerator: typeof import('./src/tools/random-port-generator/random-port-generator.vue')['default'] + ResultRow: typeof import('./src/tools/ipv4-range-expander/result-row.vue')['default'] + RomanNumeralConverter: typeof import('./src/tools/roman-numeral-converter/roman-numeral-converter.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] + RsaKeyPairGenerator: typeof import('./src/tools/rsa-key-pair-generator/rsa-key-pair-generator.vue')['default'] SearchBar: typeof import('./src/components/SearchBar.vue')['default'] SearchBarItem: typeof import('./src/components/SearchBarItem.vue')['default'] + 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'] + SvgPlaceholderGenerator: typeof import('./src/tools/svg-placeholder-generator/svg-placeholder-generator.vue')['default'] + TemperatureConverter: typeof import('./src/tools/temperature-converter/temperature-converter.vue')['default'] TextareaCopyable: typeof import('./src/components/TextareaCopyable.vue')['default'] + TextStatistics: typeof import('./src/tools/text-statistics/text-statistics.vue')['default'] + TextToNatoAlphabet: typeof import('./src/tools/text-to-nato-alphabet/text-to-nato-alphabet.vue')['default'] + TokenDisplay: typeof import('./src/tools/otp-code-generator-and-validator/token-display.vue')['default'] + 'TokenGenerator.tool': typeof import('./src/tools/token-generator/token-generator.tool.vue')['default'] + 'Tool.layout': typeof import('./src/layouts/tool.layout.vue')['default'] ToolCard: typeof import('./src/components/ToolCard.vue')['default'] + UrlEncoder: typeof import('./src/tools/url-encoder/url-encoder.vue')['default'] + UrlParser: typeof import('./src/tools/url-parser/url-parser.vue')['default'] + UserAgentParser: typeof import('./src/tools/user-agent-parser/user-agent-parser.vue')['default'] + UserAgentResultCards: typeof import('./src/tools/user-agent-parser/user-agent-result-cards.vue')['default'] + UuidGenerator: typeof import('./src/tools/uuid-generator/uuid-generator.vue')['default'] + YamlToJson: typeof import('./src/tools/yaml-to-json-converter/yaml-to-json.vue')['default'] } } diff --git a/package.json b/package.json index f708199a..26a3d5d3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "it-tools", - "version": "2023.4.14-dbad773", + "version": "2023.5.14-77f2efc", "description": "Collection of handy online tools for developers, with great UX. ", "keywords": [ "productivity", @@ -41,13 +41,14 @@ "@tiptap/vue-3": "2.0.0-beta.220", "@vicons/material": "^0.12.0", "@vicons/tabler": "^0.12.0", - "@vueuse/core": "^8.9.4", + "@vueuse/core": "^10.1.2", "@vueuse/head": "^0.7.13", "@vueuse/router": "^9.13.0", "bcryptjs": "^2.4.3", "change-case": "^4.1.2", "colord": "^2.9.3", "composerize-ts": "^0.6.2", + "country-code-lookup": "^0.0.23", "cron-validator": "^1.3.1", "cronstrue": "^2.26.0", "crypto-js": "^4.1.1", @@ -57,6 +58,7 @@ "highlight.js": "^11.7.0", "json5": "^2.2.3", "jwt-decode": "^3.1.2", + "libphonenumber-js": "^1.10.28", "lodash": "^4.17.21", "mathjs": "^10.6.4", "mime-types": "^2.1.35", @@ -77,6 +79,8 @@ "yaml": "^2.2.1" }, "devDependencies": { + "@antfu/eslint-config": "^0.39.3", + "@iconify-json/mdi": "^1.1.50", "@playwright/test": "^1.32.3", "@rushstack/eslint-patch": "^1.2.0", "@types/bcryptjs": "^2.4.2", @@ -96,17 +100,13 @@ "@unocss/eslint-config": "^0.50.8", "@vitejs/plugin-vue": "^2.3.4", "@vitejs/plugin-vue-jsx": "^1.3.10", - "@vue/eslint-config-prettier": "^7.1.0", - "@vue/eslint-config-typescript": "^10.0.0", + "@vue/compiler-sfc": "^3.2.47", + "@vue/runtime-core": "^3.2.47", "@vue/test-utils": "^2.3.2", "@vue/tsconfig": "^0.1.3", "c8": "^7.13.0", "consola": "^3.0.2", "eslint": "^8.38.0", - "eslint-config-prettier": "^8.8.0", - "eslint-import-resolver-typescript": "^3.5.5", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-vue": "^8.7.1", "jsdom": "^19.0.0", "less": "^4.1.3", "prettier": "^2.8.7", @@ -114,6 +114,7 @@ "typescript": "~4.5.5", "unocss": "^0.50.8", "unplugin-auto-import": "^0.15.2", + "unplugin-icons": "^0.16.1", "unplugin-vue-components": "^0.24.1", "vite": "^2.9.15", "vite-plugin-md": "^0.12.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e1b8715..914a9e12 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,8 +26,8 @@ dependencies: specifier: ^0.12.0 version: 0.12.0 '@vueuse/core': - specifier: ^8.9.4 - version: 8.9.4(vue@3.2.47) + specifier: ^10.1.2 + version: 10.1.2(vue@3.2.47) '@vueuse/head': specifier: ^0.7.13 version: 0.7.13(vue@3.2.47) @@ -46,6 +46,9 @@ dependencies: composerize-ts: specifier: ^0.6.2 version: 0.6.2 + country-code-lookup: + specifier: ^0.0.23 + version: 0.0.23 cron-validator: specifier: ^1.3.1 version: 1.3.1 @@ -73,6 +76,9 @@ dependencies: jwt-decode: specifier: ^3.1.2 version: 3.1.2 + libphonenumber-js: + specifier: ^1.10.28 + version: 1.10.28 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -129,6 +135,12 @@ dependencies: version: 2.2.1 devDependencies: + '@antfu/eslint-config': + specifier: ^0.39.3 + version: 0.39.3(eslint@8.38.0)(typescript@4.5.5) + '@iconify-json/mdi': + specifier: ^1.1.50 + version: 1.1.50 '@playwright/test': specifier: ^1.32.3 version: 1.32.3 @@ -186,12 +198,12 @@ devDependencies: '@vitejs/plugin-vue-jsx': specifier: ^1.3.10 version: 1.3.10 - '@vue/eslint-config-prettier': - specifier: ^7.1.0 - version: 7.1.0(eslint@8.38.0)(prettier@2.8.7) - '@vue/eslint-config-typescript': - specifier: ^10.0.0 - version: 10.0.0(eslint-plugin-vue@8.7.1)(eslint@8.38.0)(typescript@4.5.5) + '@vue/compiler-sfc': + specifier: ^3.2.47 + version: 3.2.47 + '@vue/runtime-core': + specifier: ^3.2.47 + version: 3.2.47 '@vue/test-utils': specifier: ^2.3.2 version: 2.3.2(vue@3.2.47) @@ -207,18 +219,6 @@ devDependencies: eslint: specifier: ^8.38.0 version: 8.38.0 - eslint-config-prettier: - specifier: ^8.8.0 - version: 8.8.0(eslint@8.38.0) - eslint-import-resolver-typescript: - specifier: ^3.5.5 - version: 3.5.5(@typescript-eslint/parser@5.58.0)(eslint-plugin-import@2.27.5)(eslint@8.38.0) - eslint-plugin-import: - specifier: ^2.27.5 - version: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.38.0) - eslint-plugin-vue: - specifier: ^8.7.1 - version: 8.7.1(eslint@8.38.0) jsdom: specifier: ^19.0.0 version: 19.0.0 @@ -239,7 +239,10 @@ devDependencies: version: 0.50.8(postcss@8.4.21)(rollup@2.79.1)(vite@2.9.15) unplugin-auto-import: specifier: ^0.15.2 - version: 0.15.2(@vueuse/core@8.9.4)(rollup@2.79.1) + version: 0.15.2(@vueuse/core@10.1.2)(rollup@2.79.1) + unplugin-icons: + specifier: ^0.16.1 + version: 0.16.1(@vue/compiler-sfc@3.2.47) unplugin-vue-components: specifier: ^0.24.1 version: 0.24.1(rollup@2.79.1)(vue@3.2.47) @@ -278,6 +281,102 @@ packages: '@jridgewell/trace-mapping': 0.3.18 dev: true + /@antfu/eslint-config-basic@0.39.3(@typescript-eslint/eslint-plugin@5.59.7)(@typescript-eslint/parser@5.59.7)(eslint@8.38.0)(typescript@4.5.5): + resolution: {integrity: sha512-cxV2jcVbLeTbZFgFXETAg2+Lbs0r2k/bU4FSEA9lQV7hVpJvfnfJvqph2w/CQllnIa7zoMmlUZN5JHapk11M9Q==} + peerDependencies: + eslint: '>=7.4.0' + dependencies: + eslint: 8.38.0 + eslint-plugin-antfu: 0.39.3(eslint@8.38.0)(typescript@4.5.5) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.38.0) + eslint-plugin-html: 7.1.0 + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.7)(eslint@8.38.0) + eslint-plugin-jsonc: 2.8.0(eslint@8.38.0) + eslint-plugin-markdown: 3.0.0(eslint@8.38.0) + eslint-plugin-n: 16.0.0(eslint@8.38.0) + eslint-plugin-no-only-tests: 3.1.0 + eslint-plugin-promise: 6.1.1(eslint@8.38.0) + eslint-plugin-unicorn: 47.0.0(eslint@8.38.0) + eslint-plugin-unused-imports: 2.0.0(@typescript-eslint/eslint-plugin@5.59.7)(eslint@8.38.0) + eslint-plugin-yml: 1.7.0(eslint@8.38.0) + jsonc-eslint-parser: 2.3.0 + yaml-eslint-parser: 1.2.2 + transitivePeerDependencies: + - '@typescript-eslint/eslint-plugin' + - '@typescript-eslint/parser' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + - typescript + dev: true + + /@antfu/eslint-config-ts@0.39.3(eslint@8.38.0)(typescript@4.5.5): + resolution: {integrity: sha512-c9lSYr3eWu+IImzYmUs1YrvMFZC98Xk9rlhX2JGf49SnUrAj2rOPzrmLmGG9VWYKiay5k8DiL57IuLFIkGWy9w==} + peerDependencies: + eslint: '>=7.4.0' + typescript: '>=3.9' + dependencies: + '@antfu/eslint-config-basic': 0.39.3(@typescript-eslint/eslint-plugin@5.59.7)(@typescript-eslint/parser@5.59.7)(eslint@8.38.0)(typescript@4.5.5) + '@typescript-eslint/eslint-plugin': 5.59.7(@typescript-eslint/parser@5.59.7)(eslint@8.38.0)(typescript@4.5.5) + '@typescript-eslint/parser': 5.59.7(eslint@8.38.0)(typescript@4.5.5) + eslint: 8.38.0 + eslint-plugin-jest: 27.2.1(@typescript-eslint/eslint-plugin@5.59.7)(eslint@8.38.0)(typescript@4.5.5) + typescript: 4.5.5 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + dev: true + + /@antfu/eslint-config-vue@0.39.3(@typescript-eslint/eslint-plugin@5.59.7)(@typescript-eslint/parser@5.59.7)(eslint@8.38.0)(typescript@4.5.5): + resolution: {integrity: sha512-Q3qOobJHfqq/tZg5aBDylA96oEUfb54UWdovSFhn8s6FjJMIO7Otecxe8fTynpHKrEHmx38jnnx3JvTLAR+BAg==} + peerDependencies: + eslint: '>=7.4.0' + dependencies: + '@antfu/eslint-config-basic': 0.39.3(@typescript-eslint/eslint-plugin@5.59.7)(@typescript-eslint/parser@5.59.7)(eslint@8.38.0)(typescript@4.5.5) + '@antfu/eslint-config-ts': 0.39.3(eslint@8.38.0)(typescript@4.5.5) + eslint: 8.38.0 + eslint-plugin-vue: 9.14.1(eslint@8.38.0) + local-pkg: 0.4.3 + transitivePeerDependencies: + - '@typescript-eslint/eslint-plugin' + - '@typescript-eslint/parser' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + - typescript + dev: true + + /@antfu/eslint-config@0.39.3(eslint@8.38.0)(typescript@4.5.5): + resolution: {integrity: sha512-0z6PKnK/H88ECd3Qq4vKWyi7ptUhGM9C6Rp28edJVQIA4305ofOXlo6O7v8eyD3sT72PCWUB85k54lo8slwWDw==} + peerDependencies: + eslint: '>=7.4.0' + dependencies: + '@antfu/eslint-config-vue': 0.39.3(@typescript-eslint/eslint-plugin@5.59.7)(@typescript-eslint/parser@5.59.7)(eslint@8.38.0)(typescript@4.5.5) + '@typescript-eslint/eslint-plugin': 5.59.7(@typescript-eslint/parser@5.59.7)(eslint@8.38.0)(typescript@4.5.5) + '@typescript-eslint/parser': 5.59.7(eslint@8.38.0)(typescript@4.5.5) + eslint: 8.38.0 + eslint-plugin-eslint-comments: 3.2.0(eslint@8.38.0) + eslint-plugin-html: 7.1.0 + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.7)(eslint@8.38.0) + eslint-plugin-jsonc: 2.8.0(eslint@8.38.0) + eslint-plugin-n: 16.0.0(eslint@8.38.0) + eslint-plugin-promise: 6.1.1(eslint@8.38.0) + eslint-plugin-unicorn: 47.0.0(eslint@8.38.0) + eslint-plugin-vue: 9.14.1(eslint@8.38.0) + eslint-plugin-yml: 1.7.0(eslint@8.38.0) + jsonc-eslint-parser: 2.3.0 + yaml-eslint-parser: 1.2.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + - typescript + dev: true + /@antfu/install-pkg@0.1.1: resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==} dependencies: @@ -1606,6 +1705,12 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true + /@iconify-json/mdi@1.1.50: + resolution: {integrity: sha512-SgbT5w5eHCdOG74ZWPz7HlTGk6VsifIJhNi6lAsxj/5Nlqt6Cz4LlQmSa9eecU9p075Jub2aAx/o7YI+GCahRQ==} + dependencies: + '@iconify/types': 2.0.0 + dev: true + /@iconify/types@2.0.0: resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} dev: true @@ -2239,6 +2344,12 @@ packages: '@types/mdurl': 1.0.2 dev: true + /@types/mdast@3.0.11: + resolution: {integrity: sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==} + dependencies: + '@types/unist': 2.0.6 + dev: true + /@types/mdurl@1.0.2: resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} dev: true @@ -2269,6 +2380,10 @@ packages: resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} dev: true + /@types/normalize-package-data@2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + /@types/object.omit@3.0.0: resolution: {integrity: sha512-I27IoPpH250TUzc9FzXd0P1BV/BMJuzqD3jOz98ehf9dQqGkxlq+hO1bIqZGWqCg5bVOy0g4AUVJtnxe0klDmw==} dev: false @@ -2327,19 +2442,23 @@ packages: resolution: {integrity: sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==} dev: true + /@types/unist@2.0.6: + resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + dev: true + /@types/uuid@8.3.4: resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} dev: true - /@types/web-bluetooth@0.0.14: - resolution: {integrity: sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A==} + /@types/web-bluetooth@0.0.17: + resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==} /@types/which@2.0.2: resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} dev: true - /@typescript-eslint/eslint-plugin@5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.38.0)(typescript@4.5.5): - resolution: {integrity: sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==} + /@typescript-eslint/eslint-plugin@5.59.7(@typescript-eslint/parser@5.59.7)(eslint@8.38.0)(typescript@4.5.5): + resolution: {integrity: sha512-BL+jYxUFIbuYwy+4fF86k5vdT9lT0CNJ6HtwrIvGh0PhH8s0yy5rjaKH2fDCrz5ITHy07WCzVGNvAmjJh4IJFA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -2350,10 +2469,10 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.5.0 - '@typescript-eslint/parser': 5.58.0(eslint@8.38.0)(typescript@4.5.5) - '@typescript-eslint/scope-manager': 5.58.0 - '@typescript-eslint/type-utils': 5.58.0(eslint@8.38.0)(typescript@4.5.5) - '@typescript-eslint/utils': 5.58.0(eslint@8.38.0)(typescript@4.5.5) + '@typescript-eslint/parser': 5.59.7(eslint@8.38.0)(typescript@4.5.5) + '@typescript-eslint/scope-manager': 5.59.7 + '@typescript-eslint/type-utils': 5.59.7(eslint@8.38.0)(typescript@4.5.5) + '@typescript-eslint/utils': 5.59.7(eslint@8.38.0)(typescript@4.5.5) debug: 4.3.4 eslint: 8.38.0 grapheme-splitter: 1.0.4 @@ -2386,6 +2505,26 @@ packages: - supports-color dev: true + /@typescript-eslint/parser@5.59.7(eslint@8.38.0)(typescript@4.5.5): + resolution: {integrity: sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.59.7 + '@typescript-eslint/types': 5.59.7 + '@typescript-eslint/typescript-estree': 5.59.7(typescript@4.5.5) + debug: 4.3.4 + eslint: 8.38.0 + typescript: 4.5.5 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/scope-manager@5.58.0: resolution: {integrity: sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2394,8 +2533,16 @@ packages: '@typescript-eslint/visitor-keys': 5.58.0 dev: true - /@typescript-eslint/type-utils@5.58.0(eslint@8.38.0)(typescript@4.5.5): - resolution: {integrity: sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==} + /@typescript-eslint/scope-manager@5.59.7: + resolution: {integrity: sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.59.7 + '@typescript-eslint/visitor-keys': 5.59.7 + dev: true + + /@typescript-eslint/type-utils@5.59.7(eslint@8.38.0)(typescript@4.5.5): + resolution: {integrity: sha512-ozuz/GILuYG7osdY5O5yg0QxXUAEoI4Go3Do5xeu+ERH9PorHBPSdvD3Tjp2NN2bNLh1NJQSsQu2TPu/Ly+HaQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -2404,8 +2551,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.58.0(typescript@4.5.5) - '@typescript-eslint/utils': 5.58.0(eslint@8.38.0)(typescript@4.5.5) + '@typescript-eslint/typescript-estree': 5.59.7(typescript@4.5.5) + '@typescript-eslint/utils': 5.59.7(eslint@8.38.0)(typescript@4.5.5) debug: 4.3.4 eslint: 8.38.0 tsutils: 3.21.0(typescript@4.5.5) @@ -2419,6 +2566,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@typescript-eslint/types@5.59.7: + resolution: {integrity: sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@typescript-eslint/typescript-estree@5.58.0(typescript@4.5.5): resolution: {integrity: sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2440,6 +2592,27 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree@5.59.7(typescript@4.5.5): + resolution: {integrity: sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.59.7 + '@typescript-eslint/visitor-keys': 5.59.7 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.1 + tsutils: 3.21.0(typescript@4.5.5) + typescript: 4.5.5 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/utils@5.58.0(eslint@8.38.0)(typescript@4.5.5): resolution: {integrity: sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2460,6 +2633,26 @@ packages: - typescript dev: true + /@typescript-eslint/utils@5.59.7(eslint@8.38.0)(typescript@4.5.5): + resolution: {integrity: sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.38.0) + '@types/json-schema': 7.0.11 + '@types/semver': 7.3.13 + '@typescript-eslint/scope-manager': 5.59.7 + '@typescript-eslint/types': 5.59.7 + '@typescript-eslint/typescript-estree': 5.59.7(typescript@4.5.5) + eslint: 8.38.0 + eslint-scope: 5.1.1 + semver: 7.4.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/visitor-keys@5.58.0: resolution: {integrity: sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2468,6 +2661,14 @@ packages: eslint-visitor-keys: 3.4.0 dev: true + /@typescript-eslint/visitor-keys@5.59.7: + resolution: {integrity: sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.59.7 + eslint-visitor-keys: 3.4.0 + dev: true + /@unocss/astro@0.50.8(rollup@2.79.1)(vite@2.9.15): resolution: {integrity: sha512-kphNlr0PWGzvkCgKx7RaZWQ45khieCCt9OffUnxbRRft+jodsVXIwzHn+bOhGtIKpEpZiOzxRzTYjfW/R6XnTw==} dependencies: @@ -2830,39 +3031,6 @@ packages: resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} dev: false - /@vue/eslint-config-prettier@7.1.0(eslint@8.38.0)(prettier@2.8.7): - resolution: {integrity: sha512-Pv/lVr0bAzSIHLd9iz0KnvAr4GKyCEl+h52bc4e5yWuDVtLgFwycF7nrbWTAQAS+FU6q1geVd07lc6EWfJiWKQ==} - peerDependencies: - eslint: '>= 7.28.0' - prettier: '>= 2.0.0' - dependencies: - eslint: 8.38.0 - eslint-config-prettier: 8.8.0(eslint@8.38.0) - eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.8.0)(eslint@8.38.0)(prettier@2.8.7) - prettier: 2.8.7 - dev: true - - /@vue/eslint-config-typescript@10.0.0(eslint-plugin-vue@8.7.1)(eslint@8.38.0)(typescript@4.5.5): - resolution: {integrity: sha512-F94cL8ug3FaYXlCfU5/wiGjk1qeadmoBpRGAOBq+qre3Smdupa59dd6ZJrsfRODpsMPyTG7330juMDsUvpZ3Rw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 - eslint-plugin-vue: ^8.0.1 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/eslint-plugin': 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.38.0)(typescript@4.5.5) - '@typescript-eslint/parser': 5.58.0(eslint@8.38.0)(typescript@4.5.5) - eslint: 8.38.0 - eslint-plugin-vue: 8.7.1(eslint@8.38.0) - typescript: 4.5.5 - vue-eslint-parser: 8.3.0(eslint@8.38.0) - transitivePeerDependencies: - - supports-color - dev: true - /@vue/reactivity-transform@3.2.47: resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} dependencies: @@ -2925,22 +3093,16 @@ packages: '@types/node': 16.18.23 dev: true - /@vueuse/core@8.9.4(vue@3.2.47): - resolution: {integrity: sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==} - peerDependencies: - '@vue/composition-api': ^1.1.0 - vue: ^2.6.0 || ^3.2.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true - vue: - optional: true + /@vueuse/core@10.1.2(vue@3.2.47): + resolution: {integrity: sha512-roNn8WuerI56A5uiTyF/TEYX0Y+VKlhZAF94unUfdhbDUI+NfwQMn4FUnUscIRUhv3344qvAghopU4bzLPNFlA==} dependencies: - '@types/web-bluetooth': 0.0.14 - '@vueuse/metadata': 8.9.4 - '@vueuse/shared': 8.9.4(vue@3.2.47) - vue: 3.2.47 - vue-demi: 0.13.11(vue@3.2.47) + '@types/web-bluetooth': 0.0.17 + '@vueuse/metadata': 10.1.2 + '@vueuse/shared': 10.1.2(vue@3.2.47) + vue-demi: 0.14.1(vue@3.2.47) + transitivePeerDependencies: + - '@vue/composition-api' + - vue /@vueuse/head@0.7.13(vue@3.2.47): resolution: {integrity: sha512-VHSla/0uOAUii/mz+NWLFKMrMbz/lQoYxEcpS/ri7drepYjdB5QdbTnD2KdOX8EmQM/b07qpjKanr7erGrd3XA==} @@ -2953,8 +3115,8 @@ packages: - '@vue/composition-api' dev: false - /@vueuse/metadata@8.9.4: - resolution: {integrity: sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw==} + /@vueuse/metadata@10.1.2: + resolution: {integrity: sha512-3mc5BqN9aU2SqBeBuWE7ne4OtXHoHKggNgxZR2K+zIW4YLsy6xoZ4/9vErQs6tvoKDX6QAqm3lvsrv0mczAwIQ==} /@vueuse/router@9.13.0(vue-router@4.1.6)(vue@3.2.47): resolution: {integrity: sha512-lcL6auSUGMGZMdDzZJb02QDe909AChzMXoxqFS3gL2E8mHmIx0SrNor+33UkqvvBPi18vXpDq/R7tPd9fxWwTg==} @@ -2969,24 +3131,18 @@ packages: - vue dev: false - /@vueuse/shared@8.9.4(vue@3.2.47): - resolution: {integrity: sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==} - peerDependencies: - '@vue/composition-api': ^1.1.0 - vue: ^2.6.0 || ^3.2.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true - vue: - optional: true + /@vueuse/shared@10.1.2(vue@3.2.47): + resolution: {integrity: sha512-1uoUTPBlgyscK9v6ScGeVYDDzlPSFXBlxuK7SfrDGyUTBiznb3mNceqhwvZHjtDRELZEN79V5uWPTF1VDV8svA==} dependencies: - vue: 3.2.47 - vue-demi: 0.13.11(vue@3.2.47) + vue-demi: 0.14.1(vue@3.2.47) + transitivePeerDependencies: + - '@vue/composition-api' + - vue /@vueuse/shared@9.13.0(vue@3.2.47): resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} dependencies: - vue-demi: 0.13.11(vue@3.2.47) + vue-demi: 0.14.1(vue@3.2.47) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -3314,6 +3470,12 @@ packages: engines: {node: '>=6'} dev: true + /builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + dependencies: + semver: 7.5.1 + dev: true + /c8@7.13.0: resolution: {integrity: sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==} engines: {node: '>=10.12.0'} @@ -3440,12 +3602,24 @@ packages: resolution: {integrity: sha512-acv43vqJ0+N0rD+Uw3pDHSxP30FHrywu2NO6/wBaHChJIizpDeBUd6NjqhNhy9LGaEAhZAXn46QzmlAvIWd16g==} dev: false + /character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + dev: true + + /character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + dev: true + /character-parser@2.2.0: resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} dependencies: is-regex: 1.1.4 dev: true + /character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + dev: true + /check-error@1.0.2: resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} dev: true @@ -3470,6 +3644,18 @@ packages: fsevents: 2.3.2 dev: true + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: true + + /clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + /cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} dependencies: @@ -3604,6 +3790,10 @@ packages: browserslist: 4.21.5 dev: true + /country-code-lookup@0.0.23: + resolution: {integrity: sha512-kxhIGcau9/X+tgPg9yO2q1OLu8jiYYsdwXuiXzHdsgNChd36xrJMlOba7ka9O1xShCVTiVQPQpq/tcuy4WiW+Q==} + dev: false + /country-data@0.0.31: resolution: {integrity: sha512-YqlY/i6ikZwoBFfdjK+hJTGaBdTgDpXLI15MCj2UsXZ2cPBb+Kx86AXmDH7PRGt0LUleck0cCgNdWeIhfbcxkQ==} dependencies: @@ -3868,6 +4058,14 @@ packages: entities: 2.2.0 dev: true + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: true + /domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} dev: true @@ -3886,6 +4084,13 @@ packages: domelementtype: 2.3.0 dev: true + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + /domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} dependencies: @@ -3894,6 +4099,14 @@ packages: domhandler: 4.3.1 dev: true + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + /dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: @@ -3941,14 +4154,6 @@ packages: resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} dev: false - /enhanced-resolve@5.12.0: - resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - /entities@2.1.0: resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} dev: true @@ -3961,6 +4166,11 @@ packages: resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} engines: {node: '>=0.12'} + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + /errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true @@ -3970,6 +4180,12 @@ packages: dev: true optional: true + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + /es-abstract@1.21.2: resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} engines: {node: '>= 0.4'} @@ -4278,15 +4494,6 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier@8.8.0(eslint@8.38.0): - resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - dependencies: - eslint: 8.38.0 - dev: true - /eslint-import-resolver-node@0.3.7: resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} dependencies: @@ -4297,31 +4504,7 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.58.0)(eslint-plugin-import@2.27.5)(eslint@8.38.0): - resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - dependencies: - debug: 4.3.4 - enhanced-resolve: 5.12.0 - eslint: 8.38.0 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.38.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.38.0) - get-tsconfig: 4.5.0 - globby: 13.1.4 - is-core-module: 2.12.0 - is-glob: 4.0.3 - synckit: 0.8.5 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.38.0): + /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.59.7)(eslint-import-resolver-node@0.3.7)(eslint@8.38.0): resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: @@ -4342,16 +4525,53 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.58.0(eslint@8.38.0)(typescript@4.5.5) + '@typescript-eslint/parser': 5.59.7(eslint@8.38.0)(typescript@4.5.5) debug: 3.2.7 eslint: 8.38.0 eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.58.0)(eslint-plugin-import@2.27.5)(eslint@8.38.0) transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.38.0): + /eslint-plugin-antfu@0.39.3(eslint@8.38.0)(typescript@4.5.5): + resolution: {integrity: sha512-aHOwS1ou+1xWKhxMVjR2/ScXEYGs5qAXHiHbYD+Ps9Ld1+G0OyjZDKT7w+vXLAgGb1bPV8abwJ8XBaJMoQ6qOA==} + dependencies: + '@typescript-eslint/utils': 5.59.7(eslint@8.38.0)(typescript@4.5.5) + transitivePeerDependencies: + - eslint + - supports-color + - typescript + dev: true + + /eslint-plugin-es-x@6.2.1(eslint@8.38.0): + resolution: {integrity: sha512-uR34zUhZ9EBoiSD2DdV5kHLpydVEvwWqjteUr9sXRgJknwbKZJZhdJ7uFnaTtd+Nr/2G3ceJHnHXrFhJ67n3Tw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.38.0) + '@eslint-community/regexpp': 4.5.0 + eslint: 8.38.0 + dev: true + + /eslint-plugin-eslint-comments@3.2.0(eslint@8.38.0): + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + escape-string-regexp: 1.0.5 + eslint: 8.38.0 + ignore: 5.2.4 + dev: true + + /eslint-plugin-html@7.1.0: + resolution: {integrity: sha512-fNLRraV/e6j8e3XYOC9xgND4j+U7b1Rq+OygMlLcMg+wI/IpVbF+ubQa3R78EjKB9njT6TQOlcK5rFKBVVtdfg==} + dependencies: + htmlparser2: 8.0.2 + dev: true + + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.59.7)(eslint@8.38.0): resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: @@ -4361,7 +4581,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.58.0(eslint@8.38.0)(typescript@4.5.5) + '@typescript-eslint/parser': 5.59.7(eslint@8.38.0)(typescript@4.5.5) array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 @@ -4369,7 +4589,7 @@ packages: doctrine: 2.1.0 eslint: 8.38.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.38.0) + eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.59.7)(eslint-import-resolver-node@0.3.7)(eslint@8.38.0) has: 1.0.3 is-core-module: 2.12.0 is-glob: 4.0.3 @@ -4384,40 +4604,160 @@ packages: - supports-color dev: true - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@8.38.0)(prettier@2.8.7): - resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} - engines: {node: '>=12.0.0'} + /eslint-plugin-jest@27.2.1(@typescript-eslint/eslint-plugin@5.59.7)(eslint@8.38.0)(typescript@4.5.5): + resolution: {integrity: sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: - eslint: '>=7.28.0' - eslint-config-prettier: '*' - prettier: '>=2.0.0' + '@typescript-eslint/eslint-plugin': ^5.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: '*' peerDependenciesMeta: - eslint-config-prettier: + '@typescript-eslint/eslint-plugin': + optional: true + jest: optional: true dependencies: + '@typescript-eslint/eslint-plugin': 5.59.7(@typescript-eslint/parser@5.59.7)(eslint@8.38.0)(typescript@4.5.5) + '@typescript-eslint/utils': 5.59.7(eslint@8.38.0)(typescript@4.5.5) eslint: 8.38.0 - eslint-config-prettier: 8.8.0(eslint@8.38.0) - prettier: 2.8.7 - prettier-linter-helpers: 1.0.0 + transitivePeerDependencies: + - supports-color + - typescript dev: true - /eslint-plugin-vue@8.7.1(eslint@8.38.0): - resolution: {integrity: sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==} + /eslint-plugin-jsonc@2.8.0(eslint@8.38.0): + resolution: {integrity: sha512-K4VsnztnNwpm+V49CcCu5laq8VjclJpuhfI9LFkOrOyK+BKdQHMzkWo43B4X4rYaVrChm4U9kw/tTU5RHh5Wtg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.38.0) + eslint: 8.38.0 + jsonc-eslint-parser: 2.3.0 + natural-compare: 1.4.0 + dev: true + + /eslint-plugin-markdown@3.0.0(eslint@8.38.0): + resolution: {integrity: sha512-hRs5RUJGbeHDLfS7ELanT0e29Ocyssf/7kBM+p7KluY5AwngGkDf8Oyu4658/NZSGTTq05FZeWbkxXtbVyHPwg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.38.0 + mdast-util-from-markdown: 0.8.5 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-n@16.0.0(eslint@8.38.0): + resolution: {integrity: sha512-akkZTE3hsHBrq6CwmGuYCzQREbVUrA855kzcHqe6i0FLBkeY7Y/6tThCVkjUnjhvRBAlc+8lILcSe5QvvDpeZQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + eslint: '>=7.0.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.38.0) + builtins: 5.0.1 + eslint: 8.38.0 + eslint-plugin-es-x: 6.2.1(eslint@8.38.0) + ignore: 5.2.4 + is-core-module: 2.12.0 + minimatch: 3.1.2 + resolve: 1.22.2 + semver: 7.5.1 + dev: true + + /eslint-plugin-no-only-tests@3.1.0: + resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} + engines: {node: '>=5.0.0'} + dev: true + + /eslint-plugin-promise@6.1.1(eslint@8.38.0): + resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.38.0 + dev: true + + /eslint-plugin-unicorn@47.0.0(eslint@8.38.0): + resolution: {integrity: sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.38.0' + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.38.0) + ci-info: 3.8.0 + clean-regexp: 1.0.0 + eslint: 8.38.0 + esquery: 1.5.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.0.2 + lodash: 4.17.21 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + safe-regex: 2.1.1 + semver: 7.4.0 + strip-indent: 3.0.0 + dev: true + + /eslint-plugin-unused-imports@2.0.0(@typescript-eslint/eslint-plugin@5.59.7)(eslint@8.38.0): + resolution: {integrity: sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 + eslint: ^8.0.0 + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 5.59.7(@typescript-eslint/parser@5.59.7)(eslint@8.38.0)(typescript@4.5.5) + eslint: 8.38.0 + eslint-rule-composer: 0.3.0 + dev: true + + /eslint-plugin-vue@9.14.1(eslint@8.38.0): + resolution: {integrity: sha512-LQazDB1qkNEKejLe/b5a9VfEbtbczcOaui5lQ4Qw0tbRBbQYREyxxOV5BQgNDTqGPs9pxqiEpbMi9ywuIaF7vw==} + engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.38.0) eslint: 8.38.0 - eslint-utils: 3.0.0(eslint@8.38.0) natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.0.11 semver: 7.4.0 - vue-eslint-parser: 8.3.0(eslint@8.38.0) + vue-eslint-parser: 9.3.0(eslint@8.38.0) + xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color dev: true + /eslint-plugin-yml@1.7.0(eslint@8.38.0): + resolution: {integrity: sha512-qq61FQJk+qIgWl0R06bec7UQQEIBrUH22jS+MroTbFUKu+3/iVlGRpZd8mjpOAm/+H/WEDFwy4x/+kKgVGbsWw==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + debug: 4.3.4 + eslint: 8.38.0 + lodash: 4.17.21 + natural-compare: 1.4.0 + yaml-eslint-parser: 1.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-rule-composer@0.3.0: + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} + engines: {node: '>=4.0.0'} + dev: true + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -4434,21 +4774,6 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils@3.0.0(eslint@8.38.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.38.0 - eslint-visitor-keys: 2.1.0 - dev: true - - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true - /eslint-visitor-keys@3.4.0: resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4595,10 +4920,6 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - /fast-diff@1.2.0: - resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} - dev: true - /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} @@ -4677,7 +4998,6 @@ packages: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: false /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} @@ -4844,10 +5164,6 @@ packages: get-intrinsic: 1.2.0 dev: true - /get-tsconfig@4.5.0: - resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==} - dev: true - /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -5024,6 +5340,10 @@ packages: engines: {node: '>=12.0.0'} dev: false + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + /html-encoding-sniffer@3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} @@ -5049,6 +5369,15 @@ packages: entities: 3.0.1 dev: true + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: true + /http-proxy-agent@4.0.1: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} engines: {node: '>= 6'} @@ -5128,6 +5457,11 @@ packages: engines: {node: '>=0.8.19'} dev: true + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -5166,6 +5500,17 @@ packages: jsbn: 1.1.0 dev: false + /is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + dev: true + + /is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + dev: true + /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -5174,6 +5519,10 @@ packages: is-typed-array: 1.1.10 dev: true + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -5195,6 +5544,13 @@ packages: has-tostringtag: 1.0.0 dev: true + /is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: true + /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -5213,6 +5569,10 @@ packages: has-tostringtag: 1.0.0 dev: true + /is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + dev: true + /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -5254,6 +5614,10 @@ packages: is-extglob: 2.1.1 dev: true + /is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + dev: true + /is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} dev: true @@ -5540,6 +5904,16 @@ packages: hasBin: true dev: true + /jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true @@ -5574,6 +5948,16 @@ packages: engines: {node: '>=6'} hasBin: true + /jsonc-eslint-parser@2.3.0: + resolution: {integrity: sha512-9xZPKVYp9DxnM3sd1yAsh/d59iIaswDkai8oTxbursfKYbg/ibjX0IzFt35+VZ8iEW453TVTXztnRvYUQlAfUQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.2 + eslint-visitor-keys: 3.4.0 + espree: 9.5.1 + semver: 7.4.0 + dev: true + /jsonc-parser@2.3.1: resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} dev: true @@ -5665,6 +6049,14 @@ packages: type-check: 0.4.0 dev: true + /libphonenumber-js@1.10.28: + resolution: {integrity: sha512-1eAgjLrZA0+2Wgw4hs+4Q/kEBycxQo8ZLYnmOvZ3AlM8ImAVAJgDPlZtISLEzD1vunc2q8s2Pn7XwB7I8U3Kzw==} + dev: false + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + /linkify-it@3.0.3: resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} dependencies: @@ -5687,7 +6079,6 @@ packages: engines: {node: '>=8'} dependencies: p-locate: 4.1.0 - dev: false /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} @@ -5822,6 +6213,22 @@ packages: typed-function: 2.1.0 dev: false + /mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + dependencies: + '@types/mdast': 3.0.11 + mdast-util-to-string: 2.0.0 + micromark: 2.11.4 + parse-entities: 2.0.0 + unist-util-stringify-position: 2.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + dev: true + /mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} dev: true @@ -5842,6 +6249,15 @@ packages: engines: {node: '>= 8'} dev: true + /micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + dependencies: + debug: 4.3.4 + parse-entities: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -5873,6 +6289,11 @@ packages: engines: {node: '>=6'} dev: true + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -6027,6 +6448,15 @@ packages: abbrev: 1.1.1 dev: true + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.2 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: true + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -6175,7 +6605,6 @@ packages: engines: {node: '>=6'} dependencies: p-try: 2.2.0 - dev: false /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} @@ -6189,7 +6618,6 @@ packages: engines: {node: '>=8'} dependencies: p-limit: 2.3.0 - dev: false /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} @@ -6201,7 +6629,6 @@ packages: /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - dev: false /param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} @@ -6217,6 +6644,27 @@ packages: callsites: 3.1.0 dev: true + /parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.21.4 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + /parse-node-version@1.0.1: resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} engines: {node: '>= 0.10'} @@ -6331,6 +6779,11 @@ packages: hasBin: true dev: true + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true + /pngjs@5.0.0: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} @@ -6362,13 +6815,6 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - dependencies: - fast-diff: 1.2.0 - dev: true - /prettier@2.8.7: resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} engines: {node: '>=10.13.0'} @@ -6683,6 +7129,25 @@ packages: dependencies: safe-buffer: 5.2.1 + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -6710,6 +7175,11 @@ packages: '@babel/runtime': 7.21.0 dev: true + /regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + dev: true + /regexp.prototype.flags@1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} engines: {node: '>= 0.4'} @@ -6731,6 +7201,13 @@ packages: unicode-match-property-value-ecmascript: 2.1.0 dev: true + /regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + /regjsparser@0.9.1: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true @@ -6837,6 +7314,12 @@ packages: is-regex: 1.1.4 dev: true + /safe-regex@2.1.1: + resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} + dependencies: + regexp-tree: 0.1.27 + dev: true + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true @@ -6891,6 +7374,14 @@ packages: lru-cache: 6.0.0 dev: true + /semver@7.5.1: + resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /sentence-case@3.0.4: resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} dependencies: @@ -6997,6 +7488,28 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + dev: true + /split@0.3.3: resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} dependencies: @@ -7126,6 +7639,13 @@ packages: engines: {node: '>=6'} dev: true + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -7186,11 +7706,6 @@ packages: tslib: 2.5.0 dev: true - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true - /temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} @@ -7375,6 +7890,16 @@ packages: engines: {node: '>=10'} dev: true + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + /type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} @@ -7478,6 +8003,12 @@ packages: crypto-random-string: 2.0.0 dev: true + /unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + dependencies: + '@types/unist': 2.0.6 + dev: true + /universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} @@ -7523,7 +8054,7 @@ packages: - vite dev: true - /unplugin-auto-import@0.15.2(@vueuse/core@8.9.4)(rollup@2.79.1): + /unplugin-auto-import@0.15.2(@vueuse/core@10.1.2)(rollup@2.79.1): resolution: {integrity: sha512-Wivfu+xccgvEZG8QtZcIvt6napfX9wyOFqM//7FHOtev8+k+dp3ykiqsEl6TODgHmqTTBeQX4Ah1JvRgUNjlkg==} engines: {node: '>=14'} peerDependencies: @@ -7537,7 +8068,7 @@ packages: dependencies: '@antfu/utils': 0.7.2 '@rollup/pluginutils': 5.0.2(rollup@2.79.1) - '@vueuse/core': 8.9.4(vue@3.2.47) + '@vueuse/core': 10.1.2(vue@3.2.47) local-pkg: 0.4.3 magic-string: 0.30.0 minimatch: 7.4.6 @@ -7547,6 +8078,35 @@ packages: - rollup dev: true + /unplugin-icons@0.16.1(@vue/compiler-sfc@3.2.47): + resolution: {integrity: sha512-qTunFUkpAyDnwzwV7YV1ZgCWRYfLuURcCurhhXOWMy2ipY88qx1pADvral2hJu4Xymh0X0t3Zcll3BIru2AVLQ==} + peerDependencies: + '@svgr/core': '>=7.0.0' + '@vue/compiler-sfc': ^3.0.2 || ^2.7.0 + vue-template-compiler: ^2.6.12 + vue-template-es2015-compiler: ^1.9.0 + peerDependenciesMeta: + '@svgr/core': + optional: true + '@vue/compiler-sfc': + optional: true + vue-template-compiler: + optional: true + vue-template-es2015-compiler: + optional: true + dependencies: + '@antfu/install-pkg': 0.1.1 + '@antfu/utils': 0.7.2 + '@iconify/utils': 2.1.5 + '@vue/compiler-sfc': 3.2.47 + debug: 4.3.4 + kolorist: 1.7.0 + local-pkg: 0.4.3 + unplugin: 1.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /unplugin-vue-components@0.24.1(rollup@2.79.1)(vue@3.2.47): resolution: {integrity: sha512-T3A8HkZoIE1Cja95xNqolwza0yD5IVlgZZ1PVAGvVCx8xthmjsv38xWRCtHtwl+rvZyL9uif42SRkDGw9aCfMA==} engines: {node: '>=14'} @@ -7649,6 +8209,13 @@ packages: convert-source-map: 1.9.0 dev: true + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + /vdirs@0.1.8(vue@3.2.47): resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==} peerDependencies: @@ -7894,10 +8461,25 @@ packages: optional: true dependencies: vue: 3.2.47 + dev: false - /vue-eslint-parser@8.3.0(eslint@8.38.0): - resolution: {integrity: sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /vue-demi@0.14.1(vue@3.2.47): + resolution: {integrity: sha512-rt+yuCtXvscYot9SQQj3WKZJVSriPNqVkpVBNEHPzSgBv7QIYzsS410VqVgvx8f9AAPgjg+XPKvmV3vOqqkJQQ==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.2.47 + + /vue-eslint-parser@9.3.0(eslint@8.38.0): + resolution: {integrity: sha512-48IxT9d0+wArT1+3wNIy0tascRoywqSUe2E1YalIC1L8jsUGe5aJQItWfRok7DVFGz3UYvzEI7n5wiTXsCMAcQ==} + engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: @@ -7908,7 +8490,7 @@ packages: espree: 9.5.1 esquery: 1.5.0 lodash: 4.17.21 - semver: 7.4.0 + semver: 7.5.1 transitivePeerDependencies: - supports-color dev: true @@ -8331,6 +8913,15 @@ packages: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true + /yaml-eslint-parser@1.2.2: + resolution: {integrity: sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==} + engines: {node: ^14.17.0 || >=16.0.0} + dependencies: + eslint-visitor-keys: 3.4.0 + lodash: 4.17.21 + yaml: 2.2.1 + dev: true + /yaml@2.2.1: resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} engines: {node: '>= 14'} diff --git a/scripts/create-tool.mjs b/scripts/create-tool.mjs index a6e16f33..94b70250 100644 --- a/scripts/create-tool.mjs +++ b/scripts/create-tool.mjs @@ -29,9 +29,9 @@ createToolFile( `${toolName}.vue`, ` + - - + diff --git a/src/components/InputCopyable.vue b/src/components/InputCopyable.vue index 4105abfd..27c0657f 100644 --- a/src/components/InputCopyable.vue +++ b/src/components/InputCopyable.vue @@ -1,21 +1,5 @@ - - - + diff --git a/src/components/MenuIconItem.vue b/src/components/MenuIconItem.vue index a08fe241..ed1b8881 100644 --- a/src/components/MenuIconItem.vue +++ b/src/components/MenuIconItem.vue @@ -1,14 +1,7 @@ - - + + diff --git a/src/components/TextareaCopyable.vue b/src/components/TextareaCopyable.vue index 6be5652b..2381856a 100644 --- a/src/components/TextareaCopyable.vue +++ b/src/components/TextareaCopyable.vue @@ -1,32 +1,3 @@ - - + + + diff --git a/src/tools/benchmark-builder/dynamic-values.vue b/src/tools/benchmark-builder/dynamic-values.vue index 70268aed..975a545c 100644 --- a/src/tools/benchmark-builder/dynamic-values.vue +++ b/src/tools/benchmark-builder/dynamic-values.vue @@ -1,45 +1,15 @@ - - - + diff --git a/src/tools/bip39-generator/bip39-generator.vue b/src/tools/bip39-generator/bip39-generator.vue index 26556cf8..5f005edf 100644 --- a/src/tools/bip39-generator/bip39-generator.vue +++ b/src/tools/bip39-generator/bip39-generator.vue @@ -1,67 +1,4 @@ - - + + diff --git a/src/tools/camera-recorder/camera-recorder.vue b/src/tools/camera-recorder/camera-recorder.vue new file mode 100644 index 00000000..19fe30b4 --- /dev/null +++ b/src/tools/camera-recorder/camera-recorder.vue @@ -0,0 +1,213 @@ + + + diff --git a/src/tools/camera-recorder/index.ts b/src/tools/camera-recorder/index.ts new file mode 100644 index 00000000..3c5d11bd --- /dev/null +++ b/src/tools/camera-recorder/index.ts @@ -0,0 +1,12 @@ +import { Camera } from '@vicons/tabler'; +import { defineTool } from '../tool'; + +export const tool = defineTool({ + name: 'Camera recorder', + path: '/camera-recorder', + description: 'Take a picture or record a video from your webcam or camera.', + keywords: ['camera', 'recoder'], + component: () => import('./camera-recorder.vue'), + icon: Camera, + createdAt: new Date('2023-05-15'), +}); diff --git a/src/tools/camera-recorder/useMediaRecorder.ts b/src/tools/camera-recorder/useMediaRecorder.ts new file mode 100644 index 00000000..a21328c2 --- /dev/null +++ b/src/tools/camera-recorder/useMediaRecorder.ts @@ -0,0 +1,114 @@ +import { type Ref, computed, ref } from 'vue'; + +export { useMediaRecorder }; + +function useMediaRecorder({ stream }: { stream: Ref }): { + isRecordingSupported: Ref + recordingState: Ref<'stopped' | 'recording' | 'paused'> + startRecording: () => void + stopRecording: () => void + pauseRecording: () => void + resumeRecording: () => void + onRecordAvailable: (cb: (url: string) => void) => void +} { + const isRecordingSupported = computed(() => MediaRecorder.isTypeSupported('video/webm')); + const mediaRecorder = ref(null); + const recordedChunks = ref([]); + const recordAvailable = createEventHook(); + const recordingState = ref<'stopped' | 'recording' | 'paused'>('stopped'); + + const createVideo = () => { + const blob = new Blob(recordedChunks.value, { type: 'video/webm' }); + const url = URL.createObjectURL(blob); + recordedChunks.value = []; + return url; + }; + + const startRecording = () => { + if (!isRecordingSupported.value) { + return; + } + if (!stream.value) { + return; + } + if (recordingState.value !== 'stopped') { + return; + } + + mediaRecorder.value = new MediaRecorder(stream.value, { mimeType: 'video/webm' }); + + mediaRecorder.value.ondataavailable = (e) => { + if (e.data.size > 0) { + recordedChunks.value.push(e.data); + } + }; + + mediaRecorder.value.onstop = () => { + recordAvailable.trigger(createVideo()); + }; + + if (mediaRecorder.value.state !== 'inactive') { + return; + } + + mediaRecorder.value.start(); + recordingState.value = 'recording'; + }; + + const stopRecording = () => { + if (!isRecordingSupported.value) { + return; + } + if (!mediaRecorder.value) { + return; + } + if (recordingState.value === 'stopped') { + return; + } + + mediaRecorder.value.stop(); + recordingState.value = 'stopped'; + }; + + const pauseRecording = () => { + if (!isRecordingSupported.value) { + return; + } + if (!mediaRecorder.value) { + return; + } + if (recordingState.value !== 'recording') { + return; + } + + mediaRecorder.value.pause(); + recordingState.value = 'paused'; + }; + + const resumeRecording = () => { + if (!isRecordingSupported.value) { + return; + } + if (!mediaRecorder.value) { + return; + } + + if (recordingState.value !== 'paused') { + return; + } + + mediaRecorder.value.resume(); + recordingState.value = 'recording'; + }; + + return { + isRecordingSupported, + startRecording, + stopRecording, + pauseRecording, + resumeRecording, + recordingState, + + onRecordAvailable: recordAvailable.on, + }; +} diff --git a/src/tools/case-converter/case-converter.vue b/src/tools/case-converter/case-converter.vue index 1bf8409b..4cf6507d 100644 --- a/src/tools/case-converter/case-converter.vue +++ b/src/tools/case-converter/case-converter.vue @@ -1,49 +1,3 @@ - - + + + diff --git a/src/tools/html-wysiwyg-editor/editor/menu-bar.vue b/src/tools/html-wysiwyg-editor/editor/menu-bar.vue index ff21b695..01ba9c70 100644 --- a/src/tools/html-wysiwyg-editor/editor/menu-bar.vue +++ b/src/tools/html-wysiwyg-editor/editor/menu-bar.vue @@ -1,12 +1,3 @@ - - - + diff --git a/src/tools/html-wysiwyg-editor/html-wysiwyg-editor.vue b/src/tools/html-wysiwyg-editor/html-wysiwyg-editor.vue index 7cd12566..69238215 100644 --- a/src/tools/html-wysiwyg-editor/html-wysiwyg-editor.vue +++ b/src/tools/html-wysiwyg-editor/html-wysiwyg-editor.vue @@ -1,16 +1,14 @@ - - - + diff --git a/src/tools/http-status-codes/http-status-codes.constants.ts b/src/tools/http-status-codes/http-status-codes.constants.ts index c64bda06..279cd7ce 100644 --- a/src/tools/http-status-codes/http-status-codes.constants.ts +++ b/src/tools/http-status-codes/http-status-codes.constants.ts @@ -1,11 +1,11 @@ export const codesByCategories: { - category: string; + category: string codes: { - code: number; - name: string; - description: string; - type: 'HTTP' | 'WebDav'; - }[]; + code: number + name: string + description: string + type: 'HTTP' | 'WebDav' + }[] }[] = [ { category: '1xx informational response', @@ -286,7 +286,7 @@ export const codesByCategories: { }, { code: 418, - name: "I'm a teapot", + name: 'I\'m a teapot', description: 'The server refuses the attempt to brew coffee with a teapot.', type: 'HTTP', }, diff --git a/src/tools/http-status-codes/http-status-codes.e2e.spec.ts b/src/tools/http-status-codes/http-status-codes.e2e.spec.ts index 59979cd2..cf6eae9d 100644 --- a/src/tools/http-status-codes/http-status-codes.e2e.spec.ts +++ b/src/tools/http-status-codes/http-status-codes.e2e.spec.ts @@ -1,4 +1,4 @@ -import { test, expect } from '@playwright/test'; +import { expect, test } from '@playwright/test'; test.describe('Tool - Http status codes', () => { test.beforeEach(async ({ page }) => { diff --git a/src/tools/http-status-codes/http-status-codes.vue b/src/tools/http-status-codes/http-status-codes.vue index 48bd77f7..0fb11251 100644 --- a/src/tools/http-status-codes/http-status-codes.vue +++ b/src/tools/http-status-codes/http-status-codes.vue @@ -1,3 +1,27 @@ + + - - - - diff --git a/src/tools/index.ts b/src/tools/index.ts index ad6167e1..211a8a81 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -1,6 +1,11 @@ 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 cameraRecorder } from './camera-recorder'; +import { tool as listConverter } from './list-converter'; +import { tool as phoneParserAndFormatter } from './phone-parser-and-formatter'; +import { tool as jsonDiff } from './json-diff'; +import { tool as ipv4RangeExpander } from './ipv4-range-expander'; import { tool as httpStatusCodes } from './http-status-codes'; import { tool as yamlToJson } from './yaml-to-json-converter'; import { tool as jsonToYaml } from './json-to-yaml-converter'; @@ -71,6 +76,7 @@ export const toolsByCategory: ToolCategory[] = [ textToNatoAlphabet, yamlToJson, jsonToYaml, + listConverter, ], }, { @@ -90,11 +96,12 @@ export const toolsByCategory: ToolCategory[] = [ htmlWysiwygEditor, userAgentParser, httpStatusCodes, + jsonDiff, ], }, { - name: 'Images', - components: [qrCodeGenerator, svgPlaceholderGenerator], + name: 'Images and videos', + components: [qrCodeGenerator, svgPlaceholderGenerator, cameraRecorder], }, { name: 'Development', @@ -111,7 +118,7 @@ export const toolsByCategory: ToolCategory[] = [ }, { name: 'Network', - components: [ipv4SubnetCalculator, ipv4AddressConverter, macAddressLookup, ipv6UlaGenerator], + components: [ipv4SubnetCalculator, ipv4AddressConverter, ipv4RangeExpander, macAddressLookup, ipv6UlaGenerator], }, { name: 'Math', @@ -125,9 +132,13 @@ export const toolsByCategory: ToolCategory[] = [ name: 'Text', components: [loremIpsumGenerator, textStatistics], }, + { + name: 'Data', + components: [phoneParserAndFormatter], + }, ]; export const tools = toolsByCategory.flatMap(({ components }) => components); export const toolsWithCategory = toolsByCategory.flatMap(({ components, name }) => - components.map((tool) => ({ category: name, ...tool })), + components.map(tool => ({ category: name, ...tool })), ); diff --git a/src/tools/integer-base-converter/integer-base-converter.model.test.ts b/src/tools/integer-base-converter/integer-base-converter.model.test.ts index e9d91f6f..d0387b64 100644 --- a/src/tools/integer-base-converter/integer-base-converter.model.test.ts +++ b/src/tools/integer-base-converter/integer-base-converter.model.test.ts @@ -1,4 +1,4 @@ -import { expect, describe, it } from 'vitest'; +import { describe, expect, it } from 'vitest'; import { convertBase } from './integer-base-converter.model'; describe('integer-base-converter', () => { diff --git a/src/tools/integer-base-converter/integer-base-converter.model.ts b/src/tools/integer-base-converter/integer-base-converter.model.ts index cfe15bd1..b4470e57 100644 --- a/src/tools/integer-base-converter/integer-base-converter.model.ts +++ b/src/tools/integer-base-converter/integer-base-converter.model.ts @@ -7,9 +7,9 @@ export function convertBase({ value, fromBase, toBase }: { value: string; fromBa .reverse() .reduce((carry: number, digit: string, index: number) => { if (!fromRange.includes(digit)) { - throw new Error('Invalid digit "' + digit + '" for base ' + fromBase + '.'); + throw new Error(`Invalid digit "${digit}" for base ${fromBase}.`); } - return (carry += fromRange.indexOf(digit) * Math.pow(fromBase, index)); + return (carry += fromRange.indexOf(digit) * fromBase ** index); }, 0); let newValue = ''; while (decValue > 0) { diff --git a/src/tools/integer-base-converter/integer-base-converter.vue b/src/tools/integer-base-converter/integer-base-converter.vue index df7e3ba1..01f6401a 100644 --- a/src/tools/integer-base-converter/integer-base-converter.vue +++ b/src/tools/integer-base-converter/integer-base-converter.vue @@ -1,93 +1,20 @@ - - + + + diff --git a/src/tools/ipv4-range-expander/index.ts b/src/tools/ipv4-range-expander/index.ts new file mode 100644 index 00000000..233f7cc4 --- /dev/null +++ b/src/tools/ipv4-range-expander/index.ts @@ -0,0 +1,13 @@ +import { UnfoldMoreOutlined } from '@vicons/material'; +import { defineTool } from '../tool'; + +export const tool = defineTool({ + name: 'IPv4 range expander', + path: '/ipv4-range-expander', + description: + 'Given a start and an end IPv4 address this tool calculates a valid IPv4 network with its CIDR notation.', + keywords: ['ipv4', 'range', 'expander', 'subnet', 'creator', 'cidr'], + component: () => import('./ipv4-range-expander.vue'), + icon: UnfoldMoreOutlined, + createdAt: new Date('2023-04-19'), +}); diff --git a/src/tools/ipv4-range-expander/ipv4-range-expander.e2e.spec.ts b/src/tools/ipv4-range-expander/ipv4-range-expander.e2e.spec.ts new file mode 100644 index 00000000..7d9a4a8f --- /dev/null +++ b/src/tools/ipv4-range-expander/ipv4-range-expander.e2e.spec.ts @@ -0,0 +1,46 @@ +import { expect, test } from '@playwright/test'; + +test.describe('Tool - IPv4 range expander', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/ipv4-range-expander'); + }); + + test('Has correct title', async ({ page }) => { + await expect(page).toHaveTitle('IPv4 range expander - IT Tools'); + }); + + test('Calculates correct for valid input', async ({ page }) => { + await page.getByPlaceholder('Start IPv4 address...').fill('192.168.1.1'); + await page.getByPlaceholder('End IPv4 address...').fill('192.168.7.255'); + + expect(await page.getByTestId('start-address.old').textContent()).toEqual('192.168.1.1'); + expect(await page.getByTestId('start-address.new').textContent()).toEqual('192.168.0.0'); + expect(await page.getByTestId('end-address.old').textContent()).toEqual('192.168.7.255'); + expect(await page.getByTestId('end-address.new').textContent()).toEqual('192.168.7.255'); + expect(await page.getByTestId('addresses-in-range.old').textContent()).toEqual('1,791'); + expect(await page.getByTestId('addresses-in-range.new').textContent()).toEqual('2,048'); + expect(await page.getByTestId('cidr.old').textContent()).toEqual(''); + expect(await page.getByTestId('cidr.new').textContent()).toEqual('192.168.0.0/21'); + }); + + test('Calculates correct for valid input, where first octet is lower than 128', async ({ page }) => { + await page.getByPlaceholder('Start IPv4 address...').fill('10.0.0.1'); + await page.getByPlaceholder('End IPv4 address...').fill('10.0.0.17'); + + expect(await page.getByTestId('start-address.old').textContent()).toEqual('10.0.0.1'); + expect(await page.getByTestId('start-address.new').textContent()).toEqual('10.0.0.0'); + expect(await page.getByTestId('end-address.old').textContent()).toEqual('10.0.0.17'); + expect(await page.getByTestId('end-address.new').textContent()).toEqual('10.0.0.31'); + expect(await page.getByTestId('addresses-in-range.old').textContent()).toEqual('17'); + expect(await page.getByTestId('addresses-in-range.new').textContent()).toEqual('32'); + expect(await page.getByTestId('cidr.old').textContent()).toEqual(''); + expect(await page.getByTestId('cidr.new').textContent()).toEqual('10.0.0.0/27'); + }); + + test('Hides result for invalid input', async ({ page }) => { + await page.getByPlaceholder('Start IPv4 address...').fill('192.168.1.1'); + await page.getByPlaceholder('End IPv4 address...').fill('192.168.0.255'); + + await expect(page.getByTestId('result')).not.toBeVisible(); + }); +}); diff --git a/src/tools/ipv4-range-expander/ipv4-range-expander.service.test.ts b/src/tools/ipv4-range-expander/ipv4-range-expander.service.test.ts new file mode 100644 index 00000000..51046232 --- /dev/null +++ b/src/tools/ipv4-range-expander/ipv4-range-expander.service.test.ts @@ -0,0 +1,32 @@ +import { describe, expect, it } from 'vitest'; +import { calculateCidr } from './ipv4-range-expander.service'; + +describe('ipv4RangeExpander', () => { + describe('when there are two valid ipv4 addresses given', () => { + it('should calculate valid cidr for given addresses', () => { + const result = calculateCidr({ startIp: '192.168.1.1', endIp: '192.168.7.255' }); + + expect(result).toBeDefined(); + expect(result?.oldSize).toEqual(1791); + expect(result?.newSize).toEqual(2048); + expect(result?.newStart).toEqual('192.168.0.0'); + expect(result?.newEnd).toEqual('192.168.7.255'); + expect(result?.newCidr).toEqual('192.168.0.0/21'); + }); + + it('should calculate valid cidr for given addresses, where first octet is lower than 128', () => { + const result = calculateCidr({ startIp: '10.0.0.1', endIp: '10.0.0.17' }); + + expect(result).toBeDefined(); + expect(result?.oldSize).toEqual(17); + expect(result?.newSize).toEqual(32); + expect(result?.newStart).toEqual('10.0.0.0'); + expect(result?.newEnd).toEqual('10.0.0.31'); + expect(result?.newCidr).toEqual('10.0.0.0/27'); + }); + + it('should return empty result for invalid input', () => { + expect(calculateCidr({ startIp: '192.168.7.1', endIp: '192.168.6.255' })).not.toBeDefined(); + }); + }); +}); diff --git a/src/tools/ipv4-range-expander/ipv4-range-expander.service.ts b/src/tools/ipv4-range-expander/ipv4-range-expander.service.ts new file mode 100644 index 00000000..78fbde5b --- /dev/null +++ b/src/tools/ipv4-range-expander/ipv4-range-expander.service.ts @@ -0,0 +1,68 @@ +import { convertBase } from '../integer-base-converter/integer-base-converter.model'; +import { ipv4ToInt } from '../ipv4-address-converter/ipv4-address-converter.service'; +import type { Ipv4RangeExpanderResult } from './ipv4-range-expander.types'; + +export { calculateCidr }; + +function bits2ip(ipInt: number) { + return `${ipInt >>> 24}.${(ipInt >> 16) & 255}.${(ipInt >> 8) & 255}.${ipInt & 255}`; +} + +function getRangesize(start: string, end: string) { + if (start == null || end == null) { + return -1; + } + + return 1 + parseInt(end, 2) - parseInt(start, 2); +} + +function getCidr(start: string, end: string) { + if (start == null || end == null) { + return null; + } + + const range = getRangesize(start, end); + if (range < 1) { + return null; + } + + let mask = 32; + for (let i = 0; i < 32; i++) { + if (start[i] !== end[i]) { + mask = i; + break; + } + } + + const newStart = start.substring(0, mask) + '0'.repeat(32 - mask); + const newEnd = end.substring(0, mask) + '1'.repeat(32 - mask); + + return { start: newStart, end: newEnd, mask }; +} + +function calculateCidr({ startIp, endIp }: { startIp: string; endIp: string }) { + const start = convertBase({ + value: ipv4ToInt({ ip: startIp }).toString(), + fromBase: 10, + toBase: 2, + }).padStart(32, '0'); + const end = convertBase({ + value: ipv4ToInt({ ip: endIp }).toString(), + fromBase: 10, + toBase: 2, + }).padStart(32, '0'); + + const cidr = getCidr(start, end); + if (cidr != null) { + const result: Ipv4RangeExpanderResult = {}; + result.newEnd = bits2ip(parseInt(cidr.end, 2)); + result.newStart = bits2ip(parseInt(cidr.start, 2)); + result.newCidr = `${result.newStart}/${cidr.mask}`; + result.newSize = getRangesize(cidr.start, cidr.end); + + result.oldSize = getRangesize(start, end); + return result; + } + + return undefined; +} diff --git a/src/tools/ipv4-range-expander/ipv4-range-expander.types.ts b/src/tools/ipv4-range-expander/ipv4-range-expander.types.ts new file mode 100644 index 00000000..d5d2b45e --- /dev/null +++ b/src/tools/ipv4-range-expander/ipv4-range-expander.types.ts @@ -0,0 +1,7 @@ +export interface Ipv4RangeExpanderResult { + oldSize?: number + newStart?: string + newEnd?: string + newCidr?: string + newSize?: number +} diff --git a/src/tools/ipv4-range-expander/ipv4-range-expander.vue b/src/tools/ipv4-range-expander/ipv4-range-expander.vue new file mode 100644 index 00000000..16ce62fb --- /dev/null +++ b/src/tools/ipv4-range-expander/ipv4-range-expander.vue @@ -0,0 +1,119 @@ + + + diff --git a/src/tools/ipv4-range-expander/result-row.vue b/src/tools/ipv4-range-expander/result-row.vue new file mode 100644 index 00000000..efa0b648 --- /dev/null +++ b/src/tools/ipv4-range-expander/result-row.vue @@ -0,0 +1,29 @@ + + + diff --git a/src/tools/ipv4-subnet-calculator/ipv4-subnet-calculator.vue b/src/tools/ipv4-subnet-calculator/ipv4-subnet-calculator.vue index 7b488c9c..d16e5573 100644 --- a/src/tools/ipv4-subnet-calculator/ipv4-subnet-calculator.vue +++ b/src/tools/ipv4-subnet-calculator/ipv4-subnet-calculator.vue @@ -1,48 +1,12 @@ - - - + diff --git a/src/tools/ipv6-ula-generator/ipv6-ula-generator.vue b/src/tools/ipv6-ula-generator/ipv6-ula-generator.vue index ee74d4cc..66c69c6c 100644 --- a/src/tools/ipv6-ula-generator/ipv6-ula-generator.vue +++ b/src/tools/ipv6-ula-generator/ipv6-ula-generator.vue @@ -1,34 +1,3 @@ - - - + diff --git a/src/tools/json-diff/diff-viewer/diff-viewer.models.tsx b/src/tools/json-diff/diff-viewer/diff-viewer.models.tsx new file mode 100644 index 00000000..d2117dfb --- /dev/null +++ b/src/tools/json-diff/diff-viewer/diff-viewer.models.tsx @@ -0,0 +1,119 @@ +import _ from 'lodash'; +import type { ArrayDifference, Difference, ObjectDifference } from '../json-diff.types'; +import { useCopy } from '@/composable/copy'; + +export function DiffRootViewer({ diff }: { diff: Difference }) { + return ( +
+
    {DiffViewer({ diff, showKeys: false })}
+
+ ); +} + +function DiffViewer({ diff, showKeys = true }: { diff: Difference; showKeys?: boolean }) { + const { type, status } = diff; + + if (status === 'updated') { + return ComparisonViewer({ diff, showKeys }); + } + + if (type === 'array') { + return ChildrenViewer({ diff, showKeys, showChildrenKeys: false, openTag: '[', closeTag: ']' }); + } + + if (type === 'object') { + return ChildrenViewer({ diff, showKeys, openTag: '{', closeTag: '}' }); + } + + return LineDiffViewer({ diff, showKeys }); +} + +function LineDiffViewer({ diff, showKeys }: { diff: Difference; showKeys?: boolean }) { + const { value, key, status, oldValue } = diff; + const valueToDisplay = status === 'removed' ? oldValue : value; + + return ( +
  • + + {showKeys && ( + <> + {key} + {': '} + + )} + {Value({ value: valueToDisplay, status })} + + , +
  • + ); +} + +function ComparisonViewer({ diff, showKeys }: { diff: Difference; showKeys?: boolean }) { + const { value, key, oldValue } = diff; + + return ( +
  • + {showKeys && ( + <> + {key} + {': '} + + )} + {Value({ value: oldValue, status: 'removed' })} + {Value({ value, status: 'added' })}, +
  • + ); +} + +function ChildrenViewer({ + diff, + openTag, + closeTag, + showKeys, + showChildrenKeys = true, +}: { + diff: ArrayDifference | ObjectDifference + showKeys: boolean + showChildrenKeys?: boolean + openTag: string + closeTag: string +}) { + const { children, key, status, type } = diff; + + return ( +
  • +
    + {showKeys && ( + <> + {key} + {': '} + + )} + + {openTag} + {children.length > 0 &&
      {children.map(diff => DiffViewer({ diff, showKeys: showChildrenKeys }))}
    } + {`${closeTag},`} +
    +
  • + ); +} + +function formatValue(value: unknown) { + if (_.isNull(value)) { + return 'null'; + } + + return JSON.stringify(value); +} + +function Value({ value, status }: { value: unknown; status: string }) { + const formatedValue = formatValue(value); + + const { copy } = useCopy({ source: formatedValue }); + + return ( + + {formatedValue} + + ); +} diff --git a/src/tools/json-diff/diff-viewer/diff-viewer.vue b/src/tools/json-diff/diff-viewer/diff-viewer.vue new file mode 100644 index 00000000..08c47848 --- /dev/null +++ b/src/tools/json-diff/diff-viewer/diff-viewer.vue @@ -0,0 +1,112 @@ + + + + + diff --git a/src/tools/json-diff/index.ts b/src/tools/json-diff/index.ts new file mode 100644 index 00000000..7c4c1eee --- /dev/null +++ b/src/tools/json-diff/index.ts @@ -0,0 +1,12 @@ +import { CompareArrowsRound } from '@vicons/material'; +import { defineTool } from '../tool'; + +export const tool = defineTool({ + name: 'JSON diff', + path: '/json-diff', + description: 'Compare two JSON objects and get the differences between them.', + keywords: ['json', 'diff', 'compare', 'difference', 'object', 'data'], + component: () => import('./json-diff.vue'), + icon: CompareArrowsRound, + createdAt: new Date('2023-04-20'), +}); diff --git a/src/tools/json-diff/json-diff.e2e.spec.ts b/src/tools/json-diff/json-diff.e2e.spec.ts new file mode 100644 index 00000000..6bd04f35 --- /dev/null +++ b/src/tools/json-diff/json-diff.e2e.spec.ts @@ -0,0 +1,39 @@ +import { expect, test } from '@playwright/test'; + +test.describe('Tool - JSON diff', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/json-diff'); + }); + + test('Has correct title', async ({ page }) => { + await expect(page).toHaveTitle('JSON diff - IT Tools'); + }); + + test('Identical JSONs have a custom result message', async ({ page }) => { + await page.getByTestId('leftJson').fill('{"foo":"bar"}'); + await page.getByTestId('rightJson').fill('{ "foo": "bar" } '); + + const result = await page.getByTestId('diff-result').innerText(); + + expect(result).toContain('The provided JSONs are the same'); + }); + + test('Different JSONs have differences listed', async ({ page }) => { + await page.getByTestId('leftJson').fill('{"foo":"bar"}'); + await page.getByTestId('rightJson').fill('{"foo":"buz","baz":"qux"}'); + + const result = await page.getByTestId('diff-result').innerText(); + + expect(result).toContain('{\nfoo: "bar""buz",\nbaz: "qux",\n},'); + }); + + test('Different JSONs have only differences listed when "Only show differences" is checked', async ({ page }) => { + await page.getByTestId('leftJson').fill('{"foo":"bar"}'); + await page.getByTestId('rightJson').fill('{"foo":"bar","baz":"qux"}'); + await page.getByRole('switch').click(); + + const result = await page.getByTestId('diff-result').innerText(); + + expect(result).toContain('{\nbaz: "qux",\n},'); + }); +}); diff --git a/src/tools/json-diff/json-diff.models.test.ts b/src/tools/json-diff/json-diff.models.test.ts new file mode 100644 index 00000000..fc745f37 --- /dev/null +++ b/src/tools/json-diff/json-diff.models.test.ts @@ -0,0 +1,80 @@ +import { describe, expect, it } from 'vitest'; +import { diff } from './json-diff.models'; + +describe('json-diff models', () => { + describe('diff', () => { + it('list object differences', () => { + const obj = { a: 1, b: 2 }; + const newObj = { a: 1, b: 2, c: 3 }; + const result = diff(obj, newObj); + + expect(result).toEqual({ + key: '', + type: 'object', + children: [ + { + key: 'a', + type: 'value', + value: 1, + oldValue: 1, + status: 'unchanged', + }, + { + key: 'b', + type: 'value', + value: 2, + oldValue: 2, + status: 'unchanged', + }, + { + key: 'c', + type: 'value', + value: 3, + oldValue: undefined, + status: 'added', + }, + ], + oldValue: { a: 1, b: 2 }, + value: { a: 1, b: 2, c: 3 }, + status: 'children-updated', + }); + }); + + it('list array differences', () => { + const obj = [1, 2]; + const newObj = [1, 2, 3]; + const result = diff(obj, newObj); + + expect(result).toEqual({ + key: '', + type: 'array', + children: [ + { + key: 0, + type: 'value', + value: 1, + oldValue: 1, + status: 'unchanged', + }, + { + key: 1, + type: 'value', + value: 2, + oldValue: 2, + status: 'unchanged', + }, + { + key: 2, + type: 'value', + value: 3, + oldValue: undefined, + status: 'added', + }, + ], + oldValue: [1, 2], + value: [1, 2, 3], + status: 'children-updated', + }); + }); + }); +}); diff --git a/src/tools/json-diff/json-diff.models.ts b/src/tools/json-diff/json-diff.models.ts new file mode 100644 index 00000000..54bb2533 --- /dev/null +++ b/src/tools/json-diff/json-diff.models.ts @@ -0,0 +1,140 @@ +import _ from 'lodash'; +import type { Difference, DifferenceStatus } from './json-diff.types'; + +export { diff }; + +function diff( + obj: unknown, + newObj: unknown, + { onlyShowDifferences = false }: { onlyShowDifferences?: boolean } = {}, +): Difference { + if (_.isArray(obj) && _.isArray(newObj)) { + return { + key: '', + type: 'array', + children: diffArrays(obj, newObj, { onlyShowDifferences }), + oldValue: obj, + value: newObj, + status: getStatus(obj, newObj), + }; + } + + if (_.isObject(obj) && _.isObject(newObj)) { + return { + key: '', + type: 'object', + children: diffObjects(obj as Record, newObj as Record, { onlyShowDifferences }), + oldValue: obj, + value: newObj, + status: getStatus(obj, newObj), + }; + } + + return { + key: '', + type: 'value', + oldValue: obj, + value: newObj, + status: getStatus(obj, newObj), + }; +} + +function diffObjects( + obj: Record, + newObj: Record, + { onlyShowDifferences = false }: { onlyShowDifferences?: boolean } = {}, +): Difference[] { + const keys = Object.keys({ ...obj, ...newObj }); + return keys + .map(key => createDifference(obj?.[key], newObj?.[key], key, { onlyShowDifferences })) + .filter(diff => !onlyShowDifferences || diff.status !== 'unchanged'); +} + +function createDifference( + value: unknown, + newValue: unknown, + key: string | number, + { onlyShowDifferences = false }: { onlyShowDifferences?: boolean } = {}, +): Difference { + const type = getType(value); + + if (type === 'object') { + return { + key, + type, + children: diffObjects(value as Record, newValue as Record, { + onlyShowDifferences, + }), + oldValue: value, + value: newValue, + status: getStatus(value, newValue), + }; + } + + if (type === 'array') { + return { + key, + type, + children: diffArrays(value as unknown[], newValue as unknown[], { onlyShowDifferences }), + value: newValue, + oldValue: value, + status: getStatus(value, newValue), + }; + } + + return { + key, + type, + value: newValue, + oldValue: value, + status: getStatus(value, newValue), + }; +} + +function diffArrays( + arr: unknown[], + newArr: unknown[], + { onlyShowDifferences = false }: { onlyShowDifferences?: boolean } = {}, +): Difference[] { + const maxLength = Math.max(0, arr?.length, newArr?.length); + return Array.from({ length: maxLength }, (_, i) => + createDifference(arr?.[i], newArr?.[i], i, { onlyShowDifferences }), + ).filter(diff => !onlyShowDifferences || diff.status !== 'unchanged'); +} + +function getType(value: unknown): 'object' | 'array' | 'value' { + if (value === null) { + return 'value'; + } + if (Array.isArray(value)) { + return 'array'; + } + if (typeof value === 'object') { + return 'object'; + } + return 'value'; +} + +function getStatus(value: unknown, newValue: unknown): DifferenceStatus { + if (value === undefined) { + return 'added'; + } + + if (newValue === undefined) { + return 'removed'; + } + + const bothAreObjects = getType(value) === 'object' && getType(newValue) === 'object'; + const bothAreArrays = getType(value) === 'array' && getType(newValue) === 'array'; + const bothAreDeepEqual = _.isEqual(value, newValue); + + if (bothAreDeepEqual) { + return 'unchanged'; + } + + if (bothAreObjects || bothAreArrays) { + return 'children-updated'; + } + + return 'updated'; +} diff --git a/src/tools/json-diff/json-diff.types.ts b/src/tools/json-diff/json-diff.types.ts new file mode 100644 index 00000000..e778f360 --- /dev/null +++ b/src/tools/json-diff/json-diff.types.ts @@ -0,0 +1,29 @@ +export type DifferenceStatus = 'added' | 'removed' | 'updated' | 'unchanged' | 'children-updated'; + +export interface ObjectDifference { + key: string | number + type: 'object' + children: Difference[] + status: DifferenceStatus + oldValue: unknown + value: unknown +} + +export interface ValueDifference { + key: string | number + type: 'value' + value: unknown + oldValue: unknown + status: DifferenceStatus +} + +export interface ArrayDifference { + key: number | string + type: 'array' + children: Difference[] + status: DifferenceStatus + oldValue: unknown + value: unknown +} + +export type Difference = ObjectDifference | ValueDifference | ArrayDifference; diff --git a/src/tools/json-diff/json-diff.vue b/src/tools/json-diff/json-diff.vue new file mode 100644 index 00000000..2ef3de04 --- /dev/null +++ b/src/tools/json-diff/json-diff.vue @@ -0,0 +1,46 @@ + + + diff --git a/src/tools/json-minify/json-minify.vue b/src/tools/json-minify/json-minify.vue index d7e9d15c..4ee588dd 100644 --- a/src/tools/json-minify/json-minify.vue +++ b/src/tools/json-minify/json-minify.vue @@ -1,19 +1,7 @@ - - + + diff --git a/src/tools/json-to-yaml-converter/json-to-yaml.e2e.spec.ts b/src/tools/json-to-yaml-converter/json-to-yaml.e2e.spec.ts index bce095b6..fee24d91 100644 --- a/src/tools/json-to-yaml-converter/json-to-yaml.e2e.spec.ts +++ b/src/tools/json-to-yaml-converter/json-to-yaml.e2e.spec.ts @@ -1,4 +1,4 @@ -import { test, expect } from '@playwright/test'; +import { expect, test } from '@playwright/test'; test.describe('Tool - json to yaml', () => { test.beforeEach(async ({ page }) => { @@ -14,6 +14,6 @@ test.describe('Tool - json to yaml', () => { const generatedJson = await page.getByTestId('area-content').innerText(); - expect(generatedJson.trim()).toEqual(`foo: bar\nlist:\n - item\n - key: value`.trim()); + expect(generatedJson.trim()).toEqual('foo: bar\nlist:\n - item\n - key: value'.trim()); }); }); diff --git a/src/tools/json-to-yaml-converter/json-to-yaml.vue b/src/tools/json-to-yaml-converter/json-to-yaml.vue index f25ef37b..cbaeb22d 100644 --- a/src/tools/json-to-yaml-converter/json-to-yaml.vue +++ b/src/tools/json-to-yaml-converter/json-to-yaml.vue @@ -1,20 +1,9 @@ - - - + diff --git a/src/tools/json-viewer/json-viewer.vue b/src/tools/json-viewer/json-viewer.vue index 60ae66c2..5fa3d361 100644 --- a/src/tools/json-viewer/json-viewer.vue +++ b/src/tools/json-viewer/json-viewer.vue @@ -1,13 +1,40 @@ + + - - + diff --git a/src/tools/list-converter/index.ts b/src/tools/list-converter/index.ts new file mode 100644 index 00000000..cf9fbd39 --- /dev/null +++ b/src/tools/list-converter/index.ts @@ -0,0 +1,13 @@ +import { List } from '@vicons/tabler'; +import { defineTool } from '../tool'; + +export const tool = defineTool({ + name: 'List converter', + path: '/list-converter', + description: + 'This tool can process column-based data and apply various changes (transpose, add prefix and suffix, reverse list, sort list, lowercase values, truncate values) to each row.', + keywords: ['list', 'converter', 'sort', 'reverse', 'prefix', 'suffix', 'lowercase', 'truncate'], + component: () => import('./list-converter.vue'), + icon: List, + createdAt: new Date('2023-05-07'), +}); diff --git a/src/tools/list-converter/list-converter.e2e.spec.ts b/src/tools/list-converter/list-converter.e2e.spec.ts new file mode 100644 index 00000000..4accbf06 --- /dev/null +++ b/src/tools/list-converter/list-converter.e2e.spec.ts @@ -0,0 +1,39 @@ +import { expect, test } from '@playwright/test'; + +test.describe('Tool - List converter', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/list-converter'); + }); + + test('Has correct title', async ({ page }) => { + await expect(page).toHaveTitle('List converter - IT Tools'); + }); + + test('Simple list should be converted with default settings', async ({ page }) => { + await page.getByTestId('input').fill(`1 + 2 + 3 + 4 + 5`); + + const result = await page.getByTestId('area-content').innerText(); + + expect(result.trim()).toEqual('1, 2, 3, 4, 5'); + }); + + test('Duplicates should be removed, list should be sorted and prefix and suffix list items', async ({ page }) => { + await page.getByTestId('input').fill(`1 + 2 + 2 + 4 + 4 + 3 + 5`); + await page.getByTestId('removeDuplicates').check(); + await page.getByTestId('itemPrefix').fill('\''); + await page.getByTestId('itemSuffix').fill('\''); + + const result = await page.getByTestId('area-content').innerText(); + expect(result.trim()).toEqual('\'1\', \'2\', \'4\', \'3\', \'5\''); + }); +}); diff --git a/src/tools/list-converter/list-converter.models.test.ts b/src/tools/list-converter/list-converter.models.test.ts new file mode 100644 index 00000000..abbc43c2 --- /dev/null +++ b/src/tools/list-converter/list-converter.models.test.ts @@ -0,0 +1,76 @@ +import { describe, expect, it } from 'vitest'; +import { convert } from './list-converter.models'; +import type { ConvertOptions } from './list-converter.types'; + +describe('list-converter', () => { + describe('convert', () => { + it('should convert a given list', () => { + const options: ConvertOptions = { + separator: ', ', + trimItems: true, + removeDuplicates: true, + itemPrefix: '"', + itemSuffix: '"', + listPrefix: '', + listSuffix: '', + reverseList: false, + sortList: null, + lowerCase: false, + keepLineBreaks: false, + }; + const input = ` + 1 + 2 + + 3 + 3 + 4 + `; + expect(convert(input, options)).toEqual('"1", "2", "3", "4"'); + }); + + it('should return an empty value for an empty input', () => { + const options: ConvertOptions = { + separator: ', ', + trimItems: true, + removeDuplicates: true, + itemPrefix: '', + itemSuffix: '', + listPrefix: '', + listSuffix: '', + reverseList: false, + sortList: null, + lowerCase: false, + keepLineBreaks: false, + }; + expect(convert('', options)).toEqual(''); + }); + + it('should keep line breaks', () => { + const options: ConvertOptions = { + separator: '', + trimItems: true, + itemPrefix: '
  • ', + itemSuffix: '
  • ', + listPrefix: '
      ', + listSuffix: '
    ', + keepLineBreaks: true, + lowerCase: false, + removeDuplicates: false, + reverseList: false, + sortList: null, + }; + const input = ` + 1 + 2 + 3 + `; + const expected = `
      +
    • 1
    • +
    • 2
    • +
    • 3
    • +
    `; + expect(convert(input, options)).toEqual(expected); + }); + }); +}); diff --git a/src/tools/list-converter/list-converter.models.ts b/src/tools/list-converter/list-converter.models.ts new file mode 100644 index 00000000..548baa28 --- /dev/null +++ b/src/tools/list-converter/list-converter.models.ts @@ -0,0 +1,27 @@ +import _ from 'lodash'; +import type { ConvertOptions } from './list-converter.types'; +import { byOrder } from '@/utils/array'; + +export { convert }; + +function whenever(condition: boolean, fn: (value: T) => R) { + return (value: T) => + condition ? fn(value) : value; +} + +function convert(list: string, options: ConvertOptions): string { + const lineBreak = options.keepLineBreaks ? '\n' : ''; + + return _.chain(list) + .thru(whenever(options.lowerCase, text => text.toLowerCase())) + .split('\n') + .thru(whenever(options.removeDuplicates, _.uniq)) + .thru(whenever(options.reverseList, _.reverse)) + .thru(whenever(!_.isNull(options.sortList), parts => parts.sort(byOrder({ order: options.sortList })))) + .map(whenever(options.trimItems, _.trim)) + .without('') + .map(p => options.itemPrefix + p + options.itemSuffix) + .join(options.separator + lineBreak) + .thru(text => [options.listPrefix, text, options.listSuffix].join(lineBreak)) + .value(); +} diff --git a/src/tools/list-converter/list-converter.types.ts b/src/tools/list-converter/list-converter.types.ts new file mode 100644 index 00000000..3f9ea3f8 --- /dev/null +++ b/src/tools/list-converter/list-converter.types.ts @@ -0,0 +1,15 @@ +export type SortOrder = 'asc' | 'desc' | null; + +export interface ConvertOptions { + lowerCase: boolean + trimItems: boolean + itemPrefix: string + itemSuffix: string + listPrefix: string + listSuffix: string + reverseList: boolean + sortList: SortOrder + removeDuplicates: boolean + separator: string + keepLineBreaks: boolean +} diff --git a/src/tools/list-converter/list-converter.vue b/src/tools/list-converter/list-converter.vue new file mode 100644 index 00000000..2e6d2b3a --- /dev/null +++ b/src/tools/list-converter/list-converter.vue @@ -0,0 +1,121 @@ + + + diff --git a/src/tools/lorem-ipsum-generator/lorem-ipsum-generator.service.ts b/src/tools/lorem-ipsum-generator/lorem-ipsum-generator.service.ts index 4122a7bb..b21a302b 100644 --- a/src/tools/lorem-ipsum-generator/lorem-ipsum-generator.service.ts +++ b/src/tools/lorem-ipsum-generator/lorem-ipsum-generator.service.ts @@ -179,13 +179,13 @@ const vocabulary = [ ]; const firstSentence = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; -const generateSentence = (length: number) => { +function generateSentence(length: number) { const sentence = Array.from({ length }) .map(() => randFromArray(vocabulary)) .join(' '); - return sentence.charAt(0).toUpperCase() + sentence.slice(1) + '.'; -}; + return `${sentence.charAt(0).toUpperCase() + sentence.slice(1)}.`; +} export function generateLoremIpsum({ paragraphCount = 1, @@ -194,11 +194,11 @@ export function generateLoremIpsum({ startWithLoremIpsum = true, asHTML = false, }: { - paragraphCount?: number; - sentencePerParagraph?: number; - wordCount?: number; - startWithLoremIpsum?: boolean; - asHTML?: boolean; + paragraphCount?: number + sentencePerParagraph?: number + wordCount?: number + startWithLoremIpsum?: boolean + asHTML?: boolean }) { const paragraphs = Array.from({ length: paragraphCount }).map(() => Array.from({ length: sentencePerParagraph }).map(() => generateSentence(wordCount)), @@ -209,8 +209,8 @@ export function generateLoremIpsum({ } if (asHTML) { - return `

    ${paragraphs.map((s) => s.join(' ')).join('

    \n\n

    ')}

    `; + return `

    ${paragraphs.map(s => s.join(' ')).join('

    \n\n

    ')}

    `; } - return paragraphs.map((s) => s.join(' ')).join('\n\n'); + return paragraphs.map(s => s.join(' ')).join('\n\n'); } diff --git a/src/tools/lorem-ipsum-generator/lorem-ipsum-generator.vue b/src/tools/lorem-ipsum-generator/lorem-ipsum-generator.vue index 65a536ef..4423eb4e 100644 --- a/src/tools/lorem-ipsum-generator/lorem-ipsum-generator.vue +++ b/src/tools/lorem-ipsum-generator/lorem-ipsum-generator.vue @@ -1,37 +1,8 @@ - - + + diff --git a/src/tools/mac-address-lookup/mac-address-lookup.vue b/src/tools/mac-address-lookup/mac-address-lookup.vue index 99b8342d..05382ebf 100644 --- a/src/tools/mac-address-lookup/mac-address-lookup.vue +++ b/src/tools/mac-address-lookup/mac-address-lookup.vue @@ -1,44 +1,51 @@ - - - + diff --git a/src/tools/math-evaluator/index.ts b/src/tools/math-evaluator/index.ts index ad783d25..3dc15f4f 100644 --- a/src/tools/math-evaluator/index.ts +++ b/src/tools/math-evaluator/index.ts @@ -4,7 +4,7 @@ import { defineTool } from '../tool'; export const tool = defineTool({ name: 'Math evaluator', path: '/math-evaluator', - description: `Evaluate math expression, like a calculator on steroid (you can use function like sqrt, cos, sin, abs, ...)`, + description: 'Evaluate math expression, like a calculator on steroid (you can use function like sqrt, cos, sin, abs, ...)', keywords: [ 'math', 'evaluator', diff --git a/src/tools/math-evaluator/math-evaluator.vue b/src/tools/math-evaluator/math-evaluator.vue index 16aa7c47..0429e6eb 100644 --- a/src/tools/math-evaluator/math-evaluator.vue +++ b/src/tools/math-evaluator/math-evaluator.vue @@ -1,3 +1,13 @@ + + - - diff --git a/src/tools/meta-tag-generator/OGSchemaType.type.ts b/src/tools/meta-tag-generator/OGSchemaType.type.ts index 8d09013b..64387b8c 100644 --- a/src/tools/meta-tag-generator/OGSchemaType.type.ts +++ b/src/tools/meta-tag-generator/OGSchemaType.type.ts @@ -3,25 +3,25 @@ import type { SelectGroupOption, SelectOption } from 'naive-ui'; export type { OGSchemaType, OGSchemaTypeElementInput, OGSchemaTypeElementSelect, OGSchemaTypeElementInputMultiple }; interface OGSchemaTypeElementBase { - key: string; - label: string; - placeholder: string; + key: string + label: string + placeholder: string } interface OGSchemaTypeElementInput extends OGSchemaTypeElementBase { - type: 'input'; + type: 'input' } interface OGSchemaTypeElementInputMultiple extends OGSchemaTypeElementBase { - type: 'input-multiple'; + type: 'input-multiple' } interface OGSchemaTypeElementSelect extends OGSchemaTypeElementBase { - type: 'select'; - options: Array; + type: 'select' + options: Array } interface OGSchemaType { - name: string; - elements: (OGSchemaTypeElementSelect | OGSchemaTypeElementInput | OGSchemaTypeElementInputMultiple)[]; + name: string + elements: (OGSchemaTypeElementSelect | OGSchemaTypeElementInput | OGSchemaTypeElementInputMultiple)[] } diff --git a/src/tools/meta-tag-generator/meta-tag-generator.vue b/src/tools/meta-tag-generator/meta-tag-generator.vue index ee5d8e77..12e660e4 100644 --- a/src/tools/meta-tag-generator/meta-tag-generator.vue +++ b/src/tools/meta-tag-generator/meta-tag-generator.vue @@ -1,11 +1,66 @@ + + - - + diff --git a/src/tools/slugify-string/slugify-string.vue b/src/tools/slugify-string/slugify-string.vue index be5db145..0f5ddc2f 100644 --- a/src/tools/slugify-string/slugify-string.vue +++ b/src/tools/slugify-string/slugify-string.vue @@ -1,24 +1,3 @@ - - - + diff --git a/src/tools/sql-prettify/sql-prettify.vue b/src/tools/sql-prettify/sql-prettify.vue index 9f1e4fe9..2ee93da8 100644 --- a/src/tools/sql-prettify/sql-prettify.vue +++ b/src/tools/sql-prettify/sql-prettify.vue @@ -1,7 +1,27 @@ + + - - + diff --git a/src/tools/text-statistics/index.ts b/src/tools/text-statistics/index.ts index def0b6d6..0e54b71b 100644 --- a/src/tools/text-statistics/index.ts +++ b/src/tools/text-statistics/index.ts @@ -4,7 +4,7 @@ import { defineTool } from '../tool'; export const tool = defineTool({ name: 'Text statistics', path: '/text-statistics', - description: "Get information about a text, the amount of characters, the amount of words, it's size, ...", + description: 'Get information about a text, the amount of characters, the amount of words, it\'s size, ...', keywords: ['text', 'statistics', 'length', 'characters', 'count', 'size', 'bytes'], component: () => import('./text-statistics.vue'), icon: FileText, diff --git a/src/tools/text-statistics/text-statistics.service.test.ts b/src/tools/text-statistics/text-statistics.service.test.ts index 52606834..18ffc399 100644 --- a/src/tools/text-statistics/text-statistics.service.test.ts +++ b/src/tools/text-statistics/text-statistics.service.test.ts @@ -1,4 +1,4 @@ -import { expect, describe, it } from 'vitest'; +import { describe, expect, it } from 'vitest'; import { getStringSizeInBytes } from './text-statistics.service'; describe('text-statistics', () => { diff --git a/src/tools/text-statistics/text-statistics.vue b/src/tools/text-statistics/text-statistics.vue index 84d4a526..ec543faf 100644 --- a/src/tools/text-statistics/text-statistics.vue +++ b/src/tools/text-statistics/text-statistics.vue @@ -1,21 +1,20 @@ - - + + diff --git a/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.vue b/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.vue index fc3abb5f..75b23344 100644 --- a/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.vue +++ b/src/tools/text-to-nato-alphabet/text-to-nato-alphabet.vue @@ -1,30 +1,36 @@ - - - + diff --git a/src/tools/token-generator/token-generator.e2e.spec.ts b/src/tools/token-generator/token-generator.e2e.spec.ts index 905a81cc..444c5384 100644 --- a/src/tools/token-generator/token-generator.e2e.spec.ts +++ b/src/tools/token-generator/token-generator.e2e.spec.ts @@ -1,4 +1,4 @@ -import { test, expect } from '@playwright/test'; +import { expect, test } from '@playwright/test'; test.describe('Tool - Token generator', () => { test.beforeEach(async ({ page }) => { diff --git a/src/tools/token-generator/token-generator.service.test.ts b/src/tools/token-generator/token-generator.service.test.ts index ed9dab31..604f5a89 100644 --- a/src/tools/token-generator/token-generator.service.test.ts +++ b/src/tools/token-generator/token-generator.service.test.ts @@ -1,4 +1,4 @@ -import { expect, describe, it } from 'vitest'; +import { describe, expect, it } from 'vitest'; import { createToken } from './token-generator.service'; describe('token-generator', () => { diff --git a/src/tools/token-generator/token-generator.service.ts b/src/tools/token-generator/token-generator.service.ts index f48a4deb..1885d249 100644 --- a/src/tools/token-generator/token-generator.service.ts +++ b/src/tools/token-generator/token-generator.service.ts @@ -8,16 +8,16 @@ export function createToken({ length = 64, alphabet, }: { - withUppercase?: boolean; - withLowercase?: boolean; - withNumbers?: boolean; - withSymbols?: boolean; - length?: number; - alphabet?: string; + withUppercase?: boolean + withLowercase?: boolean + withNumbers?: boolean + withSymbols?: boolean + length?: number + alphabet?: string }) { - const allAlphabet = - alphabet ?? - [ + const allAlphabet + = alphabet + ?? [ ...(withUppercase ? 'ABCDEFGHIJKLMOPQRSTUVWXYZ' : ''), ...(withLowercase ? 'abcdefghijklmopqrstuvwxyz' : ''), ...(withNumbers ? '0123456789' : ''), diff --git a/src/tools/token-generator/token-generator.tool.vue b/src/tools/token-generator/token-generator.tool.vue index 123e337e..81b7b583 100644 --- a/src/tools/token-generator/token-generator.tool.vue +++ b/src/tools/token-generator/token-generator.tool.vue @@ -1,61 +1,8 @@ - - + + diff --git a/src/tools/tools.store.ts b/src/tools/tools.store.ts index 2b0826c1..769b4d8b 100644 --- a/src/tools/tools.store.ts +++ b/src/tools/tools.store.ts @@ -1,8 +1,8 @@ -import { get, useStorage, type MaybeRef } from '@vueuse/core'; +import { type MaybeRef, get, useStorage } from '@vueuse/core'; import { defineStore } from 'pinia'; import type { Ref } from 'vue'; -import { toolsWithCategory } from './index'; import type { Tool, ToolWithCategory } from './tools.types'; +import { toolsWithCategory } from './index'; export const useToolStore = defineStore('tools', { state: () => ({ @@ -11,12 +11,12 @@ export const useToolStore = defineStore('tools', { getters: { favoriteTools(state) { return state.favoriteToolsName - .map((favoriteName) => toolsWithCategory.find(({ name }) => name === favoriteName)) + .map(favoriteName => toolsWithCategory.find(({ name }) => name === favoriteName)) .filter(Boolean) as ToolWithCategory[]; // cast because .filter(Boolean) does not remove undefined from type }, notFavoriteTools(state): ToolWithCategory[] { - return toolsWithCategory.filter((tool) => !state.favoriteToolsName.includes(tool.name)); + return toolsWithCategory.filter(tool => !state.favoriteToolsName.includes(tool.name)); }, tools(): ToolWithCategory[] { @@ -34,7 +34,7 @@ export const useToolStore = defineStore('tools', { }, removeToolFromFavorites({ tool }: { tool: MaybeRef }) { - this.favoriteToolsName = this.favoriteToolsName.filter((name) => get(tool).name !== name); + this.favoriteToolsName = this.favoriteToolsName.filter(name => get(tool).name !== name); }, isToolFavorite({ tool }: { tool: MaybeRef }) { diff --git a/src/tools/tools.types.ts b/src/tools/tools.types.ts index 48f60629..dcef8543 100644 --- a/src/tools/tools.types.ts +++ b/src/tools/tools.types.ts @@ -1,20 +1,20 @@ import type { Component } from 'vue'; -export type Tool = { - name: string; - path: string; - description: string; - keywords: string[]; - component: () => Promise; - icon: Component; - redirectFrom?: string[]; - isNew: boolean; - createdAt?: Date; -}; +export interface Tool { + name: string + path: string + description: string + keywords: string[] + component: () => Promise + icon: Component + redirectFrom?: string[] + isNew: boolean + createdAt?: Date +} -export type ToolCategory = { - name: string; - components: Tool[]; -}; +export interface ToolCategory { + name: string + components: Tool[] +} export type ToolWithCategory = Tool & { category: string }; diff --git a/src/tools/url-encoder/url-encoder.vue b/src/tools/url-encoder/url-encoder.vue index edbb4623..5fdcade9 100644 --- a/src/tools/url-encoder/url-encoder.vue +++ b/src/tools/url-encoder/url-encoder.vue @@ -1,5 +1,43 @@ + + - - diff --git a/src/tools/url-parser/url-parser.vue b/src/tools/url-parser/url-parser.vue index 3b18ca14..cadd07ef 100644 --- a/src/tools/url-parser/url-parser.vue +++ b/src/tools/url-parser/url-parser.vue @@ -1,51 +1,18 @@ - - + + diff --git a/src/tools/user-agent-parser/user-agent-result-cards.vue b/src/tools/user-agent-parser/user-agent-result-cards.vue index d79a5283..b3901ac2 100644 --- a/src/tools/user-agent-parser/user-agent-result-cards.vue +++ b/src/tools/user-agent-parser/user-agent-result-cards.vue @@ -1,8 +1,20 @@ + +