Compare commits

..

16 Commits

Author SHA1 Message Date
muwoo
d916525934 支持 asar gz 包发布 2023-11-15 11:07:20 +08:00
muwoo
7d4ccb83a2 尝试单独构建 asar 包 2023-11-14 18:17:47 +08:00
muwoo
36c2a714b5 尝试单独构建 asar 包 2023-11-14 18:11:15 +08:00
muwoo
696c24657b 尝试单独构建 asar 包 #300 2023-11-14 18:08:59 +08:00
muwoo
f59069b2ec 尝试单独构建 asar 包 #300 2023-11-14 18:07:22 +08:00
muwoo
0c16139313 尝试单独构建 asar 包 #300 2023-11-14 17:33:14 +08:00
muwoo
c99ec18151 尝试单独构建 asar 包 #300 2023-11-14 17:13:15 +08:00
muwoo
dcea66e848 尝试单独构建 asar 包 #300 2023-11-14 16:52:08 +08:00
muwoo
75e3111587 📝 Writing docs. 2023-11-14 11:41:36 +08:00
muwoo
bd1757e068 📝 Writing docs. 2023-11-14 11:37:53 +08:00
muwoo
2055bf61b1 🐛 修复插件市场插件详情页点击下载无反应的bug 2023-11-13 14:15:04 +08:00
muwoo
6c096fcd99 ♻️ 优化搜索内容排序,修复setSubInput 无法触发 inputChange bug 2023-11-13 11:40:35 +08:00
muwoo
1656418c10 🐛 fix #289,#291,#290 2023-11-10 15:00:26 +08:00
muwoo
f671b83b6a 🐛 fix #289,#291,#290 2023-11-10 14:35:37 +08:00
muwoo
dfb8446cfd 🐛 windows 启动bug 2023-11-03 13:59:29 +08:00
muwoo
4e59294b16 🐛 修复超级面板设置bug 2023-11-03 11:28:38 +08:00
29 changed files with 517 additions and 149 deletions

View File

@@ -27,6 +27,10 @@ jobs:
# create steps # create steps
steps: steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
python-version: '3.10'
# step1: check out repository # step1: check out repository
- name: Check out git repository - name: Check out git repository
uses: actions/checkout@v2 uses: actions/checkout@v2

View File

