From 4d5dc1ba0fd55c67467c4114f623c8b9735de821 Mon Sep 17 00:00:00 2001 From: modos189 Date: Sat, 29 Jul 2023 22:04:47 +0300 Subject: [PATCH] Backup creation and restore moved to lib-iitc-manager --- package-lock.json | 31 +++------- package.json | 4 +- src/background/background.js | 27 +++++++++ src/settings/backup/Main.vue | 78 +++++++++++------------- src/settings/backup/export.js | 73 ---------------------- src/settings/backup/import.js | 111 ---------------------------------- src/settings/backup/utils.js | 59 +++++++++++++++++- 7 files changed, 129 insertions(+), 254 deletions(-) delete mode 100644 src/settings/backup/export.js delete mode 100644 src/settings/backup/import.js diff --git a/package-lock.json b/package-lock.json index 0195c23..ac75376 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,13 +9,11 @@ "version": "2.0.2", "license": "GPLv3", "dependencies": { - "@bundled-es-modules/deepmerge": "^4.3.1", "@highlightjs/vue-plugin": "^1.0.2", - "await-timeout": "^1.1.1", "core-js": "^3.6.5", "highlight.js": "^10.7.3", "jszip": "^3.10.1", - "lib-iitc-manager": "^1.6.1", + "lib-iitc-manager": "^1.7.0", "scored-fuzzysearch": "^1.0.5", "vue": "^2.6.11" }, @@ -3369,14 +3367,6 @@ "url": "https://tidelift.com/funding/github/npm/autoprefixer" } }, - "node_modules/await-timeout": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/await-timeout/-/await-timeout-1.1.1.tgz", - "integrity": "sha512-gsDXAS6XVc4Jt+7S92MPX6Noq69bdeXUPEaXd8dk3+yVr629LTDLxNt4j1ycBbrU+AStK2PhKIyNIM+xzWMVOQ==", - "engines": { - "node": ">=6" - } - }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -9326,10 +9316,11 @@ } }, "node_modules/lib-iitc-manager": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/lib-iitc-manager/-/lib-iitc-manager-1.6.1.tgz", - "integrity": "sha512-lBKC6GlYkCvu3lT7peRPHtvrCPJN91CBuwwsi/JBJBzovFS3vZpJLQKZBhEUvDxo3m5VUr1YjvOkadqjPanzRQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/lib-iitc-manager/-/lib-iitc-manager-1.7.0.tgz", + "integrity": "sha512-fWo2//XgBg8v/ItIO6JBJArRzA0PhgrFFqjE9KC0LgF24Z5V0tEBCnd4uxyaZq/uBsEVGFszKntYnlEk2wyVoQ==", "dependencies": { + "@bundled-es-modules/deepmerge": "^4.3.1", "xhr2": "^0.2.1" } }, @@ -18866,11 +18857,6 @@ "postcss-value-parser": "^4.1.0" } }, - "await-timeout": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/await-timeout/-/await-timeout-1.1.1.tgz", - "integrity": "sha512-gsDXAS6XVc4Jt+7S92MPX6Noq69bdeXUPEaXd8dk3+yVr629LTDLxNt4j1ycBbrU+AStK2PhKIyNIM+xzWMVOQ==" - }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -23526,10 +23512,11 @@ } }, "lib-iitc-manager": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/lib-iitc-manager/-/lib-iitc-manager-1.6.1.tgz", - "integrity": "sha512-lBKC6GlYkCvu3lT7peRPHtvrCPJN91CBuwwsi/JBJBzovFS3vZpJLQKZBhEUvDxo3m5VUr1YjvOkadqjPanzRQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/lib-iitc-manager/-/lib-iitc-manager-1.7.0.tgz", + "integrity": "sha512-fWo2//XgBg8v/ItIO6JBJArRzA0PhgrFFqjE9KC0LgF24Z5V0tEBCnd4uxyaZq/uBsEVGFszKntYnlEk2wyVoQ==", "requires": { + "@bundled-es-modules/deepmerge": "^4.3.1", "xhr2": "^0.2.1" } }, diff --git a/package.json b/package.json index b50ed32..13d5867 100644 --- a/package.json +++ b/package.json @@ -10,13 +10,11 @@ "lint": "vue-cli-service lint" }, "dependencies": { - "@bundled-es-modules/deepmerge": "^4.3.1", "@highlightjs/vue-plugin": "^1.0.2", - "await-timeout": "^1.1.1", "core-js": "^3.6.5", "highlight.js": "^10.7.3", "jszip": "^3.10.1", - "lib-iitc-manager": "^1.6.1", + "lib-iitc-manager": "^1.7.0", "scored-fuzzysearch": "^1.0.5", "vue": "^2.6.11" }, diff --git a/src/background/background.js b/src/background/background.js index 3603ee2..9d03070 100644 --- a/src/background/background.js +++ b/src/background/background.js @@ -101,6 +101,33 @@ browser.runtime.onMessage.addListener(async function(request) { // If tab is closed, message goes nowhere and an error occurs. Ignore. } break; + case "getBackupData": + try { + browser.runtime + .sendMessage({ + type: "resolveGetBackupData", + data: await manager.getBackupData(request.params) + }) + .then(); + } catch { + // If tab is closed, message goes nowhere and an error occurs. Ignore. + } + break; + case "setBackupData": + try { + browser.runtime + .sendMessage({ + type: "resolveSetBackupData", + data: await manager.setBackupData( + request.params, + request.backup_data + ) + }) + .then(); + } catch { + // If tab is closed, message goes nowhere and an error occurs. Ignore. + } + break; case "setCustomChannelUrl": await manager.setCustomChannelUrl(request.value); break; diff --git a/src/settings/backup/Main.vue b/src/settings/backup/Main.vue index 3977def..49c9daa 100644 --- a/src/settings/backup/Main.vue +++ b/src/settings/backup/Main.vue @@ -57,18 +57,7 @@ diff --git a/src/settings/backup/export.js b/src/settings/backup/export.js deleted file mode 100644 index e480b20..0000000 --- a/src/settings/backup/export.js +++ /dev/null @@ -1,73 +0,0 @@ -//@license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3 -import JSZip from "jszip"; -import { backup_json_name, formatDate, saveAs } from "@/settings/backup/utils"; - -export const createBackupZip = async backup => { - const zip = new JSZip(); - - zip.file(backup_json_name, JSON.stringify(backup.data)); - - for (const channel in backup.external_plugins) { - for (const external_plugin_name in backup.external_plugins[channel]) { - zip.file( - `${channel}/${external_plugin_name}`, - backup.external_plugins[channel][external_plugin_name] - ); - } - } - - const filename = "iitc-backup_" + formatDate(new Date()) + ".zip"; - zip.generateAsync({ type: "blob" }).then(function(content) { - saveAs(content, filename); - }); -}; - -export const filterStorageIitcSettings = all_storage => { - const iitc_settings = {}; - const storage_keys = [ - "channel", - "network_host", - "release_update_check_interval", - "beta_update_check_interval", - "custom_update_check_interval" - ]; - - for (const key in all_storage) { - if (storage_keys.includes(key)) { - iitc_settings[key] = all_storage[key]; - } - } - return iitc_settings; -}; - -export const filterStoragePluginsSettings = all_storage => { - const plugins_storage = {}; - for (const key in all_storage) { - if (key.startsWith("VMin")) { - plugins_storage[key] = all_storage[key]; - } - } - return plugins_storage; -}; - -export const filterExternalPlugins = all_storage => { - const external_plugins = {}; - const storage_keys = [ - "release_plugins_user", - "beta_plugins_user", - "custom_plugins_user" - ]; - - for (const key in all_storage) { - if (storage_keys.includes(key)) { - const channel = key.split("_")[0]; - external_plugins[channel] = {}; - for (const plugin_uid in all_storage[key]) { - const plugin_filename = all_storage[key][plugin_uid]["filename"]; - external_plugins[channel][plugin_filename] = - all_storage[key][plugin_uid]["code"]; - } - } - } - return external_plugins; -}; diff --git a/src/settings/backup/import.js b/src/settings/backup/import.js deleted file mode 100644 index 5adff56..0000000 --- a/src/settings/backup/import.js +++ /dev/null @@ -1,111 +0,0 @@ -//@license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3 -import JSZip from "jszip"; -import Timeout from "await-timeout"; -import deepmerge from "@bundled-es-modules/deepmerge"; -import { backup_json_name } from "@/settings/backup/utils"; -import { parseMeta } from "lib-iitc-manager"; - -export const getBackupDataFromZip = async file => { - const backup = { - external_plugins: {}, - data: {} - }; - const zip = await JSZip.loadAsync(file); - - for (const zipName in zip.files) { - const zipEntry = zip.files[zipName]; - if (!zipEntry.dir) { - const filename = zipEntry.name; - const filename_split = filename.split("/"); - - if (filename === backup_json_name) { - // import iitc-button.json - backup.data = JSON.parse(await zip.file(filename).async("string")); - } else if ( - filename_split.length > 1 && - ["release", "beta", "custom"].includes(filename_split[0]) - ) { - // import external plugins - const channel = filename_split[0]; - const plugin_filename = filename_split[1]; - if (!Object.hasOwn(backup.external_plugins, channel)) { - backup.external_plugins[channel] = {}; - } - backup.external_plugins[channel][plugin_filename] = await zip - .file(filename) - .async("string"); - } - } - } - return backup; -}; - -export const importBackupIitcSettings = async backup => { - const backup_obj = Object.assign({}, backup); - const default_channel = await browser.storage.local - .get(["channel"]) - .then(data => data.channel); - - await browser.storage.local.set(backup_obj); - - const set_channel = backup_obj.channel; - if (set_channel !== default_channel) { - await browser.runtime.sendMessage({ - type: "setChannel", - value: set_channel - }); - } - await Timeout.set(1000); -}; - -export const importBackupPluginsSettings = async backup => { - const all_storage = await browser.storage.local.get(null); - - const vMinRecords = {}; - Object.keys(all_storage).forEach(key => { - if (key.startsWith("VMin")) { - vMinRecords[key] = all_storage[key]; - } - }); - - const new_storage = deepmerge(vMinRecords, backup); - await browser.storage.local.set(new_storage); -}; - -export const importBackupExternalPlugins = async backup => { - const scripts = []; - const default_channel = await browser.storage.local - .get(["channel"]) - .then(data => data.channel); - let current_channel = null; - - for (const channel of Object.keys(backup)) { - await browser.runtime.sendMessage({ - type: "setChannel", - value: channel - }); - current_channel = channel; - - await Timeout.set(1000); - - for (const [filename, code] of Object.entries(backup[channel])) { - const meta = parseMeta(code); - meta["filename"] = filename; - scripts.push({ meta: meta, code: code }); - } - - await browser.runtime.sendMessage({ - type: "addUserScripts", - scripts: scripts - }); - - await Timeout.set(100); - } - - if (current_channel !== default_channel) { - await browser.runtime.sendMessage({ - type: "setChannel", - value: default_channel - }); - } -}; diff --git a/src/settings/backup/utils.js b/src/settings/backup/utils.js index 288b217..4134e67 100644 --- a/src/settings/backup/utils.js +++ b/src/settings/backup/utils.js @@ -1,5 +1,7 @@ //@license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3 -export const backup_json_name = "iitc-button.json"; +import JSZip from "jszip"; + +export const backup_json_name = "iitc.json"; export function formatDate(date) { const year = date.getFullYear(); @@ -33,3 +35,58 @@ export const saveAs = (blob, fileName) => { // in case the Blob uses a lot of memory setTimeout(() => URL.revokeObjectURL(link.href), 7000); }; + +export const getBackupDataFromZip = async file => { + const backup = { + external_plugins: {}, + data: {} + }; + const zip = await JSZip.loadAsync(file); + + for (const zipName in zip.files) { + const zipEntry = zip.files[zipName]; + if (!zipEntry.dir) { + const filename = zipEntry.name; + const filename_split = filename.split("/"); + + if (filename === backup_json_name) { + // import iitc.json + backup.data = JSON.parse(await zip.file(filename).async("string")); + } else if ( + filename_split.length > 1 && + ["release", "beta", "custom"].includes(filename_split[0]) + ) { + // import external plugins + const channel = filename_split[0]; + const plugin_filename = filename_split[1]; + if (!Object.hasOwn(backup.external_plugins, channel)) { + backup.external_plugins[channel] = {}; + } + backup.external_plugins[channel][plugin_filename] = await zip + .file(filename) + .async("string"); + } + } + } + return backup; +}; + +export const createBackupZip = async backup => { + const zip = new JSZip(); + + zip.file(backup_json_name, JSON.stringify(backup.data)); + + for (const channel in backup.external_plugins) { + for (const external_plugin_name in backup.external_plugins[channel]) { + zip.file( + `${channel}/${external_plugin_name}`, + backup.external_plugins[channel][external_plugin_name] + ); + } + } + + const filename = "iitc-backup_" + formatDate(new Date()) + ".zip"; + zip.generateAsync({ type: "blob" }).then(function(content) { + saveAs(content, filename); + }); +};