未验证 提交 211b2b59 编写于 作者: P Peter Pan 提交者: GitHub

feat: subgraph support for graph page (#787)

上级 88719ad8
......@@ -108,7 +108,6 @@ VisualDL supports the latest version of [Google Chrome](https://www.google.com/c
This project is based on following projects:
- [Next.js](https://nextjs.org/)
- [React](https://reactjs.org/)
- [ECharts](https://echarts.apache.org/)
- [wasm-pack](https://rustwasm.github.io/wasm-pack/)
......
......@@ -108,7 +108,6 @@ VisualDL 支持最新版本的 [Google Chrome](https://www.google.com/chrome/)
本项目基于以下项目:
- [Next.js](https://nextjs.org/)
- [React](https://reactjs.org/)
- [ECharts](https://echarts.apache.org/)
- [wasm-pack](https://rustwasm.github.io/wasm-pack/)
......
......@@ -47,7 +47,7 @@
"eslint-plugin-react-hooks": "4.1.0",
"husky": "4.2.5",
"lerna": "3.22.1",
"lint-staged": "10.2.13",
"lint-staged": "10.3.0",
"prettier": "2.1.1",
"rimraf": "3.0.2",
"typescript": "4.0.2",
......
......@@ -41,7 +41,7 @@
"yargs": "15.4.1"
},
"devDependencies": {
"@types/node": "14.6.3",
"@types/node": "14.6.4",
"@types/yargs": "15.0.5",
"cross-env": "7.0.2",
"ts-node": "9.0.0",
......
......@@ -66,14 +66,14 @@
"tippy.js": "6.2.6"
},
"devDependencies": {
"@babel/core": "7.11.5",
"@babel/core": "7.11.6",
"@babel/preset-react": "7.10.4",
"@snowpack/app-scripts-react": "1.10.0",
"@snowpack/plugin-dotenv": "2.0.1",
"@snowpack/plugin-run-script": "2.1.1",
"@svgr/core": "5.4.0",
"@testing-library/jest-dom": "5.11.4",
"@testing-library/react": "10.4.9",
"@testing-library/react": "11.0.2",
"@types/d3-format": "1.3.1",
"@types/echarts": "4.6.5",
"@types/file-saver": "2.0.1",
......
......@@ -37,6 +37,7 @@
"producer": "Producer",
"runtime": "Runtime",
"source": "Source",
"subgraph": "Subgraph",
"tags": "Tags",
"type": "Type",
"version": "Version"
......@@ -45,6 +46,7 @@
"show-attributes": "Show Attributes",
"show-initializers": "Show Initializers",
"show-node-names": "Show Node Names",
"subgraph": "Select Subgraph",
"supported-model": "Supported models: ",
"supported-model-list": "PaddlePaddle, ONNX, Keras, Core ML, Caffe, Caffe2, Darknet, MXNet, ncnn, TensorFlow Lite",
"upload-model": "Upload Model",
......
......@@ -37,6 +37,7 @@
"producer": "框架",
"runtime": "运行时",
"source": "源",
"subgraph": "子图",
"tags": "标签",
"type": "类型",
"version": "版本"
......@@ -45,6 +46,7 @@
"show-attributes": "显示参数",
"show-initializers": "显示初始化参数",
"show-node-names": "显示节点名称",
"subgraph": "选择子图",
"supported-model": "VisualDL支持:",
"supported-model-list": "PaddlePaddle、ONNX、Keras、Core ML、Caffe、Caffe2、Darknet、MXNet、ncnn、TensorFlow Lite",
"upload-model": "上传模型",
......
import type {Documentation, Properties, SearchItem, SearchResult} from '~/resource/graph/types';
import type {Documentation, OpenedResult, Properties, SearchItem, SearchResult} from '~/resource/graph/types';
import React, {useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState} from 'react';
import {backgroundColor, borderColor, contentHeight, position, primaryColor, rem, size} from '~/utils/style';
......@@ -77,10 +77,11 @@ const Loading = styled.div`
export type GraphRef = {
export(type: 'svg' | 'png'): void;
changeGraph(name: string): void;
search(value: string): void;
select(item: SearchItem): void;
showModelProperties(): void;
showNodeDocumentation: (data: Properties) => void;
showNodeDocumentation(data: Properties): void;
};
type GraphProps = {
......@@ -91,6 +92,7 @@ type GraphProps = {
showNames: boolean;
horizontal: boolean;
onRendered?: () => unknown;
onOpened?: (data: OpenedResult) => unknown;
onSearch?: (data: SearchResult) => unknown;
onShowModelProperties?: (data: Properties) => unknown;
onShowNodeProperties?: (data: Properties) => unknown;
......@@ -107,6 +109,7 @@ const Graph = React.forwardRef<GraphRef, GraphProps>(
showNames,
horizontal,
onRendered,
onOpened,
onSearch,
onShowModelProperties,
onShowNodeProperties,
......@@ -139,6 +142,8 @@ const Graph = React.forwardRef<GraphRef, GraphProps>(
return;
}
return;
case 'opened':
return onOpened?.(data);
case 'search':
return onSearch?.(data);
case 'cancel':
......@@ -156,7 +161,7 @@ const Graph = React.forwardRef<GraphRef, GraphProps>(
}
}
},
[onRendered, onSearch, onShowModelProperties, onShowNodeProperties, onShowNodeDocumentation]
[onRendered, onOpened, onSearch, onShowModelProperties, onShowNodeProperties, onShowNodeDocumentation]
);
const dispatch = useCallback((type: string, data?: unknown) => {
iframe.current?.contentWindow?.postMessage(
......@@ -197,6 +202,9 @@ const Graph = React.forwardRef<GraphRef, GraphProps>(
export(type) {
dispatch('export', type);
},
changeGraph(name) {
dispatch('change-graph', name);
},
search(value) {
dispatch('search', value);
},
......
import React, {FunctionComponent, Suspense, useMemo} from 'react';
import type {WithStyled} from '~/utils/style';
import styled from 'styled-components';
const PUBLIC_PATH: string = import.meta.env.SNOWPACK_PUBLIC_PATH;
const Wrapper = styled.i`
speak: none;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
line-height: 1;
`;
export type Icons = string;
type IconProps = {
......@@ -15,11 +25,11 @@ const Icon: FunctionComponent<IconProps & WithStyled> = ({type, onClick, classNa
const Svg = useMemo(() => React.lazy(() => import(`${PUBLIC_PATH}/icons/${type}.js`)), [type]);
return (
<i className={`vdl-icon icon-${type} ${className ?? ''}`} onClick={() => onClick?.()}>
<Wrapper className={`vdl-icon icon-${type} ${className ?? ''}`} onClick={() => onClick?.()}>
<Suspense fallback="">
<Svg />
</Suspense>
</i>
</Wrapper>
);
};
......
import Aside, {AsideSection} from '~/components/Aside';
import {BlobResponse, blobFetcher} from '~/utils/fetch';
import type {Documentation, Properties, SearchItem, SearchResult} from '~/resource/graph/types';
import type {Documentation, OpenedResult, Properties, SearchItem, SearchResult} from '~/resource/graph/types';
import GraphComponent, {GraphRef} from '~/components/GraphPage/Graph';
import React, {FunctionComponent, useCallback, useEffect, useMemo, useRef, useState} from 'react';
import Select, {SelectProps} from '~/components/Select';
import {primaryColor, rem, size} from '~/utils/style';
import Button from '~/components/Button';
......@@ -26,6 +27,10 @@ const FullWidthButton = styled(Button)`
width: 100%;
`;
const FullWidthSelect = styled<React.FunctionComponent<SelectProps<NonNullable<OpenedResult['selected']>>>>(Select)`
width: 100%;
`;
const ExportButtonWrapper = styled.div`
display: flex;
justify-content: space-between;
......@@ -88,6 +93,17 @@ const Graph: FunctionComponent = () => {
}
}, [data]);
const [modelGraphs, setModelGraphs] = useState<OpenedResult['graphs']>([]);
const [selectedGraph, setSelectedGraph] = useState<NonNullable<OpenedResult['selected']>>('');
const setOpenedModel = useCallback((data: OpenedResult) => {
setModelGraphs(data.graphs);
setSelectedGraph(data.selected || '');
}, []);
const changeGraph = useCallback((name: string) => {
setSelectedGraph(name);
graph.current?.changeGraph(name);
}, []);
const [search, setSearch] = useState('');
const [searching, setSearching] = useState(false);
const [searchResult, setSearchResult] = useState<SearchResult>({text: '', result: []});
......@@ -167,6 +183,13 @@ const Graph: FunctionComponent = () => {
{t('graph:model-properties')}
</FullWidthButton>
</AsideSection>
{modelGraphs.length > 1 && (
<AsideSection>
<Field label={t('graph:subgraph')}>
<FullWidthSelect list={modelGraphs} value={selectedGraph} onChange={changeGraph} />
</Field>
</AsideSection>
)}
<AsideSection>
<Field label={t('graph:display-data')}>
<div>
......@@ -216,6 +239,9 @@ const Graph: FunctionComponent = () => {
search,
searching,
searchResult,
modelGraphs,
selectedGraph,
changeGraph,
onSearch,
onSelect,
showAttributes,
......@@ -249,6 +275,7 @@ const Graph: FunctionComponent = () => {
showNames={showNames}
horizontal={horizontal}
onRendered={() => setRendered(true)}
onOpened={setOpenedModel}
onSearch={data => setSearchResult(data)}
onShowModelProperties={data => setModelData(data)}
onShowNodeProperties={data => {
......
......@@ -33,6 +33,11 @@ export type SearchItem = {
id: string;
};
export type OpenedResult = {
graphs: string[];
selected: string | null;
};
export type SearchResult = {
text: string;
result: SearchItem[];
......
......@@ -34,7 +34,7 @@
"devDependencies": {
"@types/express": "4.17.8",
"@types/mkdirp": "1.0.1",
"@types/node": "14.6.3",
"@types/node": "14.6.4",
"@types/node-fetch": "2.5.7",
"@types/rimraf": "3.0.0",
"cpy-cli": "3.1.1",
......
......@@ -42,7 +42,7 @@
"devDependencies": {
"@types/express": "4.17.8",
"@types/faker": "4.1.12",
"@types/node": "14.6.3",
"@types/node": "14.6.4",
"cpy-cli": "3.1.1",
"rimraf": "3.0.2",
"ts-node": "9.0.0",
......
......@@ -48,8 +48,8 @@
"postcss-loader": "3.0.0",
"rimraf": "3.0.2",
"sass": "1.26.10",
"sass-loader": "10.0.1",
"terser": "5.2.1",
"sass-loader": "10.0.2",
"terser": "5.3.0",
"webpack": "4.44.1",
"webpack-cli": "3.3.12"
},
......
......@@ -64,6 +64,8 @@ host.BrowserHost = class {
return this._view.toggleDirection(data);
case 'export':
return this._view.export(`${document.title}.${data}`);
case 'change-graph':
return this._view.changeGraph(data);
case 'search':
return this._view.find(data);
case 'select':
......
......@@ -531,18 +531,17 @@ sidebar.ModelSidebar = class {
}
}
// TODO: graph select
// if (this._model._graphs.length > 1) {
// let graphSelector = new sidebar.SelectView(
// this._host,
// this._model.graphs.map(g => g.name),
// graph.name
// );
// graphSelector.on('change', (sender, data) => {
// this._raise('update-active-graph', data);
// });
// this._addProperty('subgraph', graphSelector);
// }
if (this._model._graphs.length > 1) {
// let graphSelector = new sidebar.SelectView(
// this._host,
// this._model.graphs.map(g => g.name),
// graph.name
// );
// graphSelector.on('change', (sender, data) => {
// this._raise('update-active-graph', data);
// });
this._addProperty('subgraph', new sidebar.ValueTextView(this._host, graph.name));
}
if (graph) {
if (graph.version) {
......
......@@ -190,12 +190,20 @@ view.View = class {
return this._modelFactoryService.open(context).then(model => {
return this._timeout(20).then(() => {
const graph = model.graphs.length > 0 ? model.graphs[0] : null;
this._host.message('opened', {
graphs: model.graphs.map(g => g.name || ''),
selected: graph && (graph.name || '')
});
return this._updateGraph(model, graph);
});
});
});
}
changeGraph(name) {
this._updateActiveGraph(name);
}
_updateActiveGraph(name) {
if (this._model) {
const model = this._model;
......
......@@ -47,7 +47,7 @@
"devDependencies": {
"@types/enhanced-resolve": "3.0.6",
"@types/express": "4.17.8",
"@types/node": "14.6.3",
"@types/node": "14.6.4",
"@visualdl/mock": "2.0.0",
"cross-env": "7.0.2",
"nodemon": "2.0.4",
......
......@@ -6,6 +6,7 @@
"skipLibCheck": true,
"esModuleInterop": true,
"declaration": true,
"resolveJsonModule": true,
"outDir": "dist"
},
"files": [
......
......@@ -18,13 +18,13 @@
invariant "^2.2.4"
semver "^5.5.0"
"@babel/core@7.11.5", "@babel/core@^7.1.0", "@babel/core@^7.10.5", "@babel/core@^7.7.5":
version "7.11.5"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.5.tgz#6ad96e2f71899ea3f9b651f0a911e85205d1ff6d"
integrity sha512-fsEANVOcZHzrsV6dMVWqpSeXClq3lNbYrfFGme6DE25FQWe7pyeYpXyx9guqUnpy466JLzZ8z4uwSr2iv60V5Q==
"@babel/core@7.11.6":
version "7.11.6"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.6.tgz#3a9455dc7387ff1bac45770650bc13ba04a15651"
integrity sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==
dependencies:
"@babel/code-frame" "^7.10.4"
"@babel/generator" "^7.11.5"
"@babel/generator" "^7.11.6"
"@babel/helper-module-transforms" "^7.11.0"
"@babel/helpers" "^7.10.4"
"@babel/parser" "^7.11.5"
......@@ -38,7 +38,7 @@
lodash "^4.17.19"
resolve "^1.3.2"
semver "^5.4.1"
source-map "^0.6.1"
source-map "^0.5.0"
"@babel/core@7.9.0":
version "7.9.0"
......@@ -62,6 +62,28 @@
semver "^5.4.1"
source-map "^0.5.0"
"@babel/core@^7.1.0", "@babel/core@^7.10.5", "@babel/core@^7.7.5":
version "7.11.5"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.5.tgz#6ad96e2f71899ea3f9b651f0a911e85205d1ff6d"
integrity sha512-fsEANVOcZHzrsV6dMVWqpSeXClq3lNbYrfFGme6DE25FQWe7pyeYpXyx9guqUnpy466JLzZ8z4uwSr2iv60V5Q==
dependencies:
"@babel/code-frame" "^7.10.4"
"@babel/generator" "^7.11.5"
"@babel/helper-module-transforms" "^7.11.0"
"@babel/helpers" "^7.10.4"
"@babel/parser" "^7.11.5"
"@babel/template" "^7.10.4"
"@babel/traverse" "^7.11.5"
"@babel/types" "^7.11.5"
convert-source-map "^1.7.0"
debug "^4.1.0"
gensync "^1.0.0-beta.1"
json5 "^2.1.2"
lodash "^4.17.19"
resolve "^1.3.2"
semver "^5.4.1"
source-map "^0.6.1"
"@babel/generator@^7.11.5", "@babel/generator@^7.9.0":
version "7.11.5"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.5.tgz#a5582773425a468e4ba269d9a1f701fbca6a7a82"
......@@ -71,6 +93,15 @@
jsesc "^2.5.1"
source-map "^0.6.1"
"@babel/generator@^7.11.6":
version "7.11.6"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620"
integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==
dependencies:
"@babel/types" "^7.11.5"
jsesc "^2.5.1"
source-map "^0.5.0"
"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3"
......@@ -996,7 +1027,7 @@
dependencies:
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.11.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
version "7.11.2"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736"
integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==
......@@ -2583,10 +2614,10 @@
dependencies:
defer-to-connect "^2.0.0"
"@testing-library/dom@^7.22.3":
version "7.24.0"
resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.24.0.tgz#b50066100947e4d1bd0f2f6855c7ff3f2a8770e2"
integrity sha512-Q83bQctoBse3NbHrUHlLypSp+cIchmpLCtVTG2rgVL2RhzgNOjlYgqH/gmwg3ztHVPADSD3PwtoXRhgU6dfTxQ==
"@testing-library/dom@^7.23.0":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.24.1.tgz#0e8acd042070f2c1b183fbfe5c0d38b3194ad3c0"
integrity sha512-TemHWY59gvzcScGiE5eooZpzYk9GaED0TuuK4WefbIc/DQg0L5wOpnj7MIEeAGF3B7Ekf1kvmVnQ97vwz4Lmhg==
dependencies:
"@babel/code-frame" "^7.10.4"
"@babel/runtime" "^7.10.3"
......@@ -2610,13 +2641,13 @@
lodash "^4.17.15"
redent "^3.0.0"
"@testing-library/react@10.4.9":
version "10.4.9"
resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-10.4.9.tgz#9faa29c6a1a217bf8bbb96a28bd29d7a847ca150"
integrity sha512-pHZKkqUy0tmiD81afs8xfiuseXfU/N7rAX3iKjeZYje86t9VaB0LrxYVa+OOsvkrveX5jCK3IjajVn2MbePvqA==
"@testing-library/react@11.0.2":
version "11.0.2"
resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.0.2.tgz#4588cc537085907bd1d98b531eb247dbbf57b1cc"
integrity sha512-iOuNNHt4ZgMH5trSKC4kaWDcKzUOf7e7KQIcu7xvGCd68/w1EegbW89F9T5sZ4IjS0gAXdvOfZbG9ESZ7YjOug==
dependencies:
"@babel/runtime" "^7.10.3"
"@testing-library/dom" "^7.22.3"
"@babel/runtime" "^7.11.2"
"@testing-library/dom" "^7.23.0"
"@tippyjs/react@4.1.0":
version "4.1.0"
......@@ -2896,11 +2927,16 @@
"@types/node" "*"
form-data "^3.0.0"
"@types/node@*", "@types/node@14.6.3", "@types/node@>= 8":
"@types/node@*", "@types/node@>= 8":
version "14.6.3"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.3.tgz#cc4f979548ca4d8e7b90bc0180052ab99ee64224"
integrity sha512-pC/hkcREG6YfDfui1FBmj8e20jFU5Exjw4NYDm8kEdrW+mOh0T1Zve8DWKnS7ZIZvgncrctcNCXF4Q2I+loyww==
"@types/node@14.6.4":
version "14.6.4"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.4.tgz#a145cc0bb14ef9c4777361b7bbafa5cf8e3acb5a"
integrity sha512-Wk7nG1JSaMfMpoMJDKUsWYugliB2Vy55pdjLpmLixeyMi7HizW2I/9QoxsPCkXl3dO+ZOVqPumKaDUv5zJu2uQ==
"@types/normalize-package-data@^2.4.0":
version "2.4.0"
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
......@@ -9075,10 +9111,10 @@ lines-and-columns@^1.1.6:
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
lint-staged@10.2.13:
version "10.2.13"
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.2.13.tgz#b9c504683470edfc464b7d3fe3845a5a1efcd814"
integrity sha512-conwlukNV6aL9SiMWjFtDp5exeDnTMekdNPDZsKGnpfQuHcO0E3L3Bbf58lcR+M7vk6LpCilxDAVks/DDVBYlA==
lint-staged@10.3.0:
version "10.3.0"
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.3.0.tgz#388c3d440590c45c339e7163f669ea69ae90b1e0"
integrity sha512-an3VgjHqmJk0TORB/sdQl0CTkRg4E5ybYCXTTCSJ5h9jFwZbcgKIx5oVma5e7wp/uKt17s1QYFmYqT9MGVosGw==
dependencies:
chalk "^4.1.0"
cli-truncate "^2.1.0"
......@@ -9895,7 +9931,7 @@ netmask@^1.0.6:
netron@PeterPanZH/netron:
version "4.4.2"
resolved "https://codeload.github.com/PeterPanZH/netron/tar.gz/9ed207c03a4d4137f6ee0a66655665d249a6cb2a"
resolved "https://codeload.github.com/PeterPanZH/netron/tar.gz/b2068aa97dd79c4d60b9a3a1a1d2e5aa8b06eae4"
dependencies:
d3 "5.16.0"
dagre "0.8.5"
......@@ -12180,15 +12216,15 @@ sane@^4.0.3:
minimist "^1.1.1"
walker "~1.0.5"
sass-loader@10.0.1:
version "10.0.1"
resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.0.1.tgz#10c0364d8034f22fee25ddcc9eded20f99bbe3b4"
integrity sha512-b2PSldKVTS3JcFPHSrEXh3BeAfR7XknGiGCAO5aHruR3Pf3kqLP3Gb2ypXLglRrAzgZkloNxLZ7GXEGDX0hBUQ==
sass-loader@10.0.2:
version "10.0.2"
resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.0.2.tgz#c7b73010848b264792dd45372eea0b87cba4401e"
integrity sha512-wV6NDUVB8/iEYMalV/+139+vl2LaRFlZGEd5/xmdcdzQcgmis+npyco6NsDTVOlNA3y2NV9Gcz+vHyFMIT+ffg==
dependencies:
klona "^2.0.3"
loader-utils "^2.0.0"
neo-async "^2.6.2"
schema-utils "^2.7.0"
schema-utils "^2.7.1"
semver "^7.3.2"
sass@1.26.10:
......@@ -13168,10 +13204,10 @@ terser-webpack-plugin@^1.4.3:
webpack-sources "^1.4.0"
worker-farm "^1.7.0"
terser@5.2.1:
version "5.2.1"
resolved "https://registry.yarnpkg.com/terser/-/terser-5.2.1.tgz#40b971b8d28b4fe98c9e8c0d073ab48e7bb96cd8"
integrity sha512-/AOtjRtAMNGO0fIF6m8HfcvXTw/2AKpsOzDn36tA5RfhRdeXyb4RvHxJ5Pah7iL6dFkLk+gOnCaNHGwJPl6TrQ==
terser@5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.0.tgz#c481f4afecdcc182d5e2bdd2ff2dc61555161e81"
integrity sha512-XTT3D3AwxC54KywJijmY2mxZ8nJiEjBHVYzq8l9OaYuRFWeQNBwvipuzzYEP4e+/AVcd1hqG/CqgsdIRyT45Fg==
dependencies:
commander "^2.20.0"
source-map "~0.6.1"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册