You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by ju...@apache.org on 2020/12/19 02:42:41 UTC

[apisix-dashboard] branch master updated: feat: refactor online debug for frontend (#978)

This is an automated email from the ASF dual-hosted git repository.

juzhiyuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-dashboard.git


The following commit(s) were added to refs/heads/master by this push:
     new c6f730b  feat: refactor online debug for frontend (#978)
c6f730b is described below

commit c6f730b2d8a232916ccb006cf8e20923f59023cf
Author: liuxiran <be...@126.com>
AuthorDate: Fri Dec 18 20:42:34 2020 -0600

    feat: refactor online debug for frontend (#978)
    
    * feat: refactor online debug fe
    
    * fix: lint errors
    
    * fix: update yarn.lock
    
    * fix: url required
    
    * fix: update refer to the review
    
    * fix: ci error
    
    * fix: update refer to view
    
    * fix: update yarn.lock
    
    * fix: add attr protocol  to debug request
    
    * fix: update params name
    
    * fix: update yarn.lock
    
    * fix: update code review
    
    * fix: lint errors
    
    * fix: typo
    
    * fix: codemirror height
    
    * fix: update yarn.lock
---
 web/package.json                                   |   5 +-
 web/src/pages/Consumer/List.tsx                    |   1 -
 web/src/pages/Route/List.tsx                       |  17 +-
 .../components/DebugViews/AuthenticationView.tsx   | 129 ++++++
 .../Route/components/DebugViews/DebugDrawView.tsx  | 247 ++++++++++
 .../components/DebugViews/DebugParamsView.tsx      |  85 ++++
 .../pages/Route/components/DebugViews/index.less   |  44 ++
 web/src/pages/Route/components/DebugViews/index.ts |  19 +
 web/src/pages/Route/constants.ts                   |  16 +
 web/src/pages/Route/locales/en-US.ts               |  18 +
 web/src/pages/Route/locales/zh-CN.ts               |  18 +
 web/src/pages/Route/service.ts                     |   7 +
 web/src/pages/Route/typing.d.ts                    |  70 ++-
 web/src/pages/Upstream/List.tsx                    |   1 -
 web/yarn.lock                                      | 497 ++-------------------
 15 files changed, 668 insertions(+), 506 deletions(-)

diff --git a/web/package.json b/web/package.json
index 8a6382a..c7dbef2 100644
--- a/web/package.json
+++ b/web/package.json
@@ -56,6 +56,7 @@
     "@uiw/react-codemirror": "^3.0.1",
     "ajv": "^7.0.0-rc.2",
     "antd": "^4.4.0",
+    "base-64": "^1.0.0",
     "classnames": "^2.2.6",
     "dayjs": "1.8.28",
     "js-beautify": "^1.13.0",
@@ -65,12 +66,12 @@
     "omit.js": "^2.0.2",
     "path-to-regexp": "2.4.0",
     "qs": "^6.9.0",
+    "query-string": "^6.13.7",
     "react": "^16.8.6",
     "react-device-detect": "^1.12.1",
     "react-dom": "^16.8.6",
     "react-helmet-async": "^1.0.4",
     "start-server-and-test": "^1.11.5",
-    "swagger-ui-react": "^3.33.0",
     "umi": "^3.1.2",
     "umi-request": "^1.0.8",
     "use-merge-value": "^1.0.1",
@@ -89,8 +90,8 @@
     "@types/react": "^16.9.17",
     "@types/react-dom": "^16.8.4",
     "@types/react-helmet": "^5.0.13",
-    "@types/swagger-ui-react": "^3.23.3",
     "@types/uuid": "7.0.4",
+    "@types/base-64": "^0.1.3",
     "@umijs/fabric": "^2.2.0",
     "@umijs/plugin-blocks": "^2.0.5",
     "@umijs/plugin-esbuild": "^1.0.0-beta.2",
diff --git a/web/src/pages/Consumer/List.tsx b/web/src/pages/Consumer/List.tsx
index dcd61dd..78d1587 100644
--- a/web/src/pages/Consumer/List.tsx
+++ b/web/src/pages/Consumer/List.tsx
@@ -22,7 +22,6 @@ import { history, useIntl } from 'umi';
 import { PlusOutlined } from '@ant-design/icons';
 
 import { timestampToLocaleString } from '@/helpers';
-
 import { fetchList, remove } from './service';
 
 const Page: React.FC = () => {
diff --git a/web/src/pages/Route/List.tsx b/web/src/pages/Route/List.tsx
index b606f22..0602eac 100644
--- a/web/src/pages/Route/List.tsx
+++ b/web/src/pages/Route/List.tsx
@@ -14,20 +14,21 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import React, { useRef } from 'react';
+import React, { useRef, useState } from 'react';
 import { PageHeaderWrapper } from '@ant-design/pro-layout';
 import ProTable, { ProColumns, ActionType } from '@ant-design/pro-table';
 import { Button, Popconfirm, notification, Tag, Space } from 'antd';
 import { history, useIntl } from 'umi';
-import { PlusOutlined } from '@ant-design/icons';
-
+import { PlusOutlined, BugOutlined } from '@ant-design/icons';
 import { timestampToLocaleString } from '@/helpers';
 
 import { fetchList, remove } from './service';
+import { DebugDrawView } from './components/DebugViews';
 
 const Page: React.FC = () => {
   const ref = useRef<ActionType>();
   const { formatMessage } = useIntl();
+  const [debugDrawVisible, setDebugDrawVisible] = useState(false);
 
   const columns: ProColumns<RouteModule.ResponseBody>[] = [
     {
@@ -126,8 +127,18 @@ const Page: React.FC = () => {
             <PlusOutlined />
             {formatMessage({ id: 'component.global.create' })}
           </Button>,
+          <Button type="primary" onClick={() => setDebugDrawVisible(true)}>
+            <BugOutlined />
+            {formatMessage({ id: 'page.route.onlineDebug' })}
+          </Button>,
         ]}
       />
+      <DebugDrawView
+        visible={debugDrawVisible}
+        onClose={() => {
+          setDebugDrawVisible(false);
+        }}
+      />
     </PageHeaderWrapper>
   );
 };
diff --git a/web/src/pages/Route/components/DebugViews/AuthenticationView.tsx b/web/src/pages/Route/components/DebugViews/AuthenticationView.tsx
new file mode 100644
index 0000000..ba43779
--- /dev/null
+++ b/web/src/pages/Route/components/DebugViews/AuthenticationView.tsx
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React, { useState } from 'react';
+import { Form, Input, Radio, Card } from 'antd';
+import { useIntl } from 'umi';
+import { AUTH_LIST } from '../../constants';
+import styles from './index.less';
+
+const AuthenticationView: React.FC<RouteModule.DebugViewProps> = (props) => {
+  const { formatMessage } = useIntl();
+  const [authType, setAuthType] = useState('none');
+
+  const getAuthFormItems = () => {
+    switch (props.form.getFieldValue('authType')) {
+      case 'basic-auth':
+        return (
+          <>
+            <Form.Item
+              label={formatMessage({ id: 'page.route.form.itemLabel.username' })}
+              name="username"
+              rules={[
+                {
+                  required: true,
+                  message: `${formatMessage({
+                    id: 'component.global.pleaseEnter',
+                  })}${formatMessage({ id: 'page.route.form.itemLabel.username' })}`,
+                },
+              ]}
+            >
+              <Input />
+            </Form.Item>
+            <Form.Item
+              label={formatMessage({ id: 'page.route.form.itemLabel.password' })}
+              name="password"
+              rules={[
+                {
+                  required: true,
+                  message: `${formatMessage({
+                    id: 'component.global.pleaseEnter',
+                  })}${formatMessage({ id: 'page.route.form.itemLabel.password' })}`,
+                },
+              ]}
+            >
+              <Input.Password />
+            </Form.Item>
+          </>
+        );
+      case 'jwt-auth':
+        return (
+          <Form.Item
+            label={formatMessage({ id: 'page.route.form.itemLabel.token' })}
+            name="Authorization"
+            rules={[
+              {
+                required: true,
+                message: `${formatMessage({ id: 'component.global.pleaseEnter' })}${formatMessage({
+                  id: 'page.route.form.itemLabel.token',
+                })}`,
+              },
+            ]}
+          >
+            <Input />
+          </Form.Item>
+        );
+      case 'key-auth':
+        return (
+          <Form.Item
+            label={formatMessage({ id: 'page.route.form.itemLabel.apikey' })}
+            name="apikey"
+            rules={[
+              {
+                required: true,
+                message: `${formatMessage({ id: 'component.global.pleaseEnter' })}${formatMessage({
+                  id: 'page.route.form.itemLabel.apikey',
+                })}`,
+              },
+            ]}
+          >
+            <Input />
+          </Form.Item>
+        );
+      default:
+        return <div>{formatMessage({ id: 'page.route.debugWithoutAuth' })}</div>;
+    }
+  };
+
+  return (
+    <Card>
+      <Form name="authForm" form={props.form}>
+        <div className={styles.authForm}>
+          <Form.Item name="authType">
+            <Radio.Group
+              defaultValue={authType}
+              onChange={(event) => {
+                const currentValue = event.target.value;
+                setAuthType(currentValue);
+                props.form.setFieldsValue({ autyType: currentValue });
+              }}
+            >
+              <Radio value="none">None</Radio>
+              {AUTH_LIST.map((type) => (
+                <Radio key={type} value={type}>
+                  {type}
+                </Radio>
+              ))}
+            </Radio.Group>
+          </Form.Item>
+          <div>{getAuthFormItems()}</div>
+        </div>
+      </Form>
+    </Card>
+  );
+};
+
+export default AuthenticationView;
diff --git a/web/src/pages/Route/components/DebugViews/DebugDrawView.tsx b/web/src/pages/Route/components/DebugViews/DebugDrawView.tsx
new file mode 100644
index 0000000..24f75b7
--- /dev/null
+++ b/web/src/pages/Route/components/DebugViews/DebugDrawView.tsx
@@ -0,0 +1,247 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React, { useEffect, useState } from 'react';
+import { Input, Select, Card, Tabs, Form, Drawer, Spin, notification } from 'antd';
+import { useIntl } from 'umi';
+import CodeMirror from '@uiw/react-codemirror';
+import { PanelSection } from '@api7-dashboard/ui';
+import queryString from 'query-string';
+import Base64 from 'base-64';
+
+import {
+  HTTP_METHOD_OPTION_LIST,
+  DEFAULT_DEBUG_PARAM_FORM_DATA,
+  DEFAULT_DEBUG_AUTH_FORM_DATA,
+} from '../../constants';
+import { DebugParamsView, AuthenticationView } from '.';
+import { debugRoute } from '../../service';
+import styles from './index.less';
+
+const { Option } = Select;
+const { Search } = Input;
+const { TabPane } = Tabs;
+
+const DebugDrawView: React.FC<RouteModule.DebugDrawProps> = (props) => {
+  const { formatMessage } = useIntl();
+  const [httpMethod, setHttpMethod] = useState('GET');
+  const [showBodyTab, setShowBodyTab] = useState(false);
+  const [queryForm] = Form.useForm();
+  const [bodyForm] = Form.useForm();
+  const [authForm] = Form.useForm();
+  const [headerForm] = Form.useForm();
+  const [responseCode, setResponseCode] = useState<string>();
+  const [loading, setLoading] = useState(false);
+  const [codeMirrorHeight, setCodeMirrorHeight] = useState<number | string>(50);
+  const methodWithoutBody = ['GET', 'HEAD'];
+
+  const resetForms = () => {
+    queryForm.setFieldsValue(DEFAULT_DEBUG_PARAM_FORM_DATA);
+    bodyForm.setFieldsValue(DEFAULT_DEBUG_PARAM_FORM_DATA);
+    headerForm.setFieldsValue(DEFAULT_DEBUG_PARAM_FORM_DATA);
+    authForm.setFieldsValue(DEFAULT_DEBUG_AUTH_FORM_DATA);
+    setResponseCode(`${formatMessage({ id: 'page.route.debug.showResultAfterSendRequest' })}`);
+  };
+
+  useEffect(() => {
+    resetForms();
+  }, []);
+
+  const transformBodyParamsFormData = (formData: RouteModule.debugRequestParamsFormData[]) => {
+    let transformData = {};
+    (formData || [])
+      .filter((data) => data.check)
+      .forEach((data) => {
+        transformData = {
+          ...transformData,
+          [data.key]: data.value,
+        };
+      });
+
+    return transformData;
+  };
+
+  const transformHeaderAndQueryParamsFormData = (
+    formData: RouteModule.debugRequestParamsFormData[],
+  ) => {
+    let transformData = {};
+    (formData || [])
+      .filter((data) => data.check)
+      .forEach((data) => {
+        transformData = {
+          ...transformData,
+          [data.key]: [...(transformData[data.key] || []), data.value],
+        };
+      });
+
+    return transformData;
+  };
+
+  const transformAuthFormData = (formData: RouteModule.authData, headerData: any) => {
+    const { authType } = formData;
+
+    switch (authType) {
+      case 'basic-auth':
+        return {
+          ...headerData,
+          Authorization: [`Basic ${Base64.encode(`${formData.username}:${formData.password}`)}`],
+        };
+      case 'jwt-auth':
+        return {
+          ...headerData,
+          Authorization: [formData.Authorization],
+        };
+      case 'key-auth':
+        return {
+          ...headerData,
+          apikey: [formData.apikey],
+        };
+      default:
+        break;
+    }
+
+    return headerData;
+  };
+
+  const handleDebug = (url: string) => {
+    if (url === '') {
+      notification.warning({
+        message: formatMessage({ id: 'page.route.input.placeholder.requestUrl' }),
+      });
+      return;
+    }
+    const queryFormData = transformHeaderAndQueryParamsFormData(queryForm.getFieldsValue().params);
+    const bodyFormData = transformBodyParamsFormData(bodyForm.getFieldsValue().params);
+    const pureHeaderFormData = transformHeaderAndQueryParamsFormData(
+      headerForm.getFieldsValue().params,
+    );
+    const headerFormData = transformAuthFormData(authForm.getFieldsValue(), pureHeaderFormData);
+    const urlQueryString = queryString.stringify(queryFormData);
+
+    setLoading(true);
+    // TODO: grpc and websocket
+    debugRoute({
+      url: `${url}${urlQueryString && `?${urlQueryString}`}`,
+      request_protocol: 'http',
+      method: httpMethod,
+      body_params: bodyFormData,
+      header_params: headerFormData,
+    })
+      .then((req) => {
+        setLoading(false);
+        setResponseCode(JSON.stringify(req.data.data, null, 2));
+        setCodeMirrorHeight('auto');
+      })
+      .catch(() => {
+        setLoading(false);
+      });
+  };
+  return (
+    <Drawer
+      title={formatMessage({ id: 'page.route.onlineDebug' })}
+      mask={false}
+      maskClosable={false}
+      visible={props.visible}
+      width={600}
+      onClose={() => {
+        props.onClose();
+      }}
+      className={styles.routeDebugDraw}
+    >
+      <Card bordered={false}>
+        <Input.Group compact>
+          <Select
+            defaultValue={httpMethod}
+            style={{ width: '20%' }}
+            onChange={(value) => {
+              setHttpMethod(value);
+              setShowBodyTab(!(methodWithoutBody.indexOf(value) > -1));
+            }}
+            size="large"
+          >
+            {HTTP_METHOD_OPTION_LIST.map((method) => {
+              return (
+                <Option key={method} value={method}>
+                  {method}
+                </Option>
+              );
+            })}
+          </Select>
+          <Search
+            placeholder={formatMessage({ id: 'page.route.input.placeholder.requestUrl' })}
+            allowClear
+            enterButton={formatMessage({ id: 'page.route.button.send' })}
+            size="large"
+            style={{ width: '80%' }}
+            onSearch={handleDebug}
+            onPressEnter={(e) => {
+              handleDebug(e.currentTarget.value);
+            }}
+            onChange={(e) => {
+              if (e.currentTarget.value === '') {
+                resetForms();
+                setCodeMirrorHeight(50);
+              }
+            }}
+          />
+        </Input.Group>
+        <PanelSection
+          title={formatMessage({ id: 'page.route.PanelSection.title.defineRequestParams' })}
+        >
+          <Tabs>
+            <TabPane tab={formatMessage({ id: 'page.route.TabPane.queryParams' })} key="query">
+              <DebugParamsView form={queryForm} />
+            </TabPane>
+            <TabPane tab={formatMessage({ id: 'page.route.TabPane.authentication' })} key="auth">
+              <AuthenticationView form={authForm} />
+            </TabPane>
+            <TabPane tab={formatMessage({ id: 'page.route.TabPane.headerParams' })} key="header">
+              <DebugParamsView form={headerForm} />
+            </TabPane>
+            {showBodyTab && (
+              <TabPane tab={formatMessage({ id: 'page.route.TabPane.bodyParams' })} key="body">
+                <DebugParamsView form={bodyForm} />
+              </TabPane>
+            )}
+          </Tabs>
+        </PanelSection>
+        <PanelSection title={formatMessage({ id: 'page.route.PanelSection.title.responseResult' })}>
+          <Tabs>
+            <TabPane tab={formatMessage({ id: 'page.route.TabPane.response' })} key="reponse">
+              <Spin tip="Loading..." spinning={loading}>
+                <CodeMirror
+                  value={responseCode}
+                  height={codeMirrorHeight}
+                  options={{
+                    mode: 'json-ld',
+                    readOnly: 'nocursor',
+                    lineWrapping: true,
+                    lineNumbers: true,
+                    showCursorWhenSelecting: true,
+                    autofocus: true,
+                    scrollbarStyle: null,
+                  }}
+                />
+              </Spin>
+            </TabPane>
+          </Tabs>
+        </PanelSection>
+      </Card>
+    </Drawer>
+  );
+};
+
+export default DebugDrawView;
diff --git a/web/src/pages/Route/components/DebugViews/DebugParamsView.tsx b/web/src/pages/Route/components/DebugViews/DebugParamsView.tsx
new file mode 100644
index 0000000..b116a0b
--- /dev/null
+++ b/web/src/pages/Route/components/DebugViews/DebugParamsView.tsx
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React from 'react';
+import { Form, Input, Row, Col, Checkbox } from 'antd';
+import { useIntl } from 'umi';
+import { MinusCircleOutlined } from '@ant-design/icons';
+
+import styles from './index.less';
+
+const DebugParamsView: React.FC<RouteModule.DebugViewProps> = (props) => {
+  const { formatMessage } = useIntl();
+
+  return (
+    <Form name="dynamic_form_nest_item" className={styles.routeDebugDraw} form={props.form}>
+      <Form.List name="params">
+        {(fields, { add, remove }) => {
+          return (
+            <>
+              {fields.map((field, index) => (
+                <Row gutter={16} key={field.name}>
+                  <Col span={1}>
+                    <Form.Item
+                      name={[field.name, 'check']}
+                      style={{ textAlign: 'right' }}
+                      valuePropName="checked"
+                    >
+                      {fields.length > 1 && index !== fields.length - 1 && <Checkbox />}
+                    </Form.Item>
+                  </Col>
+                  <Col span={8}>
+                    <Form.Item name={[field.name, 'key']}>
+                      <Input
+                        placeholder={formatMessage({ id: 'page.route.input.placeholder.paramKey' })}
+                        onChange={() => {
+                          // only last line key field input can trigger add new line event
+                          if (index === fields.length - 1) {
+                            add();
+                            const prevData = props.form.getFieldsValue();
+                            // auto change the prev line checkbox checked
+                            prevData.params[index].check = true;
+                            props.form.setFieldsValue(prevData);
+                          }
+                        }}
+                      />
+                    </Form.Item>
+                  </Col>
+                  <Col span={8}>
+                    <Form.Item name={[field.name, 'value']}>
+                      <Input
+                        placeholder={formatMessage({
+                          id: 'page.route.input.placeholder.paramValue',
+                        })}
+                      />
+                    </Form.Item>
+                  </Col>
+                  <Col>
+                    {fields.length > 1 && index !== fields.length - 1 && (
+                      <MinusCircleOutlined onClick={() => remove(field.name)} />
+                    )}
+                  </Col>
+                </Row>
+              ))}
+            </>
+          );
+        }}
+      </Form.List>
+    </Form>
+  );
+};
+
+export default DebugParamsView;
diff --git a/web/src/pages/Route/components/DebugViews/index.less b/web/src/pages/Route/components/DebugViews/index.less
new file mode 100644
index 0000000..f9cb5dc
--- /dev/null
+++ b/web/src/pages/Route/components/DebugViews/index.less
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+@import '~antd/es/style/themes/default.less';
+
+.routeDebugDraw {
+  :global {
+    .ant-card-body {
+      padding: 0;
+    }
+    .ant-drawer-body {
+      padding: 16px;
+    }
+    .ant-radio-wrapper {
+      display: block;
+      height: 30px;
+      line-height: 30px;
+    }
+    .ant-form-item {
+      margin-bottom: 8px;
+    }
+    .ant-radio-group {
+      margin-right: 16px;
+      border-right: 1px solid #e0e0e0;
+    }
+  }
+  .authForm {
+    display: flex;
+    margin: 16px;
+  }
+}
diff --git a/web/src/pages/Route/components/DebugViews/index.ts b/web/src/pages/Route/components/DebugViews/index.ts
new file mode 100644
index 0000000..a2bb935
--- /dev/null
+++ b/web/src/pages/Route/components/DebugViews/index.ts
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+export { default as DebugParamsView } from './DebugParamsView';
+export { default as AuthenticationView } from './AuthenticationView';
+export { default as DebugDrawView } from './DebugDrawView';
diff --git a/web/src/pages/Route/constants.ts b/web/src/pages/Route/constants.ts
index 6ea3ed3..5490f8f 100644
--- a/web/src/pages/Route/constants.ts
+++ b/web/src/pages/Route/constants.ts
@@ -83,3 +83,19 @@ export const HASH_KEY_LIST = [
 ];
 
 export const HASH_ON_LIST = ['vars', 'header', 'cookie', 'consumer'];
+
+export const AUTH_LIST = ['basic-auth', 'jwt-auth', 'key-auth'];
+
+export const DEFAULT_DEBUG_PARAM_FORM_DATA = {
+  params: [
+    {
+      check: false,
+      key: '',
+      value: '',
+    },
+  ],
+};
+
+export const DEFAULT_DEBUG_AUTH_FORM_DATA = {
+  authType: 'none',
+};
diff --git a/web/src/pages/Route/locales/en-US.ts b/web/src/pages/Route/locales/en-US.ts
index 92bfe5a..56b9ffc 100644
--- a/web/src/pages/Route/locales/en-US.ts
+++ b/web/src/pages/Route/locales/en-US.ts
@@ -16,6 +16,8 @@
  */
 export default {
   'page.route.button.returnList': 'Return Route List',
+  'page.route.button.send': 'Send',
+  'page.route.onlineDebug': 'Online Debug',
 
   'page.route.parameterPosition': 'Parameter Position',
   'page.route.httpRequestHeader': 'HTTP Request Header',
@@ -32,6 +34,9 @@ export default {
 
   'page.route.input.placeholder.parameterNameHttpHeader': 'Request header name, for example: HOST',
   'page.route.input.placeholder.parameterNameRequestParameter': 'Parameter name, for example: id',
+  'page.route.input.placeholder.requestUrl': 'please input the request URL',
+  'page.route.input.placeholder.paramKey': 'Param Key',
+  'page.route.input.placeholder.paramValue': 'Param Value',
 
   'page.route.form.itemRulesRequiredMessage.parameterName':
     'Only letters and Numbers are supported, and can only begin with letters',
@@ -55,6 +60,10 @@ export default {
   'page.route.input.placeholder.redirectCustom': 'For example: /foo/index.html',
   'page.route.select.option.redirect301': '301(Permanent Redirect)',
   'page.route.select.option.redirect302': '302(Temporary Redirect)',
+  'page.route.form.itemLabel.username': 'Username',
+  'page.route.form.itemLabel.password': 'Password',
+  'page.route.form.itemLabel.token': 'Token',
+  'page.route.form.itemLabel.apikey': 'Apikey',
 
   'page.route.form.itemExtraMessage.domain':
     'Domain Name or IP, support for generic Domain Name, for example: *.test.com',
@@ -103,4 +112,13 @@ export default {
   'page.route.domainName': 'Domain Name',
   'page.route.path': 'Path',
   'page.route.remoteAddrs': 'Remote Addrs',
+  'page.route.PanelSection.title.defineRequestParams': 'Define Request Parameters',
+  'page.route.PanelSection.title.responseResult': 'Response Result',
+  'page.route.debug.showResultAfterSendRequest': 'Show Result After Send Request',
+  'page.route.TabPane.queryParams': 'Query Params',
+  'page.route.TabPane.bodyParams': 'Body Params',
+  'page.route.TabPane.headerParams': 'Header Params',
+  'page.route.TabPane.authentication': 'Authentication',
+  'page.route.TabPane.response': 'Response',
+  'page.route.debugWithoutAuth': 'This request does not use any authorization.',
 };
diff --git a/web/src/pages/Route/locales/zh-CN.ts b/web/src/pages/Route/locales/zh-CN.ts
index da087b4..f805e67 100644
--- a/web/src/pages/Route/locales/zh-CN.ts
+++ b/web/src/pages/Route/locales/zh-CN.ts
@@ -36,14 +36,19 @@ export default {
   'page.route.status': '状态',
   'page.route.groupName': '分组名称',
   'page.route.offline': '下线',
+  'page.route.onlineDebug': '在线调试',
 
   // button
   'page.route.button.returnList': '返回路由列表',
+  'page.route.button.send': '发送请求',
 
   // input
   'page.route.input.placeholder.parameterNameHttpHeader': '请求头键名,例如:HOST',
   'page.route.input.placeholder.parameterNameRequestParameter': '参数名称,例如:id',
   'page.route.input.placeholder.redirectCustom': '例如:/foo/index.html',
+  'page.route.input.placeholder.requestUrl': '请输入请求地址',
+  'page.route.input.placeholder.paramKey': '参数名称',
+  'page.route.input.placeholder.paramValue': '参数值',
   // form
   'page.route.form.itemRulesRequiredMessage.parameterName': '仅支持字母和数字,且只能以字母开头',
   'page.route.form.itemLabel.apiName': 'API 名称',
@@ -66,6 +71,10 @@ export default {
     '客户端 IP,例如:192.168.1.101,192.168.1.0/24,::1,fe80::1,fe80::1/64',
   'page.route.form.itemRulesPatternMessage.remoteAddrs':
     '请输入合法的 IP 地址,例如:192.168.1.101,192.168.1.0/24,::1,fe80::1,fe80::1/64',
+  'page.route.form.itemLabel.username': '用户名',
+  'page.route.form.itemLabel.password': '密 码',
+  'page.route.form.itemLabel.token': 'Token',
+  'page.route.form.itemLabel.apikey': 'Apikey',
 
   // select
   'page.route.select.option.enableHttps': '启用 HTTPS',
@@ -85,6 +94,8 @@ export default {
   'page.route.panelSection.title.requestOverride': '请求改写',
   'page.route.panelSection.title.requestConfigBasicDefine': '请求基础定义',
   'page.route.panelSection.title.advancedMatchRule': '高级路由匹配条件',
+  'page.route.PanelSection.title.defineRequestParams': '请求参数定义',
+  'page.route.PanelSection.title.responseResult': '请求响应结果',
 
   'page.route.httpAction': '行为',
   'page.route.httpOverrideOrCreate': '重写/创建',
@@ -103,4 +114,11 @@ export default {
   'page.route.input.placeholder.newPath': '例如:/foo/bar/index.html',
   'page.route.form.itemLabel.newPath': '新地址',
   'page.route.popconfirm.title.offline': '确定下线该路由吗?',
+  'page.route.debug.showResultAfterSendRequest': '发送请求后在此查看响应结果',
+  'page.route.TabPane.queryParams': '查询参数',
+  'page.route.TabPane.bodyParams': '请求体参数',
+  'page.route.TabPane.headerParams': '请求头参数',
+  'page.route.TabPane.authentication': '认证',
+  'page.route.TabPane.response': '响应结果',
+  'page.route.debugWithoutAuth': '当前请求不启用任何认证方式。',
 };
diff --git a/web/src/pages/Route/service.ts b/web/src/pages/Route/service.ts
index 82172b1..8a1fad6 100644
--- a/web/src/pages/Route/service.ts
+++ b/web/src/pages/Route/service.ts
@@ -85,3 +85,10 @@ export const checkHostWithSSL = (hosts: string[]) =>
     method: 'POST',
     data: hosts,
   });
+
+export const debugRoute = (data: RouteModule.debugRequest) => {
+  return request('/debug-request-forwarding', {
+    method: 'post',
+    data,
+  });
+};
diff --git a/web/src/pages/Route/typing.d.ts b/web/src/pages/Route/typing.d.ts
index 3db4a2b..4367972 100644
--- a/web/src/pages/Route/typing.d.ts
+++ b/web/src/pages/Route/typing.d.ts
@@ -107,48 +107,6 @@ declare namespace RouteModule {
     url?: string;
   };
 
-  type RouteParamSchema = {
-    type: string | integer | boolean | object | array;
-  };
-
-  type RouteParam = {
-    name: string;
-    in: 'query' | 'header' | 'path' | 'cookie';
-    description: string;
-    required: boolean;
-    style?: 'form' | 'simple';
-    explode?: boolean;
-    schema?: RouteParamSchema;
-  };
-
-  type PathSchema = {
-    tags: string;
-    summary: string;
-    description: string;
-    operationId: string;
-    requestBody?: object;
-    parameters?: RouteParam[];
-    responses: ResponseScheme;
-  };
-
-  type ResponseSchema = {
-    [code: string]: {
-      description: string;
-      content: ResponseItemContent;
-    };
-  };
-
-  type ResponseItemContent = {
-    'application/xml'?: {};
-    'application/json'?: {};
-  };
-
-  type TagSchema = {
-    name: string;
-    description: string;
-    externalDocs?: object;
-  };
-
   // step1
   interface MatchingRule {
     position: VarPosition;
@@ -271,4 +229,32 @@ declare namespace RouteModule {
     create_time: number;
     update_time: number;
   };
+
+  // TODO: grpc and websocket
+  type debugRequest = {
+    url: string;
+    request_protocol: 'http' | 'grpc' | 'websocket';
+    method: string;
+    body_params?: any;
+    header_params?: any;
+  };
+  type authData = {
+    authType: string;
+    username?: string;
+    password?: string;
+    Authorization?: string;
+    apikey?: string;
+  };
+  type debugRequestParamsFormData = {
+    check: boolean;
+    key: string;
+    value: string;
+  };
+  type DebugViewProps = {
+    form: FormInstance;
+  };
+  type DebugDrawProps = {
+    visible: boolean;
+    onClose(): void;
+  };
 }
diff --git a/web/src/pages/Upstream/List.tsx b/web/src/pages/Upstream/List.tsx
index 396acab..1f3d80e 100644
--- a/web/src/pages/Upstream/List.tsx
+++ b/web/src/pages/Upstream/List.tsx
@@ -20,7 +20,6 @@ import ProTable, { ProColumns, ActionType } from '@ant-design/pro-table';
 import { Popconfirm, Button, notification } from 'antd';
 import { history, useIntl } from 'umi';
 import { PlusOutlined } from '@ant-design/icons';
-
 import { timestampToLocaleString } from '@/helpers';
 
 import { fetchList, remove } from './service';
diff --git a/web/yarn.lock b/web/yarn.lock
index eacd092..f5727a2 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -1369,7 +1369,7 @@
     pirates "^4.0.0"
     source-map-support "^0.5.16"
 
-"@babel/runtime-corejs2@^7.10.4", "@babel/runtime-corejs2@^7.8.7":
+"@babel/runtime-corejs2@^7.8.7":
   version "7.11.2"
   resolved "https://registry.npm.taobao.org/@babel/runtime-corejs2/download/@babel/runtime-corejs2-7.11.2.tgz?cache=0&sync_timestamp=1596637246233&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fruntime-corejs2%2Fdownload%2F%40babel%2Fruntime-corejs2-7.11.2.tgz#700a03945ebad0d31ba6690fc8a6bcc9040faa47"
   integrity sha1-cAoDlF660NMbpmkPyKa8yQQPqkc=
@@ -1392,7 +1392,7 @@
   dependencies:
     regenerator-runtime "^0.13.4"
 
-"@babel/runtime@7.11.2", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
+"@babel/runtime@7.11.2", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.4.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
   version "7.11.2"
   resolved "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.11.2.tgz?cache=0&sync_timestamp=1596637761107&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736"
   integrity sha1-9UnBPHVMxAuHZEufqfCaapX+BzY=
@@ -1483,11 +1483,6 @@
   resolved "https://registry.npm.taobao.org/@bcoe/v8-coverage/download/@bcoe/v8-coverage-0.2.3.tgz?cache=0&sync_timestamp=1588857799815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40bcoe%2Fv8-coverage%2Fdownload%2F%40bcoe%2Fv8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
   integrity sha1-daLotRy3WKdVPWgEpZMteqznXDk=
 
-"@braintree/sanitize-url@^4.0.0":
-  version "4.1.1"
-  resolved "https://registry.npm.taobao.org/@braintree/sanitize-url/download/@braintree/sanitize-url-4.1.1.tgz#671b3cfdbcc40d1449036ce586e882ab6150828e"
-  integrity sha1-Zxs8/bzEDRRJA2zlhuiCq2FQgo4=
-
 "@cnakazawa/watch@^1.0.3":
   version "1.0.4"
   resolved "https://registry.npm.taobao.org/@cnakazawa/watch/download/@cnakazawa/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a"
@@ -1923,18 +1918,6 @@
     "@types/yargs" "^15.0.0"
     chalk "^3.0.0"
 
-"@kyleshockey/object-assign-deep@^0.4.2":
-  version "0.4.2"
-  resolved "https://registry.npm.taobao.org/@kyleshockey/object-assign-deep/download/@kyleshockey/object-assign-deep-0.4.2.tgz#84900f0eefc372798f4751b5262830b8208922ec"
-  integrity sha1-hJAPDu/DcnmPR1G1JigwuCCJIuw=
-
-"@kyleshockey/xml@^1.0.2":
-  version "1.0.2"
-  resolved "https://registry.npm.taobao.org/@kyleshockey/xml/download/@kyleshockey/xml-1.0.2.tgz#81fad3d7c33da2ba2639db095db3db24c2921f70"
-  integrity sha1-gfrT18M9oromOdsJXbPbJMKSH3A=
-  dependencies:
-    stream "^0.0.2"
-
 "@mrblenny/react-flow-chart@^0.0.14":
   version "0.0.14"
   resolved "https://registry.npm.taobao.org/@mrblenny/react-flow-chart/download/@mrblenny/react-flow-chart-0.0.14.tgz#be11d06345c7222b41f488b38011b109e48a04b3"
@@ -2243,6 +2226,11 @@
   dependencies:
     "@babel/types" "^7.3.0"
 
+"@types/base-64@^0.1.3":
+  version "0.1.3"
+  resolved "https://registry.npm.taobao.org/@types/base-64/download/@types/base-64-0.1.3.tgz#875320c0d019f576a179324124cdbd5031a411f5"
+  integrity sha1-h1MgwNAZ9XaheTJBJM29UDGkEfU=
+
 "@types/body-parser@*":
   version "1.19.0"
   resolved "https://registry.npm.taobao.org/@types/body-parser/download/@types/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f"
@@ -2661,13 +2649,6 @@
     "@types/prop-types" "*"
     csstype "^3.0.2"
 
-"@types/react@16.4.6":
-  version "16.4.6"
-  resolved "https://registry.npm.taobao.org/@types/react/download/@types/react-16.4.6.tgz?cache=0&sync_timestamp=1598892372094&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Freact%2Fdownload%2F%40types%2Freact-16.4.6.tgz#5024957c6bcef4f02823accf5974faba2e54fada"
-  integrity sha1-UCSVfGvO9PAoI6zPWXT6ui5U+to=
-  dependencies:
-    csstype "^2.2.0"
-
 "@types/resolve@1.17.1":
   version "1.17.1"
   resolved "https://registry.npm.taobao.org/@types/resolve/download/@types/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6"
@@ -2747,13 +2728,6 @@
   resolved "https://registry.npm.taobao.org/@types/stack-utils/download/@types/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e"
   integrity sha1-CoUdO9lkmPolwzq3J47TvWXwbD4=
 
-"@types/swagger-ui-react@^3.23.3":
-  version "3.23.3"
-  resolved "https://registry.npm.taobao.org/@types/swagger-ui-react/download/@types/swagger-ui-react-3.23.3.tgz#56bcf3872d8655500e6d51d29ba3916397806fa3"
-  integrity sha1-Vrzzhy2GVVAObVHSm6ORY5eAb6M=
-  dependencies:
-    "@types/react" "*"
-
 "@types/tapable@*", "@types/tapable@1.0.6":
   version "1.0.6"
   resolved "https://registry.npm.taobao.org/@types/tapable/download/@types/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74"
@@ -4132,7 +4106,7 @@ arch@^2.1.2:
   resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11"
   integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==
 
-argparse@^1.0.10, argparse@^1.0.7:
+argparse@^1.0.7:
   version "1.0.10"
   resolved "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz?cache=0&sync_timestamp=1597414347077&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fargparse%2Fdownload%2Fargparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
   integrity sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=
@@ -4382,13 +4356,6 @@ atob@^2.1.2:
   resolved "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
   integrity sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=
 
-autolinker@^3.11.0:
-  version "3.14.1"
-  resolved "https://registry.npm.taobao.org/autolinker/download/autolinker-3.14.1.tgz#6ae4b812b6eaf42d4d68138b9e67757cbf2bc1e4"
-  integrity sha1-auS4Erbq9C1NaBOLnmd1fL8rweQ=
-  dependencies:
-    tslib "^1.9.3"
-
 autoprefixer@^9.0.0, autoprefixer@^9.5.1, autoprefixer@^9.6.1, autoprefixer@^9.8.0:
   version "9.8.6"
   resolved "https://registry.npm.taobao.org/autoprefixer/download/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f"
@@ -4620,7 +4587,12 @@ balanced-match@^1.0.0:
   resolved "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
   integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
 
-base64-js@^1.0.2, base64-js@^1.2.0:
+base-64@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npm.taobao.org/base-64/download/base-64-1.0.0.tgz#09d0f2084e32a3fd08c2475b973788eee6ae8f4a"
+  integrity sha1-CdDyCE4yo/0IwkdblzeI7uauj0o=
+
+base64-js@^1.0.2:
   version "1.3.1"
   resolved "https://registry.npm.taobao.org/base64-js/download/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
   integrity sha1-WOzoy3XdB+ce0IxzarxfrE2/jfE=
@@ -4876,11 +4848,6 @@ bser@2.1.1:
   dependencies:
     node-int64 "^0.4.0"
 
-btoa@^1.2.1:
-  version "1.2.1"
-  resolved "https://registry.npm.taobao.org/btoa/download/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73"
-  integrity sha1-AamQn4ssk/a/aAuiYTHrMPf6PXM=
-
 buffer-crc32@~0.2.3:
   version "0.2.13"
   resolved "https://registry.npm.taobao.org/buffer-crc32/download/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
@@ -4905,7 +4872,7 @@ buffer@^4.3.0:
     ieee754 "^1.1.4"
     isarray "^1.0.0"
 
-buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0:
+buffer@^5.2.1, buffer@^5.5.0:
   version "5.6.0"
   resolved "https://registry.npm.taobao.org/buffer/download/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786"
   integrity sha1-oxdJ3H2B2E2wir+Te2uMQDP2J4Y=
@@ -5368,15 +5335,6 @@ cli-width@^3.0.0:
   resolved "https://registry.npm.taobao.org/cli-width/download/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
   integrity sha1-ovSEN6LKqaIkNueUvwceyeYc7fY=
 
-clipboard@^2.0.0:
-  version "2.0.6"
-  resolved "https://registry.npm.taobao.org/clipboard/download/clipboard-2.0.6.tgz#52921296eec0fdf77ead1749421b21c968647376"
-  integrity sha1-UpISlu7A/fd+rRdJQhshyWhkc3Y=
-  dependencies:
-    good-listener "^1.2.2"
-    select "^1.1.2"
-    tiny-emitter "^2.0.0"
-
 clipboardy@2.1.0:
   version "2.1.0"
   resolved "https://registry.npm.taobao.org/clipboardy/download/clipboardy-2.1.0.tgz#0123a0c8fac92f256dc56335e0bb8be97a4909a5"
@@ -5569,11 +5527,6 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
   dependencies:
     delayed-stream "~1.0.0"
 
-comma-separated-tokens@^1.0.0:
-  version "1.0.8"
-  resolved "https://registry.npm.taobao.org/comma-separated-tokens/download/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea"
-  integrity sha1-YyuAthF4Z6FY8QgK1Jiy++fj9eo=
-
 commander@*, commander@^6.0.0:
   version "6.0.0"
   resolved "https://registry.npm.taobao.org/commander/download/commander-6.0.0.tgz?cache=0&sync_timestamp=1595168173997&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-6.0.0.tgz#2b270da94f8fb9014455312f829a1129dbf8887e"
@@ -5746,11 +5699,6 @@ cookie@0.4.0:
   resolved "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
   integrity sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=
 
-cookie@~0.4.1:
-  version "0.4.1"
-  resolved "https://registry.npm.taobao.org/cookie/download/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
-  integrity sha1-r9cT/ibr0hupXOth+agRblClN9E=
-
 copy-concurrently@^1.0.0:
   version "1.0.5"
   resolved "https://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
@@ -5816,7 +5764,7 @@ core-js@^1.0.0:
   resolved "https://registry.npm.taobao.org/core-js/download/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
   integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=
 
-core-js@^2.4.0, core-js@^2.5.7, core-js@^2.6.11, core-js@^2.6.5:
+core-js@^2.4.0, core-js@^2.5.7, core-js@^2.6.5:
   version "2.6.11"
   resolved "https://registry.npm.taobao.org/core-js/download/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c"
   integrity sha1-OIMUafmSK97Y7iHJ3EaYXgOZMIw=
@@ -5889,7 +5837,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
     safe-buffer "^5.0.1"
     sha.js "^2.4.8"
 
-create-react-class@^15.5.1, create-react-class@^15.6.0:
+create-react-class@^15.6.0:
   version "15.6.3"
   resolved "https://registry.npm.taobao.org/create-react-class/download/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036"
   integrity sha1-LXMjf7P5cK5uvgEanmb0bbyoADY=
@@ -5910,13 +5858,6 @@ cross-env@^7.0.0:
   dependencies:
     cross-spawn "^7.0.1"
 
-cross-fetch@^3.0.5:
-  version "3.0.6"
-  resolved "https://registry.npm.taobao.org/cross-fetch/download/cross-fetch-3.0.6.tgz?cache=0&sync_timestamp=1599789185546&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcross-fetch%2Fdownload%2Fcross-fetch-3.0.6.tgz#3a4040bc8941e653e0e9cf17f29ebcd177d3365c"
-  integrity sha1-OkBAvIlB5lPg6c8X8p680XfTNlw=
-  dependencies:
-    node-fetch "2.6.1"
-
 cross-port-killer@^1.1.1:
   version "1.2.1"
   resolved "https://registry.npm.taobao.org/cross-port-killer/download/cross-port-killer-1.2.1.tgz#30f5912dba758e25ae250feb16687a472142c8ef"
@@ -6108,11 +6049,6 @@ css-what@^3.2.1:
   resolved "https://registry.npm.taobao.org/css-what/download/css-what-3.3.0.tgz#10fec696a9ece2e591ac772d759aacabac38cd39"
   integrity sha1-EP7Glqns4uWRrHctdZqsq6w4zTk=
 
-css.escape@1.5.1:
-  version "1.5.1"
-  resolved "https://registry.npm.taobao.org/css.escape/download/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb"
-  integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=
-
 cssdb@^4.4.0:
   version "4.4.0"
   resolved "https://registry.npm.taobao.org/cssdb/download/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0"
@@ -6227,11 +6163,6 @@ cssstyle@^2.0.0:
   dependencies:
     cssom "~0.3.6"
 
-csstype@^2.2.0:
-  version "2.6.13"
-  resolved "https://registry.npm.taobao.org/csstype/download/csstype-2.6.13.tgz?cache=0&sync_timestamp=1598348227965&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcsstype%2Fdownload%2Fcsstype-2.6.13.tgz#a6893015b90e84dd6e85d0e3b442a1e84f2dbe0f"
-  integrity sha1-pokwFbkOhN1uhdDjtEKh6E8tvg8=
-
 csstype@^3.0.2:
   version "3.0.3"
   resolved "https://registry.npm.taobao.org/csstype/download/csstype-3.0.3.tgz?cache=0&sync_timestamp=1598348228932&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcsstype%2Fdownload%2Fcsstype-3.0.3.tgz#2b410bbeba38ba9633353aff34b05d9755d065f8"
@@ -6417,7 +6348,7 @@ dedent@^0.7.0:
   resolved "https://registry.npm.taobao.org/dedent/download/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
   integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
 
-deep-extend@0.6.0, deep-extend@^0.6.0, deep-extend@~0.6.0:
+deep-extend@^0.6.0:
   version "0.6.0"
   resolved "https://registry.npm.taobao.org/deep-extend/download/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
   integrity sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=
@@ -6483,11 +6414,6 @@ delayed-stream@~1.0.0:
   resolved "https://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
   integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
 
-delegate@^3.1.2:
-  version "3.2.0"
-  resolved "https://registry.npm.taobao.org/delegate/download/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166"
-  integrity sha1-tmtxwxWFIuirV0T3INjKDCr1kWY=
-
 depd@~1.1.2:
   version "1.1.2"
   resolved "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
@@ -6669,11 +6595,6 @@ domhandler@^2.3.0:
   dependencies:
     domelementtype "1"
 
-dompurify@^2.0.7:
-  version "2.0.15"
-  resolved "https://registry.npm.taobao.org/dompurify/download/dompurify-2.0.15.tgz#80e300fc3e89547bd0af1aff2eba88ce17fc9dea"
-  integrity sha1-gOMA/D6JVHvQrxr/LrqIzhf8neo=
-
 domutils@1.5.1:
   version "1.5.1"
   resolved "https://registry.npm.taobao.org/domutils/download/domutils-1.5.1.tgz?cache=0&sync_timestamp=1597680585980&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomutils%2Fdownload%2Fdomutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
@@ -6832,11 +6753,6 @@ elliptic@^6.5.3:
     minimalistic-assert "^1.0.0"
     minimalistic-crypto-utils "^1.0.0"
 
-emitter-component@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.npm.taobao.org/emitter-component/download/emitter-component-1.1.1.tgz#065e2dbed6959bf470679edabeaf7981d1003ab6"
-  integrity sha1-Bl4tvtaVm/RwZ57avq95gdEAOrY=
-
 emoji-regex@^7.0.1:
   version "7.0.3"
   resolved "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
@@ -7938,11 +7854,6 @@ fast-deep-equal@3.1.1:
   resolved "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.1.tgz?cache=0&sync_timestamp=1591599666712&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4"
   integrity sha1-VFFFB3xQFJHjOxXsQIwpQ3bpSuQ=
 
-fast-deep-equal@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
-  integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
-
 fast-deep-equal@^3.1.1:
   version "3.1.3"
   resolved "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz?cache=0&sync_timestamp=1591599666712&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
@@ -7972,13 +7883,6 @@ fast-glob@^3.0.3, fast-glob@^3.1.1:
     micromatch "^4.0.2"
     picomatch "^2.2.1"
 
-fast-json-patch@^2.2.1:
-  version "2.2.1"
-  resolved "https://registry.npm.taobao.org/fast-json-patch/download/fast-json-patch-2.2.1.tgz#18150d36c9ab65c7209e7d4eb113f4f8eaabe6d9"
-  integrity sha1-GBUNNsmrZccgnn1OsRP0+Oqr5tk=
-  dependencies:
-    fast-deep-equal "^2.0.1"
-
 fast-json-stable-stringify@^2.0.0:
   version "2.1.0"
   resolved "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
@@ -7996,13 +7900,6 @@ fastq@^1.6.0:
   dependencies:
     reusify "^1.0.4"
 
-fault@^1.0.0:
-  version "1.0.4"
-  resolved "https://registry.npm.taobao.org/fault/download/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13"
-  integrity sha1-6vz8Cm0hT8lGAeFw3ymVSk+ELxM=
-  dependencies:
-    format "^0.2.0"
-
 faye-websocket@^0.10.0:
   version "0.10.0"
   resolved "https://registry.npm.taobao.org/faye-websocket/download/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
@@ -8270,7 +8167,7 @@ fork-ts-checker-webpack-plugin@5.0.12:
     semver "^7.3.2"
     tapable "^1.0.0"
 
-form-data@^2.3.2, form-data@^2.5.0:
+form-data@^2.5.0:
   version "2.5.1"
   resolved "https://registry.npm.taobao.org/form-data/download/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4"
   integrity sha1-8svsV7XlniNxbhKP5E1OXdI4lfQ=
@@ -8293,11 +8190,6 @@ format-util@^1.0.3:
   resolved "https://registry.npm.taobao.org/format-util/download/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271"
   integrity sha1-H/tFDIoD57zP/kBkMYCRjMKX0nE=
 
-format@^0.2.0:
-  version "0.2.2"
-  resolved "https://registry.npm.taobao.org/format/download/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
-  integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=
-
 forwarded@~0.1.2:
   version "0.1.2"
   resolved "https://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
@@ -8688,13 +8580,6 @@ gonzales-pe@^4.2.3, gonzales-pe@^4.3.0:
   dependencies:
     minimist "^1.2.5"
 
-good-listener@^1.2.2:
-  version "1.2.2"
-  resolved "https://registry.npm.taobao.org/good-listener/download/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50"
-  integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=
-  dependencies:
-    delegate "^3.1.2"
-
 got@9.6.0:
   version "9.6.0"
   resolved "https://registry.npm.taobao.org/got/download/got-9.6.0.tgz?cache=0&sync_timestamp=1596795620076&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgot%2Fdownload%2Fgot-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
@@ -8853,21 +8738,6 @@ hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7:
     inherits "^2.0.3"
     minimalistic-assert "^1.0.1"
 
-hast-util-parse-selector@^2.0.0:
-  version "2.2.4"
-  resolved "https://registry.npm.taobao.org/hast-util-parse-selector/download/hast-util-parse-selector-2.2.4.tgz#60c99d0b519e12ab4ed32e58f150ec3f61ed1974"
-  integrity sha1-YMmdC1GeEqtO0y5Y8VDsP2HtGXQ=
-
-hastscript@^5.0.0:
-  version "5.1.2"
-  resolved "https://registry.npm.taobao.org/hastscript/download/hastscript-5.1.2.tgz#bde2c2e56d04c62dd24e8c5df288d050a355fb8a"
-  integrity sha1-veLC5W0Exi3SToxd8ojQUKNV+4o=
-  dependencies:
-    comma-separated-tokens "^1.0.0"
-    hast-util-parse-selector "^2.0.0"
-    property-information "^5.0.0"
-    space-separated-tokens "^1.0.0"
-
 heap@0.2.5:
   version "0.2.5"
   resolved "https://registry.npm.taobao.org/heap/download/heap-0.2.5.tgz#713b65590ebcc40fcbeeaf55e851694092b39af1"
@@ -8878,16 +8748,6 @@ hex-color-regex@^1.1.0:
   resolved "https://registry.npm.taobao.org/hex-color-regex/download/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
   integrity sha1-TAb8y0YC/iYCs8k9+C1+fb8aio4=
 
-highlight.js@^10.1.1:
-  version "10.2.0"
-  resolved "https://registry.npm.taobao.org/highlight.js/download/highlight.js-10.2.0.tgz#367151bcf813adebc54822f1cb51d2e1e599619f"
-  integrity sha1-NnFRvPgTrevFSCLxy1HS4eWZYZ8=
-
-highlight.js@~10.1.0:
-  version "10.1.2"
-  resolved "https://registry.npm.taobao.org/highlight.js/download/highlight.js-10.1.2.tgz#c20db951ba1c22c055010648dfffd7b2a968e00c"
-  integrity sha1-wg25UbocIsBVAQZI3//Xsqlo4Aw=
-
 history-with-query@4.10.3:
   version "4.10.3"
   resolved "https://registry.npm.taobao.org/history-with-query/download/history-with-query-4.10.3.tgz#9430a6f59a223796a68a436c0c4c7590233805a6"
@@ -9137,7 +8997,7 @@ identity-obj-proxy@3.0.0:
   dependencies:
     harmony-reflect "^1.4.6"
 
-ieee754@^1.1.13, ieee754@^1.1.4:
+ieee754@^1.1.4:
   version "1.1.13"
   resolved "https://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
   integrity sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=
@@ -9187,7 +9047,7 @@ immer@^5.0.0:
   resolved "https://registry.npm.taobao.org/immer/download/immer-5.3.6.tgz#51eab8cbbeb13075fe2244250f221598818cac04"
   integrity sha1-Ueq4y76xMHX+IkQlDyIVmIGMrAQ=
 
-immutable@^3.8.1, immutable@^3.x.x:
+immutable@^3.8.1:
   version "3.8.2"
   resolved "https://registry.npm.taobao.org/immutable/download/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3"
   integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=
@@ -9409,7 +9269,7 @@ intl@1.2.5:
   resolved "https://registry.npm.taobao.org/intl/download/intl-1.2.5.tgz#82244a2190c4e419f8371f5aa34daa3420e2abde"
   integrity sha1-giRKIZDE5Bn4Nx9ao02qNCDiq94=
 
-invariant@^2.0.0, invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4:
+invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4:
   version "2.2.4"
   resolved "https://registry.npm.taobao.org/invariant/download/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
   integrity sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=
@@ -9598,14 +9458,6 @@ is-docker@^2.0.0:
   resolved "https://registry.npm.taobao.org/is-docker/download/is-docker-2.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-docker%2Fdownload%2Fis-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156"
   integrity sha1-QSWojkTkUNOE4JBH7eca3C0UQVY=
 
-is-dom@^1.0.9:
-  version "1.1.0"
-  resolved "https://registry.npm.taobao.org/is-dom/download/is-dom-1.1.0.tgz#af1fced292742443bb59ca3f76ab5e80907b4e8a"
-  integrity sha1-rx/O0pJ0JEO7Wco/dqtegJB7Too=
-  dependencies:
-    is-object "^1.0.1"
-    is-window "^1.0.2"
-
 is-extendable@^0.1.0, is-extendable@^0.1.1:
   version "0.1.1"
   resolved "https://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
@@ -9714,11 +9566,6 @@ is-obj@^2.0.0:
   resolved "https://registry.npm.taobao.org/is-obj/download/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
   integrity sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI=
 
-is-object@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.npm.taobao.org/is-object/download/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
-  integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA=
-
 is-observable@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e"
@@ -9860,11 +9707,6 @@ is-whitespace-character@^1.0.0:
   resolved "https://registry.npm.taobao.org/is-whitespace-character/download/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7"
   integrity sha1-CFjt2UqVWUx8ndC1wXTsbkXuSqc=
 
-is-window@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.npm.taobao.org/is-window/download/is-window-1.0.2.tgz#2c896ca53db97de45d3c33133a65d8c9f563480d"
-  integrity sha1-LIlspT25feRdPDMTOmXYyfVjSA0=
-
 is-windows@^1.0.2:
   version "1.0.2"
   resolved "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
@@ -9927,13 +9769,6 @@ isomorphic-fetch@^2.1.1, isomorphic-fetch@^2.2.1:
     node-fetch "^1.0.1"
     whatwg-fetch ">=0.10.0"
 
-isomorphic-form-data@~2.0.0:
-  version "2.0.0"
-  resolved "https://registry.npm.taobao.org/isomorphic-form-data/download/isomorphic-form-data-2.0.0.tgz#9f6adf1c4c61ae3aefd8f110ab60fb9b143d6cec"
-  integrity sha1-n2rfHExhrjrv2PEQq2D7mxQ9bOw=
-  dependencies:
-    form-data "^2.3.2"
-
 isstream@~0.1.2:
   version "0.1.2"
   resolved "https://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
@@ -10496,11 +10331,6 @@ js-beautify@^1.13.0:
     mkdirp "^1.0.4"
     nopt "^5.0.0"
 
-js-file-download@^0.4.1:
-  version "0.4.12"
-  resolved "https://registry.npm.taobao.org/js-file-download/download/js-file-download-0.4.12.tgz#10c70ef362559a5b23cdbdc3bd6f399c3d91d821"
-  integrity sha1-EMcO82JVmlsjzb3DvW85nD2R2CE=
-
 "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
   version "4.0.0"
   resolved "https://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -10511,7 +10341,7 @@ js-tokens@^3.0.2:
   resolved "https://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
   integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
 
-js-yaml@^3.12.1, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.14.0:
+js-yaml@^3.12.1, js-yaml@^3.13.0, js-yaml@^3.13.1:
   version "3.14.0"
   resolved "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
   integrity sha1-p6NBcPJqIbsWJCTYray0ETpp5II=
@@ -11097,11 +10927,6 @@ locate-path@^5.0.0:
   dependencies:
     p-locate "^4.1.0"
 
-lodash-es@^4.2.1:
-  version "4.17.15"
-  resolved "https://registry.npm.taobao.org/lodash-es/download/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78"
-  integrity sha1-Ib2Wg5NUQS8j16EDQOXqxu5FXXg=
-
 lodash._reinterpolate@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npm.taobao.org/lodash._reinterpolate/download/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
@@ -11112,7 +10937,7 @@ lodash.camelcase@^4.1.1:
   resolved "https://registry.npm.taobao.org/lodash.camelcase/download/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
   integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
 
-lodash.debounce@^4, lodash.debounce@^4.0.8:
+lodash.debounce@^4.0.8:
   version "4.0.8"
   resolved "https://registry.npm.taobao.org/lodash.debounce/download/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
   integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
@@ -11232,7 +11057,7 @@ lodash.zip@^4.2.0:
   resolved "https://registry.npm.taobao.org/lodash.zip/download/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020"
   integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=
 
-lodash@4.17.20, "lodash@>=3.5 <5", lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1:
+lodash@4.17.20, "lodash@>=3.5 <5", lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5:
   version "4.17.20"
   resolved "https://registry.npm.taobao.org/lodash/download/lodash-4.17.20.tgz?cache=0&sync_timestamp=1597336001963&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
   integrity sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI=
@@ -11335,14 +11160,6 @@ lowercase-keys@^2.0.0:
   resolved "https://registry.npm.taobao.org/lowercase-keys/download/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
   integrity sha1-JgPni3tLAAbLyi+8yKMgJVislHk=
 
-lowlight@^1.14.0:
-  version "1.14.0"
-  resolved "https://registry.npm.taobao.org/lowlight/download/lowlight-1.14.0.tgz?cache=0&sync_timestamp=1592130682424&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flowlight%2Fdownload%2Flowlight-1.14.0.tgz#83ebc143fec0f9e6c0d3deffe01be129ce56b108"
-  integrity sha1-g+vBQ/7A+ebA097/4BvhKc5WsQg=
-  dependencies:
-    fault "^1.0.0"
-    highlight.js "~10.1.0"
-
 lru-cache@^4.1.5:
   version "4.1.5"
   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
@@ -11559,7 +11376,7 @@ memoize-one@^5.0.0, memoize-one@^5.1.1:
   resolved "https://registry.npm.taobao.org/memoize-one/download/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0"
   integrity sha1-BHtuMZm1COrsA1BN5xIpuOsddcA=
 
-memoizee@^0.4.12, memoizee@^0.4.14:
+memoizee@^0.4.14:
   version "0.4.14"
   resolved "https://registry.npm.taobao.org/memoizee/download/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57"
   integrity sha1-B6APIEaZ+alcLZ53IYJxx81hDVc=
@@ -12093,11 +11910,6 @@ node-fetch@2.6.0, node-fetch@^2.6.0:
   resolved "https://registry.npm.taobao.org/node-fetch/download/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
   integrity sha1-5jNFY4bUqlWGP2dqerDaqP3ssP0=
 
-node-fetch@2.6.1:
-  version "2.6.1"
-  resolved "https://registry.npm.taobao.org/node-fetch/download/node-fetch-2.6.1.tgz?cache=0&sync_timestamp=1599309120224&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-fetch%2Fdownload%2Fnode-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
-  integrity sha1-BFvTI2Mfdu0uK1VXM5RBa2OaAFI=
-
 node-fetch@^1.0.1:
   version "1.7.3"
   resolved "https://registry.npm.taobao.org/node-fetch/download/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
@@ -12893,11 +12705,6 @@ pend@~1.2.0:
   resolved "https://registry.npm.taobao.org/pend/download/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
   integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
 
-performance-now@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.npm.taobao.org/performance-now/download/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
-  integrity sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=
-
 performance-now@^2.1.0:
   version "2.1.0"
   resolved "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
@@ -13863,13 +13670,6 @@ pretty-time@^1.1.0:
   resolved "https://registry.npm.taobao.org/pretty-time/download/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e"
   integrity sha1-/7dCmvq7hTXDRqNOQYc63z103Q4=
 
-prismjs@^1.21.0, prismjs@~1.21.0:
-  version "1.21.0"
-  resolved "https://registry.npm.taobao.org/prismjs/download/prismjs-1.21.0.tgz#36c086ec36b45319ec4218ee164c110f9fc015a3"
-  integrity sha1-NsCG7Da0UxnsQhjuFkwRD5/AFaM=
-  optionalDependencies:
-    clipboard "^2.0.0"
-
 pro-download@1.0.1:
   version "1.0.1"
   resolved "https://registry.npm.taobao.org/pro-download/download/pro-download-1.0.1.tgz#1144d98138bbc188572109aaf8bdbf3d4d88ee2d"
@@ -13933,13 +13733,6 @@ prop-types@15.x, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, pr
     object-assign "^4.1.1"
     react-is "^16.8.1"
 
-property-information@^5.0.0:
-  version "5.5.0"
-  resolved "https://registry.npm.taobao.org/property-information/download/property-information-5.5.0.tgz#4dc075d493061a82e2b7d096f406e076ed859943"
-  integrity sha1-TcB11JMGGoLit9CW9Abgdu2FmUM=
-  dependencies:
-    xtend "^4.0.0"
-
 proto-list@~1.2.1:
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
@@ -14078,7 +13871,7 @@ qs@6.7.0:
   resolved "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
   integrity sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=
 
-qs@^6.9.0, qs@^6.9.1, qs@^6.9.4:
+qs@^6.9.0, qs@^6.9.1:
   version "6.9.4"
   resolved "https://registry.npm.taobao.org/qs/download/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687"
   integrity sha1-kJCykNH5FyjTwi5UhDykSupatoc=
@@ -14105,10 +13898,14 @@ query-string@^6.11.0:
     split-on-first "^1.0.0"
     strict-uri-encode "^2.0.0"
 
-querystring-browser@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.npm.taobao.org/querystring-browser/download/querystring-browser-1.0.4.tgz#f2e35881840a819bc7b1bf597faf0979e6622dc6"
-  integrity sha1-8uNYgYQKgZvHsb9Zf68JeeZiLcY=
+query-string@^6.13.7:
+  version "6.13.7"
+  resolved "https://registry.npm.taobao.org/query-string/download/query-string-6.13.7.tgz?cache=0&sync_timestamp=1604609929956&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fquery-string%2Fdownload%2Fquery-string-6.13.7.tgz#af53802ff6ed56f3345f92d40a056f93681026ee"
+  integrity sha1-r1OAL/btVvM0X5LUCgVvk2gQJu4=
+  dependencies:
+    decode-uri-component "^0.2.0"
+    split-on-first "^1.0.0"
+    strict-uri-encode "^2.0.0"
 
 querystring-es3@^0.2.0:
   version "0.2.1"
@@ -14659,14 +14456,6 @@ react-app-polyfill@^1.0.4:
     regenerator-runtime "^0.13.3"
     whatwg-fetch "^3.0.0"
 
-react-copy-to-clipboard@5.0.1:
-  version "5.0.1"
-  resolved "https://registry.npm.taobao.org/react-copy-to-clipboard/download/react-copy-to-clipboard-5.0.1.tgz#8eae107bb400be73132ed3b6a7b4fb156090208e"
-  integrity sha1-jq4Qe7QAvnMTLtO2p7T7FWCQII4=
-  dependencies:
-    copy-to-clipboard "^3"
-    prop-types "^15.5.8"
-
 react-copy-to-clipboard@^5.0.1:
   version "5.0.2"
   resolved "https://registry.npm.taobao.org/react-copy-to-clipboard/download/react-copy-to-clipboard-5.0.2.tgz#d82a437e081e68dfca3761fbd57dbf2abdda1316"
@@ -14675,14 +14464,6 @@ react-copy-to-clipboard@^5.0.1:
     copy-to-clipboard "^3"
     prop-types "^15.5.8"
 
-react-debounce-input@^3.2.0:
-  version "3.2.2"
-  resolved "https://registry.npm.taobao.org/react-debounce-input/download/react-debounce-input-3.2.2.tgz#d2cc99c1ce47fae89037965f5699edc1b0317197"
-  integrity sha1-0syZwc5H+uiQN5ZfVpntwbAxcZc=
-  dependencies:
-    lodash.debounce "^4"
-    prop-types "^15.7.2"
-
 react-dev-utils@9.0.1:
   version "9.0.1"
   resolved "https://registry.npm.taobao.org/react-dev-utils/download/react-dev-utils-9.0.1.tgz?cache=0&sync_timestamp=1596670540753&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freact-dev-utils%2Fdownload%2Freact-dev-utils-9.0.1.tgz#5c03d85a0b2537d0c46af7165c24a7dfb274bef2"
@@ -14797,27 +14578,6 @@ react-helmet@6.0.0:
     react-fast-compare "^2.0.4"
     react-side-effect "^2.1.0"
 
-react-immutable-proptypes@2.1.0:
-  version "2.1.0"
-  resolved "https://registry.npm.taobao.org/react-immutable-proptypes/download/react-immutable-proptypes-2.1.0.tgz#023d6f39bb15c97c071e9e60d00d136eac5fa0b4"
-  integrity sha1-Aj1vObsVyXwHHp5g0A0TbqxfoLQ=
-
-react-immutable-pure-component@^1.1.1:
-  version "1.2.3"
-  resolved "https://registry.npm.taobao.org/react-immutable-pure-component/download/react-immutable-pure-component-1.2.3.tgz#fa33638df68cfe9f73ccbee1d5861c17f3053f86"
-  integrity sha1-+jNjjfaM/p9zzL7h1YYcF/MFP4Y=
-  optionalDependencies:
-    "@types/react" "16.4.6"
-
-react-inspector@^2.3.0:
-  version "2.3.1"
-  resolved "https://registry.npm.taobao.org/react-inspector/download/react-inspector-2.3.1.tgz?cache=0&sync_timestamp=1599743804154&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freact-inspector%2Fdownload%2Freact-inspector-2.3.1.tgz#f0eb7f520669b545b441af9d38ec6d706e5f649c"
-  integrity sha1-8Ot/UgZptUW0Qa+dOOxtcG5fZJw=
-  dependencies:
-    babel-runtime "^6.26.0"
-    is-dom "^1.0.9"
-    prop-types "^15.6.1"
-
 react-intl@3.12.0:
   version "3.12.0"
   resolved "https://registry.npm.taobao.org/react-intl/download/react-intl-3.12.0.tgz#98ef1c94434cc25a8c67448e1e283e6bfe11b2fc"
@@ -14848,15 +14608,6 @@ react-lifecycles-compat@^3.0.4:
   resolved "https://registry.npm.taobao.org/react-lifecycles-compat/download/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
   integrity sha1-TxonOv38jzSIqMUWv9p4+HI1I2I=
 
-react-motion@^0.5.2:
-  version "0.5.2"
-  resolved "https://registry.npm.taobao.org/react-motion/download/react-motion-0.5.2.tgz#0dd3a69e411316567927917c6626551ba0607316"
-  integrity sha1-DdOmnkETFlZ5J5F8ZiZVG6BgcxY=
-  dependencies:
-    performance-now "^0.2.0"
-    prop-types "^15.5.8"
-    raf "^3.1.0"
-
 react-native-swipeout@^2.2.2:
   version "2.3.6"
   resolved "https://registry.npm.taobao.org/react-native-swipeout/download/react-native-swipeout-2.3.6.tgz#47dac8a835825cf3f2eef9e495574a3d9ab6d3fa"
@@ -14866,18 +14617,6 @@ react-native-swipeout@^2.2.2:
     prop-types "^15.5.10"
     react-tween-state "^0.1.5"
 
-react-redux@=4.4.10:
-  version "4.4.10"
-  resolved "https://registry.npm.taobao.org/react-redux/download/react-redux-4.4.10.tgz#ad57bd1db00c2d0aa7db992b360ce63dd0b80ec5"
-  integrity sha1-rVe9HbAMLQqn25krNgzmPdC4DsU=
-  dependencies:
-    create-react-class "^15.5.1"
-    hoist-non-react-statics "^3.3.0"
-    invariant "^2.0.0"
-    lodash "^4.17.11"
-    loose-envify "^1.4.0"
-    prop-types "^15.7.2"
-
 react-redux@^7.1.0:
   version "7.2.1"
   resolved "https://registry.npm.taobao.org/react-redux/download/react-redux-7.2.1.tgz?cache=0&sync_timestamp=1595765616486&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freact-redux%2Fdownload%2Freact-redux-7.2.1.tgz#8dedf784901014db2feca1ab633864dee68ad985"
@@ -14974,17 +14713,6 @@ react-side-effect@^2.1.0:
   resolved "https://registry.npm.taobao.org/react-side-effect/download/react-side-effect-2.1.0.tgz#1ce4a8b4445168c487ed24dab886421f74d380d3"
   integrity sha1-HOSotERRaMSH7STauIZCH3TTgNM=
 
-react-syntax-highlighter@=13.5.0:
-  version "13.5.0"
-  resolved "https://registry.npm.taobao.org/react-syntax-highlighter/download/react-syntax-highlighter-13.5.0.tgz#c0f3fd826a52b2a6ce5786d4ce60c3e0665b65c0"
-  integrity sha1-wPP9gmpSsqbOV4bUzmDD4GZbZcA=
-  dependencies:
-    "@babel/runtime" "^7.3.1"
-    highlight.js "^10.1.1"
-    lowlight "^1.14.0"
-    prismjs "^1.21.0"
-    refractor "^3.1.0"
-
 react-tween-state@^0.1.5:
   version "0.1.5"
   resolved "https://registry.npm.taobao.org/react-tween-state/download/react-tween-state-0.1.5.tgz#e98b066551efb93cb92dd1be14995c2e3deae339"
@@ -15158,28 +14886,11 @@ redeyed@~2.1.0:
   dependencies:
     esprima "~4.0.0"
 
-redux-immutable@3.1.0:
-  version "3.1.0"
-  resolved "https://registry.npm.taobao.org/redux-immutable/download/redux-immutable-3.1.0.tgz#cafbd686e0711261119b9c28960935dc47a49d0a"
-  integrity sha1-yvvWhuBxEmERm5wolgk13EeknQo=
-  dependencies:
-    immutable "^3.8.1"
-
 redux-saga@^0.16.0:
   version "0.16.2"
   resolved "https://registry.npm.taobao.org/redux-saga/download/redux-saga-0.16.2.tgz#993662e86bc945d8509ac2b8daba3a8c615cc971"
   integrity sha1-mTZi6GvJRdhQmsK42ro6jGFcyXE=
 
-redux@=3.7.2:
-  version "3.7.2"
-  resolved "https://registry.npm.taobao.org/redux/download/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b"
-  integrity sha1-BrcxIyFZAdJdBlvjQusCa8HIU3s=
-  dependencies:
-    lodash "^4.2.1"
-    lodash-es "^4.2.1"
-    loose-envify "^1.1.0"
-    symbol-observable "^1.0.3"
-
 redux@^4.0.0, redux@^4.0.1, redux@^4.0.4:
   version "4.0.5"
   resolved "https://registry.npm.taobao.org/redux/download/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f"
@@ -15188,15 +14899,6 @@ redux@^4.0.0, redux@^4.0.1, redux@^4.0.4:
     loose-envify "^1.4.0"
     symbol-observable "^1.2.0"
 
-refractor@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.npm.taobao.org/refractor/download/refractor-3.1.0.tgz#b05a43c8a1b4fccb30001ffcbd5cd781f7f06f78"
-  integrity sha1-sFpDyKG0/MswAB/8vVzXgffwb3g=
-  dependencies:
-    hastscript "^5.0.0"
-    parse-entities "^2.0.0"
-    prismjs "~1.21.0"
-
 regenerate-unicode-properties@^8.2.0:
   version "8.2.0"
   resolved "https://registry.npm.taobao.org/regenerate-unicode-properties/download/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec"
@@ -15413,14 +15115,6 @@ remark@^12.0.0:
     remark-stringify "^8.0.0"
     unified "^9.0.0"
 
-remarkable@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.npm.taobao.org/remarkable/download/remarkable-2.0.1.tgz#280ae6627384dfb13d98ee3995627ca550a12f31"
-  integrity sha1-KArmYnOE37E9mO45lWJ8pVChLzE=
-  dependencies:
-    argparse "^1.0.10"
-    autolinker "^3.11.0"
-
 remove-trailing-separator@^1.0.1:
   version "1.1.0"
   resolved "https://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
@@ -15431,7 +15125,7 @@ repeat-element@^1.1.2:
   resolved "https://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
   integrity sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=
 
-repeat-string@^1.0.0, repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1:
+repeat-string@^1.0.0, repeat-string@^1.5.4, repeat-string@^1.6.1:
   version "1.6.1"
   resolved "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
   integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
@@ -15515,11 +15209,6 @@ requires-port@^1.0.0:
   resolved "https://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
   integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
 
-reselect@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.npm.taobao.org/reselect/download/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7"
-  integrity sha1-8lKYMOXT0OAhQIskaiBu9OpEN/c=
-
 reserved-words@^0.1.2:
   version "0.1.2"
   resolved "https://registry.npm.taobao.org/reserved-words/download/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1"
@@ -15964,11 +15653,6 @@ select-hose@^2.0.0:
   resolved "https://registry.npm.taobao.org/select-hose/download/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
   integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=
 
-select@^1.1.2:
-  version "1.1.2"
-  resolved "https://registry.npm.taobao.org/select/download/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d"
-  integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=
-
 semver-compare@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npm.taobao.org/semver-compare/download/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
@@ -16018,11 +15702,6 @@ send@0.17.1:
     range-parser "~1.2.1"
     statuses "~1.5.0"
 
-serialize-error@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.npm.taobao.org/serialize-error/download/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a"
-  integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=
-
 serialize-javascript@4.0.0, serialize-javascript@^4.0.0:
   version "4.0.0"
   resolved "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
@@ -16077,7 +15756,7 @@ setprototypeof@1.1.1:
   resolved "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
   integrity sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=
 
-sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8:
+sha.js@^2.4.0, sha.js@^2.4.8:
   version "2.4.11"
   resolved "https://registry.npm.taobao.org/sha.js/download/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
   integrity sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=
@@ -16388,11 +16067,6 @@ source-map@^0.7.3:
   resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
   integrity sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=
 
-space-separated-tokens@^1.0.0:
-  version "1.1.5"
-  resolved "https://registry.npm.taobao.org/space-separated-tokens/download/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899"
-  integrity sha1-hfMsPRDZaCAH6RdBTdxcJtGqaJk=
-
 spdx-correct@^3.0.0:
   version "3.1.1"
   resolved "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
@@ -16614,13 +16288,6 @@ stream-shift@^1.0.0:
   resolved "https://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
   integrity sha1-1wiCgVWasneEJCebCHfaPDktWj0=
 
-stream@^0.0.2:
-  version "0.0.2"
-  resolved "https://registry.npm.taobao.org/stream/download/stream-0.0.2.tgz#7f5363f057f6592c5595f00bc80a27f5cec1f0ef"
-  integrity sha1-f1Nj8Ff2WSxVlfALyAon9c7B8O8=
-  dependencies:
-    emitter-component "^1.1.1"
-
 streamroller@^0.4.0:
   version "0.4.1"
   resolved "https://registry.npm.taobao.org/streamroller/download/streamroller-0.4.1.tgz#d435bd5974373abd9bd9068359513085106cc05f"
@@ -17276,68 +16943,6 @@ svgo@^1.0.0, svgo@^1.2.2:
     unquote "~1.1.1"
     util.promisify "~1.0.0"
 
-swagger-client@=3.10.12:
-  version "3.10.12"
-  resolved "https://registry.npm.taobao.org/swagger-client/download/swagger-client-3.10.12.tgz#f49beb7a6f91b6e5778cfbd3fd4064413be6e791"
-  integrity sha1-9Jvrem+RtuV3jPvT/UBkQTvm55E=
-  dependencies:
-    "@babel/runtime-corejs2" "^7.10.4"
-    btoa "^1.2.1"
-    buffer "^5.6.0"
-    cookie "~0.4.1"
-    cross-fetch "^3.0.5"
-    deep-extend "~0.6.0"
-    fast-json-patch "^2.2.1"
-    isomorphic-form-data "~2.0.0"
-    js-yaml "^3.14.0"
-    lodash "^4.17.19"
-    qs "^6.9.4"
-    querystring-browser "^1.0.4"
-    traverse "~0.6.6"
-    url "~0.11.0"
-
-swagger-ui-react@^3.33.0:
-  version "3.33.0"
-  resolved "https://registry.npm.taobao.org/swagger-ui-react/download/swagger-ui-react-3.33.0.tgz#cae8812d4a809d416a48cd2d01fe606429742d07"
-  integrity sha1-yuiBLUqAnUFqSM0tAf5gZCl0LQc=
-  dependencies:
-    "@babel/runtime-corejs2" "^7.10.4"
-    "@braintree/sanitize-url" "^4.0.0"
-    "@kyleshockey/object-assign-deep" "^0.4.2"
-    "@kyleshockey/xml" "^1.0.2"
-    base64-js "^1.2.0"
-    classnames "^2.2.6"
-    core-js "^2.6.11"
-    css.escape "1.5.1"
-    deep-extend "0.6.0"
-    dompurify "^2.0.7"
-    ieee754 "^1.1.13"
-    immutable "^3.x.x"
-    js-file-download "^0.4.1"
-    js-yaml "^3.13.1"
-    lodash "^4.17.19"
-    memoizee "^0.4.12"
-    prop-types "^15.7.2"
-    randombytes "^2.1.0"
-    react-copy-to-clipboard "5.0.1"
-    react-debounce-input "^3.2.0"
-    react-immutable-proptypes "2.1.0"
-    react-immutable-pure-component "^1.1.1"
-    react-inspector "^2.3.0"
-    react-motion "^0.5.2"
-    react-redux "=4.4.10"
-    react-syntax-highlighter "=13.5.0"
-    redux "=3.7.2"
-    redux-immutable "3.1.0"
-    remarkable "^2.0.1"
-    reselect "^4.0.0"
-    serialize-error "^2.1.0"
-    sha.js "^2.4.11"
-    swagger-client "=3.10.12"
-    url-parse "^1.4.7"
-    xml-but-prettier "^1.0.1"
-    zenscroll "^4.0.2"
-
 sylvanas@^0.4.0:
   version "0.4.3"
   resolved "https://registry.npm.taobao.org/sylvanas/download/sylvanas-0.4.3.tgz#e40ce0e651bd9f57b3a4738ce4aecbfd84eb649f"
@@ -17354,7 +16959,7 @@ sylvanas@^0.4.0:
     import-fresh "^3.1.0"
     prettier "^1.17.1"
 
-symbol-observable@^1.0.3, symbol-observable@^1.1.0, symbol-observable@^1.2.0:
+symbol-observable@^1.1.0, symbol-observable@^1.2.0:
   version "1.2.0"
   resolved "https://registry.npm.taobao.org/symbol-observable/download/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
   integrity sha1-wiaIrtTqs83C3+rLtWFmBWCgCAQ=
@@ -17529,11 +17134,6 @@ timsort@^0.3.0:
   resolved "https://registry.npm.taobao.org/timsort/download/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
   integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
 
-tiny-emitter@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.npm.taobao.org/tiny-emitter/download/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423"
-  integrity sha1-HRpW7fxRxD6GPLtTgqcjMONVVCM=
-
 tiny-invariant@^1.0.2:
   version "1.1.0"
   resolved "https://registry.npm.taobao.org/tiny-invariant/download/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875"
@@ -17654,11 +17254,6 @@ tr46@^1.0.1:
   dependencies:
     punycode "^2.1.0"
 
-traverse@~0.6.6:
-  version "0.6.6"
-  resolved "https://registry.npm.taobao.org/traverse/download/traverse-0.6.6.tgz?cache=0&sync_timestamp=1597756177034&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftraverse%2Fdownload%2Ftraverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137"
-  integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=
-
 trim-newlines@^2.0.0:
   version "2.0.0"
   resolved "https://registry.npm.taobao.org/trim-newlines/download/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20"
@@ -17704,7 +17299,7 @@ tsconfig-paths@^3.9.0:
     minimist "^1.2.0"
     strip-bom "^3.0.0"
 
-tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
+tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0:
   version "1.13.0"
   resolved "https://registry.npm.taobao.org/tslib/download/tslib-1.13.0.tgz?cache=0&sync_timestamp=1596751967733&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftslib%2Fdownload%2Ftslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
   integrity sha1-yIHhPMcBWJTtkUhi0nZDb6mkcEM=
@@ -18197,7 +17792,7 @@ url-parse@^1.4.3, url-parse@^1.4.7:
     querystringify "^2.1.1"
     requires-port "^1.0.0"
 
-url@^0.11.0, url@~0.11.0:
+url@^0.11.0:
   version "0.11.0"
   resolved "https://registry.npm.taobao.org/url/download/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
   integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
@@ -18780,13 +18375,6 @@ x-is-string@^0.1.0:
   resolved "https://registry.npm.taobao.org/x-is-string/download/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82"
   integrity sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=
 
-xml-but-prettier@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.npm.taobao.org/xml-but-prettier/download/xml-but-prettier-1.0.1.tgz#f5a33267ed42ccd4e355c62557a5e39b01fb40f3"
-  integrity sha1-9aMyZ+1CzNTjVcYlV6XjmwH7QPM=
-  dependencies:
-    repeat-string "^1.5.2"
-
 xml-name-validator@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npm.taobao.org/xml-name-validator/download/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
@@ -18888,11 +18476,6 @@ yauzl@^2.10.0:
     buffer-crc32 "~0.2.3"
     fd-slicer "~1.1.0"
 
-zenscroll@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.npm.taobao.org/zenscroll/download/zenscroll-4.0.2.tgz#e8d5774d1c0738a47bcfa8729f3712e2deddeb25"
-  integrity sha1-6NV3TRwHOKR7z6hynzcS4t7d6yU=
-
 zlib@1.0.5:
   version "1.0.5"
   resolved "https://registry.npm.taobao.org/zlib/download/zlib-1.0.5.tgz#6e7c972fc371c645a6afb03ab14769def114fcc0"