From 76964ff1a513516fd8dc28b0da3b34b69f530240 Mon Sep 17 00:00:00 2001 From: PiEgg Date: Sun, 25 Jul 2021 23:25:36 +0800 Subject: [PATCH] :construction: WIP: gallery db in progress --- package.json | 2 + src/main.ts | 5 +- src/main/apis/app/shortKey/shortKeyHandler.ts | 2 +- src/main/apis/app/system/index.ts | 2 +- src/main/apis/app/uploader/apis.ts | 2 +- src/main/apis/app/uploader/index.ts | 2 +- src/main/apis/app/window/windowList.ts | 2 +- .../apis/core}/datastore/dbChecker.ts | 44 ++++- .../apis/core}/datastore/index.ts | 33 ++-- src/main/apis/core/picgo/index.ts | 9 +- src/main/apis/gui/index.ts | 2 +- src/main/events/ipcList.ts | 2 +- src/main/events/picgoCoreIPC.ts | 15 +- src/main/lifeCycle/errorHandler.ts | 2 +- src/main/lifeCycle/index.ts | 2 +- src/main/migrate/index.ts | 2 +- src/main/utils/common.ts | 2 +- src/main/utils/privacyManager.ts | 2 +- src/main/utils/updateChecker.ts | 2 +- src/renderer/components/ChoosePicBed.vue | 42 +++-- src/renderer/components/ConfigForm.vue | 6 +- src/renderer/layouts/Main.vue | 70 +------- src/renderer/pages/Gallery.vue | 73 +++++---- src/renderer/pages/MiniPage.vue | 7 +- src/renderer/pages/PicGoSetting.vue | 125 ++++++++------ src/renderer/pages/Plugin.vue | 44 ++--- src/renderer/pages/ShortKey.vue | 19 +-- src/renderer/pages/TrayPage.vue | 31 ++-- src/renderer/pages/Upload.vue | 25 +-- src/renderer/pages/picbeds/AliYun.vue | 6 +- src/renderer/pages/picbeds/GitHub.vue | 6 +- src/renderer/pages/picbeds/Imgur.vue | 6 +- src/renderer/pages/picbeds/Others.vue | 4 +- src/renderer/pages/picbeds/Qiniu.vue | 8 +- src/renderer/pages/picbeds/SMMS.vue | 8 +- src/renderer/pages/picbeds/TcYun.vue | 8 +- src/renderer/pages/picbeds/UpYun.vue | 6 +- src/renderer/pages/picbeds/Weibo.vue | 153 ------------------ src/renderer/router/index.ts | 5 - src/renderer/utils/ConfirmButtonMixin.ts | 11 +- src/renderer/utils/db.ts | 53 ++++++ src/renderer/utils/mainMixin.ts | 27 +++- src/universal/events/constants.ts | 8 + src/universal/types/extra-vue.d.ts | 17 +- src/universal/types/types.d.ts | 8 + src/universal/utils/pasteTemplate.ts | 2 +- vue.config.js | 2 - yarn.lock | 85 ++++++++++ 48 files changed, 530 insertions(+), 469 deletions(-) rename src/{universal => main/apis/core}/datastore/dbChecker.ts (57%) rename src/{universal => main/apis/core}/datastore/index.ts (73%) delete mode 100644 src/renderer/pages/picbeds/Weibo.vue create mode 100644 src/renderer/utils/db.ts diff --git a/package.json b/package.json index a74f0c5..d1d5ef6 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ ] }, "dependencies": { + "@picgo/store": "^1.0.0-alpha.3", "axios": "^0.19.0", "core-js": "^3.3.2", "element-ui": "^2.13.0", @@ -44,6 +45,7 @@ "lowdb": "^1.0.0", "picgo": "^1.4.21", "qrcode.vue": "^1.7.0", + "uuidv4": "^6.2.11", "vue": "^2.6.10", "vue-gallery": "^2.0.1", "vue-lazyload": "^1.2.6", diff --git a/src/main.ts b/src/main.ts index 3fc8fd0..af1aba7 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,7 +1,6 @@ import Vue from 'vue' import App from './renderer/App.vue' import router from './renderer/router' -import db from '#/datastore/index' import ElementUI from 'element-ui' import { webFrame } from 'electron' import 'element-ui/lib/theme-chalk/index.css' @@ -10,6 +9,7 @@ import axios from 'axios' import mainMixin from './renderer/utils/mainMixin' import bus from '@/utils/bus' import { initTalkingData } from './renderer/utils/analytics' +import db from './renderer/utils/db' webFrame.setVisualZoomLevelLimits(1, 1) webFrame.setLayoutZoomLevelLimits(0, 0) @@ -17,7 +17,6 @@ webFrame.setLayoutZoomLevelLimits(0, 0) Vue.config.productionTip = false Vue.prototype.$builtInPicBed = [ 'smms', - 'weibo', 'imgur', 'qiniu', 'tcyun', @@ -25,7 +24,7 @@ Vue.prototype.$builtInPicBed = [ 'aliyun', 'github' ] -Vue.prototype.$db = db +Vue.prototype.$$db = db Vue.prototype.$http = axios Vue.prototype.$bus = bus diff --git a/src/main/apis/app/shortKey/shortKeyHandler.ts b/src/main/apis/app/shortKey/shortKeyHandler.ts index 49ae309..97e0a52 100644 --- a/src/main/apis/app/shortKey/shortKeyHandler.ts +++ b/src/main/apis/app/shortKey/shortKeyHandler.ts @@ -4,7 +4,7 @@ import { } from 'electron' import logger from '@core/picgo/logger' import GuiApi from '../../gui' -import db from '#/datastore' +import db from '~/main/apis/core/datastore' import { TOGGLE_SHORTKEY_MODIFIED_MODE } from '#/events/constants' import shortKeyService from './shortKeyService' import picgo from '@core/picgo' diff --git a/src/main/apis/app/system/index.ts b/src/main/apis/app/system/index.ts index d50acb5..ee83c47 100644 --- a/src/main/apis/app/system/index.ts +++ b/src/main/apis/app/system/index.ts @@ -9,7 +9,7 @@ import { } from 'electron' import uploader from 'apis/app/uploader' import getPicBeds from '~/main/utils/getPicBeds' -import db from '#/datastore' +import db from '~/main/apis/core/datastore' import windowManager from 'apis/app/window/windowManager' import { IWindowList } from 'apis/app/window/constants' import picgo from '@core/picgo' diff --git a/src/main/apis/app/uploader/apis.ts b/src/main/apis/app/uploader/apis.ts index 63c87f7..62a63ea 100644 --- a/src/main/apis/app/uploader/apis.ts +++ b/src/main/apis/app/uploader/apis.ts @@ -6,7 +6,7 @@ import windowManager from 'apis/app/window/windowManager' import { IWindowList } from 'apis/app/window/constants' import uploader from '.' import pasteTemplate from '#/utils/pasteTemplate' -import db from '#/datastore' +import db from '~/main/apis/core/datastore' import { handleCopyUrl } from '~/main/utils/common' import { handleUrlEncode } from '#/utils/common' export const uploadClipboardFiles = async (): Promise => { diff --git a/src/main/apis/app/uploader/index.ts b/src/main/apis/app/uploader/index.ts index 7c1326c..38ea439 100644 --- a/src/main/apis/app/uploader/index.ts +++ b/src/main/apis/app/uploader/index.ts @@ -6,7 +6,7 @@ import { } from 'electron' import dayjs from 'dayjs' import picgo from '@core/picgo' -import db from '#/datastore' +import db from '~/main/apis/core/datastore' import windowManager from 'apis/app/window/windowManager' import { IWindowList } from 'apis/app/window/constants' import util from 'util' diff --git a/src/main/apis/app/window/windowList.ts b/src/main/apis/app/window/windowList.ts index f380535..3763771 100644 --- a/src/main/apis/app/window/windowList.ts +++ b/src/main/apis/app/window/windowList.ts @@ -8,7 +8,7 @@ import { import { IWindowListItem } from '#/types/electron' import bus from '@core/bus' import { CREATE_APP_MENU } from '@core/bus/constants' -import db from '#/datastore' +import db from '~/main/apis/core/datastore' import { TOGGLE_SHORTKEY_MODIFIED_MODE } from '#/events/constants' import { app } from 'electron' diff --git a/src/universal/datastore/dbChecker.ts b/src/main/apis/core/datastore/dbChecker.ts similarity index 57% rename from src/universal/datastore/dbChecker.ts rename to src/main/apis/core/datastore/dbChecker.ts index ea72764..d94d633 100644 --- a/src/universal/datastore/dbChecker.ts +++ b/src/main/apis/core/datastore/dbChecker.ts @@ -1,7 +1,11 @@ import fs from 'fs-extra' import path from 'path' -import { app } from 'electron' +import { remote, app } from 'electron' import dayjs from 'dayjs' +const APP = process.type === 'renderer' ? remote.app : app +const STORE_PATH = APP.getPath('userData') +const configFilePath = path.join(STORE_PATH, 'data.json') +const configFileBackupPath = path.join(STORE_PATH, 'data.bak.json') const errorMsg = { broken: 'PicGo 配置文件损坏,已经恢复为默认配置', @@ -11,9 +15,6 @@ const errorMsg = { function dbChecker () { if (process.type !== 'renderer') { if (!global.notificationList) global.notificationList = [] - const STORE_PATH = app.getPath('userData') - const configFilePath = path.join(STORE_PATH, 'data.json') - const configFileBackupPath = path.join(STORE_PATH, 'data.bak.json') if (!fs.existsSync(configFilePath)) { return } @@ -50,6 +51,37 @@ function dbChecker () { } } -export { - dbChecker +/** + * Get config path + */ +function dbPathChecker (): string { + const defaultConfigPath = configFilePath + if (process.type !== 'renderer') { + // if defaultConfig path is not exit + // do not parse the content of config + if (!fs.existsSync(defaultConfigPath)) { + return defaultConfigPath + } + try { + const configString = fs.readFileSync(configFilePath, { encoding: 'utf-8' }) + const config = JSON.parse(configString) + const userConfigPath: string = config.configPath || '' + if (userConfigPath) { + if (fs.existsSync(userConfigPath) && userConfigPath.endsWith('.json')) { + return userConfigPath + } + } + return defaultConfigPath + } catch (e) { + // TODO: local logger is needed + console.error(e) + return defaultConfigPath + } + } + return defaultConfigPath +} + +export { + dbChecker, + dbPathChecker } diff --git a/src/universal/datastore/index.ts b/src/main/apis/core/datastore/index.ts similarity index 73% rename from src/universal/datastore/index.ts rename to src/main/apis/core/datastore/index.ts index e18ffda..68db685 100644 --- a/src/universal/datastore/index.ts +++ b/src/main/apis/core/datastore/index.ts @@ -2,25 +2,27 @@ import Datastore from 'lowdb' // @ts-ignore import LodashId from 'lodash-id' import FileSync from 'lowdb/adapters/FileSync' -import path from 'path' import fs from 'fs-extra' -import { remote, app } from 'electron' -import { dbChecker } from './dbChecker' +import path from 'path' +import { app } from 'electron' +import { dbPathChecker } from './dbChecker' +import { DBStore } from '@picgo/store' -const APP = process.type === 'renderer' ? remote.app : app +const APP = app const STORE_PATH = APP.getPath('userData') -if (process.type !== 'renderer') { - if (!fs.pathExistsSync(STORE_PATH)) { - fs.mkdirpSync(STORE_PATH) - } - dbChecker() +if (!fs.pathExistsSync(STORE_PATH)) { + fs.mkdirpSync(STORE_PATH) } +const CONFIG_PATH: string = dbPathChecker() +const CONFIG_DIR = path.dirname(CONFIG_PATH) +const DB_PATH = path.join(CONFIG_DIR, 'picgo.db') -class DB { +// TODO: use JSONStore with @picgo/store +class ConfigStore { private db: Datastore.LowdbSync constructor () { - const adapter = new FileSync(path.join(STORE_PATH, '/data.json')) + const adapter = new FileSync(CONFIG_PATH) this.db = Datastore(adapter) this.db._.mixin(LodashId) @@ -77,4 +79,11 @@ class DB { } } -export default new DB() +export default new ConfigStore() + +// v2.3.0 add gallery db +const dbStore = new DBStore(DB_PATH, 'gallery') + +export { + dbStore +} diff --git a/src/main/apis/core/picgo/index.ts b/src/main/apis/core/picgo/index.ts index 9be36b7..cb0161c 100644 --- a/src/main/apis/core/picgo/index.ts +++ b/src/main/apis/core/picgo/index.ts @@ -1,14 +1,10 @@ import PicGoCore from '~/universal/types/picgo' -import { - app -} from 'electron' -import path from 'path' +import { dbPathChecker } from 'apis/core/datastore/dbChecker' // eslint-disable-next-line const requireFunc = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require const PicGo = requireFunc('picgo') as typeof PicGoCore -const STORE_PATH = app.getPath('userData') -const CONFIG_PATH = path.join(STORE_PATH, '/data.json') +const CONFIG_PATH = dbPathChecker() const picgo = new PicGo(CONFIG_PATH) picgo.saveConfig({ @@ -16,7 +12,6 @@ picgo.saveConfig({ PICGO_ENV: 'GUI' }) -// @ts-ignore picgo.GUI_VERSION = global.PICGO_GUI_VERSION export default picgo! as PicGoCore diff --git a/src/main/apis/gui/index.ts b/src/main/apis/gui/index.ts index bca130e..285b0f8 100644 --- a/src/main/apis/gui/index.ts +++ b/src/main/apis/gui/index.ts @@ -4,7 +4,7 @@ import { Notification, ipcMain } from 'electron' -import db from '#/datastore' +import db from '~/main/apis/core/datastore' import uploader from 'apis/app/uploader' import pasteTemplate from '#/utils/pasteTemplate' import { handleCopyUrl } from '~/main/utils/common' diff --git a/src/main/events/ipcList.ts b/src/main/events/ipcList.ts index 5c35ec0..f366d0e 100644 --- a/src/main/events/ipcList.ts +++ b/src/main/events/ipcList.ts @@ -8,7 +8,7 @@ import windowManager from 'apis/app/window/windowManager' import { IWindowList } from 'apis/app/window/constants' import uploader from 'apis/app/uploader' import pasteTemplate from '#/utils/pasteTemplate' -import db from '#/datastore' +import db from '~/main/apis/core/datastore' import server from '~/main/server' import getPicBeds from '~/main/utils/getPicBeds' import shortKeyHandler from 'apis/app/shortKey/shortKeyHandler' diff --git a/src/main/events/picgoCoreIPC.ts b/src/main/events/picgoCoreIPC.ts index b45f64a..4745467 100644 --- a/src/main/events/picgoCoreIPC.ts +++ b/src/main/events/picgoCoreIPC.ts @@ -16,6 +16,7 @@ import { IGuiMenuItem } from 'picgo/dist/src/types' import windowManager from 'apis/app/window/windowManager' import { IWindowList } from 'apis/app/window/constants' import { showNotification } from '~/main/utils/common' +import { PICGO_SAVE_CONFIG, PICGO_GET_CONFIG } from '#/events/constants' // eslint-disable-next-line const requireFunc = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require @@ -229,12 +230,19 @@ const handleRemoveFiles = () => { }) } -const handlePicGoSaveData = () => { - ipcMain.on('picgoSaveData', (event: IpcMainEvent, data: IObj) => { +const handlePicGoSaveConfig = () => { + ipcMain.on(PICGO_SAVE_CONFIG, (event: IpcMainEvent, data: IObj) => { picgo.saveConfig(data) }) } +const handlePicGoGetConfig = () => { + ipcMain.on(PICGO_GET_CONFIG, (event: IpcMainEvent, key: string | undefined, callbackId: string) => { + const result = picgo.getConfig(key) + event.sender.send(PICGO_GET_CONFIG, result, callbackId) + }) +} + const handleImportLocalPlugin = () => { ipcMain.on('importLocalPlugin', (event: IpcMainEvent) => { const settingWindow = windowManager.get(IWindowList.SETTING_WINDOW)! @@ -271,7 +279,8 @@ export default { handleGetPicBedConfig() handlePluginActions() handleRemoveFiles() - handlePicGoSaveData() + handlePicGoSaveConfig() + handlePicGoGetConfig() handleImportLocalPlugin() } } diff --git a/src/main/lifeCycle/errorHandler.ts b/src/main/lifeCycle/errorHandler.ts index 3fa9ca8..7299df0 100644 --- a/src/main/lifeCycle/errorHandler.ts +++ b/src/main/lifeCycle/errorHandler.ts @@ -8,7 +8,7 @@ const LOG_PATH = path.join(STORE_PATH, '/picgo.log') // since the error may occur in picgo-core // so we can't use the log from picgo -const loggerWriter = (error: Error) => { +export const loggerWriter = (error: Error) => { let log = `${dayjs().format('YYYY-MM-DD HH:mm:ss')} [PicGo ERROR] startup error` if (error?.stack) { log += `\n------Error Stack Begin------\n${util.format(error.stack)}\n-------Error Stack End-------\n` diff --git a/src/main/lifeCycle/index.ts b/src/main/lifeCycle/index.ts index afa5130..33b0f5a 100644 --- a/src/main/lifeCycle/index.ts +++ b/src/main/lifeCycle/index.ts @@ -29,7 +29,7 @@ import server from '~/main/server/index' import updateChecker from '~/main/utils/updateChecker' import shortKeyHandler from 'apis/app/shortKey/shortKeyHandler' import { getUploadFiles } from '~/main/utils/handleArgv' -import db from '#/datastore' +import db from '~/main/apis/core/datastore' import bus from '@core/bus' import { privacyManager } from '~/main/utils/privacyManager' import logger from 'apis/core/picgo/logger' diff --git a/src/main/migrate/index.ts b/src/main/migrate/index.ts index 526f92b..8746dff 100644 --- a/src/main/migrate/index.ts +++ b/src/main/migrate/index.ts @@ -1,4 +1,4 @@ -import DB from '#/datastore' +import DB from '~/main/apis/core/datastore' // from v2.1.2 const updateShortKeyFromVersion212 = (db: typeof DB, shortKeyConfig: IShortKeyConfigs | IOldShortKeyConfigs) => { // #557 极端情况可能会出现配置不存在,需要重新写入 diff --git a/src/main/utils/common.ts b/src/main/utils/common.ts index b141c4b..f316de8 100644 --- a/src/main/utils/common.ts +++ b/src/main/utils/common.ts @@ -1,4 +1,4 @@ -import db from '#/datastore' +import db from '~/main/apis/core/datastore' import { clipboard, Notification, dialog } from 'electron' export const handleCopyUrl = (str: string): void => { diff --git a/src/main/utils/privacyManager.ts b/src/main/utils/privacyManager.ts index 97972bc..5c41247 100644 --- a/src/main/utils/privacyManager.ts +++ b/src/main/utils/privacyManager.ts @@ -1,4 +1,4 @@ -import db from '#/datastore' +import db from '~/main/apis/core/datastore' import { ipcMain } from 'electron' import { showMessageBox } from '~/main/utils/common' import { SHOW_PRIVACY_MESSAGE } from '~/universal/events/constants' diff --git a/src/main/utils/updateChecker.ts b/src/main/utils/updateChecker.ts index 81a236d..43b5696 100644 --- a/src/main/utils/updateChecker.ts +++ b/src/main/utils/updateChecker.ts @@ -1,5 +1,5 @@ import { dialog, shell } from 'electron' -import db from '#/datastore' +import db from '~/main/apis/core/datastore' import axios from 'axios' import pkg from 'root/package.json' import { lt } from 'semver' diff --git a/src/renderer/components/ChoosePicBed.vue b/src/renderer/components/ChoosePicBed.vue index 860c591..1616bea 100644 --- a/src/renderer/components/ChoosePicBed.vue +++ b/src/renderer/components/ChoosePicBed.vue @@ -8,31 +8,27 @@ - diff --git a/src/renderer/components/ConfigForm.vue b/src/renderer/components/ConfigForm.vue index 312cef1..519833b 100644 --- a/src/renderer/components/ConfigForm.vue +++ b/src/renderer/components/ConfigForm.vue @@ -80,10 +80,10 @@ export default class extends Vue { deep: true, immediate: true }) - handleConfigChange (val: any) { + async handleConfigChange (val: any) { this.ruleForm = Object.assign({}, {}) - const config = this.$db.get(`picBed.${this.id}`) - if (val.length > 0) { + const config = await this.getConfig(`picBed.${this.id}`) + if (val.length > 0 && config) { this.configList = cloneDeep(val).map((item: any) => { let defaultValue = item.default !== undefined ? item.default : item.type === 'checkbox' diff --git a/src/renderer/layouts/Main.vue b/src/renderer/layouts/Main.vue index 88ef55f..e2f7f2e 100644 --- a/src/renderer/layouts/Main.vue +++ b/src/renderer/layouts/Main.vue @@ -91,35 +91,6 @@ - - - - - - -
- 如[]($url) -
- - 取消 - 确定 - -
void) => { if (!/\$url/.test(value)) { @@ -212,18 +184,7 @@ export default class extends Vue { visible = false keyBindingVisible = false customLinkVisible = false - customLink = { - value: db.get('customLink') || '$url' - } - rules = { - value: [ - { validator: customLinkRule, trigger: 'blur' } - ] - } os = '' - shortKey: IShortKeyMap = { - upload: db.get('shortKey.upload') - } picBed: IPicBedType[] = [] qrcodeVisible = false picBedConfigString = '' @@ -238,8 +199,8 @@ export default class extends Vue { @Watch('choosedPicBedForQRCode') choosedPicBedForQRCodeChange (val: string[], oldVal: string[]) { if (val.length > 0) { - this.$nextTick(() => { - const picBedConfig = db.get('picBed') + this.$nextTick(async () => { + const picBedConfig = await this.getConfig('picBed') const config = pick(picBedConfig, ...this.choosedPicBedForQRCode) this.picBedConfigString = JSON.stringify(config) }) @@ -318,29 +279,6 @@ export default class extends Vue { // this.menu!.popup(remote.getCurrentWindow()) this.menu!.popup() } - keyDetect (type: string, event: KeyboardEvent) { - this.shortKey[type] = keyDetect(event).join('+') - } - cancelKeyBinding () { - this.keyBindingVisible = false - this.shortKey = db.get('shortKey') - } - cancelCustomLink () { - this.customLinkVisible = false - this.customLink.value = db.get('customLink') || '$url' - } - confirmCustomLink () { - // @ts-ignore - this.$refs.customLink.validate((valid: boolean) => { - if (valid) { - db.set('customLink', this.customLink.value) - this.customLinkVisible = false - ipcRenderer.send('updateCustomLink') - } else { - return false - } - }) - } openMiniWindow () { ipcRenderer.send('openMiniWindow') } diff --git a/src/renderer/pages/Gallery.vue b/src/renderer/pages/Gallery.vue index 5b3f5e5..b779d94 100644 --- a/src/renderer/pages/Gallery.vue +++ b/src/renderer/pages/Gallery.vue @@ -111,7 +111,9 @@ // @ts-ignore import gallerys from 'vue-gallery' import pasteStyle from '#/utils/pasteTemplate' +import { IPasteStyle } from '#/types/enum' import { Component, Vue, Watch } from 'vue-property-decorator' +import { IResult } from '@picgo/store/dist/types' import { ipcRenderer, clipboard, @@ -194,6 +196,7 @@ export default class extends Vue { getPicBeds (event: IpcRendererEvent, picBeds: IPicBedType[]) { this.picBed = picBeds } + // FIXME: gallery db && async computed - -||..... getGallery () { if (this.choosedPicBed.length > 0) { let arr: ImgInfo[] = [] @@ -204,7 +207,6 @@ export default class extends Vue { if (this.searchText) { obj.fileName = this.searchText } - // @ts-ignore arr = arr.concat(this.$db.read().get('uploaded').filter(obj => { return obj.fileName.indexOf(this.searchText) !== -1 && obj.type === item }).reverse().value()) @@ -212,6 +214,7 @@ export default class extends Vue { this.images = arr } else { if (this.searchText) { + // FIXME: gallery db let data = this.$db.read().get('uploaded') // @ts-ignore .filter(item => { @@ -219,7 +222,7 @@ export default class extends Vue { }).reverse().value() this.images = data } else { - // @ts-ignore + // FIXME: gallery db this.images = this.$db.read().get('uploaded').slice().reverse().value() } } @@ -267,8 +270,8 @@ export default class extends Vue { this.idx = null this.changeZIndexForGallery(false) } - copy (item: ImgInfo) { - const style = this.$db.get('settings.pasteStyle') || 'markdown' + async copy (item: ImgInfo) { + const style = await this.getConfig('settings.pasteStyle') || IPasteStyle.MARKDOWN const copyLink = pasteStyle(style, item) const obj = { title: '复制链接成功', @@ -286,9 +289,9 @@ export default class extends Vue { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' - }).then(() => { - const file = this.$db.getById('uploaded', id) - this.$db.removeById('uploaded', id) + }).then(async () => { + const file = await this.$$db.getById(id) + await this.$$db.removeById(id) ipcRenderer.send('removeFiles', [file]) const obj = { title: '操作结果', @@ -309,12 +312,10 @@ export default class extends Vue { this.imgInfo.imgUrl = item.imgUrl as string this.dialogVisible = true } - confirmModify () { - this.$db.read().get('uploaded') - // @ts-ignore - .getById(this.imgInfo.id) - .assign({ imgUrl: this.imgInfo.imgUrl }) - .write() + async confirmModify () { + await this.$$db.updateById(this.imgInfo.id, { + imgUrl: this.imgInfo.imgUrl + }) const obj = { title: '修改图片URL成功', body: this.imgInfo.imgUrl, @@ -355,15 +356,19 @@ export default class extends Vue { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' - }).then(() => { - let files: ImgInfo[] = [] - Object.keys(this.choosedList).forEach(key => { + }).then(async () => { + let files: IResult[] = [] + const imageIDList = Object.keys(this.choosedList) + for (let i = 0; i < imageIDList.length; i++) { + const key = imageIDList[i] if (this.choosedList[key]) { - const file = this.$db.getById('uploaded', key) - files.push(file) - this.$db.removeById('uploaded', key) + const file = await this.$$db.getById(key) + if (file) { + files.push(file) + await this.$$db.removeById(key) + } } - }) + } this.clearChoosedList() this.choosedList = {} // 只有删除才能将这个置空 this.getGallery() @@ -381,18 +386,22 @@ export default class extends Vue { }) } } - multiCopy () { + async multiCopy () { if (Object.values(this.choosedList).some(item => item)) { const copyString: string[] = [] - const style = this.$db.get('settings.pasteStyle') || 'markdown' + const style = await this.getConfig('settings.pasteStyle') || IPasteStyle.MARKDOWN // choosedList -> { [id]: true or false }; true means choosed. false means not choosed. - Object.keys(this.choosedList).forEach(key => { + const imageIDList = Object.keys(this.choosedList) + for (let i = 0; i < imageIDList.length; i++) { + const key = imageIDList[i] if (this.choosedList[key]) { - const item = this.$db.getById('uploaded', key) - copyString.push(pasteStyle(style, item)) - this.choosedList[key] = false + const item = await this.$$db.getById(key) + if (item) { + copyString.push(pasteStyle(style, item)) + this.choosedList[key] = false + } } - }) + } const obj = { title: '批量复制链接成功', body: copyString.join('\n') @@ -407,11 +416,11 @@ export default class extends Vue { toggleHandleBar () { this.handleBarActive = !this.handleBarActive } - getPasteStyle () { - this.pasteStyle = this.$db.get('settings.pasteStyle') || 'markdown' - } - handlePasteStyleChange (val: string) { - this.$db.set('settings.pasteStyle', val) + // getPasteStyle () { + // this.pasteStyle = this.$db.get('settings.pasteStyle') || 'markdown' + // } + async handlePasteStyleChange (val: string) { + this.saveConfig('settings.pasteStyle', val) this.pasteStyle = val } beforeDestroy () { diff --git a/src/renderer/pages/MiniPage.vue b/src/renderer/pages/MiniPage.vue index 2f89306..fa4aea5 100644 --- a/src/renderer/pages/MiniPage.vue +++ b/src/renderer/pages/MiniPage.vue @@ -136,15 +136,16 @@ export default class extends Vue { openContextMenu () { this.menu!.popup() } - buildMenu () { + async buildMenu () { const _this = this + const current = await this.getConfig('picBed.current') const submenu = this.picBed.filter(item => item.visible).map(item => { return { label: item.name, type: 'radio', - checked: this.$db.get('picBed.current') === item.type, + checked: current === item.type, click () { - _this.letPicGoSaveData({ + _this.saveConfig({ 'picBed.current': item.type, 'picBed.uploader': item.type }) diff --git a/src/renderer/pages/PicGoSetting.vue b/src/renderer/pages/PicGoSetting.vue index 5cfda1a..1588f75 100644 --- a/src/renderer/pages/PicGoSetting.vue +++ b/src/renderer/pages/PicGoSetting.vue @@ -339,12 +339,13 @@ import keyDetect from '@/utils/key-binding' import pkg from 'root/package.json' import path from 'path' +import { IConfig } from 'picgo/dist/src/types/index' import { ipcRenderer, remote } from 'electron' import { Component, Vue } from 'vue-property-decorator' -import db from '#/datastore' +// import db from '#/datastore' const releaseUrl = 'https://api.github.com/repos/Molunerfinn/PicGo/releases/latest' const releaseUrlBackup = 'https://cdn.jsdelivr.net/gh/Molunerfinn/PicGo@latest/package.json' const downloadUrl = 'https://github.com/Molunerfinn/PicGo/releases/latest' @@ -355,30 +356,22 @@ const customLinkRule = (rule: string, value: string, callback: (arg0?: Error) => return callback() } } -let logLevel = db.get('settings.logLevel') -if (!Array.isArray(logLevel)) { - if (logLevel && logLevel.length > 0) { - logLevel = [logLevel] - } else { - logLevel = ['all'] - } -} @Component({ name: 'picgo-setting' }) export default class extends Vue { form: ISettingForm = { - updateHelper: db.get('settings.showUpdateTip'), + updateHelper: false, showPicBedList: [], - autoStart: db.get('settings.autoStart') || false, - rename: db.get('settings.rename') || false, - autoRename: db.get('settings.autoRename') || false, - uploadNotification: db.get('settings.uploadNotification') || false, - miniWindowOntop: db.get('settings.miniWindowOntop') || false, - logLevel, - autoCopyUrl: db.get('settings.autoCopy') === undefined ? true : db.get('settings.autoCopy'), - checkBetaUpdate: db.get('settings.checkBetaUpdate') === undefined ? true : db.get('settings.checkBetaUpdate') + autoStart: false, + rename: false, + autoRename: false, + uploadNotification: false, + miniWindowOntop: false, + logLevel: ['all'], + autoCopyUrl: true, + checkBetaUpdate: true } picBed: IPicBedType[] = [] logFileVisible = false @@ -388,14 +381,14 @@ export default class extends Vue { serverVisible = false proxyVisible = false customLink = { - value: db.get('settings.customLink') || '$url' + value: '$url' } shortKey: IShortKeyMap = { - upload: db.get('settings.shortKey.upload') + upload: '' } - proxy = db.get('picBed.proxy') || '' - npmRegistry = db.get('settings.registry') || '' - npmProxy = db.get('settings.proxy') || '' + proxy = '' + npmRegistry = '' + npmProxy = '' rules = { value: [ { validator: customLinkRule, trigger: 'blur' } @@ -409,7 +402,7 @@ export default class extends Vue { warn: '提醒-Warn', none: '不记录日志-None' } - server = db.get('settings.server') || { + server = { port: 36677, host: '127.0.0.1', enable: true @@ -430,6 +423,45 @@ export default class extends Vue { ipcRenderer.send('getPicBeds') ipcRenderer.on('getPicBeds', this.getPicBeds) } + async initData () { + const config = (await this.getConfig())! + if (config !== undefined) { + const settings = config.settings || {} + const picBed = config.picBed + this.form.updateHelper = settings.showUpdateTip || false + this.form.autoStart = settings.autoStart || false + this.form.rename = settings.rename || false + this.form.autoRename = settings.autoRename || false + this.form.uploadNotification = settings.uploadNotification || false + this.form.miniWindowOntop = settings.miniWindowOntop || false + this.form.logLevel = this.initLogLevel(settings.logLevel || []) + this.form.autoCopyUrl = settings.autoCopy === undefined ? true : settings.autoCopy + this.form.checkBetaUpdate = settings.checkBetaUpdate === undefined ? true : settings.checkBetaUpdate + + this.customLink.value = settings.customLink || '$url' + this.shortKey.upload = settings.shortKey.upload + this.proxy = picBed.proxy || '' + this.npmRegistry = settings.registry || '' + this.npmProxy = settings.proxy || '' + this.server = settings.server || { + port: 36677, + host: '127.0.0.1', + enable: true + } + } + } + + initLogLevel (logLevel: string | string[]) { + if (!Array.isArray(logLevel)) { + if (logLevel && logLevel.length > 0) { + logLevel = [logLevel] + } else { + logLevel = ['all'] + } + } + return logLevel + } + getPicBeds (event: Event, picBeds: IPicBedType[]) { this.picBed = picBeds this.form.showPicBedList = this.picBed.map(item => { @@ -450,15 +482,15 @@ export default class extends Vue { keyDetect (type: string, event: KeyboardEvent) { this.shortKey[type] = keyDetect(event).join('+') } - cancelCustomLink () { + async cancelCustomLink () { this.customLinkVisible = false - this.customLink.value = db.get('settings.customLink') || '$url' + this.customLink.value = await this.getConfig('settings.customLink') || '$url' } confirmCustomLink () { // @ts-ignore this.$refs.customLink.validate((valid: boolean) => { if (valid) { - db.set('settings.customLink', this.customLink.value) + this.saveConfig('settings.customLink', this.customLink.value) this.customLinkVisible = false ipcRenderer.send('updateCustomLink') } else { @@ -466,13 +498,13 @@ export default class extends Vue { } }) } - cancelProxy () { + async cancelProxy () { this.proxyVisible = false - this.proxy = db.get('picBed.proxy') || undefined + this.proxy = await this.getConfig('picBed.proxy') || '' } confirmProxy () { this.proxyVisible = false - this.letPicGoSaveData({ + this.saveConfig({ 'picBed.proxy': this.proxy, 'settings.proxy': this.npmProxy, 'settings.registry': this.npmRegistry @@ -485,10 +517,10 @@ export default class extends Vue { } } updateHelperChange (val: boolean) { - db.set('settings.showUpdateTip', val) + this.saveConfig('settings.showUpdateTip', val) } checkBetaUpdateChange (val: boolean) { - db.set('settings.checkBetaUpdate', val) + this.saveConfig('settings.checkBetaUpdate', val) } handleShowPicBedListChange (val: string[]) { const list = this.picBed.map(item => { @@ -499,22 +531,22 @@ export default class extends Vue { } return item }) - this.letPicGoSaveData({ + this.saveConfig({ 'picBed.list': list }) ipcRenderer.send('getPicBeds') } handleAutoStartChange (val: boolean) { - db.set('settings.autoStart', val) + this.saveConfig('settings.autoStart', val) ipcRenderer.send('autoStart', val) } handleRename (val: boolean) { - this.letPicGoSaveData({ + this.saveConfig({ 'settings.rename': val }) } handleAutoRename (val: boolean) { - this.letPicGoSaveData({ + this.saveConfig({ 'settings.autoRename': val }) } @@ -556,14 +588,16 @@ export default class extends Vue { this.checkUpdateVisible = false } handleUploadNotification (val: boolean) { - db.set('settings.uploadNotification', val) + this.saveConfig({ + 'settings.uploadNotification': val + }) } handleMiniWindowOntop (val: boolean) { - db.set('settings.miniWindowOntop', val) + this.saveConfig('settings.miniWindowOntop', val) this.$message.info('需要重启生效') } handleAutoCopyUrl (val: boolean) { - db.set('settings.autoCopy', val) + this.saveConfig('settings.autoCopy', val) const successNotification = new Notification('设置自动复制链接', { body: '设置成功' }) @@ -575,7 +609,7 @@ export default class extends Vue { if (this.form.logLevel.length === 0) { return this.$message.error('请选择日志记录等级') } - this.letPicGoSaveData({ + this.saveConfig({ 'settings.logLevel': this.form.logLevel }) const successNotification = new Notification('设置日志', { @@ -586,9 +620,9 @@ export default class extends Vue { } this.logFileVisible = false } - cancelLogLevelSetting () { + async cancelLogLevelSetting () { this.logFileVisible = false - let logLevel = db.get('settings.logLevel') + let logLevel = await this.getConfig('settings.logLevel') if (!Array.isArray(logLevel)) { if (logLevel && logLevel.length > 0) { logLevel = [logLevel] @@ -599,8 +633,9 @@ export default class extends Vue { this.form.logLevel = logLevel } confirmServerSetting () { + // @ts-ignore this.server.port = parseInt(this.server.port, 10) - this.letPicGoSaveData({ + this.saveConfig({ 'settings.server': this.server }) const successNotification = new Notification('设置PicGo-Server', { @@ -612,9 +647,9 @@ export default class extends Vue { this.serverVisible = false ipcRenderer.send('updateServer') } - cancelServerSetting () { + async cancelServerSetting () { this.serverVisible = false - this.server = db.get('settings.server') || { + this.server = await this.getConfig('settings.server') || { port: 36677, host: '127.0.0.1', enable: true diff --git a/src/renderer/pages/Plugin.vue b/src/renderer/pages/Plugin.vue index 6caf55f..6482829 100644 --- a/src/renderer/pages/Plugin.vue +++ b/src/renderer/pages/Plugin.vue @@ -164,7 +164,7 @@ export default class extends Vue { document.querySelector('.main-content.el-row').style.zIndex = 10 } } - created () { + async created () { this.os = process.platform ipcRenderer.on('hideLoading', () => { this.loading = false @@ -216,15 +216,15 @@ export default class extends Vue { }) this.getPluginList() this.getSearchResult = debounce(this.getSearchResult, 50) - this.needReload = this.$db.get('needReload') + this.needReload = await this.getConfig('needReload') || false } - buildContextMenu (plugin: IPicGoPlugin) { + async buildContextMenu (plugin: IPicGoPlugin) { const _this = this let menu = [{ label: '启用插件', enabled: !plugin.enabled, click () { - _this.letPicGoSaveData({ + _this.saveConfig({ [`picgoPlugins.${plugin.fullName}`]: true }) plugin.enabled = true @@ -235,7 +235,7 @@ export default class extends Vue { label: '禁用插件', enabled: plugin.enabled, click () { - _this.letPicGoSaveData({ + _this.saveConfig({ [`picgoPlugins.${plugin.fullName}`]: false }) plugin.enabled = false @@ -276,7 +276,7 @@ export default class extends Vue { // handle transformer if (plugin.config.transformer.name) { - let currentTransformer = this.$db.get('picBed.transformer') || 'path' + let currentTransformer = await this.getConfig('picBed.transformer') || 'path' let pluginTransformer = plugin.config.transformer.name const obj = { label: `${currentTransformer === pluginTransformer ? '禁用' : '启用'}transformer - ${plugin.config.transformer.name}`, @@ -351,8 +351,10 @@ export default class extends Vue { remote.app.relaunch() remote.app.exit(0) } - handleReload () { - this.$db.set('needReload', true) + async handleReload () { + this.saveConfig({ + needReload: true + }) this.needReload = true const successNotification = new Notification('更新成功', { body: '请点击此通知重启应用以生效' @@ -364,14 +366,14 @@ export default class extends Vue { cleanSearch () { this.searchText = '' } - toggleTransformer (transformer: string) { - let currentTransformer = this.$db.get('picBed.transformer') || 'path' + async toggleTransformer (transformer: string) { + let currentTransformer = await this.getConfig('picBed.transformer') || 'path' if (currentTransformer === transformer) { - this.letPicGoSaveData({ + this.saveConfig({ 'picBed.transformer': 'path' }) } else { - this.letPicGoSaveData({ + this.saveConfig({ 'picBed.transformer': transformer }) } @@ -382,17 +384,17 @@ export default class extends Vue { if (result !== false) { switch (this.currentType) { case 'plugin': - this.letPicGoSaveData({ + this.saveConfig({ [`${this.configName}`]: result }) break case 'uploader': - this.letPicGoSaveData({ + this.saveConfig({ [`picBed.${this.configName}`]: result }) break case 'transformer': - this.letPicGoSaveData({ + this.saveConfig({ [`transformer.${this.configName}`]: result }) break @@ -448,20 +450,20 @@ export default class extends Vue { } } // restore Uploader & Transformer - handleRestoreState (item: string, name: string) { + async handleRestoreState (item: string, name: string) { if (item === 'uploader') { - const current = this.$db.get('picBed.current') + const current = await this.getConfig('picBed.current') if (current === name) { - this.letPicGoSaveData({ + this.saveConfig({ 'picBed.current': 'smms', 'picBed.uploader': 'smms' }) } } if (item === 'transformer') { - const current = this.$db.get('picBed.transformer') + const current = await this.getConfig('picBed.transformer') if (current === name) { - this.letPicGoSaveData({ + this.saveConfig({ 'picBed.transformer': 'path' }) } @@ -475,7 +477,7 @@ export default class extends Vue { goAwesomeList () { remote.shell.openExternal('https://github.com/PicGo/Awesome-PicGo') } - letPicGoSaveData (data: IObj) { + saveConfig (data: IObj) { ipcRenderer.send('picgoSaveData', data) } handleImportLocalPlugin () { diff --git a/src/renderer/pages/ShortKey.vue b/src/renderer/pages/ShortKey.vue index ff9a730..e8667be 100644 --- a/src/renderer/pages/ShortKey.vue +++ b/src/renderer/pages/ShortKey.vue @@ -109,8 +109,8 @@ export default class extends Vue { command = '' shortKey = '' currentIndex = 0 - created () { - const shortKeyConfig = this.$db.get('settings.shortKey') as IShortKeyConfigs + async created () { + const shortKeyConfig = (await this.getConfig('settings.shortKey'))! this.list = Object.keys(shortKeyConfig).map(item => { return { ...shortKeyConfig[item], @@ -132,26 +132,23 @@ export default class extends Vue { toggleEnable (item: IShortKeyConfig) { const status = !item.enable item.enable = status - // this.$db.set(`settings.shortKey.${item.name}.enable`, status) ipcRenderer.send('bindOrUnbindShortKey', item, item.from) } keyDetect (event: KeyboardEvent) { this.shortKey = keyDetect(event).join('+') } - openKeyBindingDialog (config: IShortKeyConfig, index: number) { + async openKeyBindingDialog (config: IShortKeyConfig, index: number) { this.command = `${config.from}:${config.name}` - this.shortKey = this.$db.get(`settings.shortKey.${this.command}.key`) + this.shortKey = await this.getConfig(`settings.shortKey.${this.command}.key`) || '' this.currentIndex = index this.keyBindingVisible = true } - cancelKeyBinding () { + async cancelKeyBinding () { this.keyBindingVisible = false - this.shortKey = this.$db.get(`settings.shortKey.${this.command}.key`) + this.shortKey = await this.getConfig(`settings.shortKey.${this.command}.key`) || '' } - confirmKeyBinding () { - const oldKey = this.$db.get(`settings.shortKey.${this.command}.key`) - // this.$db.set(`settings.shortKey.${this.command}.key`, this.shortKey) - // const newKey = this.$db.get(`settings.shortKey.${this.command}`) + async confirmKeyBinding () { + const oldKey = await this.getConfig(`settings.shortKey.${this.command}.key`) const config = Object.assign({}, this.list[this.currentIndex]) config.key = this.shortKey ipcRenderer.send('updateShortKey', config, oldKey, config.from) diff --git a/src/renderer/pages/TrayPage.vue b/src/renderer/pages/TrayPage.vue index adea657..4b0102b 100644 --- a/src/renderer/pages/TrayPage.vue +++ b/src/renderer/pages/TrayPage.vue @@ -30,12 +30,15 @@ import { Component, Vue } from 'vue-property-decorator' import mixin from '@/utils/mixin' import pasteTemplate from '#/utils/pasteTemplate' import { ipcRenderer, clipboard } from 'electron' +import { IPasteStyle } from '#/types/enum' +import { IResult } from '@picgo/store/dist/types' + @Component({ name: 'tray-page', mixins: [mixin] }) export default class extends Vue { - files = [] + files: IResult[] = [] notification = { title: '复制链接成功', body: '', @@ -46,15 +49,14 @@ export default class extends Vue { get reverseList () { return this.files.slice().reverse() } - getData () { - // @ts-ignore - this.files = this.$db.read().get('uploaded').slice().reverse().slice(0, 5).value() + async getData () { + this.files = (await this.$$db.get()).slice().reverse().slice(0, 5) } - copyTheLink (item: ImgInfo) { + async copyTheLink (item: ImgInfo) { this.notification.body = item.imgUrl! this.notification.icon = item.imgUrl! const myNotification = new Notification(this.notification.title, this.notification) - const pasteStyle = this.$db.get('settings.pasteStyle') || 'markdown' + const pasteStyle = await this.getConfig('settings.pasteStyle') || IPasteStyle.MARKDOWN clipboard.writeText(pasteTemplate(pasteStyle, item)) myNotification.onclick = () => { return true @@ -83,19 +85,18 @@ export default class extends Vue { mounted () { this.disableDragFile() this.getData() - ipcRenderer.on('dragFiles', (event: Event, files: string[]) => { - files.forEach(item => { - this.$db.insert('uploaded', item) - }) - // @ts-ignore - this.files = this.$db.read().get('uploaded').slice().reverse().slice(0, 5).value() + ipcRenderer.on('dragFiles', async (event: Event, files: string[]) => { + for (let i = 0; i < files.length; i++) { + const item = files[i] + await this.$$db.insert(item) + } + this.files = (await this.$$db.get()).slice().reverse().slice(0, 5) }) ipcRenderer.on('clipboardFiles', (event: Event, files: ImgInfo[]) => { this.clipboardFiles = files }) - ipcRenderer.on('uploadFiles', (event: Event) => { - // @ts-ignore - this.files = this.$db.read().get('uploaded').slice().reverse().slice(0, 5).value() + ipcRenderer.on('uploadFiles', async (event: Event) => { + this.files = (await this.$$db.get()).slice().reverse().slice(0, 5) console.log(this.files) this.uploadFlag = false }) diff --git a/src/renderer/pages/Upload.vue b/src/renderer/pages/Upload.vue index 13dd3cd..8d1ada9 100644 --- a/src/renderer/pages/Upload.vue +++ b/src/renderer/pages/Upload.vue @@ -169,11 +169,13 @@ export default class extends Vue { }) ipcRenderer.send('uploadChoosedFiles', sendFiles) } - getPasteStyle () { - this.pasteStyle = this.$db.get('settings.pasteStyle') || 'markdown' + async getPasteStyle () { + this.pasteStyle = await this.getConfig('settings.pasteStyle') || 'markdown' } handlePasteStyleChange (val: string) { - this.$db.set('settings.pasteStyle', val) + this.saveConfig({ + 'settings.pasteStyle': val + }) } uploadClipboardFiles () { ipcRenderer.send('uploadClipboardFilesFromUploadPage') @@ -196,10 +198,10 @@ export default class extends Vue { this.$message.error('请输入合法的URL') } } - getDefaultPicBed () { - const current: string = this.$db.get('picBed.current') + async getDefaultPicBed () { + const currentPicBed = await this.getConfig('picBed.current') this.picBed.forEach(item => { - if (item.type === current) { + if (item.type === currentPicBed) { this.picBedName = item.name } }) @@ -208,20 +210,21 @@ export default class extends Vue { this.picBed = picBeds this.getDefaultPicBed() } - handleChangePicBed () { - this.buildMenu() + async handleChangePicBed () { + await this.buildMenu() // this.menu.popup(remote.getCurrentWindow()) this.menu!.popup() } - buildMenu () { + async buildMenu () { const _this = this + const currentPicBed = await this.getConfig('picBed.current') const submenu = this.picBed.filter(item => item.visible).map(item => { return { label: item.name, type: 'radio', - checked: this.$db.get('picBed.current') === item.type, + checked: currentPicBed === item.type, click () { - _this.letPicGoSaveData({ + _this.saveConfig({ 'picBed.current': item.type, 'picBed.uploader': item.type }) diff --git a/src/renderer/pages/picbeds/AliYun.vue b/src/renderer/pages/picbeds/AliYun.vue index b82e2c7..df34a07 100644 --- a/src/renderer/pages/picbeds/AliYun.vue +++ b/src/renderer/pages/picbeds/AliYun.vue @@ -86,8 +86,8 @@ export default class extends Vue { customUrl: '', options: '' } - created () { - const config = this.$db.get('picBed.aliyun') as IAliYunConfig + async created () { + const config = await this.getConfig('picBed.aliyun') if (config) { this.form = Object.assign({}, config) } @@ -96,7 +96,7 @@ export default class extends Vue { // @ts-ignore this.$refs.aliyun.validate((valid) => { if (valid) { - this.letPicGoSaveData({ + this.saveConfig({ 'picBed.aliyun': this.form }) const successNotification = new window.Notification('设置结果', { diff --git a/src/renderer/pages/picbeds/GitHub.vue b/src/renderer/pages/picbeds/GitHub.vue index a75f5ee..5bc3ee3 100644 --- a/src/renderer/pages/picbeds/GitHub.vue +++ b/src/renderer/pages/picbeds/GitHub.vue @@ -71,8 +71,8 @@ export default class extends Vue { customUrl: '', branch: '' } - created () { - const config = this.$db.get('picBed.github') as IGitHubConfig + async created () { + const config = await this.getConfig('picBed.github') if (config) { this.form = Object.assign({}, config) } @@ -81,7 +81,7 @@ export default class extends Vue { // @ts-ignore this.$refs.github.validate((valid) => { if (valid) { - this.letPicGoSaveData({ + this.saveConfig({ 'picBed.github': this.form }) const successNotification = new Notification('设置结果', { diff --git a/src/renderer/pages/picbeds/Imgur.vue b/src/renderer/pages/picbeds/Imgur.vue index fda0e9d..24bc357 100644 --- a/src/renderer/pages/picbeds/Imgur.vue +++ b/src/renderer/pages/picbeds/Imgur.vue @@ -48,8 +48,8 @@ export default class extends Vue { clientId: '', proxy: '' } - created () { - const config = this.$db.get('picBed.imgur') as IImgurConfig + async created () { + const config = await this.getConfig('picBed.imgur') if (config) { this.form = Object.assign({}, config) } @@ -58,7 +58,7 @@ export default class extends Vue { // @ts-ignore this.$refs.imgur.validate((valid) => { if (valid) { - this.letPicGoSaveData({ + this.saveConfig({ 'picBed.imgur': this.form }) const successNotification = new Notification('设置结果', { diff --git a/src/renderer/pages/picbeds/Others.vue b/src/renderer/pages/picbeds/Others.vue index 24bd986..b402738 100644 --- a/src/renderer/pages/picbeds/Others.vue +++ b/src/renderer/pages/picbeds/Others.vue @@ -56,7 +56,7 @@ export default class extends Vue { // @ts-ignore const result = await this.$refs.configForm.validate() if (result !== false) { - this.letPicGoSaveData({ + this.saveConfig({ [`picBed.${this.type}`]: result }) const successNotification = new Notification('设置结果', { @@ -68,7 +68,7 @@ export default class extends Vue { } } setDefaultPicBed (type: string) { - this.letPicGoSaveData({ + this.saveConfig({ 'picBed.current': type, 'picBed.uploader': type }) diff --git a/src/renderer/pages/picbeds/Qiniu.vue b/src/renderer/pages/picbeds/Qiniu.vue index af87385..1e53033 100644 --- a/src/renderer/pages/picbeds/Qiniu.vue +++ b/src/renderer/pages/picbeds/Qiniu.vue @@ -17,7 +17,7 @@ :rules="{ required: true, message: 'AccessKey不能为空', trigger: 'blur' }"> - + ('picBed.qiniu') if (config) { this.form = Object.assign({}, config) } @@ -98,7 +98,7 @@ export default class extends Vue { // @ts-ignore this.$refs.qiniu.validate((valid) => { if (valid) { - this.letPicGoSaveData({ + this.saveConfig({ 'picBed.qiniu': this.form }) const successNotification = new Notification('设置结果', { diff --git a/src/renderer/pages/picbeds/SMMS.vue b/src/renderer/pages/picbeds/SMMS.vue index 72d8693..bbb3263 100644 --- a/src/renderer/pages/picbeds/SMMS.vue +++ b/src/renderer/pages/picbeds/SMMS.vue @@ -41,17 +41,17 @@ export default class extends Vue { form: ISMMSConfig = { token: '' } - created () { - const config = this.$db.get('picBed.smms.token') as (string | boolean) + async created () { + const config = await this.getConfig('picBed.smms.token') if (typeof config !== 'boolean') { - this.form.token = config + this.form.token = config || '' } } confirm () { // @ts-ignore this.$refs.smms.validate((valid) => { if (valid) { - this.letPicGoSaveData({ + this.saveConfig({ 'picBed.smms': this.form }) const successNotification = new window.Notification('设置结果', { diff --git a/src/renderer/pages/picbeds/TcYun.vue b/src/renderer/pages/picbeds/TcYun.vue index 823cdf2..74abbd9 100644 --- a/src/renderer/pages/picbeds/TcYun.vue +++ b/src/renderer/pages/picbeds/TcYun.vue @@ -30,7 +30,7 @@ :rules="{ required: true, message: 'SecretId不能为空', trigger: 'blur' }"> - + ('picBed.tcyun') if (config) { this.form = Object.assign({}, config) } @@ -114,7 +114,7 @@ export default class extends Vue { // @ts-ignore this.$refs.tcyun.validate((valid) => { if (valid) { - this.letPicGoSaveData({ + this.saveConfig({ 'picBed.tcyun': this.form }) const successNotification = new window.Notification('设置结果', { diff --git a/src/renderer/pages/picbeds/UpYun.vue b/src/renderer/pages/picbeds/UpYun.vue index 80e12b6..3aa30c7 100644 --- a/src/renderer/pages/picbeds/UpYun.vue +++ b/src/renderer/pages/picbeds/UpYun.vue @@ -79,8 +79,8 @@ export default class extends Vue { options: '', path: '' } - created () { - const config = this.$db.get('picBed.upyun') as IUpYunConfig + async created () { + const config = await this.getConfig('picBed.upyun') if (config) { this.form = Object.assign({}, config) } @@ -89,7 +89,7 @@ export default class extends Vue { // @ts-ignore this.$refs.tcyun.validate((valid) => { if (valid) { - this.letPicGoSaveData({ + this.saveConfig({ 'picBed.upyun': this.form }) const successNotification = new Notification('设置结果', { diff --git a/src/renderer/pages/picbeds/Weibo.vue b/src/renderer/pages/picbeds/Weibo.vue deleted file mode 100644 index 1fa98ed..0000000 --- a/src/renderer/pages/picbeds/Weibo.vue +++ /dev/null @@ -1,153 +0,0 @@ - - - diff --git a/src/renderer/router/index.ts b/src/renderer/router/index.ts index d5cb58b..2bf9f34 100644 --- a/src/renderer/router/index.ts +++ b/src/renderer/router/index.ts @@ -31,11 +31,6 @@ export default new Router({ component: () => import(/* webpackChunkName: "Upload" */ '@/pages/Upload.vue'), name: 'upload' }, - { - path: 'weibo', - component: () => import(/* webpackChunkName: "Weibo" */ '@/pages/picbeds/Weibo.vue'), - name: 'weibo' - }, { path: 'qiniu', component: () => import(/* webpackChunkName: "Qiniu" */ '@/pages/picbeds/Qiniu.vue'), diff --git a/src/renderer/utils/ConfirmButtonMixin.ts b/src/renderer/utils/ConfirmButtonMixin.ts index df43166..9e4e5bf 100644 --- a/src/renderer/utils/ConfirmButtonMixin.ts +++ b/src/renderer/utils/ConfirmButtonMixin.ts @@ -1,10 +1,17 @@ import { Component, Vue } from 'vue-property-decorator' import { ipcRenderer } from 'electron' +import { IConfig } from 'picgo/dist/src/types' @Component export default class extends Vue { - defaultPicBed = this.$db.get('picBed.uploader') || this.$db.get('picBed.current') || 'smms' + defaultPicBed = 'smms' + async created () { + const config = await this.getConfig() + if (config) { + this.defaultPicBed = config?.picBed?.uploader || config?.picBed?.current || 'smms' + } + } setDefaultPicBed (type: string) { - this.letPicGoSaveData({ + this.saveConfig({ 'picBed.current': type, 'picBed.uploader': type }) diff --git a/src/renderer/utils/db.ts b/src/renderer/utils/db.ts new file mode 100644 index 0000000..d0bc37d --- /dev/null +++ b/src/renderer/utils/db.ts @@ -0,0 +1,53 @@ +import { IObject, IResult } from '@picgo/store/dist/types' +import { ipcRenderer, IpcRendererEvent } from 'electron' +import { uuid } from 'uuidv4' +import { + PICGO_GET_DB, + PICGO_INSERT_DB, + PICGO_INSERT_MANY_DB, + PICGO_UPDATE_BY_ID_DB, + PICGO_GET_BY_ID_DB, + PICGO_REMOVE_BY_ID_DB +} from '#/events/constants' +import { IGalleryDB } from '#/types/extra-vue' +export class GalleryDB implements IGalleryDB { + async get (): Promise[]> { + const res = await this.msgHandler[]>(PICGO_GET_DB) + return res + } + async insert (value: T): Promise> { + const res = await this.msgHandler>(PICGO_INSERT_DB, value) + return res + } + async insertMany (value: T[]): Promise[]> { + const res = await this.msgHandler[]>(PICGO_INSERT_MANY_DB, value) + return res + } + async updateById (id: string, value: IObject): Promise { + const res = await this.msgHandler(PICGO_UPDATE_BY_ID_DB, id, value) + return res + } + async getById (id: string): Promise { + const res = await this.msgHandler(PICGO_GET_BY_ID_DB, id) + return res + } + async removeById (id: string): Promise { + const res = await this.msgHandler(PICGO_REMOVE_BY_ID_DB, id) + return res + } + private msgHandler (method: string, ...args: any[]): Promise { + return new Promise((resolve) => { + const callbackId = uuid() + const callback = (event: IpcRendererEvent, data: T, returnCallbackId: string) => { + if (returnCallbackId === callbackId) { + resolve(data) + ipcRenderer.removeListener(method, callback) + } + } + ipcRenderer.on(method, callback) + ipcRenderer.send(method, ...args) + }) + } +} + +export default new GalleryDB() diff --git a/src/renderer/utils/mainMixin.ts b/src/renderer/utils/mainMixin.ts index 20b20a3..34e7b96 100644 --- a/src/renderer/utils/mainMixin.ts +++ b/src/renderer/utils/mainMixin.ts @@ -1,8 +1,29 @@ import { Component, Vue } from 'vue-property-decorator' -import { ipcRenderer } from 'electron' +import { ipcRenderer, IpcRendererEvent } from 'electron' +import { PICGO_SAVE_CONFIG, PICGO_GET_CONFIG } from '#/events/constants' +import { uuid } from 'uuidv4' @Component export default class extends Vue { - letPicGoSaveData (data: IObj) { - ipcRenderer.send('picgoSaveData', data) + // support string key + value or object config + saveConfig (config: IObj | string, value?: any) { + if (typeof config === 'string') { + config = { + [config]: value + } + } + ipcRenderer.send(PICGO_SAVE_CONFIG, config) + } + getConfig (key?: string): Promise { + return new Promise((resolve) => { + const callbackId = uuid() + const callback = (event: IpcRendererEvent, config: T | undefined, returnCallbackId: string) => { + if (returnCallbackId === callbackId) { + resolve(config) + ipcRenderer.removeListener(PICGO_GET_CONFIG, callback) + } + } + ipcRenderer.on(PICGO_GET_CONFIG, callback) + ipcRenderer.send(PICGO_GET_CONFIG, key, callbackId) + }) } } diff --git a/src/universal/events/constants.ts b/src/universal/events/constants.ts index ead3456..6caf778 100644 --- a/src/universal/events/constants.ts +++ b/src/universal/events/constants.ts @@ -4,3 +4,11 @@ export const TOGGLE_SHORTKEY_MODIFIED_MODE = 'TOGGLE_SHORTKEY_MODIFIED_MODE' export const TALKING_DATA_APPID = '7E6832BCE3F1438696579E541DFEBFDA' export const TALKING_DATA_EVENT = 'TALKING_DATA_EVENT' export const SHOW_PRIVACY_MESSAGE = 'SHOW_PRIVACY_MESSAGE' +export const PICGO_SAVE_CONFIG = 'PICGO_SAVE_CONFIG' +export const PICGO_GET_CONFIG = 'PICGO_GET_CONFIG' +export const PICGO_GET_DB = 'PICGO_GET_DB' +export const PICGO_INSERT_DB = 'PICGO_INSERT_DB' +export const PICGO_INSERT_MANY_DB = 'PICGO_INSERT_MANY_DB' +export const PICGO_UPDATE_BY_ID_DB = 'PICGO_UPDATE_BY_ID_DB' +export const PICGO_GET_BY_ID_DB = 'PICGO_GET_BY_ID_DB' +export const PICGO_REMOVE_BY_ID_DB = 'PICGO_REMOVE_BY_ID_DB' diff --git a/src/universal/types/extra-vue.d.ts b/src/universal/types/extra-vue.d.ts index c0319aa..ad1d4ab 100644 --- a/src/universal/types/extra-vue.d.ts +++ b/src/universal/types/extra-vue.d.ts @@ -1,14 +1,25 @@ import VueRouter, { Route } from 'vue-router' -import db from '#/datastore' import axios from 'axios' +import { IObject, IResult } from '@picgo/store/dist/types' + +interface IGalleryDB { + get(): Promise[]> + insert (value: T): Promise> + insertMany (value: T[]): Promise[]> + updateById (id: string, value: IObject): Promise + getById (id: string): Promise | undefined> + removeById (id: string): Promise +} + declare module 'vue/types/vue' { interface Vue { $router: VueRouter, $route: Route, - $db: typeof db $http: typeof axios $builtInPicBed: string[] $bus: Vue - letPicGoSaveData(data: IObj): void + $$db: IGalleryDB + saveConfig(data: IObj | string, value?: any): void + getConfig(key?: string): Promise } } diff --git a/src/universal/types/types.d.ts b/src/universal/types/types.d.ts index 0295b59..9802781 100644 --- a/src/universal/types/types.d.ts +++ b/src/universal/types/types.d.ts @@ -144,6 +144,14 @@ interface IPicGoPlugin { hasInstall?: boolean } +interface IPicGoPluginConfig { + name: string + type: string + required: boolean + default?: any + [propName: string]: any +} + interface IPluginMenuConfig { name: string fullName?: string diff --git a/src/universal/utils/pasteTemplate.ts b/src/universal/utils/pasteTemplate.ts index 79bfe28..3d01bb7 100644 --- a/src/universal/utils/pasteTemplate.ts +++ b/src/universal/utils/pasteTemplate.ts @@ -1,4 +1,4 @@ -import db from '#/datastore' +import db from '~/main/apis/core/datastore' import { IPasteStyle } from '#/types/enum' import { handleUrlEncode } from './common' diff --git a/vue.config.js b/vue.config.js index d8d782d..4ca5c67 100644 --- a/vue.config.js +++ b/vue.config.js @@ -3,8 +3,6 @@ function resolve (dir) { return path.join(__dirname, dir) } -console.log(process.argv) - const arch = process.argv.includes('--ia32') ? 'ia32' : 'x64' const config = { diff --git a/yarn.lock b/yarn.lock index 3faf91d..23f7f93 100644 --- a/yarn.lock +++ b/yarn.lock @@ -918,6 +918,18 @@ dependencies: ora "^3.4.0" +"@picgo/store@^1.0.0-alpha.3": + version "1.0.0-alpha.3" + resolved "https://registry.yarnpkg.com/@picgo/store/-/store-1.0.0-alpha.3.tgz#b0f4f12c471cf370a95dcab93ed2b6291760d887" + integrity sha512-BUj/lZiAWDu7gZRwRtPIfw7LwV55PD/dUkAjPsscjn/EmckiC3LEek97/wr4j6vQc45C7LEJfgpzeEYSU76vUA== + dependencies: + "@types/bson" "^4.0.1" + "@types/graceful-fs" "^4.1.3" + bson "^4.0.3" + comment-json "^4.1.0" + lodash-id "^0.14.0" + lowdb "^1.0.0" + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -939,6 +951,13 @@ dependencies: defer-to-connect "^1.0.1" +"@types/bson@^4.0.1": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/bson/-/bson-4.0.4.tgz#79d2d26e81070044db2a1a8b2cc2f673c840e1e5" + integrity sha512-awqorHvQS0DqxkHQ/FxcPX9E+H7Du51Qw/2F+5TBMSaE3G0hm+8D3eXJ6MAzFw75nE8V7xF0QvzUSdxIjJb/GA== + dependencies: + "@types/node" "*" + "@types/caseless@*": version "0.12.2" resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8" @@ -980,6 +999,13 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/graceful-fs@^4.1.3": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + "@types/inquirer@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-6.5.0.tgz#b83b0bf30b88b8be7246d40e51d32fe9d10e09be" @@ -1064,6 +1090,11 @@ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.6.tgz#c880579e087d7a0db13777ff8af689f4ffc7b0d5" integrity sha512-wHNBMnkoEBiRAd3s8KTKwIuO9biFtTf0LehITzBhSco+HQI0xkXZbLOD55SW3Aqw3oUkHstkm5SPv58yaAdFPQ== +"@types/uuid@8.3.1": + version "8.3.1" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.1.tgz#1a32969cf8f0364b3d8c8af9cc3555b7805df14f" + integrity sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg== + "@types/webpack-env@^1.13.9": version "1.14.1" resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.14.1.tgz#0d8a53f308f017c53a5ddc3d07f4d6fa76b790d7" @@ -1812,6 +1843,11 @@ array-includes@^3.0.3: define-properties "^1.1.3" es-abstract "^1.17.0-next.0" +array-timsort@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-timsort/-/array-timsort-1.0.3.tgz#3c9e4199e54fb2b9c3fe5976396a21614ef0d926" + integrity sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ== + array-union@^1.0.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -2009,6 +2045,11 @@ base64-js@^1.0.2: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" @@ -2252,6 +2293,13 @@ browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.7.3, browserslist@^4.8 electron-to-chromium "^1.3.322" node-releases "^1.1.42" +bson@^4.0.3: + version "4.4.1" + resolved "https://registry.yarnpkg.com/bson/-/bson-4.4.1.tgz#682c3cb8b90b222414ce14ef8398154ba2cc21bc" + integrity sha512-Uu4OCZa0jouQJCKOk1EmmyqtdWAP5HVLru4lQxTwzJzxT+sJ13lVpEZU/MATDxtHiekWMAL84oQY3Xn1LpJVSg== + dependencies: + buffer "^5.6.0" + buffer-alloc-unsafe@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" @@ -2312,6 +2360,14 @@ buffer@^5.1.0, buffer@^5.2.1: base64-js "^1.0.2" ieee754 "^1.1.4" +buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + builder-util-runtime@8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.3.0.tgz#f5fac9139af6facf42a21fbe4d3aebed88fda33e" @@ -2879,6 +2935,17 @@ comment-json@^2.3.1: has-own-prop "^2.0.0" repeat-string "^1.6.1" +comment-json@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-4.1.0.tgz#09d08f0fbc4ad5eeccbac20f469adbb967dcbd2c" + integrity sha512-WEghmVYaNq9NlWbrkzQTSsya9ycLyxJxpTQfZEan6a5Jomnjw18zS3Podf8q1Zf9BvonvQd/+Z7Z39L7KKzzdQ== + dependencies: + array-timsort "^1.0.3" + core-util-is "^1.0.2" + esprima "^4.0.1" + has-own-prop "^2.0.0" + repeat-string "^1.6.1" + commitizen@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-4.0.3.tgz#c19a4213257d0525b85139e2f36db7cc3b4f6dae" @@ -5979,6 +6046,11 @@ icss-utils@^4.0.0, icss-utils@^4.1.1: dependencies: postcss "^7.0.14" +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ieee754@^1.1.4: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" @@ -11129,11 +11201,24 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= +uuid@8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + uuid@^3.0.1, uuid@^3.3.2: version "3.3.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== +uuidv4@^6.2.11: + version "6.2.11" + resolved "https://registry.yarnpkg.com/uuidv4/-/uuidv4-6.2.11.tgz#34d5a03324eb38296b87ae523a64233b5286cc27" + integrity sha512-OTS4waH9KplrXNADKo+Q1kT9AHWr8DaC0S5F54RQzEwcUaEzBEWQQlJyDUw/u1bkRhJyqkqhLD4M4lbFbV+89g== + dependencies: + "@types/uuid" "8.3.1" + uuid "8.3.2" + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"