From e6953d1b67b81a6d3c19973b706f29637c421f98 Mon Sep 17 00:00:00 2001 From: Corentin Thomasset Date: Mon, 25 Jul 2022 23:21:42 +0200 Subject: [PATCH] refactor(base64): split base64 text and file conversion in two tools + base64 to file --- package-lock.json | 20 ++++-- package.json | 2 + src/composable/downloadBase64.ts | 10 ++- .../base64-file-converter.vue} | 19 +++--- .../index.ts | 4 +- .../base64-string-converter.vue | 65 +++++++++++++++++++ src/tools/base64-string-converter/index.ts | 12 ++++ src/tools/index.ts | 6 +- 8 files changed, 117 insertions(+), 21 deletions(-) rename src/tools/{base64-converter/base64-converter.vue => base64-file-converter/base64-file-converter.vue} (73%) rename src/tools/{base64-converter => base64-file-converter}/index.ts (82%) create mode 100644 src/tools/base64-string-converter/base64-string-converter.vue create mode 100644 src/tools/base64-string-converter/index.ts diff --git a/package-lock.json b/package-lock.json index 0017706b..cbfa6e9e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "highlight.js": "^11.5.1", "lodash": "^4.17.21", "mathjs": "^10.6.0", + "mime-types": "^2.1.35", "naive-ui": "^2.31.0", "pinia": "^2.0.11", "plausible-tracker": "^0.3.5", @@ -40,6 +41,7 @@ "@types/bcryptjs": "^2.4.2", "@types/crypto-js": "^4.1.1", "@types/jsdom": "^16.2.14", + "@types/mime-types": "^2.1.1", "@types/node": "^16.11.25", "@types/qrcode": "^1.4.2", "@types/randombytes": "^2.0.0", @@ -2248,6 +2250,12 @@ "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", "dev": true }, + "node_modules/@types/mime-types": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.1.tgz", + "integrity": "sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw==", + "dev": true + }, "node_modules/@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", @@ -7703,7 +7711,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -7712,7 +7719,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -12847,6 +12853,12 @@ "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", "dev": true }, + "@types/mime-types": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.1.tgz", + "integrity": "sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw==", + "dev": true + }, "@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", @@ -16899,14 +16911,12 @@ "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "requires": { "mime-db": "1.52.0" } diff --git a/package.json b/package.json index 17b49d6b..a8d64bfd 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "highlight.js": "^11.5.1", "lodash": "^4.17.21", "mathjs": "^10.6.0", + "mime-types": "^2.1.35", "naive-ui": "^2.31.0", "pinia": "^2.0.11", "plausible-tracker": "^0.3.5", @@ -62,6 +63,7 @@ "@types/bcryptjs": "^2.4.2", "@types/crypto-js": "^4.1.1", "@types/jsdom": "^16.2.14", + "@types/mime-types": "^2.1.1", "@types/node": "^16.11.25", "@types/qrcode": "^1.4.2", "@types/randombytes": "^2.0.0", diff --git a/src/composable/downloadBase64.ts b/src/composable/downloadBase64.ts index e5b621fe..d2ea576b 100644 --- a/src/composable/downloadBase64.ts +++ b/src/composable/downloadBase64.ts @@ -1,11 +1,17 @@ +import { extension as getExtensionFromMime } from 'mime-types'; import type { Ref } from 'vue'; -export function useDownloadFileFromBase64({ source, filename = 'file' }: { source: Ref; filename?: string }) { +export function useDownloadFileFromBase64({ source, filename }: { source: Ref; filename?: string }) { return { download() { + const base64 = source.value; + const mimeType = base64.match(/data:(.*?);base64/i)?.[1] ?? 'text/plain'; + console.log({ mimeType }); + const cleanFileName = filename ?? `file.${getExtensionFromMime(mimeType)}`; + const a = document.createElement('a'); a.href = source.value; - a.download = filename; + a.download = cleanFileName; a.click(); }, }; diff --git a/src/tools/base64-converter/base64-converter.vue b/src/tools/base64-file-converter/base64-file-converter.vue similarity index 73% rename from src/tools/base64-converter/base64-converter.vue rename to src/tools/base64-file-converter/base64-file-converter.vue index 307ea2fc..88371a0e 100644 --- a/src/tools/base64-converter/base64-converter.vue +++ b/src/tools/base64-file-converter/base64-file-converter.vue @@ -1,9 +1,8 @@