diff --git a/.github/workflows/docker-nightly-release.yml b/.github/workflows/docker-nightly-release.yml index 9964632c..81a0898c 100644 --- a/.github/workflows/docker-nightly-release.yml +++ b/.github/workflows/docker-nightly-release.yml @@ -80,7 +80,7 @@ jobs: with: context: . file: ./Dockerfile - platforms: linux/amd64,linux/arm64,linux/arm/v7 + platforms: linux/amd64,linux/arm64 push: true tags: | corentinth/it-tools:nightly diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 49540562..8ed4099d 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -39,7 +39,7 @@ jobs: with: context: . file: ./Dockerfile - platforms: linux/amd64,linux/arm64,linux/arm/v7 + platforms: linux/amd64,linux/arm64 push: true tags: | corentinth/it-tools:latest diff --git a/components.d.ts b/components.d.ts index db37f842..d034fc78 100644 --- a/components.d.ts +++ b/components.d.ts @@ -29,7 +29,11 @@ declare module '@vue/runtime-core' { 'CButtonsSelect.demo': typeof import('./src/ui/c-buttons-select/c-buttons-select.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'] + CCollapse: typeof import('./src/ui/c-collapse/c-collapse.vue')['default'] + 'CCollapse.demo': typeof import('./src/ui/c-collapse/c-collapse.demo.vue')['default'] CDiffEditor: typeof import('./src/ui/c-diff-editor/c-diff-editor.vue')['default'] + CFileUpload: typeof import('./src/ui/c-file-upload/c-file-upload.vue')['default'] + 'CFileUpload.demo': typeof import('./src/ui/c-file-upload/c-file-upload.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'] @@ -39,8 +43,12 @@ declare module '@vue/runtime-core' { CLabel: typeof import('./src/ui/c-label/c-label.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'] + CMarkdown: typeof import('./src/ui/c-markdown/c-markdown.vue')['default'] + 'CMarkdown.demo': typeof import('./src/ui/c-markdown/c-markdown.demo.vue')['default'] CModal: typeof import('./src/ui/c-modal/c-modal.vue')['default'] 'CModal.demo': typeof import('./src/ui/c-modal/c-modal.demo.vue')['default'] + CModalValue: typeof import('./src/ui/c-modal-value/c-modal-value.vue')['default'] + 'CModalValue.demo': typeof import('./src/ui/c-modal-value/c-modal-value.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'] @@ -83,6 +91,7 @@ declare module '@vue/runtime-core' { 'IconMdi:contentCopy': typeof import('~icons/mdi/content-copy')['default'] 'IconMdi:kettleSteamOutline': typeof import('~icons/mdi/kettle-steam-outline')['default'] IconMdiArrowDown: typeof import('~icons/mdi/arrow-down')['default'] + IconMdiArrowRight: typeof import('~icons/mdi/arrow-right')['default'] IconMdiArrowRightBottom: typeof import('~icons/mdi/arrow-right-bottom')['default'] IconMdiCamera: typeof import('~icons/mdi/camera')['default'] IconMdiChevronDown: typeof import('~icons/mdi/chevron-down')['default'] @@ -100,6 +109,7 @@ declare module '@vue/runtime-core' { IconMdiRefresh: typeof import('~icons/mdi/refresh')['default'] IconMdiSearch: typeof import('~icons/mdi/search')['default'] IconMdiTranslate: typeof import('~icons/mdi/translate')['default'] + IconMdiTriangleDown: typeof import('~icons/mdi/triangle-down')['default'] IconMdiVideo: typeof import('~icons/mdi/video')['default'] InputCopyable: typeof import('./src/components/InputCopyable.vue')['default'] IntegerBaseConverter: typeof import('./src/tools/integer-base-converter/integer-base-converter.vue')['default'] @@ -165,6 +175,8 @@ declare module '@vue/runtime-core' { NUploadDragger: typeof import('naive-ui')['NUploadDragger'] OtpCodeGeneratorAndValidator: typeof import('./src/tools/otp-code-generator-and-validator/otp-code-generator-and-validator.vue')['default'] PasswordStrengthAnalyser: typeof import('./src/tools/password-strength-analyser/password-strength-analyser.vue')['default'] + PdfSignatureChecker: typeof import('./src/tools/pdf-signature-checker/pdf-signature-checker.vue')['default'] + PdfSignatureDetails: typeof import('./src/tools/pdf-signature-checker/components/pdf-signature-details.vue')['default'] PercentageCalculator: typeof import('./src/tools/percentage-calculator/percentage-calculator.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'] diff --git a/locales/en.yml b/locales/en.yml index 5500f8b8..dc6397a5 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -26,21 +26,23 @@ home: lightMode: 'Light mode' mode: 'Toggle dark/light mode' about: - h1: 'About IT-Tools' - h1p1: 'This wonderful website, made with ❤ by' - h1p2: ", aggregates useful tools for developer and people working in IT. If you find it useful, please feel free to share it to people you think may find it useful too and don''t forget to bookmark it in your shortcut bar!" - h1p3: 'IT Tools is open-source (under the MIT license) and free, and will always be, but it costs me money to host and renew the domain name. If you want to support my work, and encourage me to add more tools, please consider supporting by' - h1p4: 'sponsoring me' - h2: Technologies - h2p1: 'IT Tools is made in Vue.js (Vue 3) with the the Naive UI component library and is hosted and continuously deployed by Vercel. Third-party open-source libraries are used in some tools, you may find the complete list in the' - h2p2: 'file of the repository.' - h3: 'Found a bug? A tool is missing?' - h3p1: 'If you need a tool that is currently not present here, and you think can be useful, you are welcome to submit a feature request in the' - h3p2: 'issues section' - h3p3: 'in the GitHub repository.' - h3p4: "And if you found a bug, or something doesn''t work as expected, please file a bug report in the" - h3p5: 'issues section' - h3p6: 'in the GitHub repository.' + content: > + # About IT-Tools + + This wonderful website, made with ❤ by [Corentin Thomasset](https://github.com/CorentinTh) , aggregates useful tools for developer and people working in IT. If you find it useful, please feel free to share it to people you think may find it useful too and don't forget to bookmark it in your shortcut bar! + + IT Tools is open-source (under the MIT license) and free, and will always be, but it costs me money to host and renew the domain name. If you want to support my work, and encourage me to add more tools, please consider supporting by [sponsoring me](https://www.buymeacoffee.com/cthmsst). + + ## Technologies + + IT Tools is made in Vue.js (Vue 3) with the the Naive UI component library and is hosted and continuously deployed by Vercel. Third-party open-source libraries are used in some tools, you may find the complete list in the [package.json](https://github.com/CorentinTh/it-tools/blob/main/package.json) file of the repository. + + ## Found a bug? A tool is missing? + + If you need a tool that is currently not present here, and you think can be useful, you are welcome to submit a feature request in the [issues section](https://github.com/CorentinTh/it-tools/issues/new/choose) in the GitHub repository. + + And if you found a bug, or something doesn't work as expected, please file a bug report in the [issues section](https://github.com/CorentinTh/it-tools/issues/new/choose) in the GitHub repository. + 404: notFound: '404 Not Found' sorry: 'Sorry, this page does not seem to exist' diff --git a/locales/fr.yml b/locales/fr.yml index 9670546c..ff128461 100644 --- a/locales/fr.yml +++ b/locales/fr.yml @@ -25,6 +25,22 @@ home: darkMode: 'Mode sombre' lightMode: 'Mode clair' mode: 'Basculer le mode sombre/clair' +about: + content: > + # À propos de IT-Tools + + Ce merveilleux site, fait avec ❤ par [Corentin Thomasset](https://github.com/CorentinTh), regroupe des outils utiles pour les développeurs et les personnes travaillant dans l'informatique. Si vous le trouvez utile, n'hésitez pas à le partager et n'oubliez pas de le mettre dans vos favoris ! + + IT Tools est open-source (sous licence MIT) et gratuit, et le restera toujours, mais cela me coûte de l'argent pour l'héberger et renouveler le nom de domaine. Si vous voulez soutenir mon travail, et m'encourager à ajouter plus d'outils, n'hésitez pas à me [soutenir](https://www.buymeacoffee.com/cthmsst). + + ## Technologies + + IT Tools est fait en Vue.js (Vue 3) avec la bibliothèque de composants Naive UI et est hébergé et déployé en continu par Vercel. Des bibliothèques open-source tierces sont utilisées dans certains outils, vous pouvez trouver la liste complète dans le fichier [package.json](https://github.com/CorentinTh/it-tools/blob/main/package.json) du dépôt. + + ## Vous avez trouvé un bug ? Un outil manque ? + + Si vous avez besoin d'un outil qui n'est pas encore présent ici, et que vous pensez qu'il peut être utile, vous êtes invité à soumettre une demande de fonctionnalité dans la [section issue](https://github.com/CorentinTh/it-tools/issues/new/choose) du dépôt GitHub. + 404: notFound: '404 Not Found' sorry: "Désolé, cette page n'existe pas" diff --git a/package.json b/package.json index 998b0958..1f6d6d1f 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "cronstrue": "^2.26.0", "crypto-js": "^4.1.1", "date-fns": "^2.29.3", + "dompurify": "^3.0.6", "emojilib": "^3.0.10", "figue": "^1.2.0", "fuse.js": "^6.6.2", @@ -65,6 +66,7 @@ "jwt-decode": "^3.1.2", "libphonenumber-js": "^1.10.28", "lodash": "^4.17.21", + "marked": "^10.0.0", "mathjs": "^11.9.1", "mime-types": "^2.1.35", "monaco-editor": "^0.43.0", @@ -72,6 +74,7 @@ "netmask": "^2.0.2", "node-forge": "^1.3.1", "oui": "^12.0.52", + "pdf-signature-reader": "^1.4.2", "pinia": "^2.0.34", "plausible-tracker": "^0.3.8", "qrcode": "^1.5.1", @@ -97,6 +100,7 @@ "@tsconfig/node18": "^18.2.0", "@types/bcryptjs": "^2.4.2", "@types/crypto-js": "^4.1.1", + "@types/dompurify": "^3.0.5", "@types/jsdom": "^21.0.0", "@types/lodash": "^4.14.192", "@types/mime-types": "^2.1.1", @@ -106,7 +110,7 @@ "@types/qrcode": "^1.5.0", "@types/ua-parser-js": "^0.7.36", "@types/uuid": "^9.0.0", - "@unocss/eslint-config": "^0.55.0", + "@unocss/eslint-config": "^0.57.0", "@vitejs/plugin-vue": "^4.3.2", "@vitejs/plugin-vue-jsx": "^3.0.2", "@vue/compiler-sfc": "^3.2.47", @@ -120,7 +124,7 @@ "less": "^4.1.3", "prettier": "^3.0.0", "typescript": "~5.2.0", - "unocss": "^0.55.0", + "unocss": "^0.57.0", "unocss-preset-scrollbar": "^0.2.1", "unplugin-icons": "^0.17.0", "unplugin-vue-components": "^0.25.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 45773abd..2ae58a5f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -65,6 +65,9 @@ dependencies: date-fns: specifier: ^2.29.3 version: 2.29.3 + dompurify: + specifier: ^3.0.6 + version: 3.0.6 emojilib: specifier: ^3.0.10 version: 3.0.10 @@ -95,6 +98,9 @@ dependencies: lodash: specifier: ^4.17.21 version: 4.17.21 + marked: + specifier: ^10.0.0 + version: 10.0.0 mathjs: specifier: ^11.9.1 version: 11.9.1 @@ -116,6 +122,9 @@ dependencies: oui: specifier: ^12.0.52 version: 12.0.52 + pdf-signature-reader: + specifier: ^1.4.2 + version: 1.4.2 pinia: specifier: ^2.0.34 version: 2.0.34(typescript@5.2.2)(vue@3.3.4) @@ -187,6 +196,9 @@ devDependencies: '@types/crypto-js': specifier: ^4.1.1 version: 4.1.1 + '@types/dompurify': + specifier: ^3.0.5 + version: 3.0.5 '@types/jsdom': specifier: ^21.0.0 version: 21.1.0 @@ -215,8 +227,8 @@ devDependencies: specifier: ^9.0.0 version: 9.0.0 '@unocss/eslint-config': - specifier: ^0.55.0 - version: 0.55.0(eslint@8.47.0)(typescript@5.2.2) + specifier: ^0.57.0 + version: 0.57.1(eslint@8.47.0)(typescript@5.2.2) '@vitejs/plugin-vue': specifier: ^4.3.2 version: 4.3.2(vite@4.4.9)(vue@3.3.4) @@ -257,11 +269,11 @@ devDependencies: specifier: ~5.2.0 version: 5.2.2 unocss: - specifier: ^0.55.0 - version: 0.55.0(postcss@8.4.31)(rollup@2.79.1)(vite@4.4.9) + specifier: ^0.57.0 + version: 0.57.1(postcss@8.4.31)(rollup@2.79.1)(vite@4.4.9) unocss-preset-scrollbar: specifier: ^0.2.1 - version: 0.2.1(unocss@0.55.0) + version: 0.2.1(unocss@0.57.1) unplugin-icons: specifier: ^0.17.0 version: 0.17.0(@vue/compiler-sfc@3.2.47) @@ -410,10 +422,6 @@ packages: /@antfu/utils@0.7.4: resolution: {integrity: sha512-qe8Nmh9rYI/HIspLSTwtbMFPj6dISG6+dJnOguTlPNXtCvS2uezdxscVBb7/3DrmNbQK49TDqpkSQ1chbRGdpQ==} - /@antfu/utils@0.7.5: - resolution: {integrity: sha512-dlR6LdS+0SzOAPx/TPRhnoi7hE251OVeT2Snw0RguNbBSbjUHdWr0l3vcUUDg26rEysT89kCbtw1lVorBXLLCg==} - dev: true - /@antfu/utils@0.7.6: resolution: {integrity: sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==} dev: true @@ -2166,11 +2174,11 @@ packages: resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} dev: true - /@iconify/utils@2.1.7: - resolution: {integrity: sha512-P8S3z/L1LcV4Qem9AoCfVAaTFGySEMzFEY4CHZLkfRj0Fv9LiR+AwjDgrDrzyI93U2L2mg9JHsbTJ52mF8suNw==} + /@iconify/utils@2.1.11: + resolution: {integrity: sha512-M/w3PkN8zQYXi8N6qK/KhnYMfEbbb6Sk8RZVn8g+Pmmu5ybw177RpsaGwpziyHeUsu4etrexYSWq3rwnIqzYCg==} dependencies: '@antfu/install-pkg': 0.1.1 - '@antfu/utils': 0.7.5 + '@antfu/utils': 0.7.6 '@iconify/types': 2.0.0 debug: 4.3.4 kolorist: 1.8.0 @@ -2420,7 +2428,7 @@ packages: resolution: {integrity: sha512-LrwV3f0Y6H7b7m/w1Y3bkGuR3HOiBK4QiHHW3HuRMza6MZodDQbj8Baik5/V5GiSg1/ltijS1CymVcycd1EfTw==} dependencies: '@types/markdown-it': 12.2.3 - markdown-it: 13.0.1 + markdown-it: 13.0.2 dev: true /@mdit-vue/plugin-frontmatter@0.12.0: @@ -2429,7 +2437,7 @@ packages: '@mdit-vue/types': 0.12.0 '@types/markdown-it': 12.2.3 gray-matter: 4.0.3 - markdown-it: 13.0.1 + markdown-it: 13.0.2 dev: true /@mdit-vue/types@0.12.0: @@ -2586,6 +2594,21 @@ packages: picomatch: 2.3.1 rollup: 2.79.1 + /@rollup/pluginutils@5.0.5(rollup@2.79.1): + resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.0 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 2.79.1 + dev: true + /@rushstack/eslint-patch@1.2.0: resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} dev: true @@ -2904,6 +2927,12 @@ packages: resolution: {integrity: sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==} dev: true + /@types/dompurify@3.0.5: + resolution: {integrity: sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==} + dependencies: + '@types/trusted-types': 2.0.3 + dev: true + /@types/estree@0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: true @@ -3128,14 +3157,6 @@ packages: '@typescript-eslint/visitor-keys': 5.60.0 dev: true - /@typescript-eslint/scope-manager@6.3.0: - resolution: {integrity: sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.3.0 - '@typescript-eslint/visitor-keys': 6.3.0 - dev: true - /@typescript-eslint/scope-manager@6.4.1: resolution: {integrity: sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3144,6 +3165,14 @@ packages: '@typescript-eslint/visitor-keys': 6.4.1 dev: true + /@typescript-eslint/scope-manager@6.9.1: + resolution: {integrity: sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/visitor-keys': 6.9.1 + dev: true + /@typescript-eslint/type-utils@6.4.1(eslint@8.47.0)(typescript@5.2.2): resolution: {integrity: sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3169,13 +3198,13 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/types@6.3.0: - resolution: {integrity: sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==} + /@typescript-eslint/types@6.4.1: + resolution: {integrity: sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/types@6.4.1: - resolution: {integrity: sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==} + /@typescript-eslint/types@6.9.1: + resolution: {integrity: sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==} engines: {node: ^16.0.0 || >=18.0.0} dev: true @@ -3200,27 +3229,6 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree@6.3.0(typescript@5.2.2): - resolution: {integrity: sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 6.3.0 - '@typescript-eslint/visitor-keys': 6.3.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/typescript-estree@6.4.1(typescript@5.2.2): resolution: {integrity: sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3242,6 +3250,27 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree@6.9.1(typescript@5.2.2): + resolution: {integrity: sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/visitor-keys': 6.9.1 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.1(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/utils@5.60.0(eslint@8.47.0)(typescript@5.2.2): resolution: {integrity: sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3262,25 +3291,6 @@ packages: - typescript dev: true - /@typescript-eslint/utils@6.3.0(eslint@8.47.0)(typescript@5.2.2): - resolution: {integrity: sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 6.3.0 - '@typescript-eslint/types': 6.3.0 - '@typescript-eslint/typescript-estree': 6.3.0(typescript@5.2.2) - eslint: 8.47.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /@typescript-eslint/utils@6.4.1(eslint@8.47.0)(typescript@5.2.2): resolution: {integrity: sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3300,6 +3310,25 @@ packages: - typescript dev: true + /@typescript-eslint/utils@6.9.1(eslint@8.47.0)(typescript@5.2.2): + resolution: {integrity: sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 6.9.1 + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) + eslint: 8.47.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/visitor-keys@5.60.0: resolution: {integrity: sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3308,14 +3337,6 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@6.3.0: - resolution: {integrity: sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.3.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@typescript-eslint/visitor-keys@6.4.1: resolution: {integrity: sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3324,6 +3345,14 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@typescript-eslint/visitor-keys@6.9.1: + resolution: {integrity: sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.9.1 + eslint-visitor-keys: 3.4.3 + dev: true + /@unhead/dom@0.5.1: resolution: {integrity: sha512-cdRzGbZVWTgbwl9HiG3RZzzPThXmhj5afGB2BLRwbE+3IiwqUpMjL6v8bDjE5qttvH4YrK9AD9O8fFP9XyZQpg==} dependencies: @@ -3350,85 +3379,86 @@ packages: dependencies: '@unhead/dom': 0.5.1 '@unhead/schema': 0.5.1 - '@vueuse/shared': 10.5.0(vue@3.3.4) + '@vueuse/shared': 10.6.1(vue@3.3.4) unhead: 0.5.1 vue: 3.3.4 transitivePeerDependencies: - '@vue/composition-api' dev: false - /@unocss/astro@0.55.0(rollup@2.79.1)(vite@4.4.9): - resolution: {integrity: sha512-Qqk8zONPBBigEcUOGhEwBPIQmWnQGpjpQrSdpjs86BphKbQcqWHES1fQA83Fk2tpZ08zo0zAPDJ8VhfR+c+yqg==} + /@unocss/astro@0.57.1(rollup@2.79.1)(vite@4.4.9): + resolution: {integrity: sha512-KNaqN/SGM/uz1QitajIkzNEw0jy9Zx9Wp8fl4GhfGYEMAN2+M4cuvBZRmlb6cLctSXmSAJQDG91ivbD1JijGnw==} peerDependencies: vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 peerDependenciesMeta: vite: optional: true dependencies: - '@unocss/core': 0.55.0 - '@unocss/reset': 0.55.0 - '@unocss/vite': 0.55.0(rollup@2.79.1)(vite@4.4.9) + '@unocss/core': 0.57.1 + '@unocss/reset': 0.57.1 + '@unocss/vite': 0.57.1(rollup@2.79.1)(vite@4.4.9) vite: 4.4.9(@types/node@18.15.11)(less@4.1.3) transitivePeerDependencies: - rollup dev: true - /@unocss/cli@0.55.0(rollup@2.79.1): - resolution: {integrity: sha512-K8PR4UydtTfT8rMynDcNQKk1WWI97312kZYjBLHUlrJkNbSgcmpU3wfREIqvCSgPg61ttZAgE5uI6omf8FudtA==} + /@unocss/cli@0.57.1(rollup@2.79.1): + resolution: {integrity: sha512-wKuOaygrPNzDm5L7+2SfHsIi3knJrAQ8nH6OasVqB+bGDz6ybDlULV7wvUco6Os72ydh7YbWC2/WpqFii8U/3w==} engines: {node: '>=14'} + hasBin: true dependencies: '@ampproject/remapping': 2.2.1 - '@rollup/pluginutils': 5.0.2(rollup@2.79.1) - '@unocss/config': 0.55.0 - '@unocss/core': 0.55.0 - '@unocss/preset-uno': 0.55.0 + '@rollup/pluginutils': 5.0.5(rollup@2.79.1) + '@unocss/config': 0.57.1 + '@unocss/core': 0.57.1 + '@unocss/preset-uno': 0.57.1 cac: 6.7.14 chokidar: 3.5.3 colorette: 2.0.20 consola: 3.2.3 fast-glob: 3.3.1 - magic-string: 0.30.2 + magic-string: 0.30.5 pathe: 1.1.1 perfect-debounce: 1.0.0 transitivePeerDependencies: - rollup dev: true - /@unocss/config@0.55.0: - resolution: {integrity: sha512-N1o49aqqMP8UTmFZKsqN+CZFxoiUbatTYdPixCGErI5H6jA0VByVU7RI3Dr+Lk3PTOxbmZUunaDaWZP3iT4X5w==} + /@unocss/config@0.57.1: + resolution: {integrity: sha512-mbuVO0mH1PX7rEkViMNWb3jG1ji7TUydo2DdnMHhJE+dOrGtnQzhzXGlAd4qqel1fnt/VWuOyZKwJA3QO6VCtg==} engines: {node: '>=14'} dependencies: - '@unocss/core': 0.55.0 - unconfig: 0.3.10 + '@unocss/core': 0.57.1 + unconfig: 0.3.11 dev: true /@unocss/core@0.31.17: resolution: {integrity: sha512-DJ3Uk2ePVXvV1qQmgoLK44aqB6f0s+naOEvouI97nzVXDZgxDQPBxIPB/L4vvE4U+gQxEiHwwE3gJ75iPqVzXw==} dev: true - /@unocss/core@0.55.0: - resolution: {integrity: sha512-TcTugpuhsv6OwMsP3iFIG8FVc9N5JzkojIGNAKF8I2WBftZ//3QcpEHiHc1mH3MlPYfJgUvCcT6/Gad55qmHzg==} + /@unocss/core@0.57.1: + resolution: {integrity: sha512-cqQW/4gCuk+bFMPg9lBanuRNQ9Lx1l4PpMN/6uKxI5WROpq7ce/Xb4uGvAxKLh3ITtFSpXs2cLfsy7QD6cVD/Q==} dev: true - /@unocss/eslint-config@0.55.0(eslint@8.47.0)(typescript@5.2.2): - resolution: {integrity: sha512-18kDqTFQuATIOh+rja920q/S4I0aLLVG1ccZ1i8cJmpNF+XGuevu7UtPjxlcNq1F7pzmTlq/79jYrjBDZBGL/g==} + /@unocss/eslint-config@0.57.1(eslint@8.47.0)(typescript@5.2.2): + resolution: {integrity: sha512-49okz5jnpiB8uPWVRm9+iEvPaTCIm9dLwAVqN8ZMKq33SuGeTfX/dNR6i8/iKyFMBHPrLmvh3WPGq5iIAZTawQ==} engines: {node: '>=14'} dependencies: - '@unocss/eslint-plugin': 0.55.0(eslint@8.47.0)(typescript@5.2.2) + '@unocss/eslint-plugin': 0.57.1(eslint@8.47.0)(typescript@5.2.2) transitivePeerDependencies: - eslint - supports-color - typescript dev: true - /@unocss/eslint-plugin@0.55.0(eslint@8.47.0)(typescript@5.2.2): - resolution: {integrity: sha512-w6VjKtjTtiuG7jIZXUZzSCHgarV2bp5dMH3ALOhhvNZYfqLbcrJPSPk0RisVZ+uF87QCK4WSlKdXmO4UBd0ENg==} + /@unocss/eslint-plugin@0.57.1(eslint@8.47.0)(typescript@5.2.2): + resolution: {integrity: sha512-aErMKeSkJ78bXlqNd2bb0qzebKXAWVHcCSsP58xuzQsLkaNvwtj+/MrYDuF5PCNZakUCR1snfP4f/MGCP4+OmQ==} engines: {node: '>=14'} dependencies: - '@typescript-eslint/utils': 6.3.0(eslint@8.47.0)(typescript@5.2.2) - '@unocss/config': 0.55.0 - '@unocss/core': 0.55.0 - magic-string: 0.30.2 + '@typescript-eslint/utils': 6.9.1(eslint@8.47.0)(typescript@5.2.2) + '@unocss/config': 0.57.1 + '@unocss/core': 0.57.1 + magic-string: 0.30.5 synckit: 0.8.5 transitivePeerDependencies: - eslint @@ -3436,45 +3466,47 @@ packages: - typescript dev: true - /@unocss/extractor-arbitrary-variants@0.55.0: - resolution: {integrity: sha512-FCel+gJ3N8C/361yQ3gYTmbCjX3DXQ+LdxBiAawapbtTA4eXw55/f7cpiiWcHoouCRrWIEMOQN5DskAJvmMaTw==} + /@unocss/extractor-arbitrary-variants@0.57.1: + resolution: {integrity: sha512-9s+azHhBnwjxm46TsD1RY0krDAwOR8tcw58Vtl3emd6C0VQsAOdoprt7UHE7GEXMvDVq7nMf8lAT0BM0LteW3w==} dependencies: - '@unocss/core': 0.55.0 + '@unocss/core': 0.57.1 dev: true - /@unocss/inspector@0.55.0: - resolution: {integrity: sha512-wIkypLsBUA76A9cpyf/VtbVU7TLJO9HETEVMZytxEyVpq4KVNJBwNLUGWQ07IOc0oRTX+HJKiQK9/bLnIYMCHA==} + /@unocss/inspector@0.57.1: + resolution: {integrity: sha512-qV7ta7iHGX2EpZJ4IWY/05kgyhKFeWlvVJbrOnGsaH8gVt33T/43YAhB/8K5GIXBXIwkhwk13iB13nlg2gSheg==} dependencies: + '@unocss/rule-utils': 0.57.1 gzip-size: 6.0.0 sirv: 2.0.3 dev: true - /@unocss/postcss@0.55.0(postcss@8.4.31): - resolution: {integrity: sha512-qytqO8riNLpy1m6qVfISVHw3dwNRHgpxcUaufSN7P8lgsbOimwh2nRE35f/HoKS1VV+5JVsVaHmUFQVxwiW6cw==} + /@unocss/postcss@0.57.1(postcss@8.4.31): + resolution: {integrity: sha512-DexrV+v/qkVh6t660rXigNr2Y6lON8jxD1z2KVk2bjHKhFflF6q6seps6d/MquyLJI1mXF2uANTeFAeL2q6evw==} engines: {node: '>=14'} peerDependencies: postcss: ^8.4.21 dependencies: - '@unocss/config': 0.55.0 - '@unocss/core': 0.55.0 + '@unocss/config': 0.57.1 + '@unocss/core': 0.57.1 + '@unocss/rule-utils': 0.57.1 css-tree: 2.3.1 fast-glob: 3.3.1 - magic-string: 0.30.2 + magic-string: 0.30.5 postcss: 8.4.31 dev: true - /@unocss/preset-attributify@0.55.0: - resolution: {integrity: sha512-AbqoamJLsFqJih1MMyxEslLScWSpOdlTbF9R+gSnrWwkGZDuZszcyTDbXrhCPWPUkihR7NY9XQSKxUkTb6MJJg==} + /@unocss/preset-attributify@0.57.1: + resolution: {integrity: sha512-pvGQHaqBlB0jQysWhNbcKLOGrkj8b53k0sAa9LYxQjD1fa8t/dwbuMpZv4twX+gysF0vBhxRoWBPLH1/S6zRZg==} dependencies: - '@unocss/core': 0.55.0 + '@unocss/core': 0.57.1 dev: true - /@unocss/preset-icons@0.55.0: - resolution: {integrity: sha512-BeseXUz2WFRztLtfblGhpFBJkgKi8k7tKPyEx/QX2I/xhQNsXqfWqeiCEVLxrEI3HxXOZPV1G4idCCbBiZQ3ww==} + /@unocss/preset-icons@0.57.1: + resolution: {integrity: sha512-ve4jC6yREfS0mv97DCld9xLjMuiSCcsQPKucdtpUfCjLMqtGd1ZGGdFv02Q+92NkW7HDfgj+izEw1SKh9695Ow==} dependencies: - '@iconify/utils': 2.1.7 - '@unocss/core': 0.55.0 - ofetch: 1.1.1 + '@iconify/utils': 2.1.11 + '@unocss/core': 0.57.1 + ofetch: 1.3.3 transitivePeerDependencies: - supports-color dev: true @@ -3485,102 +3517,114 @@ packages: '@unocss/core': 0.31.17 dev: true - /@unocss/preset-mini@0.55.0: - resolution: {integrity: sha512-zAMLmpCBXE36CDCrMtvxNp7lN9mk5QpArPpLekR3lPZ7NTAYSxHkieCJ0TryeOYWlt1sBdrOFE8X0cQCyG96Zg==} + /@unocss/preset-mini@0.57.1: + resolution: {integrity: sha512-v9ZsIUGDfZNXbIrOc7zrBp+RFbFFGSQN/vKIf761js4fJ31j6lan4pPQPGcY17xHConkI1HJT/+yb/UVJaAcHw==} dependencies: - '@unocss/core': 0.55.0 - '@unocss/extractor-arbitrary-variants': 0.55.0 + '@unocss/core': 0.57.1 + '@unocss/extractor-arbitrary-variants': 0.57.1 + '@unocss/rule-utils': 0.57.1 dev: true - /@unocss/preset-tagify@0.55.0: - resolution: {integrity: sha512-crvJAZpG2ge9Lq51vpWANiB3BKv8Vs8sjplwRfUVRCYMiN7ZNzq9bNzUwTXhJXmRJ4LVjTSFciKPQR7fCjUScA==} + /@unocss/preset-tagify@0.57.1: + resolution: {integrity: sha512-GV8knxnsOVH/XiG2KB+mVZeEJqr0PZvvkSTPftGPbjttoKVZ+28Y5q9/qezH7p4W6RYVAAK+3qHHy5wWZosiMw==} dependencies: - '@unocss/core': 0.55.0 + '@unocss/core': 0.57.1 dev: true - /@unocss/preset-typography@0.55.0: - resolution: {integrity: sha512-M4fJUEzkBqjxEUIDbwoWb00hjPbpwZKDOcB81S0F+xE3SVu1pQj8KgymhxaJvz+FxGZRajnJJ9esaGPIrzG2gQ==} + /@unocss/preset-typography@0.57.1: + resolution: {integrity: sha512-C4cqCiGW0OSoSXsVQKgfLulYxY5C8M40f+a8VtBlAaEaN6eSlEt+catXb0chF9T2mvz/b87b0PahPvPwJdDf1Q==} dependencies: - '@unocss/core': 0.55.0 - '@unocss/preset-mini': 0.55.0 + '@unocss/core': 0.57.1 + '@unocss/preset-mini': 0.57.1 dev: true - /@unocss/preset-uno@0.55.0: - resolution: {integrity: sha512-iYGdE/MQLAvpQkyQ8f3aolC9NK9NtrG87LfQmiKu/RpzjghDlTY8VTuWIDcdIk80zTtOxRtitLqGEsoDl8WnuA==} + /@unocss/preset-uno@0.57.1: + resolution: {integrity: sha512-0+DKZiowYjYzq2swJzQA2dhqDvLJdm0Y437ITzc2GzZMKGUUuNi+w2v3/SzwkpkRd9zTB9/YaOIJVfdrx6ZOXQ==} dependencies: - '@unocss/core': 0.55.0 - '@unocss/preset-mini': 0.55.0 - '@unocss/preset-wind': 0.55.0 + '@unocss/core': 0.57.1 + '@unocss/preset-mini': 0.57.1 + '@unocss/preset-wind': 0.57.1 + '@unocss/rule-utils': 0.57.1 dev: true - /@unocss/preset-web-fonts@0.55.0: - resolution: {integrity: sha512-nFA5q0WinD/z7Iqv3uJQ8sTK7mQf18qbcFKmgWZ+QZXdI/wACOfExd6futsXj5EdACJwsEixYJe4DURTsD5XtA==} + /@unocss/preset-web-fonts@0.57.1: + resolution: {integrity: sha512-9DCIMlBRaGrljLmeciH4WqP+uRx2z2nLxvrvEmGbpJJpMn2H4higR5Zu5tDyKYGr9QBl9vXdWgib+43OSswkqA==} dependencies: - '@unocss/core': 0.55.0 - ofetch: 1.1.1 + '@unocss/core': 0.57.1 + ofetch: 1.3.3 dev: true - /@unocss/preset-wind@0.55.0: - resolution: {integrity: sha512-H9vNXdEJVQx1UO367V3RInAUj4qrsPCXm914RNC4D7qojOuPQlipW0YD5WFklcXeI/k0f1B30VjDYGZhV0jykg==} + /@unocss/preset-wind@0.57.1: + resolution: {integrity: sha512-5UairNahUXNDe9AggPtTCodyPjl6NgPCsiEB22LVgN20UjBXjaqzN5wUe1OgtpLoAUaSk0KI7eLWhnWbTbST3A==} dependencies: - '@unocss/core': 0.55.0 - '@unocss/preset-mini': 0.55.0 + '@unocss/core': 0.57.1 + '@unocss/preset-mini': 0.57.1 + '@unocss/rule-utils': 0.57.1 dev: true - /@unocss/reset@0.55.0: - resolution: {integrity: sha512-TzpcOCIr16IbFxQ4vrSfEV+A8k0N4mJkhl7J3SZfAxBpNDBKAWDB6VBW9iEQY5aBYDLN3wRx1LskgEoubqBCPQ==} + /@unocss/reset@0.57.1: + resolution: {integrity: sha512-f/ofoudjFN/HMtv1XV5phP58pOmNruBhr0GbVdBNylyieMQkFHowA7iSemChnC/fTbCcY6oSOAcFl4n9AefjdA==} dev: true - /@unocss/scope@0.55.0: - resolution: {integrity: sha512-44xgHoklh2BWWuOkA0ZL1qgr4t/DGnynj3UI8K8YP+PClFFMZ/T+kfhsLBDOrS2a4ytzgh17cTGhjAc3cTwiEA==} - dev: true - - /@unocss/transformer-attributify-jsx-babel@0.55.0: - resolution: {integrity: sha512-gsPuD56gNw47AFgOmdpqT9+gdisLXKnPccF4ozZoqGOv3Hy2MPOc+Dkwk7qkDzzSdC39G5Aq09z8X9R2vU64XQ==} + /@unocss/rule-utils@0.57.1: + resolution: {integrity: sha512-Hdicz7YORZx7SHICldzOGjPNeJwk/Xhy3cycqiPbg6nB6d639bpgZn5BsbDzHCPKpguwDomUqTZS6+C3s7tUVg==} + engines: {node: '>=14'} dependencies: - '@unocss/core': 0.55.0 + '@unocss/core': 0.57.1 + magic-string: 0.30.5 dev: true - /@unocss/transformer-attributify-jsx@0.55.0: - resolution: {integrity: sha512-17/4I2Uqj44JJ4iv3e/mBH1DsWvyVbbbA9JivS/iBPferdFTPtt4Buddhm7bkx1tE86KYZcokVZ8N5RA2zu2UQ==} - dependencies: - '@unocss/core': 0.55.0 + /@unocss/scope@0.57.1: + resolution: {integrity: sha512-ZAzg6lLGwKNQGCvJXEie3TvGztkAyajEFqygu0mjtHb+CmDql4iAjoygs+3dnRI5hSDwfMYFrJ2azX26+2CsoA==} dev: true - /@unocss/transformer-compile-class@0.55.0: - resolution: {integrity: sha512-aH2SWXqOGJAEuNS1S/fIfs0gFwnakxgG83PCS40uNbEiLv/iG0HuALaQbVvyWHo3O7xLoMa7os9p72Q2amaVQw==} + /@unocss/transformer-attributify-jsx-babel@0.57.1: + resolution: {integrity: sha512-EOCPB8OGmhroAuFU0i0W5p6GmJpx6mAkP4KmsqVLd4QMgw+8aXkG7SKyLnxQZnekM0/dSo0TcpVGeGrZaUNgvQ==} dependencies: - '@unocss/core': 0.55.0 + '@unocss/core': 0.57.1 dev: true - /@unocss/transformer-directives@0.55.0: - resolution: {integrity: sha512-bWfAOqQxzy5vIul/jgXN2b0APAk9tWKeTN9Rh4FWvz+dI0P7cBc3rHVEC5qM3i9xwYObtjQcNZjEfJpyeapnzg==} + /@unocss/transformer-attributify-jsx@0.57.1: + resolution: {integrity: sha512-ohgSEwm2j98ltPWl1zRPvZhRjQPpd7qZtgoROTQh6n2W7wEO1SlnYjgBBz+pGuo2dkfBN5NjuZJ93AEjS10Ysw==} dependencies: - '@unocss/core': 0.55.0 + '@unocss/core': 0.57.1 + dev: true + + /@unocss/transformer-compile-class@0.57.1: + resolution: {integrity: sha512-z0WZN6hbgpyBm2xqIrojqEjpQMhiyzHRbaBjWzI/6ieHWoFo5ajIwnReaFUEfJRNruLTd7/9hFDZdRXRPhttFw==} + dependencies: + '@unocss/core': 0.57.1 + dev: true + + /@unocss/transformer-directives@0.57.1: + resolution: {integrity: sha512-rIk3XEU2NywEJUOkngBSmJfvS3IVgxkkqgMvuIqz8ZDbwWhepuMxsiI0QR3ypkipGr/eKK5DJ7eK0OVlo6FPFA==} + dependencies: + '@unocss/core': 0.57.1 + '@unocss/rule-utils': 0.57.1 css-tree: 2.3.1 dev: true - /@unocss/transformer-variant-group@0.55.0: - resolution: {integrity: sha512-0VSvQpEmN8/Y+CfVMhL1+u1+FjmDFtviqKz8aaLFBapC/hnxbkAQTZRVv7mFNvBhBVUHXZOz7LASR4q9RtIeVA==} + /@unocss/transformer-variant-group@0.57.1: + resolution: {integrity: sha512-qwydzn2Lqz/8zW6UUXdORaUl8humsG8ll74LN/z8cjEsqtXZkVdkV0l6Brpp9Xp/XPbKwO+II+KH3/1LGwXSzQ==} dependencies: - '@unocss/core': 0.55.0 + '@unocss/core': 0.57.1 dev: true - /@unocss/vite@0.55.0(rollup@2.79.1)(vite@4.4.9): - resolution: {integrity: sha512-qUOqJzSnztCQFXOCNOCqpwwziVMmygXmdbuaqNAmkAg2EzoMSacQKzmLIj49UU0l+iykf2mDh8DmQxpnEU2JSQ==} + /@unocss/vite@0.57.1(rollup@2.79.1)(vite@4.4.9): + resolution: {integrity: sha512-kEBDvGgQNkX2n87S6Ao5seyFb1kuWZ5p96dGOS7VFpD7HvR5xholkJXaVhUK9/exCldjLExbo5UtVlbxFLUFYg==} peerDependencies: vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 dependencies: '@ampproject/remapping': 2.2.1 - '@rollup/pluginutils': 5.0.2(rollup@2.79.1) - '@unocss/config': 0.55.0 - '@unocss/core': 0.55.0 - '@unocss/inspector': 0.55.0 - '@unocss/scope': 0.55.0 - '@unocss/transformer-directives': 0.55.0 + '@rollup/pluginutils': 5.0.5(rollup@2.79.1) + '@unocss/config': 0.57.1 + '@unocss/core': 0.57.1 + '@unocss/inspector': 0.57.1 + '@unocss/scope': 0.57.1 + '@unocss/transformer-directives': 0.57.1 chokidar: 3.5.3 fast-glob: 3.3.1 - magic-string: 0.30.2 + magic-string: 0.30.5 vite: 4.4.9(@types/node@18.15.11)(less@4.1.3) transitivePeerDependencies: - rollup @@ -3977,8 +4021,8 @@ packages: - vue dev: false - /@vueuse/shared@10.5.0(vue@3.3.4): - resolution: {integrity: sha512-18iyxbbHYLst9MqU1X1QNdMHIjks6wC7XTVf0KNOv5es/Ms6gjVFCAAWTVP2JStuGqydg3DT+ExpFORUEi9yhg==} + /@vueuse/shared@10.6.1(vue@3.3.4): + resolution: {integrity: sha512-TECVDTIedFlL0NUfHWncf3zF9Gc4VfdxfQc8JFwoVZQmxpONhLxFrlm0eHQeidHj4rdTPL3KXJa0TZCk1wnc5Q==} dependencies: vue-demi: 0.14.6(vue@3.3.4) transitivePeerDependencies: @@ -4020,11 +4064,11 @@ packages: resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} engines: {node: '>=0.4.0'} hasBin: true - dev: true /acorn@8.9.0: resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} engines: {node: '>=0.4.0'} + dev: true /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} @@ -4206,7 +4250,6 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true /bcryptjs@2.4.3: resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==} @@ -4932,6 +4975,10 @@ packages: domelementtype: 2.3.0 dev: true + /dompurify@3.0.6: + resolution: {integrity: sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==} + dev: false + /domutils@3.1.0: resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} dependencies: @@ -5758,10 +5805,6 @@ packages: requiresBuild: true optional: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} dev: true @@ -5989,7 +6032,7 @@ packages: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: - function-bind: 1.1.1 + function-bind: 1.1.2 dev: true /hasown@2.0.0: @@ -6143,7 +6186,6 @@ packages: /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true /ignore-walk@4.0.1: resolution: {integrity: sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==} @@ -6306,6 +6348,7 @@ packages: /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} + hasBin: true dev: true /is-extendable@0.1.1: @@ -6506,8 +6549,9 @@ packages: supports-color: 7.2.0 dev: true - /jiti@1.19.1: - resolution: {integrity: sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==} + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true dev: true /js-beautify@1.14.6: @@ -6827,6 +6871,13 @@ packages: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -6845,8 +6896,9 @@ packages: resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} dev: true - /markdown-it@13.0.1: - resolution: {integrity: sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==} + /markdown-it@13.0.2: + resolution: {integrity: sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==} + hasBin: true dependencies: argparse: 2.0.1 entities: 3.0.1 @@ -6854,6 +6906,12 @@ packages: mdurl: 1.0.1 uc.micro: 1.0.6 + /marked@10.0.0: + resolution: {integrity: sha512-YiGcYcWj50YrwBgNzFoYhQ1hT6GmQbFG8SksnYJX1z4BXTHSOrz1GB5/Jm2yQvMg4nN1FHP4M6r03R10KrVUiA==} + engines: {node: '>= 18'} + hasBin: true + dev: false + /mathjs@11.9.1: resolution: {integrity: sha512-VdB9ELZ6Dwda13j5d1eCBETmPO8m9qIJETUdfZmTA9cPnXUiIk7UuoAmvxFqtfAe32XYuRugAec2Ndv0/RfRhg==} engines: {node: '>= 14'} @@ -6971,11 +7029,19 @@ packages: /mlly@1.4.0: resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} dependencies: - acorn: 8.10.0 + acorn: 8.11.2 pathe: 1.1.1 pkg-types: 1.0.3 ufo: 1.1.2 + /mlly@1.4.2: + resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} + dependencies: + acorn: 8.11.2 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.3.1 + /monaco-editor@0.43.0: resolution: {integrity: sha512-cnoqwQi/9fml2Szamv1XbSJieGJ1Dc8tENVMD26Kcfl7xGQWp7OBKMjlwKVGYFJ3/AXJjSOGvcqK7Ry/j9BM1Q==} dev: false @@ -7079,8 +7145,8 @@ packages: engines: {node: '>=10.5.0'} dev: true - /node-fetch-native@1.2.0: - resolution: {integrity: sha512-5IAMBTl9p6PaAjYCnMv5FmqIF6GcZnawAVnzaCG0rX2aYZJ4CxEkZNtVPuTRug7fL7wyM5BQYTlAzcyMPi6oTQ==} + /node-fetch-native@1.4.1: + resolution: {integrity: sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==} dev: true /node-fetch@2.6.9: @@ -7127,7 +7193,7 @@ packages: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.4 + resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 dev: true @@ -7186,12 +7252,12 @@ packages: isobject: 3.0.1 dev: false - /ofetch@1.1.1: - resolution: {integrity: sha512-SSMoktrp9SNLi20BWfB/BnnKcL0RDigXThD/mZBeQxkIRv1xrd9183MtLdsqRYLYSqW0eTr5t8w8MqjNhvoOQQ==} + /ofetch@1.3.3: + resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} dependencies: destr: 2.0.1 - node-fetch-native: 1.2.0 - ufo: 1.1.2 + node-fetch-native: 1.4.1 + ufo: 1.3.1 dev: true /once@1.4.0: @@ -7425,6 +7491,14 @@ packages: through: 2.3.8 dev: true + /pdf-signature-reader@1.4.2: + resolution: {integrity: sha512-qQbmFv6nv4SQt2gmaalaREhHu3x2XyLG2+zL4Gl4D2TL2Zfii1EKxlFhJDsduP8s06t26snDoSwEAQtJOtprmQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + node-forge: 1.3.1 + dev: false + /perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} dev: true @@ -7465,7 +7539,7 @@ packages: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: jsonc-parser: 3.2.0 - mlly: 1.4.0 + mlly: 1.4.2 pathe: 1.1.1 /plausible-tracker@0.3.8: @@ -7619,7 +7693,7 @@ packages: /prosemirror-markdown@1.11.0: resolution: {integrity: sha512-yP9mZqPRstjZhhf3yykCQNE3AijxARrHe4e7esV9A+gp4cnGOH4QvrKYPpXLHspNWyvJJ+0URH+iIvV5qP1I2Q==} dependencies: - markdown-it: 13.0.1 + markdown-it: 13.0.2 prosemirror-model: 1.19.2 dev: false @@ -7909,7 +7983,7 @@ packages: /resolve@1.22.2: resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} dependencies: - is-core-module: 2.13.0 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -7918,7 +7992,7 @@ packages: resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} hasBin: true dependencies: - is-core-module: 2.13.0 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -8383,7 +8457,7 @@ packages: /strip-literal@1.0.1: resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} dependencies: - acorn: 8.10.0 + acorn: 8.11.2 /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} @@ -8688,6 +8762,9 @@ packages: /ufo@1.1.2: resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} + /ufo@1.3.1: + resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} + /ulid@2.3.0: resolution: {integrity: sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==} hasBin: true @@ -8702,13 +8779,13 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /unconfig@0.3.10: - resolution: {integrity: sha512-tj317lhIq2iZF/NXrJnU1t2UaGUKKz1eL1sK2t63Oq66V9BxqvZV12m55fp/fpQJ+DDmVlLgo7cnLVOZkhlO/A==} + /unconfig@0.3.11: + resolution: {integrity: sha512-bV/nqePAKv71v3HdVUn6UefbsDKQWRX+bJIkiSm0+twIds6WiD2bJLWWT3i214+J/B4edufZpG2w7Y63Vbwxow==} dependencies: - '@antfu/utils': 0.7.5 + '@antfu/utils': 0.7.6 defu: 6.1.2 - jiti: 1.19.1 - mlly: 1.4.0 + jiti: 1.21.0 + mlly: 1.4.2 dev: true /underscore@1.13.6: @@ -8761,7 +8838,7 @@ packages: escape-string-regexp: 5.0.0 fast-glob: 3.3.1 local-pkg: 0.4.3 - magic-string: 0.30.0 + magic-string: 0.30.2 mlly: 1.4.0 pathe: 1.1.1 pkg-types: 1.0.3 @@ -8795,20 +8872,20 @@ packages: engines: {node: '>= 10.0.0'} dev: true - /unocss-preset-scrollbar@0.2.1(unocss@0.55.0): + /unocss-preset-scrollbar@0.2.1(unocss@0.57.1): resolution: {integrity: sha512-7ubHdOaUwr7xBn1glPpICNNsM2SZGjvWK5uRPNiQYsrZ9YFjsCGHk9x5S2R8pTkuMDQeiaSa/UQbYhjC8Fra5g==} peerDependencies: unocss: '>= 0.31.13 < 1' dependencies: '@unocss/preset-mini': 0.31.17 - unocss: 0.55.0(postcss@8.4.31)(rollup@2.79.1)(vite@4.4.9) + unocss: 0.57.1(postcss@8.4.31)(rollup@2.79.1)(vite@4.4.9) dev: true - /unocss@0.55.0(postcss@8.4.31)(rollup@2.79.1)(vite@4.4.9): - resolution: {integrity: sha512-mjtN/2Dr495swOA/u/UaA0keCtv8/vFc114pd0D4XzpbK2/nKNB9Got/lmhJp8fxblV+oNtLkD0PaHtpAvSpsw==} + /unocss@0.57.1(postcss@8.4.31)(rollup@2.79.1)(vite@4.4.9): + resolution: {integrity: sha512-xLsyJ8+T1/Ux93yrqOvuQy268wF5rSzydlsbqZ5EVfi01PxYyydez3nycPqbyPZientkJ0Yohzd5aBqmZgku3A==} engines: {node: '>=14'} peerDependencies: - '@unocss/webpack': 0.55.0 + '@unocss/webpack': 0.57.1 vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 peerDependenciesMeta: '@unocss/webpack': @@ -8816,26 +8893,26 @@ packages: vite: optional: true dependencies: - '@unocss/astro': 0.55.0(rollup@2.79.1)(vite@4.4.9) - '@unocss/cli': 0.55.0(rollup@2.79.1) - '@unocss/core': 0.55.0 - '@unocss/extractor-arbitrary-variants': 0.55.0 - '@unocss/postcss': 0.55.0(postcss@8.4.31) - '@unocss/preset-attributify': 0.55.0 - '@unocss/preset-icons': 0.55.0 - '@unocss/preset-mini': 0.55.0 - '@unocss/preset-tagify': 0.55.0 - '@unocss/preset-typography': 0.55.0 - '@unocss/preset-uno': 0.55.0 - '@unocss/preset-web-fonts': 0.55.0 - '@unocss/preset-wind': 0.55.0 - '@unocss/reset': 0.55.0 - '@unocss/transformer-attributify-jsx': 0.55.0 - '@unocss/transformer-attributify-jsx-babel': 0.55.0 - '@unocss/transformer-compile-class': 0.55.0 - '@unocss/transformer-directives': 0.55.0 - '@unocss/transformer-variant-group': 0.55.0 - '@unocss/vite': 0.55.0(rollup@2.79.1)(vite@4.4.9) + '@unocss/astro': 0.57.1(rollup@2.79.1)(vite@4.4.9) + '@unocss/cli': 0.57.1(rollup@2.79.1) + '@unocss/core': 0.57.1 + '@unocss/extractor-arbitrary-variants': 0.57.1 + '@unocss/postcss': 0.57.1(postcss@8.4.31) + '@unocss/preset-attributify': 0.57.1 + '@unocss/preset-icons': 0.57.1 + '@unocss/preset-mini': 0.57.1 + '@unocss/preset-tagify': 0.57.1 + '@unocss/preset-typography': 0.57.1 + '@unocss/preset-uno': 0.57.1 + '@unocss/preset-web-fonts': 0.57.1 + '@unocss/preset-wind': 0.57.1 + '@unocss/reset': 0.57.1 + '@unocss/transformer-attributify-jsx': 0.57.1 + '@unocss/transformer-attributify-jsx-babel': 0.57.1 + '@unocss/transformer-compile-class': 0.57.1 + '@unocss/transformer-directives': 0.57.1 + '@unocss/transformer-variant-group': 0.57.1 + '@unocss/vite': 0.57.1(rollup@2.79.1)(vite@4.4.9) vite: 4.4.9(@types/node@18.15.11)(less@4.1.3) transitivePeerDependencies: - postcss @@ -8931,7 +9008,7 @@ packages: /unplugin@1.3.1: resolution: {integrity: sha512-h4uUTIvFBQRxUKS2Wjys6ivoeofGhxzTe2sRWlooyjHXVttcVfV/JiavNd3d4+jty0SVV0dxGw9AkY9MwiaCEw==} dependencies: - acorn: 8.9.0 + acorn: 8.11.2 chokidar: 3.5.3 webpack-sources: 3.2.3 webpack-virtual-modules: 0.5.0 @@ -9079,7 +9156,7 @@ packages: '@mdit-vue/types': 0.12.0 '@rollup/pluginutils': 5.0.2(rollup@2.79.1) '@types/markdown-it': 12.2.3 - markdown-it: 13.0.1 + markdown-it: 13.0.2 vite: 4.4.9(@types/node@18.15.11)(less@4.1.3) transitivePeerDependencies: - rollup diff --git a/src/composable/downloadBase64.test.ts b/src/composable/downloadBase64.test.ts new file mode 100644 index 00000000..3f2e3f7e --- /dev/null +++ b/src/composable/downloadBase64.test.ts @@ -0,0 +1,32 @@ +import { describe, expect, it } from 'vitest'; +import { getMimeTypeFromBase64 } from './downloadBase64'; + +describe('downloadBase64', () => { + describe('getMimeTypeFromBase64', () => { + it('when the base64 string has a data URI, it returns the mime type', () => { + expect(getMimeTypeFromBase64({ base64String: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA' })).to.deep.equal({ mimeType: 'image/png' }); + expect(getMimeTypeFromBase64({ base64String: 'data:image/jpg;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA' })).to.deep.equal({ mimeType: 'image/jpg' }); + }); + + it('when the base64 string has no data URI, it try to infer the mime type from the signature', () => { + // https://en.wikipedia.org/wiki/List_of_file_signatures + + // PNG + expect(getMimeTypeFromBase64({ base64String: 'iVBORw0KGgoAAAANSUhEUgAAAAUA' })).to.deep.equal({ mimeType: 'image/png' }); + + // GIF + expect(getMimeTypeFromBase64({ base64String: 'R0lGODdh' })).to.deep.equal({ mimeType: 'image/gif' }); + expect(getMimeTypeFromBase64({ base64String: 'R0lGODlh' })).to.deep.equal({ mimeType: 'image/gif' }); + + // JPG + expect(getMimeTypeFromBase64({ base64String: '/9j/' })).to.deep.equal({ mimeType: 'image/jpg' }); + + // PDF + expect(getMimeTypeFromBase64({ base64String: 'JVBERi0' })).to.deep.equal({ mimeType: 'application/pdf' }); + }); + + it('when the base64 string has no data URI and no signature, it returns an undefined mimeType', () => { + expect(getMimeTypeFromBase64({ base64String: 'JVBERi' })).to.deep.equal({ mimeType: undefined }); + }); + }); +}); diff --git a/src/composable/downloadBase64.ts b/src/composable/downloadBase64.ts index 3904315a..37b0428d 100644 --- a/src/composable/downloadBase64.ts +++ b/src/composable/downloadBase64.ts @@ -1,32 +1,60 @@ import { extension as getExtensionFromMime } from 'mime-types'; import type { Ref } from 'vue'; +import _ from 'lodash'; -function getFileExtensionFromBase64({ - base64String, +export { getMimeTypeFromBase64, useDownloadFileFromBase64 }; + +const commonMimeTypesSignatures = { + 'JVBERi0': 'application/pdf', + 'R0lGODdh': 'image/gif', + 'R0lGODlh': 'image/gif', + 'iVBORw0KGgo': 'image/png', + '/9j/': 'image/jpg', +}; + +function getMimeTypeFromBase64({ base64String }: { base64String: string }) { + const [,mimeTypeFromBase64] = base64String.match(/data:(.*?);base64/i) ?? []; + + if (mimeTypeFromBase64) { + return { mimeType: mimeTypeFromBase64 }; + } + + const inferredMimeType = _.find(commonMimeTypesSignatures, (_mimeType, signature) => base64String.startsWith(signature)); + + if (inferredMimeType) { + return { mimeType: inferredMimeType }; + } + + return { mimeType: undefined }; +} + +function getFileExtensionFromMimeType({ + mimeType, defaultExtension = 'txt', }: { - base64String: string + mimeType: string | undefined defaultExtension?: string }) { - const hasMimeType = base64String.match(/data:(.*?);base64/i); - - if (hasMimeType) { - return getExtensionFromMime(hasMimeType[1]) || defaultExtension; + if (mimeType) { + return getExtensionFromMime(mimeType) ?? defaultExtension; } return defaultExtension; } -export function useDownloadFileFromBase64({ source, filename }: { source: Ref; filename?: string }) { +function useDownloadFileFromBase64({ source, filename }: { source: Ref; filename?: string }) { return { download() { - const base64String = source.value; - - if (base64String === '') { + if (source.value === '') { throw new Error('Base64 string is empty'); } - const cleanFileName = filename ?? `file.${getFileExtensionFromBase64({ base64String })}`; + const { mimeType } = getMimeTypeFromBase64({ base64String: source.value }); + const base64String = mimeType + ? source.value + : `data:text/plain;base64,${source.value}`; + + const cleanFileName = filename ?? `file.${getFileExtensionFromMimeType({ mimeType })}`; const a = document.createElement('a'); a.href = base64String; diff --git a/src/pages/About.vue b/src/pages/About.vue index 9d7436d3..556f0f9e 100644 --- a/src/pages/About.vue +++ b/src/pages/About.vue @@ -1,63 +1,9 @@ diff --git a/src/shims.d.ts b/src/shims.d.ts index 147c01ee..ef2e2f39 100644 --- a/src/shims.d.ts +++ b/src/shims.d.ts @@ -32,4 +32,10 @@ declare module 'unicode-emoji-json' { }>; export default emoji; +} + +declare module 'pdf-signature-reader' { + const verifySignature: (pdf: ArrayBuffer) => ({signatures: SignatureInfo[]}); + + export default verifySignature; } \ No newline at end of file diff --git a/src/tools/base64-file-converter/base64-file-converter.vue b/src/tools/base64-file-converter/base64-file-converter.vue index e607c018..377625bd 100644 --- a/src/tools/base64-file-converter/base64-file-converter.vue +++ b/src/tools/base64-file-converter/base64-file-converter.vue @@ -1,7 +1,5 @@ + + diff --git a/src/tools/pdf-signature-checker/index.ts b/src/tools/pdf-signature-checker/index.ts new file mode 100644 index 00000000..54563979 --- /dev/null +++ b/src/tools/pdf-signature-checker/index.ts @@ -0,0 +1,12 @@ +import { defineTool } from '../tool'; +import FileCertIcon from '~icons/mdi/file-certificate-outline'; + +export const tool = defineTool({ + name: 'PDF signature checker', + path: '/pdf-signature-checker', + description: 'Verify the signatures of a PDF file. A signed PDF file contains one or more signatures that may be used to determine whether the contents of the file have been altered since the file was signed.', + keywords: ['pdf', 'signature', 'checker', 'verify', 'validate', 'sign'], + component: () => import('./pdf-signature-checker.vue'), + icon: FileCertIcon, + createdAt: new Date('2023-12-09'), +}); diff --git a/src/tools/pdf-signature-checker/pdf-signature-checker.e2e.spec.ts b/src/tools/pdf-signature-checker/pdf-signature-checker.e2e.spec.ts new file mode 100644 index 00000000..8e9a2870 --- /dev/null +++ b/src/tools/pdf-signature-checker/pdf-signature-checker.e2e.spec.ts @@ -0,0 +1,11 @@ +import { expect, test } from '@playwright/test'; + +test.describe('Tool - Pdf signature checker', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/pdf-signature-checker'); + }); + + test('Has correct title', async ({ page }) => { + await expect(page).toHaveTitle('PDF signature checker - IT Tools'); + }); +}); diff --git a/src/tools/pdf-signature-checker/pdf-signature-checker.types.ts b/src/tools/pdf-signature-checker/pdf-signature-checker.types.ts new file mode 100644 index 00000000..6932509c --- /dev/null +++ b/src/tools/pdf-signature-checker/pdf-signature-checker.types.ts @@ -0,0 +1,39 @@ +export interface SignatureInfo { + verified: boolean + authenticity: boolean + integrity: boolean + expired: boolean + meta: { + certs: { + clientCertificate?: boolean + issuedBy: { + commonName: string + organizationalUnitName?: string + organizationName: string + countryName?: string + localityName?: string + stateOrProvinceName?: string + } + issuedTo: { + commonName: string + serialNumber?: string + organizationalUnitName?: string + organizationName: string + countryName?: string + localityName?: string + stateOrProvinceName?: string + } + validityPeriod: { + notBefore: string + notAfter: string + } + pemCertificate: string + }[] + signatureMeta: { + reason: string + contactInfo: string | null + location: string + name: string | null + } + } +} diff --git a/src/tools/pdf-signature-checker/pdf-signature-checker.vue b/src/tools/pdf-signature-checker/pdf-signature-checker.vue new file mode 100644 index 00000000..02206164 --- /dev/null +++ b/src/tools/pdf-signature-checker/pdf-signature-checker.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/tools/token-generator/index.ts b/src/tools/token-generator/index.ts index 4e849758..44923e79 100644 --- a/src/tools/token-generator/index.ts +++ b/src/tools/token-generator/index.ts @@ -6,7 +6,7 @@ export const tool = defineTool({ name: translate('tools.token-generator.title'), path: '/token-generator', description: translate('tools.token-generator.description'), - keywords: ['token', 'random', 'string', 'alphanumeric', 'symbols', 'number', 'letters', 'lowercase', 'uppercase'], + keywords: ['token', 'random', 'string', 'alphanumeric', 'symbols', 'number', 'letters', 'lowercase', 'uppercase', 'password'], component: () => import('./token-generator.tool.vue'), icon: ArrowsShuffle, }); diff --git a/src/tools/token-generator/locales/fr.yml b/src/tools/token-generator/locales/fr.yml index e5f40d4d..e9605567 100644 --- a/src/tools/token-generator/locales/fr.yml +++ b/src/tools/token-generator/locales/fr.yml @@ -1,9 +1,16 @@ tools: token-generator: title: Générateur de token - description: Génère une chaîne aléatoire avec les caractères que vous voulez, lettres majuscules ou minuscules, chiffres et/ou symboles. - + description: >- + Génère une chaîne aléatoire avec les caractères que vous voulez, lettres + majuscules ou minuscules, chiffres et/ou symboles. uppercase: Majuscules (ABC...) lowercase: Minuscules (abc...) numbers: Chiffres (123...) symbols: Symboles (!-;...) + button: + copy: Copier + refresh: Rafraichir + copied: Le token a été copié + length: Longueur + tokenPlaceholder: Le token... diff --git a/src/tools/uuid-generator/index.ts b/src/tools/uuid-generator/index.ts index ae5ae0da..9289b902 100644 --- a/src/tools/uuid-generator/index.ts +++ b/src/tools/uuid-generator/index.ts @@ -2,11 +2,11 @@ import { Fingerprint } from '@vicons/tabler'; import { defineTool } from '../tool'; export const tool = defineTool({ - name: 'UUIDs v4 generator', + name: 'UUIDs generator', path: '/uuid-generator', description: 'A Universally Unique Identifier (UUID) is a 128-bit number used to identify information in computer systems. The number of possible UUIDs is 16^32, which is 2^128 or about 3.4x10^38 (which is a lot!).', - keywords: ['uuid', 'v4', 'random', 'id', 'alphanumeric', 'identity', 'token', 'string', 'identifier', 'unique'], + keywords: ['uuid', 'v4', 'random', 'id', 'alphanumeric', 'identity', 'token', 'string', 'identifier', 'unique', 'v1', 'v3', 'v5', 'nil'], component: () => import('./uuid-generator.vue'), icon: Fingerprint, }); diff --git a/src/tools/uuid-generator/uuid-generator.vue b/src/tools/uuid-generator/uuid-generator.vue index e9f55e6b..22b32ba3 100644 --- a/src/tools/uuid-generator/uuid-generator.vue +++ b/src/tools/uuid-generator/uuid-generator.vue @@ -1,22 +1,94 @@