@@ -27,20 +27,29 @@ English | [简体中文](./README.zh-CN.md)
</a> </a>
</div> </div>
An open-source toolbox based on Electron, freely integrating rich plugins to create the ultimate desktop productivity tool. Rubick is one of the heroes in Dota, whose core skill is the ability to use the skills of other heroes through plugins, and then move on. This aligns perfectly with the design philosophy of this tool, which is why it is named Rubick. <div align= "center">
<img align="center" src="https://picx.zhimg.com/80/v2-f8fe09ef125dac5fdcbef3fe00f92b21_720w.png" />
</div>
## Sponsor Open-source plugin-based desktop efficiency toolbox. The plugins are installed and uninstalled based on npm, which is very lightweight. The plugin data supports webdav multi-terminal synchronization, which is very secure. It supports internal network deployment and can be customized for further development, which is very flexible.
我们通过有偿的方式积累高质量的常见问题、最佳实践文档,加入星球后可以和作者进行互动和答疑。我们提供技术支持、答疑解惑、定制化插件开发、二次定制化开发 rubick 等等官方服务。
权益明细可以参考文档:[权益明细](https://rubickcenter.github.io/rubick/super/) ## Get Rubick
Download the latest release:
<img width=400 src=https://picx.zhimg.com/80/v2-6deabf65175d18080439ef813102d18c_720w.png />
## Installation package
* [Rubick Mac OS](https://github.com/rubickCenter/rubick/releases) * [Rubick Mac OS](https://github.com/rubickCenter/rubick/releases)
* [Rubick Windows](https://github.com/rubickCenter/rubick/releases) * [Rubick Windows](https://github.com/rubickCenter/rubick/releases)
* [Rubick Linux](https://github.com/rubickCenter/rubick/releases) * [Rubick Linux](https://github.com/rubickCenter/rubick/releases)
## Docs
[Rubick website](https://rubick.vip)
[Rubick Docs](https://rubickCenter.github.io/docs/)
## How To Use Rubick
After installing rubick, you can quickly launch the main program by pressing the shortcut keys Alt/Option+R. Entering keywords in the main program input box can search for corresponding apps, plugins, files...
Select the ones you want and use them.
If you don't want the function, you can click the logo on the left to enter the plugin market and find the ones you want to install.
## Feature list ## Feature list
- [x] Plugin management based on the npm package pattern, installing plugins is as simple as installing npm packages. - [x] Plugin management based on the npm package pattern, installing plugins is as simple as installing npm packages.
@@ -50,13 +59,6 @@ An open-source toolbox based on Electron, freely integrating rich plugins to cre
- [x] Supports enterprise-level intranet deployment. - [x] Supports enterprise-level intranet deployment.
- [x] Supports multiple languages. - [x] Supports multiple languages.
## Docs
[Rubick website](https://rubick.vip)
[Rubick Docs](https://rubickCenter.github.io/rubick/)
## Core functionality showcase. ## Core functionality showcase.
### 1. Search system application ### 1. Search system application
Support pinyin and abbreviations to search system applications Support pinyin and abbreviations to search system applications
@@ -81,17 +83,34 @@ In "Rubick," search for "Preferences," go to "Account and Settings," and then se
![](https://pic1.zhimg.com/80/v2-ff85793741e4dff82a729d3eb3d41551_720w.png) ![](https://pic1.zhimg.com/80/v2-ff85793741e4dff82a729d3eb3d41551_720w.png)
### More features ## Related Repositories
If you need more features, please come here to give us suggestions[issues](https://github.com/rubickCenter/rubick/issues) 。
We will add valuable ideas to the later development. At the same time, welcome to join and build together。
## 贡献 [Rubick Plugins Repositories](https://gitee.com/rubick-center)
This project exists thanks to all the people who contribute. [[Contribute](https://github.com/rubickCenter/rubick/graphs/contributors)]. <a href="https://github.com/rubickCenter/rubick/graphs/contributors"><img src="https://opencollective.com/rubick/contributors.svg?width=890&button=false" /></a>
## 反馈 [Rubick Plugins Database](https://gitcode.net/rubickcenter/rubick-database)
对本项目有兴趣或者想要交流学习的同学可以扫码加下面的微信,备注 rubick帮助我们更好的成长
[Rubick Plugin CLI](https://github.com/rubickCenter/rubick-plugin-cli)
## Sponsor
### 1. Join the Knowledge Planet
We have accumulated a lot of knowledge and common issues about rubick on the Knowledge Planet. You can pay to join our knowledge community to discuss with us. We will answer at any time!
<img width=400 src=https://picx.zhimg.com/80/v2-6deabf65175d18080439ef813102d18c_720w.png />
### 2. Buy me a cup of coffee
If the project is helpful to you, you can buy me a cup of coffee as a reward!
<div align= "left">
<img width="180" src="https://picx.zhimg.com/80/v2-911d249dc454f3460451a4e1ecceeb14_720w.png">
<img width="180" src="https://picx.zhimg.com/80/v2-3160247d6099053405e6cd2cb6afb5e5_720w.png">
</div>
## Feedback
Those who are interested in this project or want to exchange and learn can scan the QR code and add the following WeChat, with the comment rubick, to help us grow better.
![image](https://user-images.githubusercontent.com/21073039/127327603-9796f246-ee4b-4950-a69d-ce3205ec9569.png) ![image](https://user-images.githubusercontent.com/21073039/127327603-9796f246-ee4b-4950-a69d-ce3205ec9569.png)
## Contribute
This project exists thanks to all the people who contribute. [[Contribute](https://github.com/rubickCenter/rubick/graphs/contributors)]. <a href="https://github.com/rubickCenter/rubick/graphs/contributors"><img src="https://opencollective.com/rubick/contributors.svg?width=890&button=false" /></a>
## License ## License
This project is licensed under the MIT License - see the [LICENSE](https://github.com/rubickCenter/rubick/blob/master/LICENSE) file for details. This project is licensed under the MIT License - see the [LICENSE](https://github.com/rubickCenter/rubick/blob/master/LICENSE) file for details.

View File

@@ -27,21 +27,29 @@
</a> </a>
</div> </div>
<div align= "center">
<img align="center" src="https://picx.zhimg.com/80/v2-f8fe09ef125dac5fdcbef3fe00f92b21_720w.png" />
</div>
基于 electron 的开源工具箱,自由集成丰富插件,打造极致的桌面端效工具。Rubick(拉比克) 是 dota 里面的英雄之一,其核心技能是插件化使用其他英雄的技能,用完即走。非常符合本工具的设计理念,所以取名 Rubick 开源的插件化桌面端效工具箱。插件是基于 npm 进行安装和卸载,非常轻便。插件数据支持 webdav 多端同步,非常安全。支持内网部署,可二次定制化开发,非常灵活
## 赞助和服务 ## 获取 rubick
我们通过有偿的方式积累高质量的常见问题、最佳实践文档,加入星球后可以和作者进行互动和答疑。我们提供技术支持、答疑解惑、定制化插件开发、二次定制化开发 rubick 等等官方服务。 下载最新的安装包:
权益明细可以参考文档:[权益明细](https://rubickcenter.github.io/rubick/super/)
<img width=400 src=https://picx.zhimg.com/80/v2-6deabf65175d18080439ef813102d18c_720w.png />
## 安装包
* [Rubick Mac OS](https://github.com/rubickCenter/rubick/releases) * [Rubick Mac OS](https://github.com/rubickCenter/rubick/releases)
* [Rubick Windows](https://github.com/rubickCenter/rubick/releases) * [Rubick Windows](https://github.com/rubickCenter/rubick/releases)
* [Rubick Linux](https://github.com/rubickCenter/rubick/releases) * [Rubick Linux](https://github.com/rubickCenter/rubick/releases)
## 使用文档
[Rubick 官网](https://rubick.vip)
[Rubick Docs](https://rubickCenter.github.io/rubick/)
## 如何使用 rubick
安装完成 rubick 后,可以通过快捷键 Alt/Option+R 可以快速呼起主程序。主程序输入框内输入关键词可以搜索出对应的 App、插件、文件... 选择即可使用。如果没有想要的功能,可以点击左侧的 logo 进入插件市场寻找自己想要的插件进行安装。
## 支持能力 ## 支持能力
- [x] 基于 npm 包模式的插件管理,安装插件和安装 npm 包一样简单 - [x] 基于 npm 包模式的插件管理,安装插件和安装 npm 包一样简单
- [x] 支持 webdav 多端数据同步,真正的数据安全同步 - [x] 支持 webdav 多端数据同步,真正的数据安全同步
@@ -50,12 +58,6 @@
- [x] 支持企业化内网部署 - [x] 支持企业化内网部署
- [x] 支持多语言 - [x] 支持多语言
## 使用文档
[Rubick 官网](https://rubick.vip)
[Rubick Docs](https://rubickCenter.github.io/rubick/)
## 核心功能展示 ## 核心功能展示
### 1. 搜索系统应用 ### 1. 搜索系统应用
@@ -81,18 +83,36 @@
![](https://pic1.zhimg.com/80/v2-ff85793741e4dff82a729d3eb3d41551_720w.png) ![](https://pic1.zhimg.com/80/v2-ff85793741e4dff82a729d3eb3d41551_720w.png)
### 更多功能 ## 关联仓库
如果您还需要更多功能,欢迎来这里给我们提建议:[issues](https://github.com/rubickCenter/rubick/issues) 。
有价值的想法我们会加入到后期的开发当中。同时也欢迎一起加入共建。
## 贡献 [Rubick 插件仓库](https://gitee.com/rubick-center)
This project exists thanks to all the people who contribute. [[Contribute](https://github.com/rubickCenter/rubick/graphs/contributors)]. <a href="https://github.com/rubickCenter/rubick/graphs/contributors"><img src="https://opencollective.com/rubick/contributors.svg?width=890&button=false" /></a>
[Rubick 插件数据库](https://gitcode.net/rubickcenter/rubick-database)
[Rubick Plugin CLI](https://github.com/rubickCenter/rubick-plugin-cli)
## 赞助
### 1. 加入知识星球
我们在知识星球积累了大量的关于 rubick 的知识和常见问题,您可以付费加入我们的知识星球来一起讨论。我们将随时解答!
<img width=400 src=https://picx.zhimg.com/80/v2-6deabf65175d18080439ef813102d18c_720w.png />
### 2. 打赏喝杯咖啡
如果项目对你有帮助,可以请我喝杯咖啡赞赏!
<div align= "left">
<img width="180" src="https://picx.zhimg.com/80/v2-911d249dc454f3460451a4e1ecceeb14_720w.png">
<img width="180" src="https://picx.zhimg.com/80/v2-3160247d6099053405e6cd2cb6afb5e5_720w.png">
</div>
## 反馈 ## 反馈
对本项目有兴趣或者想要交流学习的同学可以扫码加下面的微信,备注 rubick帮助我们更好的成长 对本项目有兴趣或者想要交流学习的同学可以扫码加下面的微信,备注 rubick帮助我们更好的成长
![image](https://user-images.githubusercontent.com/21073039/127327603-9796f246-ee4b-4950-a69d-ce3205ec9569.png) ![image](https://user-images.githubusercontent.com/21073039/127327603-9796f246-ee4b-4950-a69d-ce3205ec9569.png)
## 贡献
This project exists thanks to all the people who contribute. [[Contribute](https://github.com/rubickCenter/rubick/graphs/contributors)]. <a href="https://github.com/rubickCenter/rubick/graphs/contributors"><img src="https://opencollective.com/rubick/contributors.svg?width=890&button=false" /></a>
## License ## License
This project is licensed under the MIT License - see the [LICENSE](https://github.com/rubickCenter/rubick/blob/master/LICENSE) file for details. This project is licensed under the MIT License - see the [LICENSE](https://github.com/rubickCenter/rubick/blob/master/LICENSE) file for details.

View File

@@ -18,7 +18,7 @@
"code": "installed", "code": "installed",
"explain": "已安装插件", "explain": "已安装插件",
"cmds":[ "cmds":[
"已安装插件" "已安装插件", "installed"
] ]
},{ },{
"code": "settings", "code": "settings",

View File

@@ -108,6 +108,7 @@ const changeMenu = (key: any) => {
}; };
window.rubick.onPluginEnter(({ code }: { code: string }) => { window.rubick.onPluginEnter(({ code }: { code: string }) => {
code = code === '已安装插件' ? 'installed' : code;
changeMenu(code); changeMenu(code);
store.commit('commonUpdate', {active: [code]}) store.commit('commonUpdate', {active: [code]})
}); });

Binary file not shown.

After

Width:  |  Height:  |  Size: 845 B

View File

@@ -33,6 +33,12 @@ import localConfig from './confOp';
const config: any = localConfig.getConfig(); const config: any = localConfig.getConfig();
// 暗夜模式
if (config.perf.common.darkMode) {
document.body.classList.add('dark');
window.rubick.theme = 'dark';
}
ConfigProvider.config({ ConfigProvider.config({
theme: config.perf.custom || {}, theme: config.perf.custom || {},
}); });

View File

@@ -185,7 +185,8 @@ const addCmdToSuperPanel = ({ cmd, code }) => {
}, },
}; };
superPanelPlugins.value.data.push(plugin); superPanelPlugins.value.data.push(plugin);
window.rubick.db.put(toRaw(superPanelPlugins.value)); const { rev } = window.rubick.db.put(JSON.parse(JSON.stringify(superPanelPlugins.value)));
superPanelPlugins.value._rev = rev;
}; };
const removePluginToSuperPanel = ({ cmd, name }) => { const removePluginToSuperPanel = ({ cmd, name }) => {
@@ -195,7 +196,8 @@ const removePluginToSuperPanel = ({ cmd, name }) => {
return item.cmd !== cmd; return item.cmd !== cmd;
} }
); );
window.rubick.db.put(toRaw(superPanelPlugins.value)); const { rev } = window.rubick.db.put(toRaw(superPanelPlugins.value));
superPanelPlugins.value._rev = rev;
}; };
const hasAdded = (cmd) => { const hasAdded = (cmd) => {

View File

@@ -7,7 +7,7 @@
:data-source="list.filter((item) => !!item)" :data-source="list.filter((item) => !!item)"
> >
<template #renderItem="{ item, index }"> <template #renderItem="{ item, index }">
<a-list-item v-if="item" @click="showDetail(item)"> <a-list-item v-if="item" @click="showDetail(index)">
<template #actions> <template #actions>
<a-button <a-button
class="download-plugin-btn" class="download-plugin-btn"
@@ -105,7 +105,7 @@ import {
SelectOutlined SelectOutlined
} from '@ant-design/icons-vue'; } from '@ant-design/icons-vue';
import { defineProps, ref } from 'vue'; import { defineProps, ref, computed } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import { message } from 'ant-design-vue'; import { message } from 'ant-design-vue';
import MarkdownIt from 'markdown-it'; import MarkdownIt from 'markdown-it';
@@ -121,7 +121,7 @@ const router = useRouter();
const startDownload = (name) => store.dispatch('startDownload', name); const startDownload = (name) => store.dispatch('startDownload', name);
const successDownload = (name) => store.dispatch('successDownload', name); const successDownload = (name) => store.dispatch('successDownload', name);
defineProps({ const props = defineProps({
list: { list: {
type: [Array], type: [Array],
default: () => [], default: () => [],
@@ -137,13 +137,14 @@ const downloadPlugin = async (plugin) => {
}; };
const visible = ref(false); const visible = ref(false);
const detail = ref({}); const showIndex = ref(0);
const markdown = new MarkdownIt(); const markdown = new MarkdownIt();
const content = ref(''); const content = ref('');
const showDetail = async (item) => { const showDetail = async (index) => {
const item = props.list[index];
visible.value = true; visible.value = true;
detail.value = item; showIndex.value = index;
content.value = ''; content.value = '';
let mdContent = '暂无内容'; let mdContent = '暂无内容';
try { try {
@@ -156,6 +157,8 @@ const showDetail = async (item) => {
} }
}; };
const detail = computed(() => props.list[showIndex.value]);
const openPlugin = (item) => { const openPlugin = (item) => {
store.commit('commonUpdate', {active: ['installed']}) store.commit('commonUpdate', {active: ['installed']})
router.push({ router.push({

View File

@@ -1,6 +1,6 @@
{ {
"name": "rubick", "name": "rubick",
"version": "4.1.3", "version": "4.1.6",
"author": "muwoo <2424880409@qq.com>", "author": "muwoo <2424880409@qq.com>",
"private": true, "private": true,
"scripts": { "scripts": {
@@ -30,7 +30,7 @@
"fix-path": "^3.0.0", "fix-path": "^3.0.0",
"get-mac-apps": "^1.0.2", "get-mac-apps": "^1.0.2",
"got": "^11.8.3", "got": "^11.8.3",
"lodash.throttle": "^4.1.1", "lodash.debounce": "^4.0.8",
"memorystream": "^0.3.1", "memorystream": "^0.3.1",
"node-key-sender": "^1.0.11", "node-key-sender": "^1.0.11",
"npm": "6.14.7", "npm": "6.14.7",
@@ -46,6 +46,7 @@
"worker-loader": "^3.0.8" "worker-loader": "^3.0.8"
}, },
"devDependencies": { "devDependencies": {
"@electron/asar": "^3.2.8",
"@ts-type/package-dts": "^1.0.53", "@ts-type/package-dts": "^1.0.53",
"@types/electron-devtools-installer": "^2.2.0", "@types/electron-devtools-installer": "^2.2.0",
"@typescript-eslint/eslint-plugin": "^4.18.0", "@typescript-eslint/eslint-plugin": "^4.18.0",
@@ -60,6 +61,7 @@
"@vue/eslint-config-prettier": "^6.0.0", "@vue/eslint-config-prettier": "^6.0.0",
"@vue/eslint-config-typescript": "^7.0.0", "@vue/eslint-config-typescript": "^7.0.0",
"babel-plugin-import": "^1.13.3", "babel-plugin-import": "^1.13.3",
"compressing": "^1.10.0",
"electron": "26.0.0", "electron": "26.0.0",
"electron-builder": "22.13.1", "electron-builder": "22.13.1",
"electron-devtools-installer": "^3.1.0", "electron-devtools-installer": "^3.1.0",

View File

@@ -18,7 +18,7 @@
"code": "installed", "code": "installed",
"explain": "已安装插件", "explain": "已安装插件",
"cmds":[ "cmds":[
"已安装插件" "已安装插件", "installed"
] ]
},{ },{
"code": "settings", "code": "settings",

BIN
public/icons/delete@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 845 B

BIN
public/icons/pin@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 830 B

BIN
public/icons/unpin@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 747 B

View File

@@ -49,6 +49,10 @@ window.rubick = {
showOpenDialog(options) { showOpenDialog(options) {
return ipcSendSync('showOpenDialog', options); return ipcSendSync('showOpenDialog', options);
}, },
showSaveDialog(options) {
return ipcSendSync('showSaveDialog', options);
},
setExpendHeight(height) { setExpendHeight(height) {
ipcSendSync('setExpendHeight', height); ipcSendSync('setExpendHeight', height);
}, },

9
release.js Normal file
View File

@@ -0,0 +1,9 @@
exports.default = async function () {
const fs = require('fs');
const compressing = require('compressing');
const src = './build/mac/rubick.app/Contents/Resources/app.asar';
if (fs.existsSync(src)) {
await compressing.gzip.compressFile(src, 'build/app.asar.gz');
}
};

View File

@@ -1,4 +1,4 @@
export const WINDOW_WIDTH = 688; export const WINDOW_WIDTH = 800;
export const WINDOW_HEIGHT = 60; export const WINDOW_HEIGHT = 60;
export const WINDOW_PLUGIN_HEIGHT = 600; export const WINDOW_PLUGIN_HEIGHT = 600;

View File

@@ -4,5 +4,6 @@ import path from 'path';
const appPath = app.getPath('userData'); const appPath = app.getPath('userData');
const PLUGIN_INSTALL_DIR = path.join(appPath, './rubick-plugins-new'); const PLUGIN_INSTALL_DIR = path.join(appPath, './rubick-plugins-new');
const PLUGIN_HISTORY = 'rubick-local-start-app';
export { PLUGIN_INSTALL_DIR }; export { PLUGIN_INSTALL_DIR, PLUGIN_HISTORY };

View File

@@ -9,7 +9,8 @@ const useDrag = () => {
let draggable = true; let draggable = true;
const onMouseDown = (e) => { const onMouseDown = (e) => {
// if (commonConst.macOS()) return; // 右击不移动
if (e.button === 2) return;
draggable = true; draggable = true;
mouseX = e.clientX; mouseX = e.clientX;
mouseY = e.clientY; mouseY = e.clientY;

View File

@@ -1,6 +1,6 @@
const WINDOW_MAX_HEIGHT = 600; const WINDOW_MAX_HEIGHT = 620;
const WINDOW_MIN_HEIGHT = 60; const WINDOW_MIN_HEIGHT = 60;
const PRE_ITEM_HEIGHT = 60; const PRE_ITEM_HEIGHT = 70;
const HISTORY_HEIGHT = 70; const HISTORY_HEIGHT = 70;
export default (searchList: Array<any>, historyList): number => { export default (searchList: Array<any>, historyList): number => {

View File

@@ -1,12 +1,8 @@
import fs from 'fs'; import fs from 'fs';
import path from 'path'; import path from 'path';
import os from 'os'; import os from 'os';
import translate from './translate';
import { shell } from 'electron'; import { shell } from 'electron';
// eslint-disable-next-line @typescript-eslint/no-var-requires
const fileIcon = require('extract-file-icon');
const filePath = path.resolve( const filePath = path.resolve(
'C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs' 'C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs'
); );
@@ -29,6 +25,8 @@ if (!exists) {
const getico = (app) => { const getico = (app) => {
try { try {
// eslint-disable-next-line @typescript-eslint/no-var-requires
const fileIcon = require('extract-file-icon');
const buffer = fileIcon(app.desc, 32); const buffer = fileIcon(app.desc, 32);
const iconpath = path.join(icondir, `${app.name}.png`); const iconpath = path.join(icondir, `${app.name}.png`);

View File

@@ -26,6 +26,7 @@ import { runner, detach } from '../browsers';
import DBInstance from './db'; import DBInstance from './db';
import getWinPosition from './getWinPosition'; import getWinPosition from './getWinPosition';
import path from 'path'; import path from 'path';
import commonConst from '@/common/utils/commonConst';
const runnerInstance = runner(); const runnerInstance = runner();
const detachInstance = detach(); const detachInstance = detach();
@@ -97,7 +98,12 @@ class API extends DBInstance {
? 'http://localhost:8083/#/' ? 'http://localhost:8083/#/'
: `file://${__static}/tpl/index.html`; : `file://${__static}/tpl/index.html`;
} }
if (!plugin.indexPath) { if (plugin.name === 'rubick-system-feature') {
plugin.logo = plugin.logo || `file://${__static}/logo.png`;
plugin.indexPath = commonConst.dev()
? 'http://localhost:8081/#/'
: `file://${__static}/feature/index.html`;
} else if (!plugin.indexPath) {
const pluginPath = path.resolve(baseDir, 'node_modules', plugin.name); const pluginPath = path.resolve(baseDir, 'node_modules', plugin.name);
plugin.indexPath = `file://${path.join( plugin.indexPath = `file://${path.join(
pluginPath, pluginPath,
@@ -133,7 +139,6 @@ class API extends DBInstance {
public hideMainWindow(arg, window) { public hideMainWindow(arg, window) {
window.hide(); window.hide();
} }
public showMainWindow(arg, window) { public showMainWindow(arg, window) {
window.show(); window.show();
} }
@@ -142,6 +147,10 @@ class API extends DBInstance {
return dialog.showOpenDialogSync(window, data); return dialog.showOpenDialogSync(window, data);
} }
public showSaveDialog({ data }, window) {
return dialog.showSaveDialogSync(window, data);
}
public setExpendHeight({ data: height }, window: BrowserWindow, e) { public setExpendHeight({ data: height }, window: BrowserWindow, e) {
const originWindow = this.getCurrentWindow(window, e); const originWindow = this.getCurrentWindow(window, e);
if (!originWindow) return; if (!originWindow) return;
@@ -181,6 +190,7 @@ class API extends DBInstance {
value: data.text, value: data.text,
})})` })})`
); );
this.sendSubInputChangeEvent({ data });
} }
public getPath({ data }) { public getPath({ data }) {

View File

@@ -15,10 +15,12 @@ const registerHotKey = (mainWindow: BrowserWindow): void => {
// 设置开机启动 // 设置开机启动
const setAutoLogin = async () => { const setAutoLogin = async () => {
const config = await localConfig.getConfig(); const config = await localConfig.getConfig();
app.setLoginItemSettings({ if (app.getLoginItemSettings().openAtLogin !== config.perf.common.start) {
openAtLogin: config.perf.common.start, app.setLoginItemSettings({
openAsHidden: true, openAtLogin: config.perf.common.start,
}); openAsHidden: true,
});
}
}; };
const setTheme = async () => { const setTheme = async () => {
@@ -86,10 +88,6 @@ const registerHotKey = (mainWindow: BrowserWindow): void => {
}); });
}); });
// globalShortcut.register(config.perf.shortCut.separate, () => {
//
// });
globalShortcut.register(config.perf.shortCut.quit, () => { globalShortcut.register(config.perf.shortCut.quit, () => {
// mainWindow.webContents.send('init-rubick'); // mainWindow.webContents.send('init-rubick');
// mainWindow.show(); // mainWindow.show();

View File

@@ -27,18 +27,22 @@
:currentSelect="currentSelect" :currentSelect="currentSelect"
:options="options" :options="options"
:clipboardFile="clipboardFile || []" :clipboardFile="clipboardFile || []"
@setPluginHistory="setPluginHistory"
@choosePlugin="choosePlugin"
/> />
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { watch, ref, nextTick, toRaw } from 'vue'; import { watch, ref, toRaw } from 'vue';
import { ipcRenderer } from 'electron';
import Result from './components/result.vue'; import Result from './components/result.vue';
import Search from './components/search.vue'; import Search from './components/search.vue';
import getWindowHeight from '../common/utils/getWindowHeight'; import getWindowHeight from '../common/utils/getWindowHeight';
import createPluginManager from './plugins-manager'; import createPluginManager from './plugins-manager';
import useDrag from '../common/utils/dragWindow'; import useDrag from '../common/utils/dragWindow';
import { getGlobal } from '@electron/remote';
import { PLUGIN_HISTORY } from '@/common/constans/renderer';
import { message } from 'ant-design-vue';
const { onMouseDown } = useDrag(); const { onMouseDown } = useDrag();
const remote = window.require('@electron/remote'); const remote = window.require('@electron/remote');
@@ -60,6 +64,8 @@ const {
clearClipboardFile, clearClipboardFile,
readClipboardContent, readClipboardContent,
pluginHistory, pluginHistory,
setPluginHistory,
changePluginHistory,
} = createPluginManager(); } = createPluginManager();
initPlugins(); initPlugins();
@@ -76,19 +82,22 @@ getPluginInfo({
remote.getGlobal('LOCAL_PLUGINS').addPlugin(res); remote.getGlobal('LOCAL_PLUGINS').addPlugin(res);
}); });
watch([options, pluginHistory, currentPlugin], () => { watch(
currentSelect.value = 0; [options, pluginHistory, currentPlugin],
if (currentPlugin.value.name) return; () => {
nextTick(() => { currentSelect.value = 0;
ipcRenderer.sendSync('msg-trigger', { if (currentPlugin.value.name) return;
type: 'setExpendHeight', window.rubick.setExpendHeight(
data: getWindowHeight( getWindowHeight(
options.value, options.value,
(pluginLoading.value) ? [] : pluginHistory.value pluginLoading.value ? [] : pluginHistory.value
), )
}); );
}); },
}); {
immediate: true,
}
);
const changeIndex = (index) => { const changeIndex = (index) => {
if (!options.value.length) { if (!options.value.length) {
@@ -125,13 +134,40 @@ const openMenu = (ext) => {
window.rubick.openMenu = openMenu; window.rubick.openMenu = openMenu;
const choosePlugin = () => { const choosePlugin = (plugin) => {
if (options.value.length) { if (options.value.length) {
const currentChoose = options.value[currentSelect.value]; const currentChoose = options.value[currentSelect.value];
currentChoose.click(); currentChoose.click();
} else { } else {
const currentChoose = pluginHistory.value[currentSelect.value]; const localPlugins = getGlobal('LOCAL_PLUGINS').getLocalPlugins();
currentChoose.click(); const currentChoose = plugin || pluginHistory.value[currentSelect.value];
let hasRemove = true;
localPlugins.find((plugin) => {
if (plugin.name === currentChoose.originName) {
hasRemove = false;
return true;
}
return false;
});
if (hasRemove) {
const result = window.rubick.db.get(PLUGIN_HISTORY) || {};
const history = result.data.filter(item => item.originName !== currentChoose.originName);
setPluginHistory(history);
return message.warning('插件已被卸载!');
}
changePluginHistory(currentChoose);
window.rubick.openPlugin(
JSON.parse(
JSON.stringify({
...currentChoose,
ext: {
code: currentChoose.feature.code,
type: currentChoose.cmd.type || 'text',
payload: null,
},
})
)
);
} }
}; };

View File

@@ -1,20 +1,25 @@
<template> <template>
<div <div v-show="!currentPlugin.name" class="options">
v-show="!currentPlugin.name" <div
class="options" class="history-plugins"
ref="scrollDom" v-if="!options.length || !(searchValue || !!clipboardFile.length)"
> >
<div class="history-plugins" v-if="!options.length || !(searchValue || !!clipboardFile.length)">
<a-row> <a-row>
<a-col <a-col
@click="() => item.click()" @click="() => openPlugin(item)"
:class="currentSelect === index ? 'active history-item' : 'history-item'" @contextmenu.prevent="openMenu($event,item)"
:class="
currentSelect === index ? 'active history-item' : 'history-item'
"
:span="3" :span="3"
v-for="(item, index) in pluginHistory" v-for="(item, index) in pluginHistory"
:key="index" :key="index"
> >
<a-avatar style="width: 28px; height: 28px;" :src="item.icon" /> <a-avatar style="width: 28px; height: 28px" :src="item.icon" />
<div class="name ellpise">{{item.cmd || item.pluginName || item._name || item.name}}</div> <div class="name ellpise">
{{ item.cmd || item.pluginName || item._name || item.name }}
</div>
<div class="badge" v-if="item.pin"></div>
</a-col> </a-col>
</a-row> </a-row>
</div> </div>
@@ -39,16 +44,13 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import BScroll from '@better-scroll/core'; import {defineEmits, defineProps, reactive, toRaw, watch} from 'vue';
import { defineProps, onMounted, ref } from 'vue'; const path = window.require('path');
const remote = window.require('@electron/remote');
const scrollDom = ref(null); declare const __static: string;
onMounted(() => { const props: any = defineProps({
new BScroll(scrollDom.value);
});
const props = defineProps({
searchValue: { searchValue: {
type: [String, Number], type: [String, Number],
default: '', default: '',
@@ -66,14 +68,22 @@ const props = defineProps({
clipboardFile: (() => [])(), clipboardFile: (() => [])(),
}); });
const emit = defineEmits(['choosePlugin', 'setPluginHistory']);
const renderTitle = (title, match) => { const renderTitle = (title, match) => {
if (typeof title !== 'string') return; if (typeof title !== 'string') return;
if (!props.searchValue || !match) return title; if (!props.searchValue || !match) return title;
const result = title.substring(match[0], match[1] + 1); const result = title.substring(match[0], match[1] + 1);
return `<div>${title.substring(0, match[0])}<span style='color: var(--ant-error-color)'>${result}</span>${title.substring(match[1]+1, title.length)}</div>`; return `<div>${title.substring(
0,
match[0]
)}<span style='color: var(--ant-error-color)'>${result}</span>${title.substring(
match[1] + 1,
title.length
)}</div>`;
}; };
const renderDesc = (desc) => { const renderDesc = (desc = '') => {
if (desc.length > 80) { if (desc.length > 80) {
return `${desc.substr(0, 63)}...${desc.substr( return `${desc.substr(0, 63)}...${desc.substr(
desc.length - 14, desc.length - 14,
@@ -93,17 +103,97 @@ const sort = (options) => {
} }
} }
} }
return options; return options.slice(0, 20);
}; };
const openPlugin = (item) => {
emit('choosePlugin', item);
};
const menuState: any = reactive({
plugin: null,
});
let mainMenus;
const openMenu = (e, item) => {
const pinToMain = mainMenus.getMenuItemById('pinToMain');
const unpinFromMain = mainMenus.getMenuItemById('unpinFromMain');
pinToMain.visible = !item.pin;
unpinFromMain.visible = item.pin;
mainMenus.popup({
x: e.pageX,
y: e.pageY,
});
menuState.plugin = item;
};
const initMainCmdMenus = () => {
const menu = [
{
id: 'removeRecentCmd',
label: '从"使用记录"中删除',
icon: path.join(__static, 'icons', 'delete@2x.png'),
click: () => {
const history = props.pluginHistory.filter((item) => item.name !== menuState.plugin.name);
emit('setPluginHistory', toRaw(history));
},
},
{
id: 'pinToMain',
label: '固定到"搜索面板"',
icon: path.join(__static, 'icons', 'pin@2x.png'),
click: () => {
const history = props.pluginHistory.map((item) => {
if (item.name === menuState.plugin.name) {
item.pin = true;
}
return item;
});
emit('setPluginHistory', toRaw(history));
},
},
{
id: 'unpinFromMain',
label: '从"搜索面板"取消固定',
icon: path.join(__static, 'icons', 'unpin@2x.png'),
click: () => {
const history = props.pluginHistory.map((item) => {
if (item.name === menuState.plugin.name) {
item.pin = false;
}
return item;
});
emit('setPluginHistory', toRaw(history));
},
},
];
mainMenus = remote.Menu.buildFromTemplate(menu);
};
initMainCmdMenus();
</script> </script>
<style lang="less"> <style lang="less">
.ellpise { .ellpise {
overflow:hidden; overflow: hidden;
text-overflow:ellipsis; text-overflow: ellipsis;
display:-webkit-box; display: -webkit-box;
-webkit-line-clamp:1; -webkit-line-clamp: 1;
-webkit-box-orient:vertical; -webkit-box-orient: vertical;
}
.contextmenu {
margin: 0;
background: #fff;
z-index: 3000;
position: absolute;
list-style-type: none;
padding: 5px 0;
border-radius: 4px;
font-size: 12px;
font-weight: 400;
color: #333;
box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3);
} }
.options { .options {
@@ -120,6 +210,7 @@ const sort = (options) => {
border-top: 1px dashed var(--color-border-light); border-top: 1px dashed var(--color-border-light);
box-sizing: border-box; box-sizing: border-box;
.history-item { .history-item {
cursor: pointer;
box-sizing: border-box; box-sizing: border-box;
height: 69px; height: 69px;
display: flex; display: flex;
@@ -128,6 +219,19 @@ const sort = (options) => {
flex-direction: column; flex-direction: column;
color: var(--color-text-content); color: var(--color-text-content);
border-right: 1px dashed var(--color-border-light); border-right: 1px dashed var(--color-border-light);
position: relative;
.badge {
position: absolute;
top: 2px;
right: 2px;
width: 0;
height: 0;
border-radius: 4px;
border-top: 6px solid var(--ant-primary-4);
border-right: 6px solid var(--ant-primary-4);
border-left: 6px solid transparent;
border-bottom: 6px solid transparent;
}
&.active { &.active {
background: var(--color-list-hover); background: var(--color-list-hover);
} }
@@ -141,7 +245,7 @@ const sort = (options) => {
} }
.op-item { .op-item {
padding: 0 10px; padding: 0 10px;
height: 60px; height: 70px;
line-height: 50px; line-height: 50px;
max-height: 500px; max-height: 500px;
overflow: auto; overflow: auto;

View File

@@ -8,7 +8,10 @@ import commonConst from '@/common/utils/commonConst';
import { exec } from 'child_process'; import { exec } from 'child_process';
import searchManager from './search'; import searchManager from './search';
import optionsManager from './options'; import optionsManager from './options';
import { PLUGIN_INSTALL_DIR as baseDir } from '@/common/constans/renderer'; import {
PLUGIN_INSTALL_DIR as baseDir,
PLUGIN_HISTORY,
} from '@/common/constans/renderer';
import { message } from 'ant-design-vue'; import { message } from 'ant-design-vue';
const createPluginManager = (): any => { const createPluginManager = (): any => {
@@ -28,16 +31,22 @@ const createPluginManager = (): any => {
const appList: any = ref([]); const appList: any = ref([]);
const initPlugins = async () => { const initPlugins = async () => {
initPluginHistory();
appList.value = await appSearch(nativeImage); appList.value = await appSearch(nativeImage);
initLocalStartPlugin(); initLocalStartPlugin();
}; };
const initPluginHistory = () => {
const result = window.rubick.db.get(PLUGIN_HISTORY) || {};
if (result && result.data) {
state.pluginHistory = result.data;
}
};
const initLocalStartPlugin = () => { const initLocalStartPlugin = () => {
const result = ipcRenderer.sendSync('msg-trigger', { const result = ipcRenderer.sendSync('msg-trigger', {
type: 'dbGet', type: 'dbGet',
data: { data: { id: PLUGIN_HISTORY },
id: 'rubick-local-start-app',
},
}); });
if (result && result.value) { if (result && result.value) {
appList.value.push(...result.value); appList.value.push(...result.value);
@@ -70,15 +79,12 @@ const createPluginManager = (): any => {
const openPlugin = async (plugin, option) => { const openPlugin = async (plugin, option) => {
if (plugin.pluginType === 'ui' || plugin.pluginType === 'system') { if (plugin.pluginType === 'ui' || plugin.pluginType === 'system') {
if (state.currentPlugin && state.currentPlugin.name === plugin.name) { if (state.currentPlugin && state.currentPlugin.name === plugin.name) {
ipcRenderer.sendSync('msg-trigger', { window.rubick.showMainWindow();
type: 'showMainWindow',
});
return; return;
} }
await loadPlugin(plugin); await loadPlugin(plugin);
ipcRenderer.sendSync('msg-trigger', { window.rubick.openPlugin(
type: 'openPlugin', JSON.parse(
data: JSON.parse(
JSON.stringify({ JSON.stringify({
...plugin, ...plugin,
ext: plugin.ext || { ext: plugin.ext || {
@@ -87,8 +93,8 @@ const createPluginManager = (): any => {
payload: null, payload: null,
}, },
}) })
), )
}); );
} }
if (plugin.pluginType === 'app') { if (plugin.pluginType === 'app') {
try { try {
@@ -101,19 +107,52 @@ const createPluginManager = (): any => {
changePluginHistory({ changePluginHistory({
...plugin, ...plugin,
...option, ...option,
originName: plugin.name,
}); });
}; };
const changePluginHistory = (plugin) => { const changePluginHistory = (plugin) => {
state.pluginHistory.forEach((p, index) => { const unpin = state.pluginHistory.filter((plugin) => !plugin.pin);
if (p.name === plugin.name) { const pin = state.pluginHistory.filter((plugin) => plugin.pin);
state.pluginHistory.splice(index, 1); const isPin = state.pluginHistory.find((p) => p.name === plugin.name)?.pin;
} if (isPin) {
}); pin.forEach((p, index) => {
state.pluginHistory.unshift(plugin); if (p.name === plugin.name) {
if (state.pluginHistory.length > 8) { plugin = pin.splice(index, 1)[0];
state.pluginHistory.pop(); }
});
pin.unshift(plugin);
} else {
unpin.forEach((p, index) => {
if (p.name === plugin.name) {
unpin.splice(index, 1);
}
});
unpin.unshift(plugin);
} }
if (state.pluginHistory.length > 8) {
unpin.pop();
}
state.pluginHistory = [...pin, ...unpin];
const result = window.rubick.db.get(PLUGIN_HISTORY) || {};
window.rubick.db.put({
_id: PLUGIN_HISTORY,
_rev: result._rev,
data: JSON.parse(JSON.stringify(state.pluginHistory)),
});
};
const setPluginHistory = (plugins) => {
state.pluginHistory = plugins;
const unpin = state.pluginHistory.filter((plugin) => !plugin.pin);
const pin = state.pluginHistory.filter((plugin) => plugin.pin);
state.pluginHistory = [...pin, ...unpin];
const result = window.rubick.db.get(PLUGIN_HISTORY) || {};
window.rubick.db.put({
_id: PLUGIN_HISTORY,
_rev: result._rev,
data: JSON.parse(JSON.stringify(state.pluginHistory)),
});
}; };
const { searchValue, onSearch, setSearchValue, placeholder } = const { searchValue, onSearch, setSearchValue, placeholder } =
@@ -206,6 +245,8 @@ const createPluginManager = (): any => {
clipboardFile, clipboardFile,
clearClipboardFile, clearClipboardFile,
readClipboardContent, readClipboardContent,
setPluginHistory,
changePluginHistory,
}; };
}; };

View File

@@ -1,5 +1,5 @@
import { ref, watch } from 'vue'; import { ref, watch } from 'vue';
import throttle from 'lodash.throttle'; import debounce from 'lodash.debounce';
import { ipcRenderer } from 'electron'; import { ipcRenderer } from 'electron';
import { getGlobal } from '@electron/remote'; import { getGlobal } from '@electron/remote';
import PinyinMatch from 'pinyin-match'; import PinyinMatch from 'pinyin-match';
@@ -41,6 +41,17 @@ const optionsManager = ({
options[0].click(); options[0].click();
}); });
const getIndex = (cmd, value) => {
let index = 0;
if (PinyinMatch.match(cmd.label || cmd, value)) {
index += 1;
}
if (cmd.label) {
index -= 1;
}
return index;
};
const getOptionsFromSearchValue = (value, strict = false) => { const getOptionsFromSearchValue = (value, strict = false) => {
const localPlugins = getGlobal('LOCAL_PLUGINS').getLocalPlugins(); const localPlugins = getGlobal('LOCAL_PLUGINS').getLocalPlugins();
let options: any = []; let options: any = [];
@@ -61,7 +72,7 @@ const optionsManager = ({
desc: fe.explain, desc: fe.explain,
type: plugin.pluginType, type: plugin.pluginType,
match: PinyinMatch.match(cmd.label || cmd, value), match: PinyinMatch.match(cmd.label || cmd, value),
zIndex: cmd.label ? 0 : 1, // 排序权重 zIndex: getIndex(cmd, value), // 排序权重
click: () => { click: () => {
pluginClickEvent({ pluginClickEvent({
plugin, plugin,
@@ -117,7 +128,7 @@ const optionsManager = ({
.map((plugin) => { .map((plugin) => {
const option = { const option = {
...plugin, ...plugin,
zIndex: 1, zIndex: 0,
click: () => { click: () => {
openPlugin(plugin, option); openPlugin(plugin, option);
}, },
@@ -130,7 +141,7 @@ const optionsManager = ({
watch(searchValue, () => search(searchValue.value)); watch(searchValue, () => search(searchValue.value));
// search Input operation // search Input operation
const search = throttle((value) => { const search = debounce((value) => {
if (currentPlugin.value.name) return; if (currentPlugin.value.name) return;
if (clipboardFile.value.length) return; if (clipboardFile.value.length) return;
if (!value) { if (!value) {
@@ -138,7 +149,7 @@ const optionsManager = ({
return; return;
} }
optionsRef.value = getOptionsFromSearchValue(value); optionsRef.value = getOptionsFromSearchValue(value);
}, 500); }, 100);
const setOptionsRef = (options) => { const setOptionsRef = (options) => {
optionsRef.value = options; optionsRef.value = options;

View File

@@ -33,6 +33,10 @@ module.exports = {
productName: 'rubick', productName: 'rubick',
appId: 'com.muwoo.rubick', appId: 'com.muwoo.rubick',
compression: 'maximum', compression: 'maximum',
afterPack: './release.js',
afterAllArtifactBuild: () => {
return ['./build/app.asar.gz'];
},
directories: { directories: {
output: 'build', output: 'build',
}, },

110
yarn.lock
View File

@@ -1007,6 +1007,23 @@
ajv "^6.12.0" ajv "^6.12.0"
ajv-keywords "^3.4.1" ajv-keywords "^3.4.1"
"@eggjs/yauzl@^2.11.0":
version "2.11.0"
resolved "https://registry.yarnpkg.com/@eggjs/yauzl/-/yauzl-2.11.0.tgz#b8e4413f50fc7c51451f770f152de4c1137aa99b"
integrity sha512-Jq+k2fCZJ3i3HShb0nxLUiAgq5pwo8JTT1TrH22JoehZQ0Nm2dvByGIja1NYfNyuE4Tx5/Dns5nVsBN/mlC8yg==
dependencies:
buffer-crc32 "~0.2.3"
fd-slicer2 "^1.2.0"
"@electron/asar@^3.2.8":
version "3.2.8"
resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.8.tgz#2ea722f3452583dbd4ffdcc4b4f5dc903f1d8178"
integrity sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg==
dependencies:
commander "^5.0.0"
glob "^7.1.6"
minimatch "^3.0.4"
"@electron/get@^2.0.0": "@electron/get@^2.0.0":
version "2.0.2" version "2.0.2"
resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.2.tgz#ae2a967b22075e9c25aaf00d5941cd79c21efd7e" resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.2.tgz#ae2a967b22075e9c25aaf00d5941cd79c21efd7e"
@@ -3188,6 +3205,14 @@ bindings@^1.5.0:
dependencies: dependencies:
file-uri-to-path "1.0.0" file-uri-to-path "1.0.0"
bl@^1.0.0:
version "1.2.3"
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7"
integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==
dependencies:
readable-stream "^2.3.5"
safe-buffer "^5.1.1"
bl@^4.1.0: bl@^4.1.0:
version "4.1.0" version "4.1.0"
resolved "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" resolved "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
@@ -4280,6 +4305,21 @@ compressible@~2.0.16:
dependencies: dependencies:
mime-db ">= 1.43.0 < 2" mime-db ">= 1.43.0 < 2"
compressing@^1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/compressing/-/compressing-1.10.0.tgz#bca0f734736b5bb05c3a176fef8d60d7f5f322da"
integrity sha512-k2vpbZLaJoHe9euyUZjYYE8vOrbR19aU3HcWIYw5EBXiUs34ygfDVnXU+ubI41JXMriHutnoiu0ZFdwCkH6jPA==
dependencies:
"@eggjs/yauzl" "^2.11.0"
flushwritable "^1.0.0"
get-ready "^1.0.0"
iconv-lite "^0.5.0"
mkdirp "^0.5.1"
pump "^3.0.0"
streamifier "^0.1.1"
tar-stream "^1.5.2"
yazl "^2.4.2"
compression@^1.7.4: compression@^1.7.4:
version "1.7.4" version "1.7.4"
resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f"
@@ -6205,6 +6245,13 @@ faye-websocket@^0.11.3, faye-websocket@^0.11.4:
dependencies: dependencies:
websocket-driver ">=0.5.1" websocket-driver ">=0.5.1"
fd-slicer2@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/fd-slicer2/-/fd-slicer2-1.2.0.tgz#a2c54a540639bbcd4702480821771341277ca20e"
integrity sha512-3lBUNUckhMZduCc4g+Pw4Ve16LD9vpX9b8qUkkKq2mgDRLYWzblszZH2luADnJqjJe+cypngjCuKRm/IW12rRw==
dependencies:
pend "^1.2.0"
fd-slicer@~1.1.0: fd-slicer@~1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
@@ -6387,6 +6434,11 @@ flush-write-stream@^1.0.0:
inherits "^2.0.3" inherits "^2.0.3"
readable-stream "^2.3.6" readable-stream "^2.3.6"
flushwritable@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/flushwritable/-/flushwritable-1.0.0.tgz#3e328d8fde412ad47e738e3be750b4d290043498"
integrity sha512-3VELfuWCLVzt5d2Gblk8qcqFro6nuwvxwMzHaENVDHI7rxcBRtMCwTk/E9FXcgh+82DSpavPNDueA9+RxXJoFg==
follow-redirects@^1.0.0: follow-redirects@^1.0.0:
version "1.15.1" version "1.15.1"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5"
@@ -6503,6 +6555,11 @@ from2@^2.1.0:
inherits "^2.0.1" inherits "^2.0.1"
readable-stream "^2.0.0" readable-stream "^2.0.0"
fs-constants@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
fs-extra@^10.0.0, fs-extra@^10.1.0: fs-extra@^10.0.0, fs-extra@^10.1.0:
version "10.1.0" version "10.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
@@ -6697,6 +6754,11 @@ get-mac-apps@^1.0.2:
dependencies: dependencies:
plist "^3.0.1" plist "^3.0.1"
get-ready@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/get-ready/-/get-ready-1.0.0.tgz#f91817f1e9adecfea13a562adfc8de883ab34782"
integrity sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==
get-stdin@^6.0.0: get-stdin@^6.0.0:
version "6.0.0" version "6.0.0"
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b"
@@ -7430,6 +7492,13 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.5:
dependencies: dependencies:
safer-buffer ">= 2.1.2 < 3" safer-buffer ">= 2.1.2 < 3"
iconv-lite@^0.5.0:
version "0.5.2"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.5.2.tgz#af6d628dccfb463b7364d97f715e4b74b8c8c2b8"
integrity sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==
dependencies:
safer-buffer ">= 2.1.2 < 3"
iconv-lite@^0.6.2: iconv-lite@^0.6.2:
version "0.6.3" version "0.6.3"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
@@ -8867,7 +8936,7 @@ lodash.clonedeep@^4.5.0, lodash.clonedeep@~4.5.0:
lodash.debounce@^4.0.8: lodash.debounce@^4.0.8:
version "4.0.8" version "4.0.8"
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" resolved "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
lodash.defaultsdeep@^4.6.1: lodash.defaultsdeep@^4.6.1:
@@ -8910,11 +8979,6 @@ lodash.pick@^4.0.0:
resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
integrity sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q== integrity sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==
lodash.throttle@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==
lodash.transform@^4.6.0: lodash.transform@^4.6.0:
version "4.6.0" version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.transform/-/lodash.transform-4.6.0.tgz#12306422f63324aed8483d3f38332b5f670547a0" resolved "https://registry.yarnpkg.com/lodash.transform/-/lodash.transform-4.6.0.tgz#12306422f63324aed8483d3f38332b5f670547a0"
@@ -10481,7 +10545,7 @@ pbkdf2@^3.0.3:
safe-buffer "^5.0.1" safe-buffer "^5.0.1"
sha.js "^2.4.8" sha.js "^2.4.8"
pend@~1.2.0: pend@^1.2.0, pend@~1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==
@@ -11510,7 +11574,7 @@ readable-stream@1.1.14, readable-stream@^1.0.27-1, readable-stream@~1.1.10:
isarray "0.0.1" isarray "0.0.1"
string_decoder "~0.10.x" string_decoder "~0.10.x"
readable-stream@^2.0.6: readable-stream@^2.0.6, readable-stream@^2.3.0, readable-stream@^2.3.5:
version "2.3.8" version "2.3.8"
resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
@@ -12707,6 +12771,11 @@ stream-shift@^1.0.0:
resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
streamifier@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/streamifier/-/streamifier-0.1.1.tgz#97e98d8fa4d105d62a2691d1dc07e820db8dfc4f"
integrity sha512-zDgl+muIlWzXNsXeyUfOk9dChMjlpkq0DRsxujtYPgyJ676yQ8jEm6zzaaWHFDg5BNcLuif0eD2MTyJdZqXpdg==
strict-uri-encode@^1.0.0: strict-uri-encode@^1.0.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
@@ -12955,6 +13024,19 @@ tapable@^2.1.1, tapable@^2.2.0:
resolved "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" resolved "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
tar-stream@^1.5.2:
version "1.6.2"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
dependencies:
bl "^1.0.0"
buffer-alloc "^1.2.0"
end-of-stream "^1.0.0"
fs-constants "^1.0.0"
readable-stream "^2.3.0"
to-buffer "^1.1.1"
xtend "^4.0.0"
tar@^4.4.10, tar@^4.4.12, tar@^4.4.13: tar@^4.4.10, tar@^4.4.12, tar@^4.4.13:
version "4.4.19" version "4.4.19"
resolved "https://registry.npmmirror.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" resolved "https://registry.npmmirror.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3"
@@ -13150,6 +13232,11 @@ to-arraybuffer@^1.0.0:
resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==
to-buffer@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
to-fast-properties@^2.0.0: to-fast-properties@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
@@ -14499,6 +14586,13 @@ yauzl@^2.10.0:
buffer-crc32 "~0.2.3" buffer-crc32 "~0.2.3"
fd-slicer "~1.1.0" fd-slicer "~1.1.0"
yazl@^2.4.2:
version "2.5.1"
resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35"
integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==
dependencies:
buffer-crc32 "~0.2.3"
yorkie@^2.0.0: yorkie@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/yorkie/-/yorkie-2.0.0.tgz#92411912d435214e12c51c2ae1093e54b6bb83d9" resolved "https://registry.yarnpkg.com/yorkie/-/yorkie-2.0.0.tgz#92411912d435214e12c51c2ae1093e54b6bb83d9"