qiushang 7 月之前
父节点
当前提交
f7a530ffef
共有 4 个文件被更改,包括 299 次插入17 次删除
  1. 2 0
      package.json
  2. 170 14
      src/renderer/components/home.vue
  3. 46 0
      src/renderer/utils/search.js
  4. 81 3
      yarn.lock

+ 2 - 0
package.json

@@ -37,6 +37,8 @@
   "dependencies": {
     "axios": "^0.18.0",
     "element-ui": "^2.15.14",
+    "fast-glob": "^3.3.2",
+    "fs-extra": "^11.2.0",
     "node-xlsx": "^0.24.0",
     "officegen": "^0.6.5",
     "request": "^2.88.2",

+ 170 - 14
src/renderer/components/home.vue

@@ -189,7 +189,7 @@
 								</vxe-table>
 								<!-- 2、文件夹重命名 -->
 								<vxe-table
-									v-show="['2', '6', '8'].indexOf(menuIndex) > -1"
+									v-show="['2', '6'].indexOf(menuIndex) > -1"
 									show-overflow class="img-table" max-height="100%" empty-text="没有更多数据了!" :loading="tabLoading"
 									:loading-config="{icon: 'vxe-icon-indicator roll', text: '文件加载中...'}" :row-config="{isHover: true}"
 									:edit-config="{trigger: 'click', mode: 'cell'}" :data="dirList" :scroll-y="{enabled: true}">
@@ -363,6 +363,60 @@
 										</template>
 									</vxe-column>
 								</vxe-table>
+								
+								<!-- 8、文件夹合并和提取文件 -->
+								<vxe-table
+									v-show="menuIndex == '8'"
+									show-overflow class="img-table" max-height="100%" empty-text="没有更多数据了!" :loading="tabLoading"
+									:loading-config="{icon: 'vxe-icon-indicator roll', text: '文件加载中...'}" :row-config="{isHover: true}"
+									:edit-config="{trigger: 'click', mode: 'cell'}" :data="dirList" :scroll-y="{enabled: true}">
+									<vxe-column field="name" :title="'文件夹名'+'(' + dirList.length + ')'"></vxe-column>
+										<template #edit="{ row }">
+											<vxe-input v-model="row.newName" type="text" placeholder="请输入新文件夹名"></vxe-input>
+										</template>
+									</vxe-column>
+									<vxe-column field="path" title="文件位置" width="200"></vxe-column>
+									<vxe-column field="status" title="状态" width="180">
+										<template #default="{ row }">
+											<template v-if="row.status == '1'">
+												<i class="el-icon-info" style="font-size: 16px; color: #999;"></i>
+												<span>待操作</span>
+											</template>
+											<template v-if="row.status == '2'">
+												<i class="el-icon-success" style="font-size: 16px; color: #19be6b;"></i>
+												<span>处理成功</span>
+											</template>
+											<template v-if="row.status == '3'">
+												<i class="el-icon-error" style="font-size: 16px; color: #ed4014;"></i>
+												<span>修改失败</span>
+											</template>
+											<template v-if="row.status == '4'">
+												<i class="el-icon-warning" style="font-size: 16px; color: #ff9900;"></i>
+												<span>文件被修改</span>
+											</template>
+											<template v-if="row.status == '5'">
+												<i class="el-icon-warning" style="font-size: 16px; color: #ff9900;"></i>
+												<span>文件已存在</span>
+											</template>
+											<template v-if="row.status == '6'">
+												<template v-if="row.searchList && row.searchList.length > row.total">
+													<i class="el-icon-loading" style="font-size: 16px; color: #999;"></i>
+													<span>提取中<span v-if="row.searchList">,共{{row.searchList.length}}个,{{row.total}}</span></span>
+												</template>
+												<template v-else>
+													<i class="el-icon-success" style="font-size: 16px; color: #19be6b;"></i>
+													<span>提取成功<span v-if="row.searchList">,共{{row.searchList.length}}个,{{row.total}}</span></span>
+												</template>
+											</template>
+										</template>
+									</vxe-column>
+									<vxe-column title="操作" width="88">
+										<template #default="{ row, rowIndex }">
+											<i class="el-icon-delete cur-pointer" style="font-size: 20px;" @click="delFile(rowIndex, 'dir')"></i>
+										</template>
+									</vxe-column>
+								</vxe-table>
+								
 							</div>
 						</div>
 						
@@ -823,6 +877,10 @@ import xlsx from 'node-xlsx';
 import { setTimeout } from 'timers';
 const child = require("child_process");
 const officegen = require('officegen');
+import fse from 'fs-extra';
+const fg = require('fast-glob');
+import { v4 as uuidv4 } from 'uuid';
+import search from '@/utils/search.js';
 
 let separator = '';
 if (os.platform == 'linux') {
@@ -1106,7 +1164,7 @@ export default {
 				this.fileTimeList = [];
 				this.filexlsxPath = "";
 				this.filexlsxData = [];
-			}else if(['2', '4', '6'].indexOf(this.menuIndex) > -1){
+			}else if(['2', '4', '6', '8'].indexOf(this.menuIndex) > -1){
 				this.backDirList = [];
 				this.dirList = [];
 				this.dirTimeList = [];
@@ -1160,7 +1218,9 @@ export default {
 					name: dirs[i].slice(lastIndex+1),
 					newName: dirs[i].slice(lastIndex+1),
 					path: dirs[i].slice(0, lastIndex+1),
-					status: "1"
+					status: "1",
+					searchList: [],
+					total: 0
 				};
 				
 				if(this.dirList.length == 0){
@@ -1857,28 +1917,124 @@ export default {
 				return false;
 			}
 			
+			if(this.dirList.length === 0){ //长度为0 不执行任何操作
+				return false;
+			}
+			
 			for(let i=0;i < this.dirList.length; i++){
 				let item = this.dirList[i];
 				
-				fs.mkdir(this.mergeData.newPath + separator + item.name, (err) => {
-					if(err){
-						this.dirList[i].status = '5';
-						if(err.toString().indexOf('EBUSY') > -1){
-							this.$notify({title: '提示', message: "文件被占用,请关闭后重试!", type: 'warning'});
-							thisdirList[i].status = '3';
-						}else if(err.toString().indexOf('EXIST') > -1){
+				if(this.mergeData.type == 'merge'){ // 合并目录
+					fs.mkdir(this.mergeData.newPath + separator + item.name, (err) => {
+						if(err){
+							this.dirList[i].status = '5';
+							if(err.toString().indexOf('EBUSY') > -1){
+								this.$notify({title: '提示', message: "文件被占用,请关闭后重试!", type: 'warning'});
+								thisdirList[i].status = '3';
+							}else if(err.toString().indexOf('EXIST') > -1){
+								this.dirList[i].status = '2';
+							}
+						}else{
 							this.dirList[i].status = '2';
 						}
-					}else{
-						this.dirList[i].status = '2';
+					});
+				}else if(this.mergeData.type == 'extract'){ // 提取文件
+					this.dirList[i].status = '6';
+					switch(this.mergeData.extractType){
+						case "1": // 全部提取
+							this.traverseDirectoryIteratively(i, this.mergeData.newPath, 'folder').catch(console.error);
+							break;
+						case "2": // 按类型提取
+							
+							break;
+						case "3": // 按名称提取
+							(async () => {
+								let ruleStr = [];
+								let searchDir = item.path.replace(/\\/g, '/') + item.name;
+								
+								if(this.mergeData.fileName.indexOf('.') > -1){
+									ruleStr.push(searchDir + '/**/' + '*{' + this.mergeData.fileName + ',<}*.[!.]+');
+								}else{
+									ruleStr.push(searchDir + '/**/' + '*{' + this.mergeData.fileName + ',<}*.[!.]+');
+									ruleStr.push(searchDir + '/**/' + '{' + this.mergeData.fileName + ',<}');
+									ruleStr.push(searchDir + '/**/' + '[!.]+{' + this.mergeData.fileName + ',<}');
+									ruleStr.push(searchDir + '/**/' + '{' + this.mergeData.fileName + ',<}[!.]+');
+									ruleStr.push(searchDir + '/**/' + '[!.]+{' + this.mergeData.fileName + ',<}[!.]+');
+								}
+								const files = await fg(ruleStr, { dot: true });
+								this.dirList[i].searchList = files;
+								
+								this.traverseDirectoryIteratively(i, this.mergeData.newPath, 'files').catch(console.error);
+							})();
+							break;
+						case "4": // 按后缀提取
+							(async () => {
+								let ruleStr = [];
+								let searchDir = item.path.replace(/\\/g, '/') + item.name;
+								ruleStr.push(searchDir + '/**/' + '*.' + this.mergeData.suffixName);
+								const files = await fg(ruleStr, { dot: true });
+								this.dirList[i].searchList = files;
+							})();
+							break;
 					}
-				});
+					
+				}
+			}
+		},
+		// 按文件夹提取文件
+		async traverseDirectoryIteratively(index, newPath, type) {
+			const fs = require('fs').promises;
+			if(!this.dirList[index].total){
+				this.dirList[index].total = 0;
 			}
 			
+			if(type == 'folder'){ //提取目录里面的文件
+				let directoryPath = this.dirList[index].path + this.dirList[index].name;
+				const queue = [directoryPath]; // 使用数组作为队列
+				const visited = new Set(); // 用于跟踪已访问的目录,防止循环引用
+				
+				while (queue.length > 0) {
+				    const currentPath = queue.shift();
+						 
+				    if (!visited.has(currentPath)) {
+				        visited.add(currentPath);
+						 
+						try {
+							const entries = await fs.readdir(currentPath,{ withFileTypes: true });
+				            for (const entry of entries) {
+				                const fullPath = path.join(currentPath, entry.name);
+						 
+				                if (entry.isDirectory()) {
+									queue.push(fullPath); // 将子目录添加到队列中以便后续遍历
+				                } else if (entry.isFile()) {
+				                    // 处理文件
+									console.log(`Found file: ${fullPath}`);
+									let targetPath = newPath + separator + entry.name;
+									await fs.copyFile(fullPath, targetPath);
+									this.dirList[index].total += 1;
+				                }
+				            }
+				        } catch (err) {
+				            console.error(`Unable to scan directory: ${currentPath}, Error: ${err}`);
+				        }
+				    }
+				}
+			}else if(type == 'files'){
+				try {
+					for (const entry of this.dirList[index].searchList) {
+						let filename = entry.substr(entry.lastIndexOf('/')+1);
+						let targetPath = newPath + separator + filename;
+						await fs.copyFile(entry, targetPath);
+						this.dirList[index].total += 1;
+					}
+				} catch (err) {
+					console.error(`Unable to scan directory: Error: ${err}`);
+				}
+			}
 			
 		},
 		
-		// 提取文件、文件夹名称
+		// 提取文件/文件夹名称
 		extratFile(authority, size){
 			let nameCont = [];
 			let list = [];

+ 46 - 0
src/renderer/utils/search.js

@@ -0,0 +1,46 @@
+import fse from 'fs-extra';
+const fg = require('fast-glob');
+import { v4 as uuidv4 } from 'uuid';
+
+// 根据文件类型搜索,并返回全部路径
+function searchFromType(str){
+	
+}
+
+// 根据文件名称模糊搜索,并返回全部路径
+async function searchFromTitle(str, folderList){
+	try{
+		const files = await fg(ruleStr, { dot: true });
+		console.log(files);
+		let regExp = new RegExp(paramArr.join('|'));
+		let regExp2 = new RegExp(paramArr2.join('|'));
+		
+	}catch(e){
+		this.showError(e);
+	}
+}
+
+// 根据后缀名搜索,并返回全部路径
+function searchFromSuffix(str){
+	
+}
+
+// 处理正则表达式特殊字符
+function filterReg(data){
+	let specialChar2 = ["$", "(", ")", "^", "*", "+", "?", "[", "]", '|', '/', '\\', ',']; // 特殊字符 正则匹配
+	let regStr = '';
+	let expArr = data.split('');
+	expArr.map(item => {
+		if(specialChar2.indexOf(item) > -1){
+			item = '\\' + item;
+		}
+		regStr += item;
+	})	
+	return regStr;
+}
+
+export default{
+	searchFromType,
+	searchFromTitle,
+	searchFromSuffix
+}

+ 81 - 3
yarn.lock

@@ -79,6 +79,27 @@
     lodash "^4.17.15"
     tmp-promise "^3.0.2"
 
+"@nodelib/fs.scandir@2.1.5":
+  version "2.1.5"
+  resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+  integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+  dependencies:
+    "@nodelib/fs.stat" "2.0.5"
+    run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+  version "2.0.5"
+  resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+  integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3":
+  version "1.2.8"
+  resolved "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+  integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+  dependencies:
+    "@nodelib/fs.scandir" "2.1.5"
+    fastq "^1.6.0"
+
 "@sindresorhus/is@^0.14.0":
   version "0.14.0"
   resolved "https://registry.npmmirror.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
@@ -1958,7 +1979,7 @@ braces@^2.3.1, braces@^2.3.2:
     split-string "^3.0.2"
     to-regex "^3.0.1"
 
-braces@~3.0.2:
+braces@^3.0.3, braces@~3.0.2:
   version "3.0.3"
   resolved "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
   integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
@@ -4089,6 +4110,17 @@ fast-deep-equal@^3.1.1:
   resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
   integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
 
+fast-glob@^3.3.2:
+  version "3.3.2"
+  resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
+  integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
+  dependencies:
+    "@nodelib/fs.stat" "^2.0.2"
+    "@nodelib/fs.walk" "^1.2.3"
+    glob-parent "^5.1.2"
+    merge2 "^1.3.0"
+    micromatch "^4.0.4"
+
 fast-image-size@^0.1.3:
   version "0.1.3"
   resolved "https://registry.npmmirror.com/fast-image-size/-/fast-image-size-0.1.3.tgz#fca56c19f0c69cf44b15606e60d820f6863fd5b2"
@@ -4104,6 +4136,13 @@ fastparse@^1.0.0, fastparse@^1.1.2:
   resolved "https://registry.npmmirror.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9"
   integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==
 
+fastq@^1.6.0:
+  version "1.18.0"
+  resolved "https://registry.npmmirror.com/fastq/-/fastq-1.18.0.tgz#d631d7e25faffea81887fe5ea8c9010e1b36fee0"
+  integrity sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==
+  dependencies:
+    reusify "^1.0.4"
+
 faye-websocket@^0.11.3, faye-websocket@^0.11.4:
   version "0.11.4"
   resolved "https://registry.npmmirror.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da"
@@ -4338,6 +4377,15 @@ fs-extra@^10.0.0:
     jsonfile "^6.0.1"
     universalify "^2.0.0"
 
+fs-extra@^11.2.0:
+  version "11.2.0"
+  resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b"
+  integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==
+  dependencies:
+    graceful-fs "^4.2.0"
+    jsonfile "^6.0.1"
+    universalify "^2.0.0"
+
 fs-extra@^4.0.0, fs-extra@^4.0.1:
   version "4.0.3"
   resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
@@ -4528,7 +4576,7 @@ glob-parent@^3.1.0:
     is-glob "^3.1.0"
     path-dirname "^1.0.0"
 
-glob-parent@~5.1.2:
+glob-parent@^5.1.2, glob-parent@~5.1.2:
   version "5.1.2"
   resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
   integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
@@ -6311,6 +6359,11 @@ merge-source-map@^1.1.0:
   dependencies:
     source-map "^0.6.1"
 
+merge2@^1.3.0:
+  version "1.4.1"
+  resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+  integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
 methods@~1.1.2:
   version "1.1.2"
   resolved "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
@@ -6335,6 +6388,14 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
     snapdragon "^0.8.1"
     to-regex "^3.0.2"
 
+micromatch@^4.0.4:
+  version "4.0.8"
+  resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
+  integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
+  dependencies:
+    braces "^3.0.3"
+    picomatch "^2.3.1"
+
 miller-rabin@^4.0.0:
   version "4.0.1"
   resolved "https://registry.npmmirror.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
@@ -7179,7 +7240,7 @@ picocolors@^1.0.0:
   resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1"
   integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
 
-picomatch@^2.0.4, picomatch@^2.2.1:
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
   version "2.3.1"
   resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
   integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
@@ -7744,6 +7805,11 @@ querystringify@^2.1.1:
   resolved "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
   integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
 
+queue-microtask@^1.2.2:
+  version "1.2.3"
+  resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+  integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
 randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
   version "2.1.0"
   resolved "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
@@ -8138,6 +8204,11 @@ retry@^0.12.0:
   resolved "https://registry.npmmirror.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
   integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==
 
+reusify@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+  integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
 right-align@^0.1.1:
   version "0.1.3"
   resolved "https://registry.npmmirror.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
@@ -8160,6 +8231,13 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
     hash-base "^3.0.0"
     inherits "^2.0.1"
 
+run-parallel@^1.1.9:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+  integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+  dependencies:
+    queue-microtask "^1.2.2"
+
 run-queue@^1.0.0, run-queue@^1.0.3:
   version "1.0.3"
   resolved "https://registry.npmmirror.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"