2
0
Эх сурвалжийг харах

Merge pull request #173 from zilliztech/support-rename-collection

support rename collection
ryjiang 2 жил өмнө
parent
commit
31587de257

+ 54 - 74
README.md

@@ -10,62 +10,37 @@ Attu is an all-in-one milvus administration tool. With Attu, you can dramaticall
 
 ## Features
 
-- Basic dashboard
-  - View basic collection statistics
-  - Quick search from loaded collection
-  - Quick release loaded collection
-- Manage collections/partitions
-  - Create/Drop collection/partion
-  - Create/drop alias
-  - View collection schema
-  - Create/drop index with parameters
-  - Load/release collections for search
-- Data Management
-  - Insert entities
-  - Data preview
-  - Data query
-- Vector search/query with advanced filter
-- System view
-  - View milvus nodes system info
-  - View milvus nodes configuration
-- Manage Milvus user
-- More are comming...
-
-## Quick start
-
-> If you prefer desktop application, you can download the [desktop version of Attu](https://github.com/zilliztech/attu/releases/).
-
-## Run attu from docker
-
-> Ensure you have Milvus installed on [your server](https://milvus.io/docs/install_standalone-docker.md) or [cluster](https://milvus.io/docs/install_cluster-docker.md), and attu only supports Milvus 2.x.
-
-> _ Before attu v2.1.0 , [check here](https://github.com/zilliztech/attu/tree/v2.0.5) _\*\*
-
-### ✈️ Start a attu container
+- Basic Dashboard: Get an overview of your collection statistics, perform quick searches, and release collections quickly.
+- Collection Management: Create, drop, and manage collections using our intuitive interface. You can also create aliases, view collection schemas, and configure indexes with custom parameters.
+- Data Management: Insert entities, preview your data, and run queries to analyze your results.
+- Vector Search/Query: Use our advanced filtering system to search and query vectors with precision.
+- System View: View system information and Milvus node configurations easily.
+- Milvus User Management: Manage users and their permissions with ease.
+- More Features Coming Soon: Stay tuned for additional features that will make Milvus even more powerful and user-friendly.
 
-```code
-docker run -p 8000:3000 -e MILVUS_URL={milvus server ip}:19530 zilliz/attu:latest
-```
+## Quick start guide for Attu
 
-> 👀 Please make sure the attu server(container) can access the milvus ip address. 
+If you prefer to use a desktop application, you can download the [desktop version of Attu](https://github.com/zilliztech/attu/releases/).
 
-Once you start the container, open the browser, type `http://{ attu ip }:8000`, you can view the attu GUI.
+### Running Attu from Docker
 
-#### Docker CLI parameters
+Before you begin, make sure that you have Milvus installed on either [your server](https://milvus.io/docs/install_cluster-docker.md) or [Zilliz Cloud](https://zilliz.com/cloud). Note that Attu only supports Milvus 2.x and some of the features are not supported yet for Zilliz Cloud.
 
-| Parameter  | Example           | required | description                 |
-| :--------- | :---------------- | :------: | --------------------------- |
-| MILVUS_URL | 192.168.0.1:19530 |  false   | Optional, Milvus server URL |
+Here are the steps to start a container for running Attu:
 
-Tip: **127.0.0.1 or localhost will not work when runs on docker**
+```code
+docker run -p 8000:3000 -e MILVUS_URL={milvus server IP}:19530 zilliz/attu:latest
+```
 
-## Try the dev build
+Make sure that the Attu container can access the Milvus IP address. After starting the container, open your web browser and enter `http://{ Attu IP }:8000` to view the Attu GUI.
 
-> We plan to release attu once a feature is done. Also, if you want to try the nightly build, please pull the docker image with the `dev` tag.
+#### Parameters for Docker CLI
 
-```code
-docker run -p 8000:3000 -e MILVUS_URL={ your machine IP }:19530 zilliz/attu:dev
-```
+| Parameter  | Example           | Required | Description                 |
+| :--------- | :---------------- | :------: | --------------------------- |
+| MILVUS_URL | 192.168.0.1:19530 |  false   | Optional, Milvus server URL |
+
+Note that "127.0.0.1" or "localhost" will not work when running Attu on Docker.
 
 ## Screenshots
 
@@ -78,47 +53,52 @@ docker run -p 8000:3000 -e MILVUS_URL={ your machine IP }:19530 zilliz/attu:dev
 
 ## ✨ Contributing Code
 
-You might want to build Attu locally to contribute some code, test out the latest features, or try
-out an open PR:
+Thank you for your interest in contributing to Attu! Here's how you can build Attu locally to contribute code, test out the latest features, or try out an open PR:
 
-### Build server
+### Build the Server
 
-1. Fork and clone the repo
-2. `cd server` go to the server directory
-3. `yarn install` to install dependencies
-4. Create a branch for your PR
+1. Fork and clone the Attu repository.
+2. Navigate to the server directory by running `cd server` in the terminal.
+3. Install dependencies by running `yarn install`.
+4. To start the server in development mode, run `yarn start`.
+5. Create a new branch for your PR by running `git checkout -b my-branch`.
 
-### Build client
+### Build the Client
 
-1. Fork and clone the repo
-2. `cd client` go to the client directory
-3. `yarn install` to install dependencies
-4. Create a branch for your PR
+1. Fork and clone the Attu repository.
+2. Navigate to the client directory by running `cd client` in the terminal.
+3. Install dependencies by running `yarn install`.
+4. To start the server in development mode, run `yarn start`.
+5. Create a new branch for your PR by running `git checkout -b my-branch`.
 
-### Milvus
+### Submitting a Pull Request
 
-New to milvus? [Milvus](https://milvus.io) is an open-source vector database built to power AI applications and embedding similarity search.
+1. Make changes and ensure that tests pass.
+2. Commit changes and push to your fork.
+3. Create a Pull Request targeting the main branch of Attu.
 
-### Userful links
+We appreciate your contributions to Attu, regardless of size. Thanks for supporting the project!
 
-- [Milvus docs](https://milvus.io/docs)
-- [Milvus python sdk](https://github.com/milvus-io/pymilvus)
-- [Milvus java sdk](https://github.com/milvus-io/milvus-sdk-java)
-- [Milvus gp sdk](https://github.com/milvus-io/milvus-sdk-go)
-- [Milvus node sdk](https://github.com/milvus-io/milvus-sdk-node)
-- [Feder](https://github.com/zilliztech/feder)
+#### ❓ Do you have any questions or problems?
 
-#### ❓ Questions? Problems?
+If you encounter any bugs or want to request a new feature, please create a [GitHub issue](https://github.com/zilliztech/attu/issues/new/choose). It's important to check if someone else has already created an issue for the same problem before submitting a new one.
 
-- If you've found a bug or want to request a feature, please create a [GitHub Issue](https://github.com/zilliztech/attu/issues/new/choose).
-  Please check to make sure someone else hasn't already created an issue for the same topic.
+### Userful links
+Here are some helpful resources to get you started with Milvus:
 
-[milvus-doc]: https://milvus.io/docs
+- [Milvus documentation](https://milvus.io/docs): Here, you can find detailed information on how to use Milvus, including installation instructions, tutorials, and API documentation.
+- [Milvus python SDK](https://github.com/milvus-io/pymilvus): The Python SDK allows you to interact with Milvus using Python. It provides a simple and intuitive interface for creating and querying vectors.
+- [Milvus Java SDK](https://github.com/milvus-io/milvus-sdk-java): The Java SDK is similar to the Python SDK but designed for Java developers. It also provides a simple and intuitive interface for creating and querying vectors.
+- [Milvus Go SDK](https://github.com/milvus-io/milvus-sdk-go): The Go SDK provides a Go API for Milvus. If you're a Go developer, this is the SDK for you.
+- [Milvus Node SDK](https://github.com/milvus-io/milvus-sdk-node): The Node SDK provides a Node.js API for Milvus. If you're a Node.js developer, this is the SDK for you.
+- [Feder](https://github.com/zilliztech/feder): Feder is a JavaScript tool designed to aid in the comprehension of embedding vectors.
 
 ## Community
 
-💬 Community isn’t just about writing code together. Come join the conversation, share your knowledge and get your questions answered on [Milvus Slack Channel](https://join.slack.com/t/milvusio/shared_invite/zt-e0u4qu3k-bI2GDNys3ZqX1YCJ9OM~GQ)!
+💬 Join our vibrant community on the Milvus Slack Channel where you can share your knowledge, ask questions and engage in meaningful conversations. It's not just about coding, it's about connecting with other like-minded individuals. Click the link below to join now!
 
-<a href="https://join.slack.com/t/milvusio/shared_invite/zt-e0u4qu3k-bI2GDNys3ZqX1YCJ9OM~GQ">
+<a href="https://slack.milvus.io/">
     <img src="https://assets.zilliz.com/readme_slack_4a07c4c92f.png" alt="Miluvs Slack Channel"  height="150" width="500">
 </a>
+
+Also, don't forget to check out our documentation and GitHub repositories for more resources and information. We look forward to seeing you on the channel!

+ 14 - 2
client/src/components/icons/Icons.tsx

@@ -8,6 +8,7 @@ import FileCopyIcon from '@material-ui/icons/FileCopy';
 import Visibility from '@material-ui/icons/Visibility';
 import VisibilityOff from '@material-ui/icons/VisibilityOff';
 import ClearIcon from '@material-ui/icons/Clear';
+import EditIcon from '@material-ui/icons/Edit';
 import ReorderIcon from '@material-ui/icons/Reorder';
 import AppsIcon from '@material-ui/icons/Apps';
 import MoreVertIcon from '@material-ui/icons/MoreVert';
@@ -45,7 +46,7 @@ import { ReactComponent as SystemIcon } from '../../assets/icons/system.svg';
 const icons: { [x in IconsType]: (props?: any) => React.ReactElement } = {
   search: (props = {}) => <SearchIcon {...props} />,
   add: (props = {}) => <AddIcon {...props} />,
-  addOutline:  (props = {}) => <AddCircleOutlineIcon {...props} />,
+  addOutline: (props = {}) => <AddCircleOutlineIcon {...props} />,
   delete: (props = {}) => <DeleteIcon {...props} />,
   list: (props = {}) => <ReorderIcon {...props} />,
   copy: (props = {}) => <FileCopyIcon {...props} />,
@@ -68,6 +69,7 @@ const icons: { [x in IconsType]: (props?: any) => React.ReactElement } = {
   alias: (props = {}) => <AlternateEmailIcon {...props} />,
   datePicker: (props = {}) => <DatePicker {...props} />,
   download: (props = {}) => <GetAppIcon {...props} />,
+  edit: (props = {}) => <EditIcon {...props} />,
 
   zilliz: (props = {}) => (
     <SvgIcon viewBox="0 0 36 36" component={ZillizIcon} {...props} />
@@ -108,7 +110,12 @@ const icons: { [x in IconsType]: (props?: any) => React.ReactElement } = {
     <SvgIcon viewBox="0 0 16 16" component={KeyIcon} {...props} />
   ),
   upload: (props = {}) => (
-    <SvgIcon viewBox="0 0 16 16" component={UploadIcon} {...props} />
+    <SvgIcon
+      viewBox="0 0 16 16"
+      component={UploadIcon}
+      {...props}
+      fill="#000"
+    />
   ),
   vectorSearch: (props = {}) => (
     <SvgIcon viewBox="0 0 48 48" component={SearchEmptyIcon} {...props} />
@@ -121,6 +128,11 @@ const icons: { [x in IconsType]: (props?: any) => React.ReactElement } = {
       <path d="M20 6h-8l-2-2H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm-6 10H6v-2h8v2zm4-4H6v-2h12v2z"></path>
     </SvgIcon>
   ),
+  uploadFile: (props = {}) => (
+    <SvgIcon viewBox="0 0 24 24" {...props}>
+      <path d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm4 18H6V4h7v5h5v11zM8 15.01l1.41 1.41L11 14.84V19h2v-4.16l1.59 1.59L16 15.01 12.01 11z"></path>
+    </SvgIcon>
+  ),
 };
 
 export default icons;

+ 3 - 1
client/src/components/icons/Types.ts

@@ -38,4 +38,6 @@ export type IconsType =
   | 'alias'
   | 'datePicker'
   | 'download'
-  | 'source';
+  | 'source'
+  | 'edit'
+  | 'uploadFile';

+ 4 - 0
client/src/consts/Milvus.tsx

@@ -97,6 +97,10 @@ export const FLOAT_INDEX_CONFIG: indexConfigType = {
     create: ['n_trees'],
     search: ['search_k'],
   },
+  // AUTOINDEX: {
+  //   create: [],
+  //   search: [],
+  // },
   // RNSG: {
   //   create: ['out_degree', 'candidate_pool_size', 'search_length', 'knng'],
   //   search: ['search_length'],

+ 10 - 0
client/src/http/Collection.ts

@@ -83,6 +83,16 @@ export class CollectionHttp extends BaseModel implements CollectionView {
     });
   }
 
+  static renameCollection(
+    collectionName: string,
+    params: { new_collection_name: string }
+  ) {
+    return super.create({
+      path: `${this.COLLECTIONS_URL}/${collectionName}`,
+      data: params,
+    });
+  }
+
   static getStatistics() {
     return super.search({ path: this.COLLECTIONS_STATISTICS_URL, params: {} });
   }

+ 1 - 0
client/src/i18n/cn/button.ts

@@ -23,6 +23,7 @@ const btnTrans = {
   loading: 'Loading...',
   importing: 'Importing...',
   example: 'Example',
+  rename: 'Rename',
 };
 
 export default btnTrans;

+ 12 - 1
client/src/i18n/cn/collection.ts

@@ -7,6 +7,9 @@ const collectionTrans = {
   create: 'Create Collection',
   delete: 'delete',
   deleteTooltip: 'Please select at least one item to delete.',
+  rename: 'rename',
+  renameTooltip: 'Please select one item to rename.',
+  newColName: 'New Collection Name',
   alias: 'Alias',
   aliasTooltip: 'Please select one collection to create alias',
   download: 'Download',
@@ -58,8 +61,11 @@ const collectionTrans = {
   // load dialog
   loadTitle: 'Load Collection',
   loadContent:
-    'You are trying to load a collection with data. Only loaded collection can be searched.',
+    'All search and query operations within Milvus are executed in memory, only loaded collection can be searched.',
   loadConfirmLabel: 'Load',
+  replicaNum: 'Replica number',
+  replicaDes: `With in-memory replicas, Milvus can load the same segment on multiple query nodes. The replica number can not exceed query node count.`,
+  enableRepica: `Enable in-memory replica`,
 
   // release dialog
   releaseTitle: 'Release Collection',
@@ -82,6 +88,11 @@ const collectionTrans = {
 
   // alias dialog
   aliasCreatePlaceholder: 'Alias name',
+
+  // rename dialog
+  newColNamePlaceholder: 'New Collection Name',
+  newNameInfo:
+    'Only numbers, letters, and underscores are allowed.',
 };
 
 export default collectionTrans;

+ 1 - 0
client/src/i18n/cn/dialog.ts

@@ -2,6 +2,7 @@ const dialogTrans = {
   deleteTipAction: 'Type',
   deleteTipPurpose: 'to confirm.',
   deleteTitle: `Drop {{type}}`,
+  renameTitle: `Rename {{type}}`,
   releaseTitle: `Release {{type}}`,
   createAlias: `Create alias for {{type}}`,
   loadTitle: `Load {{type}}`,

+ 2 - 2
client/src/i18n/cn/overview.ts

@@ -1,8 +1,8 @@
 const overviewTrans = {
   load: 'Loaded Collections',
   all: 'All Collections',
-  data: 'Data',
-  rows: '{{number}} Entities',
+  data: 'Entites',
+  rows: '{{number}}',
   loading: 'Loading Collections',
 };
 

+ 1 - 1
client/src/i18n/cn/prometheus.ts

@@ -1,7 +1,7 @@
 const prometheusTrans = {
   ready: 'Prometheus is ready.',
   invalid: 'Prometheus configuration is invalid.',
-  
+
   totalCount: 'Total Count',
   searchCount: 'Search Count',
   searchLatency: 'Search Latency',

+ 1 - 0
client/src/i18n/cn/success.ts

@@ -5,6 +5,7 @@ const successTrans = {
   delete: `{{name}} successfully dropped.`,
   release: `{{name}} has been released.`,
   update: `{{name}} has been updated.`,
+  rename: `{{name}} has been renamed.`,
 };
 
 export default successTrans;

+ 1 - 0
client/src/i18n/en/button.ts

@@ -23,6 +23,7 @@ const btnTrans = {
   loading: 'Loading...',
   importing: 'Importing...',
   example: 'Example',
+  rename: 'Rename',
 };
 
 export default btnTrans;

+ 8 - 0
client/src/i18n/en/collection.ts

@@ -7,6 +7,9 @@ const collectionTrans = {
   create: 'Create Collection',
   delete: 'delete',
   deleteTooltip: 'Please select at least one item to delete.',
+  rename: 'rename',
+  renameTooltip: 'Please select one item to rename.',
+  newColName: 'New Collection Name',
   alias: 'Alias',
   aliasTooltip: 'Please select one collection to create alias',
   download: 'Download',
@@ -85,6 +88,11 @@ const collectionTrans = {
 
   // alias dialog
   aliasCreatePlaceholder: 'Alias name',
+
+  // rename dialog
+  newColNamePlaceholder: 'New Collection Name',
+  newNameInfo:
+    'Only numbers, letters, and underscores are allowed.',
 };
 
 export default collectionTrans;

+ 1 - 0
client/src/i18n/en/dialog.ts

@@ -2,6 +2,7 @@ const dialogTrans = {
   deleteTipAction: 'Type',
   deleteTipPurpose: 'to confirm.',
   deleteTitle: `Drop {{type}}`,
+  renameTitle: `Rename {{type}}`,
   releaseTitle: `Release {{type}}`,
   createAlias: `Create alias for {{type}}`,
   loadTitle: `Load {{type}}`,

+ 1 - 0
client/src/i18n/en/success.ts

@@ -5,6 +5,7 @@ const successTrans = {
   delete: `{{name}} successfully dropped.`,
   release: `{{name}} has been released.`,
   update: `{{name}} has been updated.`,
+  rename: `{{name}} has been renamed.`,
 };
 
 export default successTrans;

+ 37 - 4
client/src/pages/collections/Collections.tsx

@@ -21,6 +21,7 @@ import { CollectionHttp } from '../../http/Collection';
 import LoadCollectionDialog from '../dialogs/LoadCollectionDialog';
 import ReleaseCollectionDialog from '../dialogs/ReleaseCollectionDialog';
 import DropCollectionDialog from '../dialogs/DropCollectionDialog';
+import RenameCollectionDialog from '../dialogs/RenameCollectionDialog';
 import Highlighter from 'react-highlight-words';
 import InsertDialog from '../dialogs/insert/Dialog';
 import ImportSampleDialog from '../dialogs/ImportSampleDialog';
@@ -205,6 +206,14 @@ const Collections = () => {
     setSelectedCollections([]);
   };
 
+  const onRename = () => {
+    openSnackBar(
+      successTrans('rename', { name: collectionTrans('collection') })
+    );
+    fetchData();
+    setSelectedCollections([]);
+  };
+
   const handleSearch = (value: string) => {
     setSearch(value);
   };
@@ -224,6 +233,8 @@ const Collections = () => {
       icon: 'add',
     },
     {
+      icon: 'uploadFile',
+      type: 'iconBtn',
       label: btnTrans('insert'),
       onClick: () => {
         setDialog({
@@ -253,15 +264,28 @@ const Collections = () => {
        */
       disabled: () =>
         collectionList.length === 0 || selectedCollections.length > 1,
-      btnVariant: 'outlined',
     },
     {
+      icon: 'edit',
       type: 'iconBtn',
       onClick: () => {
-        fetchData();
+        setDialog({
+          open: true,
+          type: 'custom',
+          params: {
+            component: (
+              <RenameCollectionDialog
+                cb={onRename}
+                collectionName={selectedCollections[0]._name}
+              />
+            ),
+          },
+        });
       },
-      label: collectionTrans('delete'),
-      icon: 'refresh',
+      label: collectionTrans('rename'),
+      // tooltip: collectionTrans('deleteTooltip'),
+      disabledTooltip: collectionTrans('renameTooltip'),
+      disabled: data => data.length !== 1,
     },
     {
       type: 'iconBtn',
@@ -286,6 +310,15 @@ const Collections = () => {
       disabled: data => data.length === 0,
     },
 
+    {
+      type: 'iconBtn',
+      onClick: () => {
+        fetchData();
+      },
+      label: collectionTrans('delete'),
+      icon: 'refresh',
+    },
+
     {
       label: 'Search',
       icon: 'search',

+ 6 - 4
client/src/pages/collections/Types.ts

@@ -117,10 +117,6 @@ export interface CreateFieldsProps {
   autoID: boolean;
   setAutoID: (value: boolean) => void;
 }
-export interface CreateAliasProps {
-  collectionName: string;
-  cb?: () => void;
-}
 
 export interface InsertDataParam {
   partition_names: string[];
@@ -150,3 +146,9 @@ export enum TAB_EMUM {
   'data-preview',
   'data-query',
 }
+
+export interface LoadSampleParam {
+  collection_name: string;
+  // e.g. [{vector: [1,2,3], age: 10}]
+  size: string;
+}

+ 97 - 0
client/src/pages/dialogs/RenameCollectionDialog.tsx

@@ -0,0 +1,97 @@
+import { FC, useContext, useMemo, useState } from 'react';
+import { Typography, makeStyles, Theme } from '@material-ui/core';
+import { useTranslation } from 'react-i18next';
+import { rootContext } from '../../context/Root';
+import DialogTemplate from '../../components/customDialog/DialogTemplate';
+import CustomInput from '../../components/customInput/CustomInput';
+import { formatForm } from '../../utils/Form';
+import { useFormValidation } from '../../hooks/Form';
+import { ITextfieldConfig } from '../../components/customInput/Types';
+import { CollectionHttp } from '../../http/Collection';
+import { RenameCollectionProps } from './Types';
+
+const useStyles = makeStyles((theme: Theme) => ({
+  desc: {
+    margin: '8px 0 16px 0',
+  },
+}));
+
+const RenameCollectionDialog: FC<RenameCollectionProps> = props => {
+  const { collectionName, cb } = props;
+  const [form, setForm] = useState({
+    new_collection_name: '',
+  });
+
+  const classes = useStyles();
+
+  const checkedForm = useMemo(() => {
+    const { new_collection_name } = form;
+    return formatForm({ new_collection_name });
+  }, [form]);
+
+  const { validation, checkIsValid, disabled } = useFormValidation(checkedForm);
+
+  const { handleCloseDialog } = useContext(rootContext);
+  const { t: dialogTrans } = useTranslation('dialog');
+  const { t: warningTrans } = useTranslation('warning');
+  const { t: collectionTrans } = useTranslation('collection');
+  const { t: btnTrans } = useTranslation('btn');
+
+  const handleInputChange = (value: string) => {
+    setForm({ new_collection_name: value });
+  };
+
+  const handleConfirm = async () => {
+    await CollectionHttp.renameCollection(collectionName, form);
+    handleCloseDialog();
+    cb && cb();
+  };
+
+  const renameInputCfg: ITextfieldConfig = {
+    label: collectionTrans('newColName'),
+    key: 'new_collection_name',
+    onChange: handleInputChange,
+    variant: 'filled',
+    placeholder: collectionTrans('newColNamePlaceholder'),
+    fullWidth: true,
+    validations: [
+      {
+        rule: 'require',
+        errorText: warningTrans('required', {
+          name: collectionTrans('name'),
+        }),
+      },
+      {
+        rule: 'collectionName',
+        errorText: collectionTrans('nameContentWarning'),
+      },
+    ],
+    defaultValue: form.new_collection_name,
+  };
+  return (
+    <DialogTemplate
+      title={dialogTrans('renameTitle', {
+        type: collectionName,
+      })}
+      handleClose={handleCloseDialog}
+      children={
+        <>
+          <Typography variant="body1" component="p" className={classes.desc}>
+            {collectionTrans('newNameInfo')}
+          </Typography>
+          <CustomInput
+            type="text"
+            textConfig={renameInputCfg}
+            checkValid={checkIsValid}
+            validInfo={validation}
+          />
+        </>
+      }
+      confirmLabel={btnTrans('rename')}
+      handleConfirm={handleConfirm}
+      confirmDisabled={disabled}
+    />
+  );
+};
+
+export default RenameCollectionDialog;

+ 10 - 6
client/src/pages/dialogs/Types.ts

@@ -1,12 +1,6 @@
 import { CollectionData } from '../collections/Types';
 import { PartitionData } from '../partitions/Types';
 
-export interface LoadSampleParam {
-  collection_name: string;
-  // e.g. [{vector: [1,2,3], age: 10}]
-  size: string;
-}
-
 export interface DropCollectionProps {
   collections: CollectionData[];
   onDelete: () => void;
@@ -22,3 +16,13 @@ export interface PartitionCreateProps {
   onCreate: () => void;
   collectionName: string;
 }
+
+export interface CreateAliasProps {
+  collectionName: string;
+  cb?: () => void;
+}
+
+export interface RenameCollectionProps {
+  collectionName: string;
+  cb?: () => void;
+}

+ 1 - 1
server/package.json

@@ -12,7 +12,7 @@
     "url": "https://github.com/zilliztech/attu"
   },
   "dependencies": {
-    "@zilliz/milvus2-sdk-node": "^2.2.1",
+    "@zilliz/milvus2-sdk-node": "^2.2.4",
     "axios": "^1.3.2",
     "chalk": "^4.1.2",
     "class-sanitizer": "^1.0.1",

+ 20 - 14
server/src/collections/collections.controller.ts

@@ -9,6 +9,7 @@ import {
   ImportSampleDto,
   VectorSearchDto,
   QueryDto,
+  RenameCollectionDto,
 } from './dto';
 import { LoadCollectionReq } from '@zilliz/milvus2-sdk-node/dist/milvus/types';
 
@@ -28,61 +29,52 @@ export class CollectionController {
 
   generateRoutes() {
     this.router.get('/', this.showCollections.bind(this));
-
     this.router.post(
       '/',
       dtoValidationMiddleware(CreateCollectionDto),
       this.createCollection.bind(this)
     );
-
     this.router.get('/statistics', this.getStatistics.bind(this));
-
     this.router.get(
       '/:name/statistics',
       this.getCollectionStatistics.bind(this)
     );
-
     this.router.get(
       '/indexes/status',
       this.getCollectionsIndexStatus.bind(this)
     );
-
     this.router.delete('/:name', this.dropCollection.bind(this));
+    this.router.post(
+      '/:name',
+      dtoValidationMiddleware(RenameCollectionDto),
+      this.renameCollection.bind(this)
+    );
     this.router.delete('/:name/alias/:alias', this.dropAlias.bind(this));
-
     this.router.get('/:name', this.describeCollection.bind(this));
-
     this.router.put('/:name/load', this.loadCollection.bind(this));
-
     this.router.put('/:name/release', this.releaseCollection.bind(this));
-
     this.router.post(
       '/:name/insert',
       dtoValidationMiddleware(InsertDataDto),
       this.insert.bind(this)
     );
-
     this.router.post(
       '/:name/importSample',
       dtoValidationMiddleware(ImportSampleDto),
       this.importSample.bind(this)
     );
-
     // we need use req.body, so we can't use delete here
     this.router.put('/:name/entities', this.deleteEntities.bind(this));
-
     this.router.post(
       '/:name/search',
       dtoValidationMiddleware(VectorSearchDto),
       this.vectorSearch.bind(this)
     );
-
     this.router.post(
       '/:name/query',
       dtoValidationMiddleware(QueryDto),
       this.query.bind(this)
     );
-
     this.router.post(
       '/:name/alias',
       dtoValidationMiddleware(CreateAliasDto),
@@ -126,6 +118,20 @@ export class CollectionController {
     }
   }
 
+  async renameCollection(req: Request, res: Response, next: NextFunction) {
+    const name = req.params?.name;
+    const data = req.body;
+    try {
+      const result = await this.collectionsService.renameCollection({
+        collection_name: name,
+        ...data,
+      });
+      res.send(result);
+    } catch (error) {
+      next(error);
+    }
+  }
+
   async dropCollection(req: Request, res: Response, next: NextFunction) {
     const name = req.params?.name;
     try {

+ 7 - 0
server/src/collections/collections.service.ts

@@ -9,6 +9,7 @@ import {
   LoadCollectionReq,
   ReleaseLoadCollectionReq,
   SearchReq,
+  RenameCollectionReq,
 } from '@zilliz/milvus2-sdk-node/dist/milvus/types';
 import { throwErrorFromSDK } from '../utils/Error';
 import { findKeyValue, genRows } from '../utils/Helper';
@@ -56,6 +57,12 @@ export class CollectionsService {
     return res;
   }
 
+  async renameCollection(data: RenameCollectionReq) {
+    const res = await this.collectionManager.renameCollection(data);
+    throwErrorFromSDK(res);
+    return res;
+  }
+
   async dropCollection(data: DropCollectionReq) {
     const res = await this.collectionManager.dropCollection(data);
     throwErrorFromSDK(res);

+ 7 - 1
server/src/collections/dto.ts

@@ -13,7 +13,7 @@ import {
   FieldType,
   ShowCollectionsType,
 } from '@zilliz/milvus2-sdk-node/dist/milvus/types/Collection';
-import { DataType } from '@zilliz/milvus2-sdk-node/dist/milvus/types/Common';
+import { DataType } from '@zilliz/milvus2-sdk-node/dist/milvus/const/Milvus';
 import { SearchParam } from '@zilliz/milvus2-sdk-node/dist/milvus/types';
 
 enum VectorTypes {
@@ -100,3 +100,9 @@ export class QueryDto {
   @IsOptional()
   readonly output_fields: string[];
 }
+
+export class RenameCollectionDto {
+  @IsString()
+  @IsNotEmpty({ message: 'new_collection_name is empty.' })
+  new_collection_name: string;
+}

+ 1 - 1
server/src/utils/Error.ts

@@ -1,7 +1,7 @@
 import {
   ErrorCode,
   ResStatus,
-} from '@zilliz/milvus2-sdk-node/dist/milvus/types/Response';
+} from '@zilliz/milvus2-sdk-node/dist/milvus/types';
 
 export const throwErrorFromSDK = (res: ResStatus) => {
   if (res.error_code !== ErrorCode.SUCCESS) {

+ 4 - 2
server/src/utils/Helper.ts

@@ -1,5 +1,7 @@
-import { KeyValuePair } from '@zilliz/milvus2-sdk-node/dist/milvus/types/Common';
-import { FieldSchema } from '@zilliz/milvus2-sdk-node/dist/milvus/types/Response';
+import {
+  KeyValuePair,
+  FieldSchema,
+} from '@zilliz/milvus2-sdk-node/dist/milvus/types';
 
 export const findKeyValue = (obj: KeyValuePair[], key: string) =>
   obj.find(v => v.key === key)?.value;

+ 12 - 202
server/yarn.lock

@@ -641,61 +641,6 @@
     lodash "^4.17.15"
     tmp-promise "^3.0.2"
 
-"@microsoft/api-documenter@^7.13.39":
-  version "7.13.65"
-  resolved "https://registry.yarnpkg.com/@microsoft/api-documenter/-/api-documenter-7.13.65.tgz#c9c82369046e882d26f557ab187428f254123b62"
-  integrity sha512-cajrUQaNTjzRXMzftUhTku5J4BHSqrCiPXv3tCzdWnii9FxZpqvAYZelfW0/Tz9gjM9kYEMp9Msetf41AR1u7A==
-  dependencies:
-    "@microsoft/api-extractor-model" "7.13.14"
-    "@microsoft/tsdoc" "0.13.2"
-    "@rushstack/node-core-library" "3.43.0"
-    "@rushstack/ts-command-line" "4.10.3"
-    colors "~1.2.1"
-    js-yaml "~3.13.1"
-    resolve "~1.17.0"
-
-"@microsoft/api-extractor-model@7.13.14":
-  version "7.13.14"
-  resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.13.14.tgz#071bf881942814c7786a20c6805bc5cde4019bc5"
-  integrity sha512-mKc917+QhOuOZebSnE77i8Tavj/G5ydIFoJqDIY9LpmAfJjsVHgL2pc7vkvW58QTxH2wadIDK1tLzcteOMEt4w==
-  dependencies:
-    "@microsoft/tsdoc" "0.13.2"
-    "@microsoft/tsdoc-config" "~0.15.2"
-    "@rushstack/node-core-library" "3.43.0"
-
-"@microsoft/api-extractor@^7.18.5":
-  version "7.18.17"
-  resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.18.17.tgz#3139f803fcaef919c7ff68e02bd6759bc637a64b"
-  integrity sha512-gZuJ//FAyfrOqWssY0cyU2bEo8FOIaIYVs+pU5IDyfImkye6YkT2Qnm5PAFhyYSkfUjV5SjvyuP4+VsDfS3jww==
-  dependencies:
-    "@microsoft/api-extractor-model" "7.13.14"
-    "@microsoft/tsdoc" "0.13.2"
-    "@microsoft/tsdoc-config" "~0.15.2"
-    "@rushstack/node-core-library" "3.43.0"
-    "@rushstack/rig-package" "0.3.4"
-    "@rushstack/ts-command-line" "4.10.3"
-    colors "~1.2.1"
-    lodash "~4.17.15"
-    resolve "~1.17.0"
-    semver "~7.3.0"
-    source-map "~0.6.1"
-    typescript "~4.4.2"
-
-"@microsoft/tsdoc-config@~0.15.2":
-  version "0.15.2"
-  resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz#eb353c93f3b62ab74bdc9ab6f4a82bcf80140f14"
-  integrity sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==
-  dependencies:
-    "@microsoft/tsdoc" "0.13.2"
-    ajv "~6.12.6"
-    jju "~1.4.0"
-    resolve "~1.19.0"
-
-"@microsoft/tsdoc@0.13.2":
-  version "0.13.2"
-  resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz#3b0efb6d3903bd49edb073696f60e90df08efb26"
-  integrity sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==
-
 "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf"
@@ -749,39 +694,6 @@
   resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
   integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=
 
-"@rushstack/node-core-library@3.43.0":
-  version "3.43.0"
-  resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.43.0.tgz#aace43bf49bc907445fa306f8c2e6010a8353cda"
-  integrity sha512-MFLW+6X83k6o8m8KnWkDhL/8NCJYHbFnnDokPSX1UHC3JwiEvVhHmEnxZv2YEzwnXeFYoKViub2G2t2liHbHLA==
-  dependencies:
-    "@types/node" "12.20.24"
-    colors "~1.2.1"
-    fs-extra "~7.0.1"
-    import-lazy "~4.0.0"
-    jju "~1.4.0"
-    resolve "~1.17.0"
-    semver "~7.3.0"
-    timsort "~0.3.0"
-    z-schema "~3.18.3"
-
-"@rushstack/rig-package@0.3.4":
-  version "0.3.4"
-  resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.3.4.tgz#13987cea8eef2f350e2e7538e028fa839f8c4f3c"
-  integrity sha512-NsCzPxPQ8cu7lnqa/4xBQXuCJwaBrb5vEbOC8Q/bMQK7GDOxeVUN3/f+NCYjgQSl39toAm8jQJ7TJe+RYYX3yQ==
-  dependencies:
-    resolve "~1.17.0"
-    strip-json-comments "~3.1.1"
-
-"@rushstack/ts-command-line@4.10.3":
-  version "4.10.3"
-  resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.10.3.tgz#2b8610473f2aa9e22450273f662abb02a3979a11"
-  integrity sha512-DdDfwr8CO6CP/kBZlQrrwKyA6UxOteujaIBrmoHa+J+dyLZC19YA/LK0fAHjr2qHLAJHHXVpZwPH8BpqN84oVg==
-  dependencies:
-    "@types/argparse" "1.0.38"
-    argparse "~1.0.9"
-    colors "~1.2.1"
-    string-argv "~0.3.1"
-
 "@sindresorhus/is@^0.14.0":
   version "0.14.0"
   resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
@@ -838,11 +750,6 @@
   resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e"
   integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==
 
-"@types/argparse@1.0.38":
-  version "1.0.38"
-  resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9"
-  integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==
-
 "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14":
   version "7.1.16"
   resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702"
@@ -1045,11 +952,6 @@
   resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae"
   integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==
 
-"@types/node@12.20.24":
-  version "12.20.24"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.24.tgz#c37ac69cb2948afb4cef95f424fa0037971a9a5c"
-  integrity sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==
-
 "@types/node@^16.11.26":
   version "16.18.3"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.3.tgz#d7f7ba828ad9e540270f01ce00d391c54e6e0abc"
@@ -1162,17 +1064,13 @@
   dependencies:
     "@types/node" "*"
 
-"@zilliz/milvus2-sdk-node@^2.2.1":
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/@zilliz/milvus2-sdk-node/-/milvus2-sdk-node-2.2.1.tgz#93b024f9d22af340086d5545488d3d000d798a29"
-  integrity sha512-dfUnnFf2CKDos2lewibcCf+GR2LO3MTb2eGWCbUvobIdjMVdFm9z9M6ih7NIpGVbPJoKGUwEHT3UlycWOpkuXw==
+"@zilliz/milvus2-sdk-node@^2.2.4":
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/@zilliz/milvus2-sdk-node/-/milvus2-sdk-node-2.2.4.tgz#617cc97a405c0a56f7ab33ee379022e77b46c291"
+  integrity sha512-1DRZhuWDpjzKo6zYVr8wK4cfhIFMrnDwc+D6sfQR4KxXmYZikTTFxLJBtvzyFw1TgVmXRZ6UUQ3JgerzwOcxQg==
   dependencies:
     "@grpc/grpc-js" "^1.2.12"
     "@grpc/proto-loader" "^0.7.3"
-    "@microsoft/api-documenter" "^7.13.39"
-    "@microsoft/api-extractor" "^7.18.5"
-    json-schema "^0.4.0"
-    node-forge "^1.0.0"
     protobufjs "^7.1.2"
 
 abab@^2.0.3, abab@^2.0.5:
@@ -1233,7 +1131,7 @@ ajv-keywords@^3.4.1:
   resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
   integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
 
-ajv@^6.10.0, ajv@^6.12.0, ajv@~6.12.6:
+ajv@^6.10.0, ajv@^6.12.0:
   version "6.12.6"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
   integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -1331,7 +1229,7 @@ arg@^4.1.0:
   resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
   integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
 
-argparse@^1.0.7, argparse@~1.0.9:
+argparse@^1.0.7:
   version "1.0.10"
   resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
   integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
@@ -1872,11 +1770,6 @@ colors@1.0.3:
   resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
   integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=
 
-colors@~1.2.1:
-  version "1.2.5"
-  resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.5.tgz#89c7ad9a374bc030df8013241f68136ed8835afc"
-  integrity sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==
-
 combined-stream@^1.0.8:
   version "1.0.8"
   resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
@@ -2664,15 +2557,6 @@ fs-extra@^9.0.0, fs-extra@^9.0.1:
     jsonfile "^6.0.1"
     universalify "^2.0.0"
 
-fs-extra@~7.0.1:
-  version "7.0.1"
-  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
-  integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
-  dependencies:
-    graceful-fs "^4.1.2"
-    jsonfile "^4.0.0"
-    universalify "^0.1.0"
-
 fs-minipass@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
@@ -2994,11 +2878,6 @@ import-lazy@^2.1.0:
   resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
   integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
 
-import-lazy@~4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153"
-  integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==
-
 import-local@^3.0.2:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.3.tgz#4d51c2c495ca9393da259ec66b62e022920211e0"
@@ -3066,7 +2945,7 @@ is-ci@^3.0.0:
   dependencies:
     ci-info "^3.2.0"
 
-is-core-module@^2.1.0, is-core-module@^2.2.0:
+is-core-module@^2.2.0:
   version "2.8.0"
   resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548"
   integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==
@@ -3632,11 +3511,6 @@ jest@^27.3.1:
     import-local "^3.0.2"
     jest-cli "^27.3.1"
 
-jju@~1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a"
-  integrity sha1-o6vicYryQaKykE+EpiWXDzia4yo=
-
 js-tokens@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -3657,14 +3531,6 @@ js-yaml@^4.1.0:
   dependencies:
     argparse "^2.0.1"
 
-js-yaml@~3.13.1:
-  version "3.13.1"
-  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
-  integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
-  dependencies:
-    argparse "^1.0.7"
-    esprima "^4.0.0"
-
 jsdom@^16.6.0:
   version "16.7.0"
   resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710"
@@ -3713,11 +3579,6 @@ json-schema-traverse@^0.4.1:
   resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
   integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
 
-json-schema@^0.4.0:
-  version "0.4.0"
-  resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
-  integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==
-
 json-stringify-safe@^5.0.1:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
@@ -3800,12 +3661,12 @@ lodash.camelcase@^4.3.0:
   resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
   integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
 
-lodash.get@^4.0.0, lodash.get@^4.4.2:
+lodash.get@^4.4.2:
   version "4.4.2"
   resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
   integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=
 
-lodash.isequal@^4.0.0, lodash.isequal@^4.5.0:
+lodash.isequal@^4.5.0:
   version "4.5.0"
   resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
   integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=
@@ -3820,7 +3681,7 @@ lodash.mergewith@^4.6.2:
   resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55"
   integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==
 
-lodash@^4.17.10, lodash@^4.17.15, lodash@^4.7.0, lodash@~4.17.15:
+lodash@^4.17.10, lodash@^4.17.15, lodash@^4.7.0:
   version "4.17.21"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -4049,11 +3910,6 @@ node-cron@^3.0.0:
   dependencies:
     moment-timezone "^0.5.31"
 
-node-forge@^1.0.0:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.2.1.tgz#82794919071ef2eb5c509293325cec8afd0fd53c"
-  integrity sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==
-
 node-int64@^0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
@@ -4522,21 +4378,6 @@ resolve@^1.20.0, resolve@^1.3.2:
     is-core-module "^2.2.0"
     path-parse "^1.0.6"
 
-resolve@~1.17.0:
-  version "1.17.0"
-  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
-  integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
-  dependencies:
-    path-parse "^1.0.6"
-
-resolve@~1.19.0:
-  version "1.19.0"
-  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c"
-  integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==
-  dependencies:
-    is-core-module "^2.1.0"
-    path-parse "^1.0.6"
-
 responselike@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
@@ -4609,7 +4450,7 @@ semver-diff@^3.1.1:
   dependencies:
     semver "^6.3.0"
 
-semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@~7.3.0:
+semver@7.x, semver@^7.3.2, semver@^7.3.4:
   version "7.3.5"
   resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
   integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
@@ -4825,11 +4666,6 @@ stat-mode@^1.0.0:
   resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
   integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
 
-string-argv@~0.3.1:
-  version "0.3.1"
-  resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da"
-  integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==
-
 string-length@^4.0.1:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a"
@@ -4876,11 +4712,6 @@ strip-json-comments@~2.0.1:
   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
   integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
 
-strip-json-comments@~3.1.1:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
-  integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
-
 sumchecker@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42"
@@ -5020,11 +4851,6 @@ throat@^6.0.1:
   resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375"
   integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==
 
-timsort@~0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
-  integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
-
 tmp-promise@^3.0.2:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7"
@@ -5211,7 +5037,7 @@ typedarray-to-buffer@^3.1.5:
   dependencies:
     is-typedarray "^1.0.0"
 
-typescript@^4.4.4, typescript@~4.4.2:
+typescript@^4.4.4:
   version "4.4.4"
   resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c"
   integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==
@@ -5306,11 +5132,6 @@ validator@^13.1.1, validator@^13.5.2, validator@^13.6.0:
   resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857"
   integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==
 
-validator@^8.0.0:
-  version "8.2.0"
-  resolved "https://registry.yarnpkg.com/validator/-/validator-8.2.0.tgz#3c1237290e37092355344fef78c231249dab77b9"
-  integrity sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA==
-
 vary@^1, vary@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
@@ -5529,14 +5350,3 @@ z-schema@^4.2.3:
     validator "^13.6.0"
   optionalDependencies:
     commander "^2.7.1"
-
-z-schema@~3.18.3:
-  version "3.18.4"
-  resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-3.18.4.tgz#ea8132b279533ee60be2485a02f7e3e42541a9a2"
-  integrity sha512-DUOKC/IhbkdLKKiV89gw9DUauTV8U/8yJl1sjf6MtDmzevLKOF2duNJ495S3MFVjqZarr+qNGCPbkg4mu4PpLw==
-  dependencies:
-    lodash.get "^4.0.0"
-    lodash.isequal "^4.0.0"
-    validator "^8.0.0"
-  optionalDependencies:
-    commander "^2.7.1"