Compare commits

..

No commits in common. "master" and "main" have entirely different histories.
master ... main

7 changed files with 65 additions and 340 deletions

View File

@ -1,7 +1,7 @@
{
"name": "esp32-program-batch-burner",
"name": "esp32-program-burner",
"version": "3.3.3",
"description": "esp32程序批量烧录",
"description": "esp32程序烧录",
"main": "dist/main/app.js",
"scripts": {
"dev": "vite",
@ -12,15 +12,15 @@
"electron:build": "rimraf dist && vite build && tsc -p tsconfig.electron.json && electron-builder --dir && yarn electron:copy-esp32-dir"
},
"dependencies": {
"archiver": "5.3.1",
"archiver": "^5.3.1",
"serialport": "9.2.4",
"vue": "^3.2.26"
},
"devDependencies": {
"@atao60/fse-cli": "^0.1.7",
"@vitejs/plugin-vue": "^1.1.5",
"@vue/compiler-sfc": "^3.2.26",
"archiver": "^5.3.1",
"@vue/compiler-sfc": "^3.2.26",
"autoprefixer": "^10.4.2",
"cross-env": "^7.0.3",
"electron": "13.6.6",
@ -34,7 +34,7 @@
"vite": "^2.0.5"
},
"build": {
"productName": "esp32程序批量烧录",
"productName": "esp32程序烧录",
"appId": "your.id",
"mac": {
"category": "your.app.category.type"

View File

@ -29,7 +29,7 @@ function createWindow() {
win.webContents.on('did-finish-load', () => {
serialPortManager.sendPortList(win.webContents)
});
})
win.hookWindowMessage(537, (wParam, lParam) => {
// WM_DEVICECHANGE = 537; 通知应用程序对设备或计算机的硬件配置的更改
@ -40,7 +40,7 @@ function createWindow() {
// console.log(wParam)
serialPortManager.sendPortList(win.webContents)
}
});
})
}
app.whenReady().then(createWindow)

View File

