From 1ef2db5f479e839845a0c27258b24ae9856b64f7 Mon Sep 17 00:00:00 2001 From: FatttSnake Date: Wed, 8 May 2024 12:36:16 +0800 Subject: [PATCH] Feat(Electron-store): Add electron store Add electron store to support install tool --- electron.vite.config.ts | 2 +- package-lock.json | 219 ++++++++++++++++++++++++++++++++- package.json | 2 + src/main/dataProcess.ts | 21 ++++ src/main/global.d.ts | 78 ++++++++++++ src/main/index.ts | 3 +- src/preload/index.ts | 8 +- src/renderer/src/electron.d.ts | 14 ++- src/renderer/src/global.d.ts | 1 + 9 files changed, 334 insertions(+), 14 deletions(-) create mode 100644 src/main/dataProcess.ts diff --git a/electron.vite.config.ts b/electron.vite.config.ts index 30dfbc4..ebe3258 100644 --- a/electron.vite.config.ts +++ b/electron.vite.config.ts @@ -10,7 +10,7 @@ import { FileSystemIconLoader } from 'unplugin-icons/loaders' export default defineConfig({ main: { - plugins: [externalizeDepsPlugin()] + plugins: [externalizeDepsPlugin({ exclude: ['electron-store'] })] }, preload: { plugins: [externalizeDepsPlugin()] diff --git a/package-lock.json b/package-lock.json index 7512c27..c2cd92e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@electron-toolkit/preload": "^3.0.1", "@electron-toolkit/utils": "^3.0.0", + "electron-store": "^9.0.0", "electron-updater": "^6.1.8" }, "devDependencies": { @@ -2916,6 +2917,42 @@ "uri-js": "^4.2.2" } }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -3407,6 +3444,15 @@ "node": ">= 4.0.0" } }, + "node_modules/atomically": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-2.0.3.tgz", + "integrity": "sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==", + "dependencies": { + "stubborn-fs": "^1.2.5", + "when-exit": "^2.1.1" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -4065,6 +4111,70 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/conf": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-12.0.0.tgz", + "integrity": "sha512-fIWyWUXrJ45cHCIQX+Ck1hrZDIf/9DR0P0Zewn3uNht28hbt5OfGUq8rRWsxi96pZWPyBEd0eY9ama01JTaknA==", + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "atomically": "^2.0.2", + "debounce-fn": "^5.1.2", + "dot-prop": "^8.0.2", + "env-paths": "^3.0.0", + "json-schema-typed": "^8.0.1", + "semver": "^7.5.4", + "uint8array-extras": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conf/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/conf/node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conf/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/conf/node_modules/semver": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", + "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/confbox": { "version": "0.1.7", "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.7.tgz", @@ -4312,6 +4422,31 @@ "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==", "dev": true }, + "node_modules/debounce-fn": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-5.1.2.tgz", + "integrity": "sha512-Sr4SdOZ4vw6eQDvPYNxHogvrxmCIld/VenC5JbNrFwMiwd7lY/Z18ZFfo+EWNG4DD9nFlAujWAo/wGuOPHmy5A==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debounce-fn/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", @@ -4588,6 +4723,31 @@ "tslib": "^2.0.3" } }, + "node_modules/dot-prop": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-8.0.2.tgz", + "integrity": "sha512-xaBe6ZT4DHPkg0k4Ytbvn5xoxgpG0jOS1dYxSOwAHPuNLjP3/OzN0gH55SrLqpx8cBfSaVt91lXYkApjb+nYdQ==", + "dependencies": { + "type-fest": "^3.8.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/dotenv": { "version": "9.0.2", "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-9.0.2.tgz", @@ -4947,6 +5107,32 @@ "node": ">= 10.0.0" } }, + "node_modules/electron-store": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-9.0.0.tgz", + "integrity": "sha512-7LZ2dR3N3bF93G2c4x+1NZ/8fpsKv6bKrMxeOQWLqdRbxvopxVqy9QXQy9axSV2O3P1kVGTj1q2wq5/W4isiOg==", + "dependencies": { + "conf": "^12.0.0", + "type-fest": "^4.18.1" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-store/node_modules/type-fest": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz", + "integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.752", "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.752.tgz", @@ -6019,8 +6205,7 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-diff": { "version": "1.3.0", @@ -7507,6 +7692,11 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/json-schema-typed": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.1.tgz", + "integrity": "sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg==" + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -8726,7 +8916,6 @@ "version": "2.3.1", "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "engines": { "node": ">=6" } @@ -9707,8 +9896,6 @@ "version": "2.0.2", "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -10457,6 +10644,11 @@ "acorn": "^8.10.0" } }, + "node_modules/stubborn-fs": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/stubborn-fs/-/stubborn-fs-1.2.5.tgz", + "integrity": "sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==" + }, "node_modules/style-search": { "version": "0.1.0", "resolved": "https://registry.npmmirror.com/style-search/-/style-search-0.1.0.tgz", @@ -11119,6 +11311,17 @@ "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", "dev": true }, + "node_modules/uint8array-extras": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-0.3.0.tgz", + "integrity": "sha512-erJsJwQ0tKdwuqI0359U8ijkFmfiTcq25JvvzRVc1VP+2son1NJRXhxcAKJmAW3ajM8JSGAfsAXye8g4s+znxA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -11288,7 +11491,6 @@ "version": "4.4.1", "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -11886,6 +12088,11 @@ "node": ">=18" } }, + "node_modules/when-exit": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.2.tgz", + "integrity": "sha512-u9J+toaf3CCxCAzM/484qNAxQE75rFdVgiFEEV8Xps2gzYhf0tx73s1WXDQhkwV17E3MxRMz40m7Ekd2/121Lg==" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index eb056eb..db86cea 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "format": "prettier --write .", "lint": "eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix", "typecheck": "tsc", + "clean": "rimraf out .eslintrc-auto-import.json src/renderer/auto-imports.d.ts", "start": "electron-vite preview", "build": "electron-vite build && npm run typecheck", "build-test": "electron-vite build --mode testing && npm run typecheck", @@ -26,6 +27,7 @@ "dependencies": { "@electron-toolkit/preload": "^3.0.1", "@electron-toolkit/utils": "^3.0.0", + "electron-store": "^9.0.0", "electron-updater": "^6.1.8" }, "devDependencies": { diff --git a/src/main/dataProcess.ts b/src/main/dataProcess.ts new file mode 100644 index 0000000..b39f873 --- /dev/null +++ b/src/main/dataProcess.ts @@ -0,0 +1,21 @@ +import Store, { Schema } from 'electron-store' +import { ipcMain } from 'electron' + +const schema: Schema = { + installedTools: { + default: [] + } +} + +const store = new Store({ schema }) + +ipcMain.handle('store:installTool', (_, value: Record>) => { + const installedTools = store.get('installedTools') + + store.set('installedTools', { ...installedTools, ...value }) + return store.get('installedTools') +}) + +ipcMain.handle('store:getInstalledTool', () => { + return store.get('installedTools') +}) diff --git a/src/main/global.d.ts b/src/main/global.d.ts index 3c22eaa..33ed138 100644 --- a/src/main/global.d.ts +++ b/src/main/global.d.ts @@ -11,3 +11,81 @@ interface ImportMetaEnv { interface ImportMeta { readonly env: ImportMetaEnv } + +interface StoreSchema { + installedTools: Record> +} + +interface ToolVo { + id: string + name: string + toolId: string + icon: string + platform: Platform + description: string + base: ToolBaseVo + author: UserWithInfoVo + ver: string + keywords: string[] + categories: ToolCategoryVo[] + source: ToolDataVo + dist: ToolDataVo + entryPoint: string + publish: string + review: 'NONE' | 'PROCESSING' | 'PASS' | 'REJECT' + createTime: string + updateTime: string + favorite: boolean +} + +interface ToolBaseVo { + id: string + name: string + source: ToolDataVo + dist: ToolDataVo + platform: Platform + compiled: boolean + createTime: string + updateTime: string +} + +interface ToolDataVo { + id: string + data?: string + createTime?: string + updateTime?: string +} + +interface UserWithInfoVo { + id: string + username: string + twoFactor: boolean + verified: boolean + locking: boolean + expiration: string + credentialsExpiration: string + enable: boolean + currentLoginTime: string + currentLoginIp: string + lastLoginTime: string + lastLoginIp: string + createTime: string + updateTime: string + userInfo: UserInfoVo +} + +interface UserInfoVo { + id: string + userId: string + nickname: string + avatar: string + email: string +} + +interface ToolCategoryVo { + id: string + name: string + enable: boolean + createTime: string + updateTime: string +} diff --git a/src/main/index.ts b/src/main/index.ts index b29d785..c872b16 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -50,7 +50,7 @@ app.on('open-url', (_, argv) => { handleUrl(argv) }) -function createWindow(): void { +const createWindow = () => { // Create the browser window. mainWindow = new BrowserWindow({ width: 900, @@ -120,3 +120,4 @@ app.on('window-all-closed', () => { // In this file you can include the rest of your app's specific main process // code. You can also put them in separate files and require them here. +import './dataProcess' diff --git a/src/preload/index.ts b/src/preload/index.ts index f4c7828..193686d 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -1,8 +1,12 @@ -import { contextBridge, Notification } from 'electron' +import { contextBridge, Notification, ipcRenderer } from 'electron' import { electronAPI } from '@electron-toolkit/preload' // Custom APIs for renderer -const api = {} +const api = { + installTool: (newTools: Record>) => + ipcRenderer.invoke('store:installTool', newTools), + getInstalledTool: () => ipcRenderer.invoke('store:getInstalledTool') +} // Use `contextBridge` APIs to expose Electron APIs to // renderer only if context isolation is enabled, otherwise diff --git a/src/renderer/src/electron.d.ts b/src/renderer/src/electron.d.ts index c8c1689..3531fa4 100644 --- a/src/renderer/src/electron.d.ts +++ b/src/renderer/src/electron.d.ts @@ -1,8 +1,14 @@ -import { ElectronAPI } from "@electron-toolkit/preload"; -import { Notification } from "electron"; +import { ElectronAPI } from '@electron-toolkit/preload' +import { Notification } from 'electron' declare global { - type _ElectronAPI = ElectronAPI + type _ElectronAPI = ElectronAPI - class _Notification extends Notification {} + class _Notification extends Notification {} + + interface API { + installTool: ( + newTools: Record> + ) => Promise>> + } } diff --git a/src/renderer/src/global.d.ts b/src/renderer/src/global.d.ts index cc18d1b..6adf1b3 100644 --- a/src/renderer/src/global.d.ts +++ b/src/renderer/src/global.d.ts @@ -19,6 +19,7 @@ interface ImportMeta { interface Window { electronAPI: _ElectronAPI Notification: typeof _Notification + api: API } interface RouteJsonObject {