feat: 更新mock功能和全局cookie缓存策略

master
shuxiaokai 3 years ago
parent d080436e7c
commit c3628de41e

@ -15,7 +15,6 @@
},
"main": "background.js",
"dependencies": {
"@types/js-beautify": "^1.13.2",
"@types/mockjs": "^1.0.4",
"@types/set-cookie-parser": "^2.4.1",
"axios": "^0.21.1",
@ -28,7 +27,6 @@
"file-type": "^16.5.3",
"form-data": "^4.0.0",
"got": "^11.8.2",
"js-beautify": "^1.14.0",
"js-cookie": "^2.2.1",
"lodash": "^4.17.21",
"mitt": "^3.0.0",

@ -172,6 +172,10 @@ type ApidocProjectBaseInfoState = {
*
*/
rules: ApidocProjectRules,
/**
* cookie
*/
globalCookies: Record<string, ApidocCookieInfo[]>
};
//=========================================================================//
type ApidocTabType = "doc" | "config" | "paramsTemplate" | "onlineLink" | "exportDoc" | "importDoc" | "history" | "variable" | "mock" | "recycler" | "guide"

@ -7,17 +7,112 @@
<template>
<div class="s-mock-select" @click.stop="() => {}">
<el-tabs v-model="activeName">
<el-tab-pane label="全部" name="all"></el-tab-pane>
<el-tab-pane label="日期/时间" name="日期/时间"></el-tab-pane>
<el-tab-pane label="图片" name="图片"></el-tab-pane>
<el-tab-pane label="中文文本" name="中文文本"></el-tab-pane>
<el-tab-pane label="英文文本" name="英文文本"></el-tab-pane>
<el-tab-pane label="地区相关" name="地区相关"></el-tab-pane>
<el-tab-pane label="颜色" name="颜色"></el-tab-pane>
<el-tab-pane name="常用">
<template #label>
<span>常用</span>
<span>
<span>(</span>
<span v-if="activeName === '常用'">{{ mockEnum.length }}</span>
<span v-else>{{ cpMockEnum.filter(v => v.tags.find((tag) => tag === "常用")).length }}</span>
<span>/{{ cpMockEnum.filter(v => v.tags.find((tag) => tag === "常用")).length }}</span>
<span>)</span>
</span>
</template>
</el-tab-pane>
<el-tab-pane name="all">
<template #label>
<span>全部</span>
<span>
<span>(</span>
<span v-if="activeName === '全部'">{{ mockEnum.length }}</span>
<span v-else>{{ mockEnum.length }}</span>
<span>/{{ cpMockEnum.length }}</span>
<span>)</span>
</span>
</template>
</el-tab-pane>
<el-tab-pane name="日期/时间">
<template #label>
<span>日期&时间</span>
<span>
<span>(</span>
<span v-if="activeName === '日期/时间'">{{ mockEnum.length }}</span>
<span v-else>{{ cpMockEnum.filter(v => v.tags.find((tag) => tag === "日期/时间")).length }}</span>
<span>/{{ cpMockEnum.filter(v => v.tags.find((tag) => tag === "日期/时间")).length }}</span>
<span>)</span>
</span>
</template>
</el-tab-pane>
<el-tab-pane label="图片" name="图片">
<template #label>
<span>图片</span>
<span>
<span>(</span>
<span v-if="activeName === '图片'">{{ mockEnum.length }}</span>
<span v-else>{{ cpMockEnum.filter(v => v.tags.find((tag) => tag === "图片")).length }}</span>
<span>/{{ cpMockEnum.filter(v => v.tags.find((tag) => tag === "图片")).length }}</span>
<span>)</span>
</span>
</template>
</el-tab-pane>
<el-tab-pane name="中文文本">
<template #label>
<span>中文文本</span>
<span>
<span>(</span>
<span v-if="activeName === '中文文本'">{{ mockEnum.length }}</span>
<span v-else>{{ cpMockEnum.filter(v => v.tags.find((tag) => tag === "中文文本")).length }}</span>
<span>/{{ cpMockEnum.filter(v => v.tags.find((tag) => tag === "中文文本")).length }}</span>
<span>)</span>
</span>
</template>
</el-tab-pane>
<el-tab-pane label="英文文本" name="英文文本">
<template #label>
<span>英文文本</span>
<span>
<span>(</span>
<span v-if="activeName === '英文文本'">{{ mockEnum.length }}</span>
<span v-else>{{ cpMockEnum.filter(v => v.tags.find((tag) => tag === "英文文本")).length }}</span>
<span>/{{ cpMockEnum.filter(v => v.tags.find((tag) => tag === "英文文本")).length }}</span>
<span>)</span>
</span>
</template>
</el-tab-pane>
<el-tab-pane label="地区相关" name="地区相关">
<template #label>
<span>地区相关</span>
<span>
<span>(</span>
<span v-if="activeName === '地区相关'">{{ mockEnum.length }}</span>
<span v-else>{{ cpMockEnum.filter(v => v.tags.find((tag) => tag === "地区相关")).length }}</span>
<span>/{{ cpMockEnum.filter(v => v.tags.find((tag) => tag === "地区相关")).length }}</span>
<span>)</span>
</span>
</template>
</el-tab-pane>
<el-tab-pane label="颜色" name="颜色">
<template #label>
<span>颜色</span>
<span>
<span>(</span>
<span v-if="activeName === '颜色'">{{ mockEnum.length }}</span>
<span v-else>{{ cpMockEnum.filter(v => v.tags.find((tag) => tag === "颜色")).length }}</span>
<span>/{{ cpMockEnum.filter(v => v.tags.find((tag) => tag === "颜色")).length }}</span>
<span>)</span>
</span>
</template>
</el-tab-pane>
</el-tabs>
<div class="wrap">
<div class="list">
<div v-for="(item, index) in mockEnum" :key="index" class="list-item" @mouseenter="handleMockView(item)" @click="handleSelectMockData(item)">
<div class="list" tabindex="-1">
<div
v-for="(item, index) in mockEnum"
:key="index"
class="list-item"
@mouseenter="handleMockView(item)"
@click="handleSelectMockData(item)"
>
<span>{{ item.value }}</span>
<span>{{ item.name }}</span>
</div>
@ -37,6 +132,8 @@ import Mock from "@/server/mock"
import mockEnum from "./mock-enum";
import type { MockItem } from "@@/global"
const cpMockEnum: MockItem[] = JSON.parse(JSON.stringify(mockEnum));
export default defineComponent({
props: {
/**
@ -57,22 +154,30 @@ export default defineComponent({
emits: ["select", "close"],
data() {
return {
activeName: "all",
cpMockEnum,
activeName: "常用",
mockValue: "",
mockTags: [] as string[],
currentSelectMockData: null as MockItem | null,
//=======================================================================//
};
},
computed: {
mockEnum() {
const matchedMockData = mockEnum.filter((mock) => {
const mockValue = mock.value;
const searchValue = this.searchValue.toString().replace("@", "")
return mockValue.includes(searchValue)
});
if (this.activeName === "all") {
return mockEnum.filter((mock) => {
const mockValue = mock.value;
const searchValue = this.searchValue.toString().replace("@", "")
return mockValue.includes(searchValue)
});
return matchedMockData;
}
return mockEnum.filter((val) => val.tags.find((tag) => tag === this.activeName));
return matchedMockData.filter((val) => val.tags.find((tag) => tag === this.activeName))
},
},
watch: {
searchValue() {
this.currentSelectMockData = mockEnum[0];
},
},
mounted() {
@ -115,6 +220,9 @@ export default defineComponent({
align-items: center;
justify-content: space-between;
padding: 0 size(10);
&.active {
background: $gray-200;
}
&:hover {
background: $gray-200;
cursor: pointer;

@ -5,6 +5,7 @@
*/
export default [
//=====================================中文文本====================================//
{
name: "中文名称",
value: "cname",
@ -30,6 +31,7 @@ export default [
value: "ctitle",
tags: ["常用", "中文文本"],
},
//=====================================英文文本====================================//
{
name: "英文名称",
value: "name",
@ -55,11 +57,13 @@ export default [
value: "title",
tags: ["常用", "英文文本"],
},
//=====================================布尔值====================================//
{
name: "布尔值",
value: "boolean",
tags: ["常用"],
},
//=====================================数字====================================//
{
name: "自然数(0,1,2,3,4)",
value: "natural",
@ -95,6 +99,7 @@ export default [
value: "float",
tags: ["常用", "数字"],
},
//=========================================================================//
{
name: "字符串",
value: "string",
@ -105,6 +110,12 @@ export default [
value: "string(5)",
tags: ["常用", "英文文本"],
},
//=====================================日期时间====================================//
{
name: "时间戳(精确到毫秒13位)",
value: "timestamp",
tags: ["常用", "日期/时间"],
},
{
name: "日期(年月日)",
value: "date",
@ -125,6 +136,7 @@ export default [
value: "now",
tags: ["常用", "日期/时间"],
},
//=====================================颜色====================================//
{
name: "颜色(#ff6600)",
value: "color",
@ -150,6 +162,7 @@ export default [
value: "hsl",
tags: ["颜色"],
},
//=====================================图片====================================//
{
name: "图片",
value: "image",

@ -12,6 +12,7 @@ import lodashDebounce from "lodash/debounce";
import lodashThrottle from "lodash/throttle";
import dayjs from "dayjs";
import mitt from "mitt"
import Mock from "@/server/mock"
type Data = Record<string, unknown>
@ -357,7 +358,7 @@ function convertToJson(properties: Properties, options: ConvertToObjectOptions):
if (isParentArray && keyValIsEmpty && type === "boolean") { //数组下面为布尔值
continue
}
const convertValue = valueHook ? valueHook(property) : value;
const convertValue = valueHook ? valueHook(property) : apidocConvertValue(value);
if (isParentArray) { //父元素为数组
if (type === "boolean") {
(result as JSON[]).push(convertValue === "true" ? true : false);
@ -586,6 +587,21 @@ export function apidocConvertJsonDataToParams(jsonData: JSON, hook?: PropertyVal
return globalResult;
}
/**
* @description apidocvalue
* @author shuxiaokai
* @create 2021-8-26 21:56
* @param {string} value -
* @return {String}
* @remark
*/
export function apidocConvertValue(value: string): string {
if (value.startsWith("@")) {
return Mock.mock(value);
}
return value;
}
/**
* @description byte
* @author shuxiaokai
@ -634,4 +650,4 @@ export function formatMs(ms: number): string {
result = `${(ms / 1000 / 60).toFixed(2)}m`;
}
return result;
}
}

@ -6,7 +6,7 @@
*/
<template>
<div class="apidoc">
<div class="request-layout">
<div v-loading="loading" class="request-layout">
<s-operation></s-operation>
<s-params></s-params>
</div>
@ -40,6 +40,9 @@ export default defineComponent({
const currentSelectTab = tabs?.find((tab) => tab.selected) || null;
return currentSelectTab;
},
loading() {
return this.$store.state["apidoc/apidoc"].loading;
},
},
watch: {
currentSelectTab: {

@ -9,12 +9,12 @@
<!-- 环境host服务器地址 -->
<div>
<el-radio-group v-model="host" size="mini" @change="handleChangeHost">
<el-popover placement="top-start" trigger="hover" width="auto" :content="mockServer" class="mr-2">
<el-popover placement="top-start" :show-after="500" trigger="hover" width="auto" :content="mockServer" class="mr-2">
<template #reference>
<el-radio :label="mockServer" border>Mock服务器</el-radio>
</template>
</el-popover>
<el-popover v-for="(item, index) in hostEnum" :key="index" placement="top-start" trigger="hover" width="auto" :content="item.url">
<el-popover v-for="(item, index) in hostEnum" :key="index" :show-after="500" placement="top-start" trigger="hover" width="auto" :content="item.url">
<template #reference>
<el-radio :label="item.url" border>{{ item.name }}</el-radio>
</template>

@ -35,9 +35,9 @@
<component :is="activeName" class="workbench"></component>
</keep-alive>
<div class="view-type">
<div class="active cursor-pointer">横向</div>
<div class="active cursor-pointer">编辑</div>
<el-divider direction="vertical"></el-divider>
<div class="cursor-pointer">纵向</div>
<div class="cursor-pointer">预览</div>
</div>
</div>
</template>
@ -49,6 +49,8 @@ import requestBody from "./body/body.vue";
import requestHeaders from "./headers/headers.vue";
import responseParams from "./response/response.vue";
import { apidocConvertParamsToJsonData } from "@/helper/index"
import type { ApidocTab } from "@@/store"
import { apidocCache } from "@/cache/apidoc"
export default defineComponent({
components: {
@ -63,16 +65,19 @@ export default defineComponent({
};
},
computed: {
//
hasQueryOrPathsParams() {
const { queryParams, paths } = this.$store.state["apidoc/apidoc"].apidoc.item;
const hasQueryParams = queryParams.filter(p => p.select).some((data) => data.key);
const hasPathsParams = paths.some((data) => data.key);
return hasQueryParams || hasPathsParams;
},
//body
hasBodyParams() {
const { contentType } = this.$store.state["apidoc/apidoc"].apidoc.item;
return !!contentType;
},
//
responseNum() {
const { responseParams } = this.$store.state["apidoc/apidoc"].apidoc.item;
let resNum = 0;
@ -95,20 +100,39 @@ export default defineComponent({
});
return resNum;
},
//headers
hasHeaders() {
const { headers } = this.$store.state["apidoc/apidoc"].apidoc.item;
const hasHeaders = headers.filter(p => p.select).some((data) => data.key);
return hasHeaders;
},
//tab
currentSelectTab(): ApidocTab | null { //doc
const projectId = this.$route.query.id as string;
const tabs = this.$store.state["apidoc/tabs"].tabs[projectId];
const currentSelectTab = tabs?.find((tab) => tab.selected) || null;
return currentSelectTab;
},
},
watch: {
activeName() {
localStorage.setItem("apidoc/paramsActiveTab", this.activeName)
activeName(val: string) {
if (this.currentSelectTab) {
apidocCache.setActiveParamsTab(this.currentSelectTab._id, val);
}
},
currentSelectTab() {
this.initTabCache();
}
},
created() {
const activeName = localStorage.getItem("apidoc/paramsActiveTab");
this.activeName = activeName || "s-params";
this.initTabCache();
},
methods: {
initTabCache() {
if (this.currentSelectTab) {
this.activeName = apidocCache.getActiveParamsTab(this.currentSelectTab._id) || "s-params";
}
},
},
})
</script>

@ -5,7 +5,7 @@
备注
*/
<template>
<div class="d-flex a-center px-3">
<div class="d-flex a-center px-3 text-ellipsis">
<div class="flex0">
<span>状态码</span>
<template v-if="remoteResponse.statusCode">

@ -39,7 +39,8 @@ export default defineComponent({
* 获取项目基本信息
*/
getProjectInfo() {
this.$store.dispatch("apidoc/baseInfo/getProjectBaseInfo", { projectId: this.$route.query.id })
this.$store.dispatch("apidoc/baseInfo/getProjectBaseInfo", { projectId: this.$route.query.id });
this.$store.commit("apidoc/baseInfo/initCookies")
},
},
})

@ -3,6 +3,10 @@ import Mock from "mockjs";
const { Random } = Mock;
Random.extend({
//时间戳
timestamp() {
return Date.now();
},
// image(data, background) {
// let width = 0;
// let height = 0;

@ -109,7 +109,6 @@ export function sendRequest(): void {
const requestUrl = url.host + validPath + queryString;
let body: string | FormData = "";
const realHeaders = getRealHeaders();
console.log(realHeaders)
if (method === "GET") { //GET请求body为空否则请求将被一直挂起
body = "";
} else {
@ -139,6 +138,7 @@ export function sendRequest(): void {
break;
}
}
console.log(realHeaders, requestUrl, body)
const gotStream = gotInstance(requestUrl, {
isStream: true,
method,

@ -2,6 +2,7 @@
import type { ApidocProperty } from "@@/global"
import FormData from "form-data"
import fs from "fs"
import { apidocConvertValue } from "@/helper/index"
/**
* queryParams
*/
@ -9,7 +10,7 @@ export function convertQueryParamsToQueryString(queryParams: ApidocProperty<"str
let queryString = "";
queryParams.forEach((v) => {
if (v.key && v.select) {
queryString += `${v.key}=${v.value}&`
queryString += `${v.key}=${apidocConvertValue(v.value)}&`
}
})
queryString = queryString.replace(/\&$/, "");
@ -25,7 +26,7 @@ export function convertUrlencodedToBodyString(urlencoded: ApidocProperty<"string
let result = "";
urlencoded.forEach((v) => {
if (v.key && v.select) {
result += `${v.key}=${v.value}&`
result += `${v.key}=${apidocConvertValue(v.value)}&`
}
})
result = result.replace(/\&$/, "");
@ -39,7 +40,7 @@ export function getPathParamsMap(pathParams: ApidocProperty<"string">[]): Record
const pathMap: Record<string, string> = {};
pathParams.forEach((v) => {
if (v.key) {
pathMap[v.key] = v.value;
pathMap[v.key] = apidocConvertValue(v.value);
}
})
return pathMap;
@ -55,7 +56,7 @@ export function convertFormDataToFormDataString(bodyFormData: ApidocProperty<"st
continue;
}
if (item.type === "string") { //字符串类型
formData.append(item.key, item.value);
formData.append(item.key, apidocConvertValue(item.value));
} else if (item.type === "file") { //文件处理
try {
fs.accessSync(item.value);

@ -13,6 +13,7 @@ const baseInfo = {
paramsTemplate: [],
rules: {},
hosts: [],
globalCookies: {},
},
mutations: {
//改变项目基本信息
@ -30,6 +31,17 @@ const baseInfo = {
console.log(444, payload)
state.hosts = payload;
},
//初始化cookie值
initCookies(state: ApidocProjectBaseInfoState): void {
const localCookies = localStorage.getItem("apidoc/globalCookies") || "{}";
try {
const jsonCookies = JSON.parse(localCookies)
state.globalCookies = jsonCookies;
} catch (error) {
console.error(error);
localStorage.setItem("apidoc/globalCookies", "{}")
}
},
},
actions: {
/**

@ -49,6 +49,7 @@ const response = {
type: "",
text: "",
},
globalCookies: {},
},
mutations: {
//改变加载状态
@ -139,16 +140,28 @@ const response = {
secure: false,
sameSite: "",
};
const realDomin = parsedCookie[0].domain || (matchedDomin ? matchedDomin[0] : "")
cookieInfo.name = parsedCookie[0].name;
cookieInfo.value = parsedCookie[0].value;
cookieInfo.domin = parsedCookie[0].domain || (matchedDomin ? matchedDomin[0] : "");
cookieInfo.domin = realDomin;
cookieInfo.path = parsedCookie[0].path || "";
cookieInfo.expires = formatDate(parsedCookie[0].expires);
cookieInfo.httpOnly = parsedCookie[0].httpOnly || false;
cookieInfo.secure = parsedCookie[0].secure || false;
cookieInfo.sameSite = parsedCookie[0].sameSite || "";
state.cookies.push(cookieInfo);
const { globalCookies } = store.state["apidoc/baseInfo"];
if (!globalCookies[realDomin]) {
globalCookies[realDomin] = [];
}
const matchedCookieIndex = globalCookies[realDomin].findIndex(info => info.name === cookieInfo.name)
if (matchedCookieIndex === -1) { //不存在则添加一个
globalCookies[realDomin].push(JSON.parse(JSON.stringify(cookieInfo)));
} else { //存在则覆盖
globalCookies[realDomin][matchedCookieIndex] = JSON.parse(JSON.stringify(cookieInfo));
}
})
localStorage.setItem("apidoc/globalCookies", JSON.stringify(store.state["apidoc/baseInfo"].globalCookies))
},
},
}

@ -1401,11 +1401,6 @@
dependencies:
"@types/node" "*"
"@types/js-beautify@^1.13.2":
version "1.13.2"
resolved "https://registry.nlark.com/@types/js-beautify/download/@types/js-beautify-1.13.2.tgz?cache=0&sync_timestamp=1629708102564&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fjs-beautify%2Fdownload%2F%40types%2Fjs-beautify-1.13.2.tgz#49783f6c6c68558738139e612b64b4f1a275383e"
integrity sha1-SXg/bGxoVYc4E55hK2S08aJ1OD4=
"@types/js-cookie@^2.2.6":
version "2.2.7"
resolved "https://registry.nlark.com/@types/js-cookie/download/@types/js-cookie-2.2.7.tgz?cache=0&sync_timestamp=1629708102133&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fjs-cookie%2Fdownload%2F%40types%2Fjs-cookie-2.2.7.tgz#226a9e31680835a6188e887f3988e60c04d3f6a3"
@ -2260,11 +2255,6 @@ JSONStream@^1.0.4:
jsonparse "^1.2.0"
through ">=2.2.7 <3"
abbrev@1:
version "1.1.1"
resolved "https://registry.nlark.com/abbrev/download/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=
accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
version "1.3.7"
resolved "https://registry.nlark.com/accepts/download/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
@ -3762,7 +3752,7 @@ commander@2.9.0:
dependencies:
graceful-readlink ">= 1.0.0"
commander@^2.12.1, commander@^2.18.0, commander@^2.19.0, commander@^2.20.0:
commander@^2.12.1, commander@^2.18.0, commander@^2.20.0:
version "2.20.3"
resolved "https://registry.nlark.com/commander/download/commander-2.20.3.tgz?cache=0&sync_timestamp=1627358203890&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=
@ -3843,7 +3833,7 @@ concat-stream@1.6.2, concat-stream@^1.5.0, concat-stream@^1.6.2:
readable-stream "^2.2.2"
typedarray "^0.0.6"
config-chain@^1.1.11, config-chain@^1.1.12:
config-chain@^1.1.11:
version "1.1.13"
resolved "https://registry.nlark.com/config-chain/download/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4"
integrity sha1-+tB5Wqamza/57Rto6d/5Q3LCMvQ=
@ -4804,16 +4794,6 @@ ecc-jsbn@~0.1.1:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
editorconfig@^0.15.3:
version "0.15.3"
resolved "https://registry.nlark.com/editorconfig/download/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5"
integrity sha1-vvhMTnX7jcsM5c7o79UcFZmb78U=
dependencies:
commander "^2.19.0"
lru-cache "^4.1.5"
semver "^5.6.0"
sigmund "^1.0.1"
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.nlark.com/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@ -7415,16 +7395,6 @@ jest-worker@^26.2.1:
merge-stream "^2.0.0"
supports-color "^7.0.0"
js-beautify@^1.14.0:
version "1.14.0"
resolved "https://registry.nlark.com/js-beautify/download/js-beautify-1.14.0.tgz#2ce790c555d53ce1e3d7363227acf5dc69024c2d"
integrity sha1-LOeQxVXVPOHj1zYyJ6z13GkCTC0=
dependencies:
config-chain "^1.1.12"
editorconfig "^0.15.3"
glob "^7.1.3"
nopt "^5.0.0"
js-cookie@^2.2.1:
version "2.2.1"
resolved "https://registry.nlark.com/js-cookie/download/js-cookie-2.2.1.tgz?cache=0&sync_timestamp=1627319452652&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fjs-cookie%2Fdownload%2Fjs-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8"
@ -7974,7 +7944,7 @@ lowercase-keys@^2.0.0:
resolved "https://registry.nlark.com/lowercase-keys/download/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
integrity sha1-JgPni3tLAAbLyi+8yKMgJVislHk=
lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.5:
lru-cache@^4.0.1, lru-cache@^4.1.2:
version "4.1.5"
resolved "https://registry.nlark.com/lru-cache/download/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
integrity sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=
@ -8553,13 +8523,6 @@ node-releases@^1.1.75:
resolved "https://registry.nlark.com/node-releases/download/node-releases-1.1.75.tgz?cache=0&sync_timestamp=1629280416131&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnode-releases%2Fdownload%2Fnode-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe"
integrity sha1-bdjIdrmJehuOWgLeJq+nm7VOu/4=
nopt@^5.0.0:
version "5.0.0"
resolved "https://registry.nlark.com/nopt/download/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88"
integrity sha1-UwlCu1ilEvzK/lP+IQ8TolNV3Ig=
dependencies:
abbrev "1"
normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
version "2.5.0"
resolved "https://registry.nlark.com/normalize-package-data/download/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
@ -10753,11 +10716,6 @@ side-channel@^1.0.4:
get-intrinsic "^1.0.2"
object-inspect "^1.9.0"
sigmund@^1.0.1:
version "1.0.1"
resolved "https://registry.nlark.com/sigmund/download/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=
signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3:
version "3.0.3"
resolved "https://registry.nlark.com/signal-exit/download/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"

Loading…
Cancel
Save