@ -3,14 +3,15 @@ import { execFile } from 'child_process'
const ESP32_RELATIVE_PATH = process.env.NODE_ENV === 'development' ? './public/esp32/' : './esp32/'
ipcMain.on('BURN', (event, {selectedPort, selectedFilePath, errsum, sucsum}) => {
// event.reply('CLEAN_MSG')
ipcMain.on('BURN', (event, {selectedPort, selectedFilePath}) => {
event.reply('CLEAN_MSG')
execFile(ESP32_RELATIVE_PATH + 'esptool.exe',
['--chip', 'esp32', '--port', selectedPort, '--baud', '921600', '--before', 'default_reset', '--after', 'hard_reset', 'write_flash', '-z', '--flash_mode', 'dio', '--flash_freq', '80m', '--flash_size', 'detect',
'0xe000', ESP32_RELATIVE_PATH + 'boot_app0.bin',
'0x1000', ESP32_RELATIVE_PATH + 'bootloader.bin',
'0x10000', selectedFilePath,
'0x8000', ESP32_RELATIVE_PATH + 'partitions.bin'], (error, stdout, stderr) => {
event.reply('BURN_END')
if (error) {
console.log('-----------------------------')
console.error(error);
@ -60,26 +61,18 @@ ipcMain.on('BURN', (event, {selectedPort, selectedFilePath, errsum, sucsum}) =>
console.log('未知错误')
errmsg = '未知错误,请重新烧录'
}
// event.reply('ALERT_MSG', errmsg)
event.reply('ERR_SUM', errsum+1)
// event.reply('APPEND_MSG', error.stack)
event.reply('ALERT_MSG', errmsg)
event.reply('APPEND_MSG', error.stack)
console.log('-----------------------------')
console.log(stdout);
console.log('-----------------------------')
// event.reply('APPEND_MSG', stdout)
event.reply('APPEND_MSG', selectedPort + '烧录失败' + '\n' + error.stack + stdout)
event.reply('FAILED_RESULT', selectedPort)
event.reply('BURN_END')
event.reply('APPEND_MSG', stdout)
}else{
console.log('-----------------------------')
console.log(stdout);
console.log('-----------------------------')
// event.reply('ALERT_MSG', '烧录成功!')
event.reply('SUC_SUM', sucsum+1)
// event.reply('APPEND_MSG', stdout)
event.reply('APPEND_MSG', selectedPort + '烧录成功')
event.reply('SUC_RESULT', selectedPort)
event.reply('BURN_END')
event.reply('ALERT_MSG', '烧录成功!')
event.reply('APPEND_MSG', stdout)
}
});
})

View File

@ -1,6 +0,0 @@
export const filters = [
{ usbProductId: 8963 , usbVendorId: 1659 }, // 核心处理模块micro-usb蓝色无线通信模块
{ usbProductId: 29986, usbVendorId: 6790 }, // 核心处理模块(type-c),红色无线通信模块
{ usbProductId: 29987, usbVendorId: 6790 }, // 核心处理模块(type-c)
]

View File

@ -1,20 +1,10 @@
import SerialPort from 'serialport'
import { filters } from './data'
const serialPortManager = {
sendPortList: async (sender) => {
if (!sender) return
const ports = await serialPortManager.list_ports()
let targetArr = []
ports.forEach(element => {
filters.forEach(item => {
//十六进制转十进制
if(parseInt(element.vendorId,16)==item.usbVendorId&&parseInt(element.productId,16)==item.usbProductId){
targetArr.push(element)
}
})
})
sender.send('LIST_PORTS', targetArr)
sender.send('LIST_PORTS', ports)
},
list_ports: async () => {
const ports = await SerialPort.list()

View File

@ -1,12 +1,20 @@
<template>
<h1 class="text-center text-3xl title">ESP32程序批量烧录</h1>
<h1 class="text-center text-3xl title">ESP32程序烧录</h1>
<div class="home">
<div class="operatebox">
<div class="flexbox">
<div class="p-4 nop">
<div class="textport">待烧录串口</div>
<textarea disabled class="commsg resize-none border-2" :value="ports">
</textarea>
<div class="textport"> </div>
<select
class="selebox px-2 border-2 rounded"
:class="loading ? 'bg-gray-500' : ''"
:disabled="loading"
v-model="selectedPort"
>
<option v-for="port in ports" :key="port.pnpId" :value="port.path">
{{ port.path }}
</option>
</select>
</div>
<div class="p-4 nop">
<div class="textport"> </div>
@ -33,7 +41,7 @@
class="anni px-4 border-2 rounded text-white"
:class="loading ? 'bg-gray-500' : 'bg-blue-500'"
:disabled="loading"
@click="burn_start"
@click="burn"
>
<svg
v-if="loadings"
@ -62,7 +70,7 @@
<div class="tips">
<h6 class="tipstitle">   </h6>
<textarea disabled class="tipsmsg resize-none border-2">
1. 待烧录或烧录失败的串口会自动显示
1. 通过下拉框选择计算机对应的串口号
2. 点击按钮选择需要烧录的程序
3. 点击烧录按钮等待烧录完成
@ -86,7 +94,7 @@
<script lang="ts" setup>
import { ref, inject, watch, onMounted } from "vue";
function alert(data) {
const alert = (data) => {
loading.value = true;
var a = document.createElement("div"),
p = document.createElement("p"),
@ -133,7 +141,7 @@ function alert(data) {
a.parentNode?.removeChild(a);
loading.value = false;
};
}
};
function css(targetObj, cssObj) {
var str = targetObj.getAttribute("style") ? targetObj.getAttribute("style") : "";
for (var i in cssObj) {
@ -147,32 +155,16 @@ const IPCRENDERER_API_SUPPORTED = inject("IPCRENDERER_API_SUPPORTED", false);
const loading = ref(false);
const loadings = ref(false);
const msg = ref("烧录结果输出:\n");
const msg = ref("");
const container = ref(null);
const selectedPort = ref("");
const ports = ref([]);
const errsum = ref(0);
const sucsum = ref(0);
const succom = ref([]);
const failedcom = ref([]);
const comlength = ref(0);
const setPorts = (value: Object[]) => {
let compath = [];
value.forEach((element) => {
compath.push(element.path);
});
if (loading.value == false) {
ports.value = compath;
}
comlength.value = ports.value.length;
};
const setPorts = (value: Object[]) => (ports.value = value);
const selectedFilePath = ref("");
const setSelectedFilePath = (value: string) => (selectedFilePath.value = value);
const selectFile = () => {
if (!IPCRENDERER_API_SUPPORTED) {
alert("The ipcRenderer API is not supported.");
@ -181,7 +173,6 @@ const selectFile = () => {
ipcRenderer.send("SELECT_FILE");
};
const alert_msg = (value: string) => {
if (!value) {
return;
@ -189,85 +180,19 @@ const alert_msg = (value: string) => {
alert(value);
};
const errlog = (value: number) => {
if (!value) {
return;
}
errsum.value = value;
};
const suclog = (value: number) => {
if (!value) {
return;
}
sucsum.value = value;
};
const append_msg = (value: string) => {
if (!value) {
return;
}
msg.value += value + "\n";
msg.value += value;
};
const suc_result = (value: Array<string>) => {
if (!value) {
return;
}
succom.value.push(value);
};
const failed_result = (value: Array<string>) => {
if (!value) {
return;
}
failedcom.value.push(value);
};
const scroll = () => {
setTimeout(() => (container.value.scrollTop = container.value.scrollHeight), 5);
};
const burn = () => {
selectedPort.value = ports.value.shift();
const param = {
selectedPort: selectedPort.value,
selectedFilePath: selectedFilePath.value,
errsum: errsum.value,
sucsum: sucsum.value,
};
ipcRenderer.send("BURN", param);
loading.value = true;
loadings.value = true;
};
const burn_start = () => {
if (ports.value.length == 0) {
alert("未发现串口");
return;
}
if (!selectedFilePath.value) {
alert("请选择程序文件");
return;
}
succom.value = [];
failedcom.value = [];
errsum.value = 0;
sucsum.value = 0;
msg.value = "烧录结果输出:\n";
burn();
};
watch(msg, () => {
scroll();
});
onMounted(() => {
if (!IPCRENDERER_API_SUPPORTED) {
alert("The ipcRenderer API is not supported.");
@ -277,32 +202,36 @@ onMounted(() => {
ipcRenderer.receive("SELECT_FILE", setSelectedFilePath);
ipcRenderer.receive("LIST_PORTS", setPorts);
ipcRenderer.receive("BURN_END", () => {
if (ports.value.length == 0) {
loadings.value = false;
loading.value = false;
if (errsum.value == 0) {
alert("串口已全部烧录成功!");
return;
} else if (sucsum.value == 0) {
alert("串口已全部烧录失败!");
ports.value = failedcom.value;
return;
} else {
alert(`烧录结束,成功:${sucsum.value}个,失败:${errsum.value}`);
ports.value = failedcom.value;
return;
}
}
burn();
loadings.value = false;
loading.value = false;
});
ipcRenderer.receive("ALERT_MSG", alert_msg);
ipcRenderer.receive("ERR_SUM", errlog);
ipcRenderer.receive("SUC_SUM", suclog);
ipcRenderer.receive("APPEND_MSG", append_msg);
ipcRenderer.receive("FAILED_RESULT", failed_result);
ipcRenderer.receive("SUC_RESULT", suc_result);
// ipcRenderer.receive('CLEAN_MSG' , () => msg.value = '')
ipcRenderer.receive("CLEAN_MSG", () => (msg.value = ""));
});
const burn = () => {
if (!selectedPort.value) {
alert("请选择串口号");
return;
}
if (!selectedFilePath.value) {
alert("请选择程序文件");
return;
}
console.log(selectedPort.value);
const param = {
selectedPort: selectedPort.value,
selectedFilePath: selectedFilePath.value,
};
ipcRenderer.send("BURN", param);
loading.value = true;
loadings.value = true;
};
</script>
<style scoped>
@ -436,9 +365,4 @@ onMounted(() => {
height: 80%;
background-color: #efe;
}
.commsg {
width: 45%;
height: 100%;
background-color: #efe;
}
</style>

180
yarn.lock
View File

@ -566,51 +566,6 @@ aproba@^1.0.3:
resolved "https://registry.npmmirror.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
archiver-utils@^2.1.0:
version "2.1.0"
resolved "https://registry.npmmirror.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2"
integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==
dependencies:
glob "^7.1.4"
graceful-fs "^4.2.0"
lazystream "^1.0.0"
lodash.defaults "^4.2.0"
lodash.difference "^4.5.0"
lodash.flatten "^4.4.0"
lodash.isplainobject "^4.0.6"
lodash.union "^4.6.0"
normalize-path "^3.0.0"
readable-stream "^2.0.0"
archiver-utils@^3.0.4:
version "3.0.4"
resolved "https://registry.npmmirror.com/archiver-utils/-/archiver-utils-3.0.4.tgz#a0d201f1cf8fce7af3b5a05aea0a337329e96ec7"
integrity sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==
dependencies:
glob "^7.2.3"
graceful-fs "^4.2.0"
lazystream "^1.0.0"
lodash.defaults "^4.2.0"
lodash.difference "^4.5.0"
lodash.flatten "^4.4.0"
lodash.isplainobject "^4.0.6"
lodash.union "^4.6.0"
normalize-path "^3.0.0"
readable-stream "^3.6.0"
archiver@5.3.1:
version "5.3.1"
resolved "https://registry.npmmirror.com/archiver/-/archiver-5.3.1.tgz#21e92811d6f09ecfce649fbefefe8c79e57cbbb6"
integrity sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==
dependencies:
archiver-utils "^2.1.0"
async "^3.2.3"
buffer-crc32 "^0.2.1"
readable-stream "^3.6.0"
readdir-glob "^1.0.0"
tar-stream "^2.2.0"
zip-stream "^4.1.0"
are-we-there-yet@~1.1.2:
version "1.1.7"
resolved "https://registry.npmmirror.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146"
@ -673,11 +628,6 @@ async@0.9.x:
resolved "https://registry.npmmirror.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
integrity sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==
async@^3.2.3:
version "3.2.4"
resolved "https://registry.npmmirror.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c"
integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@ -787,13 +737,6 @@ brace-expansion@^1.1.7:
balanced-match "^1.0.0"
concat-map "0.0.1"
brace-expansion@^2.0.1:
version "2.0.1"
resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
dependencies:
balanced-match "^1.0.0"
braces@^3.0.1, braces@~3.0.2:
version "3.0.2"
resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
@ -825,7 +768,7 @@ buffer-alloc@^1.2.0:
buffer-alloc-unsafe "^1.1.0"
buffer-fill "^1.0.0"
buffer-crc32@^0.2.1, buffer-crc32@^0.2.13, buffer-crc32@~0.2.3:
buffer-crc32@~0.2.3:
version "0.2.13"
resolved "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
@ -1116,16 +1059,6 @@ compare-version@^0.1.2:
resolved "https://registry.npmmirror.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080"
integrity sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==
compress-commons@^4.1.2:
version "4.1.2"
resolved "https://registry.npmmirror.com/compress-commons/-/compress-commons-4.1.2.tgz#6542e59cb63e1f46a8b21b0e06f9a32e4c8b06df"
integrity sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==
dependencies:
buffer-crc32 "^0.2.13"
crc32-stream "^4.0.2"
normalize-path "^3.0.0"
readable-stream "^3.6.0"
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
@ -1192,19 +1125,6 @@ cosmiconfig@^7.0.1:
path-type "^4.0.0"
yaml "^1.10.0"
crc-32@^1.2.0:
version "1.2.2"
resolved "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff"
integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
crc32-stream@^4.0.2:
version "4.0.3"
resolved "https://registry.npmmirror.com/crc32-stream/-/crc32-stream-4.0.3.tgz#85dd677eb78fa7cad1ba17cc506a597d41fc6f33"
integrity sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==
dependencies:
crc-32 "^1.2.0"
readable-stream "^3.4.0"
crc@^3.8.0:
version "3.8.0"
resolved "https://registry.npmmirror.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6"
@ -1965,18 +1885,6 @@ glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@^7.2.3:
version "7.2.3"
resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.1.1"
once "^1.3.0"
path-is-absolute "^1.0.0"
global-agent@^3.0.0:
version "3.0.0"
resolved "https://registry.npmmirror.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6"
@ -2486,13 +2394,6 @@ lazy-val@^1.0.4, lazy-val@^1.0.5:
resolved "https://registry.npmmirror.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d"
integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==
lazystream@^1.0.0:
version "1.0.1"
resolved "https://registry.npmmirror.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638"
integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==
dependencies:
readable-stream "^2.0.5"
lilconfig@^2.0.4:
version "2.0.4"
resolved "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082"
@ -2503,31 +2404,6 @@ lines-and-columns@^1.1.6:
resolved "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
lodash.defaults@^4.2.0:
version "4.2.0"
resolved "https://registry.npmmirror.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==
lodash.difference@^4.5.0:
version "4.5.0"
resolved "https://registry.npmmirror.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c"
integrity sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==
lodash.flatten@^4.4.0:
version "4.4.0"
resolved "https://registry.npmmirror.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==
lodash.isplainobject@^4.0.6:
version "4.0.6"
resolved "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==
lodash.union@^4.6.0:
version "4.6.0"
resolved "https://registry.npmmirror.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==
lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
@ -2658,20 +2534,6 @@ minimatch@^3.0.4:
dependencies:
brace-expansion "^1.1.7"
minimatch@^3.1.1:
version "3.1.2"
resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
dependencies:
brace-expansion "^1.1.7"
minimatch@^5.1.0:
version "5.1.6"
resolved "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96"
integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
dependencies:
brace-expansion "^2.0.1"
minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5:
version "1.2.5"
resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
@ -3197,19 +3059,6 @@ read-config-file@6.2.0:
json5 "^2.2.0"
lazy-val "^1.0.4"
readable-stream@^2.0.0, readable-stream@^2.0.5:
version "2.3.8"
resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.3"
isarray "~1.0.0"
process-nextick-args "~2.0.0"
safe-buffer "~5.1.1"
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.5:
version "2.3.7"
resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
@ -3232,22 +3081,6 @@ readable-stream@^3.1.1, readable-stream@^3.4.0:
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
readable-stream@^3.6.0:
version "3.6.2"
resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
readdir-glob@^1.0.0:
version "1.1.3"
resolved "https://registry.npmmirror.com/readdir-glob/-/readdir-glob-1.1.3.tgz#c3d831f51f5e7bfa62fa2ffbe4b508c640f09584"
integrity sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==
dependencies:
minimatch "^5.1.0"
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
@ -3702,7 +3535,7 @@ tar-fs@^2.0.0:
pump "^3.0.0"
tar-stream "^2.1.4"
tar-stream@^2.1.4, tar-stream@^2.2.0:
tar-stream@^2.1.4:
version "2.2.0"
resolved "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
@ -4125,12 +3958,3 @@ yn@3.1.1:
version "3.1.1"
resolved "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
zip-stream@^4.1.0:
version "4.1.1"
resolved "https://registry.npmmirror.com/zip-stream/-/zip-stream-4.1.1.tgz#1337fe974dbaffd2fa9a1ba09662a66932bd7135"
integrity sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==
dependencies:
archiver-utils "^3.0.4"
compress-commons "^4.1.2"
readable-stream "^3.6.0"