Просмотр исходного кода

Merge branch 'feat/growi-bot' into support/add-dockerfile-for-slackbot-proxy

Yuki Takei 5 лет назад
Родитель
Сommit
67fe831fd3
24 измененных файлов с 343 добавлено и 197 удалено
  1. 3 2
      packages/slack/package.json
  2. 1 0
      packages/slack/src/index.ts
  3. 31 0
      packages/slack/src/utils/block-creater.ts
  4. 12 12
      packages/slackbot-proxy/package.json
  5. 10 5
      packages/slackbot-proxy/src/controllers/slack.ts
  6. 3 0
      packages/slackbot-proxy/src/interfaces/growi-commands-mappings.ts
  7. 9 0
      packages/slackbot-proxy/src/repositories/installation.ts
  8. 15 2
      packages/slackbot-proxy/src/services/InstallerService.ts
  9. 37 0
      packages/slackbot-proxy/src/services/RegisterService.ts
  10. BIN
      public/029f9229f245585818d628bc89f13bda.png
  11. BIN
      public/3b057d62dafc540b458a2b68e3de90bb.png
  12. BIN
      public/48180ec4401b7b8bfceb485c28713908.png
  13. BIN
      public/8435ca833da926a3ce14246def63d63e.png
  14. BIN
      public/d4d8e2f879b6afdfddeaae28233ff4f0.png
  15. BIN
      public/eaac23070c6b378bde2c1438fa72f52e.png
  16. BIN
      public/images/slack-integration/slack-bot-install-to-workspace-joined-bot.png
  17. BIN
      public/images/slack-integration/slack-bot-install-to-workspace.png
  18. BIN
      public/images/slack-integration/slack-bot-install-your-app-complete.png
  19. BIN
      public/images/slack-integration/slack-bot-install-your-app-introduction-to-channel.png
  20. BIN
      public/images/slack-integration/slack-bot-install-your-app-introduction.png
  21. BIN
      public/images/slack-integration/slack-bot-install-your-app-transition-destination.png
  22. 58 8
      src/client/js/components/Admin/SlackIntegration/CustomBotWithoutProxySettingsAccordion.jsx
  23. 10 0
      src/client/styles/scss/_admin.scss
  24. 154 168
      yarn.lock

+ 3 - 2
packages/slack/package.json

@@ -5,8 +5,9 @@
   "main": "dist/index.js",
   "main": "dist/index.js",
   "typings": "dist/index.d.ts",
   "typings": "dist/index.d.ts",
   "scripts": {
   "scripts": {
-    "build": "yarn tsc",
-    "tsc": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
+    "build": "yarn tsc && tsc-alias -p tsconfig.build.json",
+    "tsc": "tsc -p tsconfig.build.json",
+    "tsc:w": "yarn tsc -w",
     "test": "yarn test:lint && yarn test:coverage",
     "test": "yarn test:lint && yarn test:coverage",
     "test:unit": "cross-env NODE_ENV=test jest --passWithNoTests",
     "test:unit": "cross-env NODE_ENV=test jest --passWithNoTests",
     "test:coverage": "yarn test:unit",
     "test:coverage": "yarn test:unit",

+ 1 - 0
packages/slack/src/index.ts

@@ -10,3 +10,4 @@ export const supportedGrowiCommands: string[] = [
 export * from './interfaces/growi-command';
 export * from './interfaces/growi-command';
 export * from './models/errors';
 export * from './models/errors';
 export * from './utils/slash-command-parser';
 export * from './utils/slash-command-parser';
+export * from './utils/block-creater';

+ 31 - 0
packages/slack/src/utils/block-creater.ts

@@ -0,0 +1,31 @@
+import { SectionBlock, InputBlock } from '@slack/types';
+
+export const generateMarkdownSectionBlock = (blocks:string):SectionBlock => {
+  return {
+    type: 'section',
+    text: {
+      type: 'mrkdwn',
+      text: blocks,
+    },
+  };
+};
+
+export const generateInputSectionBlock = (blockId:string, labelText:string, actionId:string, isMultiline:boolean, placeholder:string):InputBlock => {
+  return {
+    type: 'input',
+    block_id: blockId,
+    label: {
+      type: 'plain_text',
+      text: labelText,
+    },
+    element: {
+      type: 'plain_text_input',
+      action_id: actionId,
+      multiline: isMultiline,
+      placeholder: {
+        type: 'plain_text',
+        text: placeholder,
+      },
+    },
+  };
+};

+ 12 - 12
packages/slackbot-proxy/package.json

@@ -3,9 +3,9 @@
   "version": "0.9.0-RC",
   "version": "0.9.0-RC",
   "license": "MIT",
   "license": "MIT",
   "scripts": {
   "scripts": {
-    "build": "yarn tsc",
-    "tsc": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
-    "tsc:w": "tsc -w",
+    "build": "yarn tsc && tsc-alias -p tsconfig.build.json",
+    "tsc": "tsc -p tsconfig.build.json",
+    "tsc:w": "yarn tsc -w",
     "dev:ci": "yarn dev --ci",
     "dev:ci": "yarn dev --ci",
     "dev": "cross-env NODE_ENV=development ts-node-dev -r tsconfig-paths/register -r dotenv-flow/config src/index.ts",
     "dev": "cross-env NODE_ENV=development ts-node-dev -r tsconfig-paths/register -r dotenv-flow/config src/index.ts",
     "start:prod:ci": "yarn start:prod --ci",
     "start:prod:ci": "yarn start:prod --ci",
@@ -20,11 +20,11 @@
     "@growi/slack": "0.9.0-RC",
     "@growi/slack": "0.9.0-RC",
     "@slack/oauth": "^2.0.1",
     "@slack/oauth": "^2.0.1",
     "@slack/web-api": "^6.1.0",
     "@slack/web-api": "^6.1.0",
-    "@tsed/common": "^6.34.3",
-    "@tsed/di": "^6.34.3",
-    "@tsed/platform-express": "^6.34.3",
-    "@tsed/swagger": "^6.34.3",
-    "@tsed/typeorm": "^6.34.3",
+    "@tsed/common": "^6.43.0",
+    "@tsed/di": "^6.43.0",
+    "@tsed/platform-express": "^6.43.0",
+    "@tsed/swagger": "^6.43.0",
+    "@tsed/typeorm": "^6.43.0",
     "compression": "^1.7.4",
     "compression": "^1.7.4",
     "cookie-parser": "^1.4.5",
     "cookie-parser": "^1.4.5",
     "dotenv-flow": "^3.2.0",
     "dotenv-flow": "^3.2.0",
@@ -33,10 +33,10 @@
     "typeorm": "^0.2.31"
     "typeorm": "^0.2.31"
   },
   },
   "devDependencies": {
   "devDependencies": {
-    "@tsed/core": "^6.34.3",
-    "@tsed/exceptions": "^6.34.3",
-    "@tsed/json-mapper": "^6.34.3",
-    "@tsed/schema": "^6.34.3",
+    "@tsed/core": "^6.43.0",
+    "@tsed/exceptions": "^6.43.0",
+    "@tsed/json-mapper": "^6.43.0",
+    "@tsed/schema": "^6.43.0",
     "@typescript-eslint/eslint-plugin": "^4.18.0",
     "@typescript-eslint/eslint-plugin": "^4.18.0",
     "@typescript-eslint/parser": "^4.18.0",
     "@typescript-eslint/parser": "^4.18.0",
     "eslint-import-resolver-typescript": "^2.4.0",
     "eslint-import-resolver-typescript": "^2.4.0",

+ 10 - 5
packages/slackbot-proxy/src/controllers/slack.ts

@@ -1,7 +1,7 @@
 import {
 import {
   BodyParams, Controller, Get, Inject, Post, Req, Res,
   BodyParams, Controller, Get, Inject, Post, Req, Res,
 } from '@tsed/common';
 } from '@tsed/common';
-
+import { parseSlashCommand } from '@growi/slack';
 import { Installation } from '~/entities/installation';
 import { Installation } from '~/entities/installation';
 import { Relation } from '~/entities/relation';
 import { Relation } from '~/entities/relation';
 import { Order } from '~/entities/order';
 import { Order } from '~/entities/order';
@@ -10,7 +10,7 @@ import { InstallationRepository } from '~/repositories/installation';
 import { RelationRepository } from '~/repositories/relation';
 import { RelationRepository } from '~/repositories/relation';
 import { OrderRepository } from '~/repositories/order';
 import { OrderRepository } from '~/repositories/order';
 import { InstallerService } from '~/services/InstallerService';
 import { InstallerService } from '~/services/InstallerService';
-import { ReceiveService } from '~/services/RecieveService';
+import { RegisterService } from '~/services/RegisterService';
 
 
 
 
 @Controller('/slack')
 @Controller('/slack')
@@ -29,7 +29,11 @@ export class SlackCtrl {
   orderRepository: OrderRepository;
   orderRepository: OrderRepository;
 
 
   @Inject()
   @Inject()
-  receiveService: ReceiveService;
+  registerService: RegisterService;
+
+  growiCommandsMappings = {
+    register: async(body:{[key:string]:string}):Promise<void> => this.registerService.execSlashCommand(body),
+  };
 
 
   @Get('/testsave')
   @Get('/testsave')
   testsave(): void {
   testsave(): void {
@@ -75,8 +79,9 @@ export class SlackCtrl {
     // Send response immediately to avoid opelation_timeout error
     // Send response immediately to avoid opelation_timeout error
     // See https://api.slack.com/apis/connections/events-api#the-events-api__responding-to-events
     // See https://api.slack.com/apis/connections/events-api#the-events-api__responding-to-events
 
 
-    const slackInput = this.receiveService.receiveContentsFromSlack(body);
-    console.log('Controller/events', slackInput);
+    const parsedBody = parseSlashCommand(body);
+    const executeGrowiCommand = this.growiCommandsMappings[parsedBody.growiCommandType];
+    await executeGrowiCommand(body);
     res.send();
     res.send();
 
 
     const installation = await this.installationRepository.findByID('1');
     const installation = await this.installationRepository.findByID('1');

+ 3 - 0
packages/slackbot-proxy/src/interfaces/growi-commands-mappings.ts

@@ -0,0 +1,3 @@
+export interface GrowiCommandsMappings{
+  execSlashCommand(body:{[key:string]:string}):Promise<void>
+}

+ 9 - 0
packages/slackbot-proxy/src/repositories/installation.ts

@@ -11,4 +11,13 @@ export class InstallationRepository extends Repository<Installation> {
     return this.findOne(id);
     return this.findOne(id);
   }
   }
 
 
+  async findByTeamIdOrEnterpriseId(teamIdOrEnterpriseId:string): Promise<Installation|undefined> {
+    return this.findOne({
+      where: [
+        { teamId: teamIdOrEnterpriseId },
+        { enterpriseId: teamIdOrEnterpriseId, isEnterpriseInstall: true },
+      ],
+    });
+  }
+
 }
 }

+ 15 - 2
packages/slackbot-proxy/src/services/InstallerService.ts

@@ -33,12 +33,25 @@ export class InstallerService {
       clientSecret,
       clientSecret,
       stateSecret,
       stateSecret,
       installationStore: {
       installationStore: {
+        // upsert
         storeInstallation: async(slackInstallation: SlackInstallation<'v1' | 'v2', boolean>) => {
         storeInstallation: async(slackInstallation: SlackInstallation<'v1' | 'v2', boolean>) => {
+          const teamIdOrEnterpriseId = slackInstallation.team?.id || slackInstallation.enterprise?.id;
+
+          if (teamIdOrEnterpriseId == null) {
+            throw new Error('teamId or enterpriseId is required.');
+          }
+
+          const existedInstallation = await repository.findByTeamIdOrEnterpriseId(teamIdOrEnterpriseId);
+
+          if (existedInstallation != null) {
+            existedInstallation.setData(slackInstallation);
+            await repository.save(existedInstallation);
+            return;
+          }
+
           const installation = new Installation();
           const installation = new Installation();
           installation.setData(slackInstallation);
           installation.setData(slackInstallation);
-
           await repository.save(installation);
           await repository.save(installation);
-
           return;
           return;
         },
         },
         fetchInstallation: async(installQuery: InstallationQuery<boolean>) => {
         fetchInstallation: async(installQuery: InstallationQuery<boolean>) => {

+ 37 - 0
packages/slackbot-proxy/src/services/RegisterService.ts

@@ -0,0 +1,37 @@
+import { Service } from '@tsed/di';
+import { WebClient, LogLevel } from '@slack/web-api';
+import { generateInputSectionBlock } from '@growi/slack';
+import { GrowiCommandsMappings } from '../interfaces/growi-commands-mappings';
+
+@Service()
+export class RegisterService implements GrowiCommandsMappings {
+
+  async execSlashCommand(body:{[key:string]:string}):Promise<void> {
+    // tmp use process.env
+    const client = new WebClient(process.env.SLACK_BOT_USER_OAUTH_TOKEN, { logLevel: LogLevel.DEBUG });
+    await client.views.open({
+      trigger_id: body.trigger_id,
+      view: {
+        type: 'modal',
+        title: {
+          type: 'plain_text',
+          text: 'Register Credentials',
+        },
+        submit: {
+          type: 'plain_text',
+          text: 'Submit',
+        },
+        close: {
+          type: 'plain_text',
+          text: 'Close',
+        },
+        blocks: [
+          generateInputSectionBlock('growiDomain', 'GROWI domain', 'contents_input', false, 'https://example.com'),
+          generateInputSectionBlock('growiAccessToken', 'GROWI ACCESS_TOKEN', 'contents_input', false, 'jBMZvpk.....'),
+          generateInputSectionBlock('proxyToken', 'PROXY ACCESS_TOKEM', 'contents_input', false, 'jBMZvpk.....'),
+        ],
+      },
+    });
+  }
+
+}

BIN
public/029f9229f245585818d628bc89f13bda.png


BIN
public/3b057d62dafc540b458a2b68e3de90bb.png


BIN
public/48180ec4401b7b8bfceb485c28713908.png


BIN
public/8435ca833da926a3ce14246def63d63e.png


BIN
public/d4d8e2f879b6afdfddeaae28233ff4f0.png


BIN
public/eaac23070c6b378bde2c1438fa72f52e.png


BIN
public/images/slack-integration/slack-bot-install-to-workspace-joined-bot.png


BIN
public/images/slack-integration/slack-bot-install-to-workspace.png


BIN
public/images/slack-integration/slack-bot-install-your-app-complete.png


BIN
public/images/slack-integration/slack-bot-install-your-app-introduction-to-channel.png


BIN
public/images/slack-integration/slack-bot-install-your-app-introduction.png


BIN
public/images/slack-integration/slack-bot-install-your-app-transition-destination.png


+ 58 - 8
src/client/js/components/Admin/SlackIntegration/CustomBotWithoutProxySettingsAccordion.jsx

@@ -1,10 +1,16 @@
 import React, { useState } from 'react';
 import React, { useState } from 'react';
+import PropTypes from 'prop-types';
 import { useTranslation } from 'react-i18next';
 import { useTranslation } from 'react-i18next';
 import { Collapse } from 'reactstrap';
 import { Collapse } from 'reactstrap';
+import AppContainer from '../../../services/AppContainer';
+import { withUnstatedContainers } from '../../UnstatedUtils';
 
 
-const CustomBotWithoutSettingsAccordion = () => {
+const CustomBotWithoutProxySettingsAccordion = (props) => {
+  const { appContainer } = props;
   const { t } = useTranslation('admin');
   const { t } = useTranslation('admin');
   const [openAccordionIndexes, setOpenAccordionIndexes] = useState(new Set());
   const [openAccordionIndexes, setOpenAccordionIndexes] = useState(new Set());
+  const [connectionErrorCode, setConnectionErrorCode] = useState(null);
+  const [connectionErrorMessage, setConnectionErrorMessage] = useState(null);
 
 
   const onToggleAccordionHandler = (i) => {
   const onToggleAccordionHandler = (i) => {
     const accordionIndexes = new Set(openAccordionIndexes);
     const accordionIndexes = new Set(openAccordionIndexes);
@@ -17,6 +23,21 @@ const CustomBotWithoutSettingsAccordion = () => {
     setOpenAccordionIndexes(accordionIndexes);
     setOpenAccordionIndexes(accordionIndexes);
   };
   };
 
 
+  const onTestConnectionHandler = async() => {
+    setConnectionErrorCode(null);
+    setConnectionErrorMessage(null);
+    try {
+      await appContainer.apiv3.post('slack-integration/notification-test-to-slack-work-space', {
+        // TODO put proper request
+        channel: 'testchannel',
+      });
+    }
+    catch (err) {
+      setConnectionErrorCode(err[0].code);
+      setConnectionErrorMessage(err[0].message);
+    }
+  };
+
   return (
   return (
     <div className="card border-0 rounded-lg shadow overflow-hidden">
     <div className="card border-0 rounded-lg shadow overflow-hidden">
 
 
@@ -71,8 +92,20 @@ const CustomBotWithoutSettingsAccordion = () => {
           }
           }
         </div>
         </div>
         <Collapse isOpen={openAccordionIndexes.has(1)}>
         <Collapse isOpen={openAccordionIndexes.has(1)}>
-          <div className="card-body">
-            BODY2
+          <div className="card-body py-5">
+            <div className="container w-75">
+              <p>1. Install your app をクリックします。</p>
+              <img src="/images/slack-integration/slack-bot-install-your-app-introduction.png" className="border border-light img-fluid mb-5" />
+              <p>2. Install to Workspace をクリックします。</p>
+              <img src="/images/slack-integration/slack-bot-install-to-workspace.png" className="border border-light img-fluid mb-5" />
+              <p>3. 遷移先の画面にて、Allowをクリックします。</p>
+              <img src="/images/slack-integration/slack-bot-install-your-app-transition-destination.png" className="border border-light img-fluid mb-5" />
+              <p>4. Install your app の右側に 緑色のチェックがつけばワークスペースへのインストール完了です。</p>
+              <img src="/images/slack-integration/slack-bot-install-your-app-complete.png" className="border border-light img-fluid mb-5" />
+              <p>5. GROWI bot を使いたいチャンネルに @example を使用して招待します。</p>
+              <img src="/images/slack-integration/slack-bot-install-to-workspace-joined-bot.png" className="border border-light img-fluid mb-1" />
+              <img src="/images/slack-integration/slack-bot-install-your-app-introduction-to-channel.png" className="border border-light img-fluid" />
+            </div>
           </div>
           </div>
         </Collapse>
         </Collapse>
       </div>
       </div>
@@ -110,16 +143,33 @@ const CustomBotWithoutSettingsAccordion = () => {
         </div>
         </div>
         <Collapse isOpen={openAccordionIndexes.has(3)}>
         <Collapse isOpen={openAccordionIndexes.has(3)}>
           <div className="card-body">
           <div className="card-body">
-            BODY 4
+            <p className="text-center m-4">以下のテストボタンを押して、Slack連携が完了しているかの確認をしましょう</p>
+            <div className="d-flex justify-content-center">
+              <button type="button" className="btn btn-info m-3 px-5 font-weight-bold" onClick={onTestConnectionHandler}>Test</button>
+            </div>
+            {connectionErrorMessage != null
+              && <p className="text-danger text-center m-4">エラーが発生しました。下記のログを確認してください。</p>
+            }
+            <div className="row m-3 justify-content-center">
+              <div className="col-sm-5 slack-connection-error-log">
+                <p className="border-info slack-connection-error-log-title mb-1 pl-2">Logs</p>
+                <div className="card border-info slack-connection-error-log-body rounded-lg px-5 py-4">
+                  <p className="m-0">{connectionErrorCode}</p>
+                  <p className="m-0">{connectionErrorMessage}</p>
+                </div>
+              </div>
+            </div>
           </div>
           </div>
         </Collapse>
         </Collapse>
       </div>
       </div>
-
     </div>
     </div>
-
   );
   );
-
 };
 };
 
 
+const CustomBotWithoutProxySettingsAccordionWrapper = withUnstatedContainers(CustomBotWithoutProxySettingsAccordion, [AppContainer]);
+
+CustomBotWithoutProxySettingsAccordion.propTypes = {
+  appContainer: PropTypes.instanceOf(AppContainer).isRequired,
+};
 
 
-export default CustomBotWithoutSettingsAccordion;
+export default CustomBotWithoutProxySettingsAccordionWrapper;

+ 10 - 0
src/client/styles/scss/_admin.scss

@@ -104,6 +104,16 @@
       border-width: 2px;
       border-width: 2px;
     }
     }
   }
   }
+  // TODO: change to utility class on Bootstrap 5
+  .slack-connection-error-log {
+    .slack-connection-error-log-title {
+      border-left: 2px solid;
+    }
+    .slack-connection-error-log-body {
+      min-height: 6rem;
+      border: 2px solid;
+    }
+  }
 
 
   //// TODO: migrate to Bootstrap 4
   //// TODO: migrate to Bootstrap 4
   //// omit all .btn-toggle and use Switches
   //// omit all .btn-toggle and use Switches

+ 154 - 168
yarn.lock

@@ -2794,27 +2794,27 @@
     p-queue "^6.6.1"
     p-queue "^6.6.1"
     p-retry "^4.0.0"
     p-retry "^4.0.0"
 
 
-"@sqltools/formatter@1.2.2":
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.2.tgz#9390a8127c0dcba61ebd7fdcc748655e191bdd68"
-  integrity sha512-/5O7Fq6Vnv8L6ucmPjaWbVG1XkP4FO+w5glqfkIsq3Xw4oyNAdJddbnYodNDAfjVUvo/rrSCTom4kAND7T1o5Q==
+"@sqltools/formatter@^1.2.2":
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.3.tgz#1185726610acc37317ddab11c3c7f9066966bd20"
+  integrity sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg==
 
 
 "@tootallnate/once@1":
 "@tootallnate/once@1":
   version "1.1.2"
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
   resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
   integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
   integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
 
 
-"@tsed/common@^6.34.3":
-  version "6.34.3"
-  resolved "https://registry.yarnpkg.com/@tsed/common/-/common-6.34.3.tgz#f9fa6904312a844b97e2566e3c16a13579015835"
-  integrity sha512-sXBaYrXyIVSBNdui3kGjV9rLTVqQlvddaGlOaRTYpnkRzCbFDh7rtfXJ254Wi6+7sa2FuFpZZSZP9ON57PWgaA==
-  dependencies:
-    "@tsed/core" "6.34.3"
-    "@tsed/di" "6.34.3"
-    "@tsed/exceptions" "6.34.3"
-    "@tsed/json-mapper" "6.34.3"
-    "@tsed/logger" "^5.12.0"
-    "@tsed/schema" "6.34.3"
+"@tsed/common@^6.43.0":
+  version "6.43.0"
+  resolved "https://registry.yarnpkg.com/@tsed/common/-/common-6.43.0.tgz#43d55a414c3ef24cd4e8f2adbf91935e08749f16"
+  integrity sha512-/tSElT1SVH7xbw+h89PLzm0Lhm3RzmVb04al/391wQX5W9rCGPevgFB1HN5zVNQqKFfvKPoTrvzLEHjNZj1jRQ==
+  dependencies:
+    "@tsed/core" "6.43.0"
+    "@tsed/di" "6.43.0"
+    "@tsed/exceptions" "6.43.0"
+    "@tsed/json-mapper" "6.43.0"
+    "@tsed/logger" "^5.12.1"
+    "@tsed/schema" "6.43.0"
     "@types/cache-manager" "^3.4.0"
     "@types/cache-manager" "^3.4.0"
     "@types/json-schema" "7.0.6"
     "@types/json-schema" "7.0.6"
     cache-manager "^3.4.1"
     cache-manager "^3.4.1"
@@ -2825,72 +2825,46 @@
     tslib "2.1.0"
     tslib "2.1.0"
     uuid "8.3.2"
     uuid "8.3.2"
 
 
-"@tsed/core@6.34.3":
-  version "6.34.3"
-  resolved "https://registry.yarnpkg.com/@tsed/core/-/core-6.34.3.tgz#33c3e2926573847a24e2b95b4198ceede291648f"
-  integrity sha512-JeEehwzt+ijgZ9ZT7WjQm7CdnWzpNnfZoOBIash/JrQiWL3mdXs8KrJUlgkgKQJl03M1+9AJD6nL87e6sjIejA==
-  dependencies:
-    normalize-path "3.0.0"
-    reflect-metadata "^0.1.13"
-    source-map-support "0.5.19"
-    tslib "2.1.0"
-
-"@tsed/core@6.40.0", "@tsed/core@^6.34.3":
-  version "6.40.0"
-  resolved "https://registry.yarnpkg.com/@tsed/core/-/core-6.40.0.tgz#8eae4b1f821c39097398006da76cbd676e1869a6"
-  integrity sha512-nijyNb5EXzlZI4ck71t9k8R9FtQH5kaHOxekLYkLE04nmKRT//Zok18v9upT4rUMVsim2kjSpRZ2h8nuasgd+g==
+"@tsed/core@6.43.0", "@tsed/core@^6.43.0":
+  version "6.43.0"
+  resolved "https://registry.yarnpkg.com/@tsed/core/-/core-6.43.0.tgz#63db73fb99a7f56791d58d1e557d10a670b5bc2e"
+  integrity sha512-6e3QWTCVla/BtI0bg0/ALvZf0i2MhfQwm32UHr4tHECmJ28AcStD6tc/zF9ffFEJr7xjHrFcMuvdEb3fhPLR4w==
   dependencies:
   dependencies:
     normalize-path "3.0.0"
     normalize-path "3.0.0"
     reflect-metadata "^0.1.13"
     reflect-metadata "^0.1.13"
     source-map-support "0.5.19"
     source-map-support "0.5.19"
     tslib "2.1.0"
     tslib "2.1.0"
 
 
-"@tsed/di@6.34.3", "@tsed/di@^6.34.3":
-  version "6.34.3"
-  resolved "https://registry.yarnpkg.com/@tsed/di/-/di-6.34.3.tgz#57f4a72c7cf2046ecfbb8879cb951e198b535daa"
-  integrity sha512-DU26ykSzgreEDPiRifXF3vqoYqasA4sGCCeGF08b19Wee1P4K0DHnrnjOvCUfr7mKq1dmielVNxdYWzWp3nwvg==
+"@tsed/di@6.43.0", "@tsed/di@^6.43.0":
+  version "6.43.0"
+  resolved "https://registry.yarnpkg.com/@tsed/di/-/di-6.43.0.tgz#c3c55c90f048f78a07e96d19fb413053aba52ecf"
+  integrity sha512-F1dM4KfhwOOmv9dKVaoi65wnLW6hPacVpiXYREqPhBHnAMSsQcpdgbvc7cFU3rO5ymPA8IHGLpDsfOM1aj8EcA==
   dependencies:
   dependencies:
-    "@tsed/core" "6.34.3"
+    "@tsed/core" "6.43.0"
     chalk "4.1.0"
     chalk "4.1.0"
     globby "11.0.1"
     globby "11.0.1"
     tslib "2.1.0"
     tslib "2.1.0"
 
 
-"@tsed/exceptions@6.34.3":
-  version "6.34.3"
-  resolved "https://registry.yarnpkg.com/@tsed/exceptions/-/exceptions-6.34.3.tgz#39d58d18a0cbda9a1269e3cf68a078dfb5bdfb4a"
-  integrity sha512-Cfkwh6NY9bK/2XdrwQJakXe9sQwBRaMbjpsDK53D598JDcdv+VNg14FcRDZcz5vAWLDKMYGZJUNBDMnwBXJtdg==
+"@tsed/exceptions@6.43.0", "@tsed/exceptions@^6.43.0":
+  version "6.43.0"
+  resolved "https://registry.yarnpkg.com/@tsed/exceptions/-/exceptions-6.43.0.tgz#327aefa42235c8da955366fe932bc11864104541"
+  integrity sha512-Sz0Zt51xsoXbF36dWm1vl74pVmAmHAhbykl3pIH5Cnbr4vqp3K5OpPPD/ZVxzfKJrTfiIN15zmvs5eXbyjXu5g==
   dependencies:
   dependencies:
-    "@tsed/schema" "6.34.3"
+    "@tsed/schema" "6.43.0"
     tslib "2.1.0"
     tslib "2.1.0"
 
 
-"@tsed/exceptions@^6.34.3":
-  version "6.40.0"
-  resolved "https://registry.yarnpkg.com/@tsed/exceptions/-/exceptions-6.40.0.tgz#66342dd392c32720b5eb5b5f7839665ab62482fb"
-  integrity sha512-gqMkHMar0nH9XkyBg3mKA1TuLhORAcI29E69tumoZ3akZmNPn7WWzhEuireE16asHk2mjkzpzFq7wuuWJrllEg==
+"@tsed/json-mapper@6.43.0", "@tsed/json-mapper@^6.43.0":
+  version "6.43.0"
+  resolved "https://registry.yarnpkg.com/@tsed/json-mapper/-/json-mapper-6.43.0.tgz#6b804b7e56a2c4bd1ad20b5721bb3b460c2ea5e2"
+  integrity sha512-Sy4w5VzSHsERdfBUAxZmkSCf6pC7Ri7qjCNBX9RaZQteqePPOBxugUzOqQCaOBoadawfpn9KDljo+gZbCjqJ9w==
   dependencies:
   dependencies:
-    "@tsed/schema" "6.40.0"
+    "@tsed/core" "6.43.0"
     tslib "2.1.0"
     tslib "2.1.0"
 
 
-"@tsed/json-mapper@6.34.3":
-  version "6.34.3"
-  resolved "https://registry.yarnpkg.com/@tsed/json-mapper/-/json-mapper-6.34.3.tgz#65eeb45ab1bc3e7a687e6ded059bfd61671d96e1"
-  integrity sha512-UJQYeamtISFLLAdR05sZOYgBGZOAV2eEmySOxcXV5xJNhT2YyCBVu8e9phMyuT5i4Bha39yfuaAp+eDBpAnJ1A==
-  dependencies:
-    "@tsed/core" "6.34.3"
-    tslib "2.1.0"
-
-"@tsed/json-mapper@^6.34.3":
-  version "6.40.0"
-  resolved "https://registry.yarnpkg.com/@tsed/json-mapper/-/json-mapper-6.40.0.tgz#6959af6329ba19956c857994b351bf01e1055258"
-  integrity sha512-2Zjy1nm2XGLR7yTc+1WoRkSco5dkcD77ymga3Ung06jb0gvACsnRJLSmci98YMHnkZJ8jfuPonndIKGqX69EFw==
-  dependencies:
-    "@tsed/core" "6.40.0"
-    tslib "2.1.0"
-
-"@tsed/logger@^5.12.0":
-  version "5.12.0"
-  resolved "https://registry.yarnpkg.com/@tsed/logger/-/logger-5.12.0.tgz#e67146151b368678cf34b57a82e93b5f46b757d9"
-  integrity sha512-rKAJ/qZILlvywzpQNcYzdhZPwo6TwJrlJgrKknuFaeZA0x+xYEG0wYQhYVlny0MdZX1FMjnH3qt3ofcAaIC32w==
+"@tsed/logger@^5.12.1":
+  version "5.13.2"
+  resolved "https://registry.yarnpkg.com/@tsed/logger/-/logger-5.13.2.tgz#cd0fe03d12b84bc884fd97873c2adf4a2892c521"
+  integrity sha512-xhTTqvIqiK5fULi+z6G9tx0xBKh5oHhyYtHQ67KBpEXEPOaIMyLdZsakluErILW2z6w0WI+3RkNdviGGo6Bpzg==
   dependencies:
   dependencies:
     colors "^1.3.3"
     colors "^1.3.3"
     date-format "^3.0.0"
     date-format "^3.0.0"
@@ -2899,58 +2873,42 @@
     streamroller "^1.0.3"
     streamroller "^1.0.3"
     tslib "2.1.0"
     tslib "2.1.0"
 
 
-"@tsed/openspec@6.34.3":
-  version "6.34.3"
-  resolved "https://registry.yarnpkg.com/@tsed/openspec/-/openspec-6.34.3.tgz#50f62e4dc54646456baeb57947bf3bd3c039adb6"
-  integrity sha512-tFIm9fLASUwuslk8qolAYpOptcl1/sRYtlrD100p2GEB7eq8NJQLrR6KyIa0SsQYsoXdPJ4I8NuEsWCb0ojtcw==
+"@tsed/openspec@6.43.0":
+  version "6.43.0"
+  resolved "https://registry.yarnpkg.com/@tsed/openspec/-/openspec-6.43.0.tgz#defa3fa4dd4c5b978e14042c720f416b81abceec"
+  integrity sha512-vX25uMQ9DZj9F8ZUE4ztsLJDcC9Wjb7OPUqd97Ve+SQoVt0iK5cxw103hBfEjG1Jag2J6IEbeX5SbXjepTZdXg==
 
 
-"@tsed/openspec@6.40.0":
-  version "6.40.0"
-  resolved "https://registry.yarnpkg.com/@tsed/openspec/-/openspec-6.40.0.tgz#5348d8c371d65813df711768dbe443b9d81f91fb"
-  integrity sha512-8Z23mQKyvJi+Xsl/1iO54Op5kOYXIzCtmUNOai3+K6FvTLJiSgmK8rYmIljD1Mv62WZ4AgL68QO7OcYYpDXo5Q==
-
-"@tsed/platform-express@^6.34.3":
-  version "6.34.3"
-  resolved "https://registry.yarnpkg.com/@tsed/platform-express/-/platform-express-6.34.3.tgz#1cad7ba7f88694b5c6c733e640bd19a0571c67f3"
-  integrity sha512-Bskbf2Cu0w8G2IplEmky6FBj9eD6dk5P0ItuPcx0rSn1pU1rrJF5cdOwHud+rdLwbGiIgYk9U94SID2+lqBFag==
+"@tsed/platform-express@^6.43.0":
+  version "6.43.0"
+  resolved "https://registry.yarnpkg.com/@tsed/platform-express/-/platform-express-6.43.0.tgz#b8a6abbde54c8ad47e4cb414e102c94990bb656b"
+  integrity sha512-FsBJfR3wT3qwON8TS5cTITGG/si2KiW+vYXUXCbcgsyRgTGi83K2rNlVcRsZPqCwIJ/pH1fEWjQfMpLYbTIpSQ==
   dependencies:
   dependencies:
     express "^4.17.1"
     express "^4.17.1"
     multer "^1.4.2"
     multer "^1.4.2"
 
 
-"@tsed/schema@6.34.3":
-  version "6.34.3"
-  resolved "https://registry.yarnpkg.com/@tsed/schema/-/schema-6.34.3.tgz#44b419302c124ee7ac68c4cb89ad28bbc8d1fb76"
-  integrity sha512-RYnsCxHj2hEqVjAMtmhouhbuzmLyqclwnb2zah8JAQFJ/0P5fvAIUaHNENIZ3Ch8WKomMWKiQKvYMA91yJjREQ==
+"@tsed/schema@6.43.0", "@tsed/schema@^6.43.0":
+  version "6.43.0"
+  resolved "https://registry.yarnpkg.com/@tsed/schema/-/schema-6.43.0.tgz#b4bb7b8d97eeeeeeb58f9f6d3bc6304792e09f82"
+  integrity sha512-fEP2ieYENPHLXba7ZT7Atys85A//g1f2LSvfWVVdyRPd+fZ/QKA61pDhFV/chWhNGrymqBRNczXcUVnq16l3dA==
   dependencies:
   dependencies:
-    "@tsed/core" "6.34.3"
-    "@tsed/openspec" "6.34.3"
+    "@tsed/core" "6.43.0"
+    "@tsed/openspec" "6.43.0"
     change-case "4.1.2"
     change-case "4.1.2"
     micromatch "4.0.2"
     micromatch "4.0.2"
     tslib "2.1.0"
     tslib "2.1.0"
 
 
-"@tsed/schema@6.40.0", "@tsed/schema@^6.34.3":
-  version "6.40.0"
-  resolved "https://registry.yarnpkg.com/@tsed/schema/-/schema-6.40.0.tgz#34af6d52daead4d1773d59b4f8c1a08e0c38b341"
-  integrity sha512-QfygeDCJFSE3xiwjN5nBl9RXWhsxM3dGi23kdoAecm+U+JUEn6NySccSSj8NcMh81/1FQKsLEkXa9iZ4ERIZZA==
+"@tsed/swagger@^6.43.0":
+  version "6.43.0"
+  resolved "https://registry.yarnpkg.com/@tsed/swagger/-/swagger-6.43.0.tgz#a91fa9d7bf654a07f8d15c2aecab70ea80828016"
+  integrity sha512-wuL5UdlYEpV9mj3smx9Sxq7MhAC5ra32Sc0GL3n+3M2JeWQi2eELNhcsZBDVioh49yfcsI3S1c1/tTHNZPvLdw==
   dependencies:
   dependencies:
-    "@tsed/core" "6.40.0"
-    "@tsed/openspec" "6.40.0"
-    change-case "4.1.2"
-    micromatch "4.0.2"
-    tslib "2.1.0"
-
-"@tsed/swagger@^6.34.3":
-  version "6.34.3"
-  resolved "https://registry.yarnpkg.com/@tsed/swagger/-/swagger-6.34.3.tgz#cb1414e50876c0c93bb206201182f01fad287170"
-  integrity sha512-tLkdZqoMiYR3SElyCHcm7Bzoyo6836XPsFIBUDPdhnAkv7uhX8l+MubWAE4lERqfvU+HceSf7obu1dmVxi2Kgg==
-  dependencies:
-    swagger-ui-dist "^3.31.1"
+    swagger-ui-dist "^3.46.0"
     tslib "2.1.0"
     tslib "2.1.0"
 
 
-"@tsed/typeorm@^6.34.3":
-  version "6.34.3"
-  resolved "https://registry.yarnpkg.com/@tsed/typeorm/-/typeorm-6.34.3.tgz#b79ac85397fa7e7fba6a913432be2f03b0fbcfe9"
-  integrity sha512-Lt4KjVQBbiz9GedI6dyBhTj6ZHk2F/sM3eAimadjMEC5lZqG2b1PRCuKG7Vmb4OoeK1U2ejj2ROlyYSLb0Qxcw==
+"@tsed/typeorm@^6.43.0":
+  version "6.43.0"
+  resolved "https://registry.yarnpkg.com/@tsed/typeorm/-/typeorm-6.43.0.tgz#f064d08d733fddf647e2db567235771b24409440"
+  integrity sha512-B2xU8fsKQYaAW+DNDoAOvawmqaqmKLia17p9AdTcc1aaxsJ51KTdpOxn9CkwcvWExMqyJNrJldELiaH5LuBqOw==
   dependencies:
   dependencies:
     tslib "2.1.0"
     tslib "2.1.0"
 
 
@@ -3098,9 +3056,9 @@
   integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
   integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
 
 
 "@types/jsonwebtoken@^8.3.7":
 "@types/jsonwebtoken@^8.3.7":
-  version "8.5.0"
-  resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz#2531d5e300803aa63279b232c014acf780c981c5"
-  integrity sha512-9bVao7LvyorRGZCw0VmH/dr7Og+NdjYSsKAxB43OQoComFbBgsEpoR9JW6+qSq/ogwVBg8GI2MfAlk4SYI4OLg==
+  version "8.5.1"
+  resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#56958cb2d80f6d74352bd2e501a018e2506a8a84"
+  integrity sha512-rNAPdomlIUX0i0cg2+I+Q1wOUr531zHBQ+cV/28PJ39bSPKjahatZZ2LMuhiguETkCgLVzfruw/ZvNMNkKoSzw==
   dependencies:
   dependencies:
     "@types/node" "*"
     "@types/node" "*"
 
 
@@ -3144,11 +3102,16 @@
   dependencies:
   dependencies:
     "@types/express" "*"
     "@types/express" "*"
 
 
-"@types/node@*", "@types/node@>=12", "@types/node@>=12.0.0", "@types/node@>=8.9.0", "@types/node@^14.14.35":
+"@types/node@*", "@types/node@>=12.0.0", "@types/node@>=8.9.0", "@types/node@^14.14.35":
   version "14.14.35"
   version "14.14.35"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.35.tgz#42c953a4e2b18ab931f72477e7012172f4ffa313"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.35.tgz#42c953a4e2b18ab931f72477e7012172f4ffa313"
   integrity sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag==
   integrity sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag==
 
 
+"@types/node@>=12":
+  version "14.14.37"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.37.tgz#a3dd8da4eb84a996c36e331df98d82abd76b516e"
+  integrity sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==
+
 "@types/node@>=12.13.0 < 13":
 "@types/node@>=12.13.0 < 13":
   version "12.20.7"
   version "12.20.7"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.7.tgz#1cb61fd0c85cb87e728c43107b5fd82b69bc9ef8"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.7.tgz#1cb61fd0c85cb87e728c43107b5fd82b69bc9ef8"
@@ -3311,6 +3274,11 @@
   dependencies:
   dependencies:
     "@types/yargs-parser" "*"
     "@types/yargs-parser" "*"
 
 
+"@types/zen-observable@^0.8.2":
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.2.tgz#808c9fa7e4517274ed555fa158f2de4b4f468e71"
+  integrity sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg==
+
 "@typescript-eslint/eslint-plugin@^4.18.0":
 "@typescript-eslint/eslint-plugin@^4.18.0":
   version "4.21.0"
   version "4.21.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.21.0.tgz#3fce2bfa76d95c00ac4f33dff369cb593aab8878"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.21.0.tgz#3fce2bfa76d95c00ac4f33dff369cb593aab8878"
@@ -3946,6 +3914,11 @@ argparse@^1.0.7:
   dependencies:
   dependencies:
     sprintf-js "~1.0.2"
     sprintf-js "~1.0.2"
 
 
+argparse@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+  integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
 arr-diff@^2.0.0:
 arr-diff@^2.0.0:
   version "2.0.0"
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
   resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
@@ -4923,13 +4896,13 @@ buffer@^5.1.0:
     base64-js "^1.0.2"
     base64-js "^1.0.2"
     ieee754 "^1.1.4"
     ieee754 "^1.1.4"
 
 
-buffer@^5.5.0:
-  version "5.7.1"
-  resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
-  integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+buffer@^6.0.3:
+  version "6.0.3"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
+  integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
   dependencies:
   dependencies:
     base64-js "^1.3.1"
     base64-js "^1.3.1"
-    ieee754 "^1.1.13"
+    ieee754 "^1.2.1"
 
 
 buffers@~0.1.1:
 buffers@~0.1.1:
   version "0.1.1"
   version "0.1.1"
@@ -5054,9 +5027,9 @@ cache-base@^1.0.1:
     unset-value "^1.0.0"
     unset-value "^1.0.0"
 
 
 cache-manager@^3.4.1:
 cache-manager@^3.4.1:
-  version "3.4.1"
-  resolved "https://registry.yarnpkg.com/cache-manager/-/cache-manager-3.4.1.tgz#57d366efc4b06fe2b1246d84356df7bc5e24674d"
-  integrity sha512-yE50UL7AcuQ1ZydREl9OvPYD74gw3qS9HtZTY+2gS7fcZeIsyiof2UF+WReqg5ZX+852anbDe1fAtjsaMYT2yw==
+  version "3.4.3"
+  resolved "https://registry.yarnpkg.com/cache-manager/-/cache-manager-3.4.3.tgz#c978d58f82b414ade08903d4d72b56a80a4978be"
+  integrity sha512-6+Hfzy1SNs/thUwo+07pV0ozgxc4sadrAN0eFVGvXl/X9nz3J0BqEnnEoyxEn8jnF+UkEo0MKpyk9BO80hMeiQ==
   dependencies:
   dependencies:
     async "3.2.0"
     async "3.2.0"
     lodash "^4.17.21"
     lodash "^4.17.21"
@@ -5463,12 +5436,12 @@ cli-cursor@^3.1.0:
     restore-cursor "^3.1.0"
     restore-cursor "^3.1.0"
 
 
 cli-highlight@^2.1.10:
 cli-highlight@^2.1.10:
-  version "2.1.10"
-  resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.10.tgz#26a087da9209dce4fcb8cf5427dc97cd96ac173a"
-  integrity sha512-CcPFD3JwdQ2oSzy+AMG6j3LRTkNjM82kzcSKzoVw6cLanDCJNlsLjeqVTOTfOfucnWv5F0rmBemVf1m9JiIasw==
+  version "2.1.11"
+  resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf"
+  integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==
   dependencies:
   dependencies:
     chalk "^4.0.0"
     chalk "^4.0.0"
-    highlight.js "^10.0.0"
+    highlight.js "^10.7.1"
     mz "^2.4.0"
     mz "^2.4.0"
     parse5 "^5.1.1"
     parse5 "^5.1.1"
     parse5-htmlparser2-tree-adapter "^6.0.0"
     parse5-htmlparser2-tree-adapter "^6.0.0"
@@ -6664,7 +6637,7 @@ debug@3.1.0, debug@~3.1.0:
   dependencies:
   dependencies:
     ms "2.0.0"
     ms "2.0.0"
 
 
-debug@4:
+debug@4, debug@^4.3.1:
   version "4.3.1"
   version "4.3.1"
   resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
   resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
   integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
   integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
@@ -9400,12 +9373,7 @@ has-symbols@^1.0.0:
   version "1.0.0"
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
   resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
 
 
-has-symbols@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
-  integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
-
-has-symbols@^1.0.2:
+has-symbols@^1.0.1, has-symbols@^1.0.2:
   version "1.0.2"
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
   resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
   integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
   integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
@@ -9549,10 +9517,10 @@ highlight.js@9.18.1:
   resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.1.tgz#ed21aa001fe6252bb10a3d76d47573c6539fe13c"
   resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.1.tgz#ed21aa001fe6252bb10a3d76d47573c6539fe13c"
   integrity sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg==
   integrity sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg==
 
 
-highlight.js@^10.0.0:
-  version "10.7.1"
-  resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.1.tgz#a8ec4152db24ea630c90927d6cae2a45f8ecb955"
-  integrity sha512-S6G97tHGqJ/U8DsXcEdnACbirtbx58Bx9CzIVeYli8OuswCfYI/LsXH2EiGcoGio1KAC3x4mmUwulOllJ2ZyRA==
+highlight.js@^10.7.1:
+  version "10.7.2"
+  resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.2.tgz#89319b861edc66c48854ed1e6da21ea89f847360"
+  integrity sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg==
 
 
 hmac-drbg@^1.0.0:
 hmac-drbg@^1.0.0:
   version "1.0.1"
   version "1.0.1"
@@ -9843,15 +9811,15 @@ icss-utils@^4.0.0, icss-utils@^4.1.1:
   dependencies:
   dependencies:
     postcss "^7.0.14"
     postcss "^7.0.14"
 
 
-ieee754@^1.1.13:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
-  integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
-
 ieee754@^1.1.4:
 ieee754@^1.1.4:
   version "1.1.8"
   version "1.1.8"
   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
 
 
+ieee754@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+  integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
 ienoopen@1.0.0:
 ienoopen@1.0.0:
   version "1.0.0"
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/ienoopen/-/ienoopen-1.0.0.tgz#346a428f474aac8f50cf3784ea2d0f16f62bda6b"
   resolved "https://registry.yarnpkg.com/ienoopen/-/ienoopen-1.0.0.tgz#346a428f474aac8f50cf3784ea2d0f16f62bda6b"
@@ -11174,13 +11142,12 @@ js-yaml@^3.11.0:
     argparse "^1.0.7"
     argparse "^1.0.7"
     esprima "^4.0.0"
     esprima "^4.0.0"
 
 
-js-yaml@^3.14.0:
-  version "3.14.1"
-  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
-  integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+js-yaml@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f"
+  integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==
   dependencies:
   dependencies:
-    argparse "^1.0.7"
-    esprima "^4.0.0"
+    argparse "^2.0.1"
 
 
 js-yaml@~3.10.0:
 js-yaml@~3.10.0:
   version "3.10.0"
   version "3.10.0"
@@ -12431,9 +12398,9 @@ mime-db@1.45.0:
   integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==
   integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==
 
 
 "mime-db@>= 1.43.0 < 2":
 "mime-db@>= 1.43.0 < 2":
-  version "1.46.0"
-  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee"
-  integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==
+  version "1.47.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c"
+  integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==
 
 
 mime-db@~1.30.0:
 mime-db@~1.30.0:
   version "1.30.0"
   version "1.30.0"
@@ -18298,10 +18265,10 @@ swagger-parser@8.0.0:
     swagger-methods "^2.0.0"
     swagger-methods "^2.0.0"
     z-schema "^4.1.0"
     z-schema "^4.1.0"
 
 
-swagger-ui-dist@^3.31.1:
-  version "3.45.1"
-  resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-3.45.1.tgz#3c0b718cb5e944056500d92a45a04d2072073582"
-  integrity sha512-QWotWWYkgSdPtI6HW12q4Ua5zxIhhvnYvx9iZKtDbZuVvJSTnMIzaHrE6KJVe/8plWh7Wpd/qqeBfpOxF8g1/g==
+swagger-ui-dist@^3.46.0:
+  version "3.46.0"
+  resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-3.46.0.tgz#f08d2c9b4a2dce922ba363c598e4795b5ccf0b80"
+  integrity sha512-ueaZ45OHhHvGKmocvCkxFY8VCfbP5PgcxutoQxy9j8/VZeDoLDvg8FBf4SO6NxHhieNAdYPUd0O6G9FjJO2fqw==
 
 
 swagger2openapi@^5.3.1:
 swagger2openapi@^5.3.1:
   version "5.3.1"
   version "5.3.1"
@@ -18872,21 +18839,26 @@ tslib@2.1.0:
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a"
   integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==
   integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==
 
 
-tslib@^1.13.0, tslib@^1.9.0:
-  version "1.14.1"
-  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
-  integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
-
 tslib@^1.8.1:
 tslib@^1.8.1:
   version "1.10.0"
   version "1.10.0"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
   integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
   integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
 
 
+tslib@^1.9.0:
+  version "1.14.1"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+  integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
 tslib@^1.9.3:
 tslib@^1.9.3:
   version "1.11.1"
   version "1.11.1"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35"
   integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==
   integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==
 
 
+tslib@^2.1.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c"
+  integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==
+
 tsscmp@1.0.6, tsscmp@^1.0.6:
 tsscmp@1.0.6, tsscmp@^1.0.6:
   version "1.0.6"
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb"
   resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb"
@@ -18983,26 +18955,27 @@ typedarray@^0.0.6:
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
 
 
 typeorm@^0.2.31:
 typeorm@^0.2.31:
-  version "0.2.31"
-  resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.31.tgz#82b8a1b233224f81c738f53b0380386ccf360917"
-  integrity sha512-dVvCEVHH48DG0QPXAKfo0l6ecQrl3A8ucGP4Yw4myz4YEDMProebTQo8as83uyES+nrwCbu3qdkL4ncC2+qcMA==
+  version "0.2.32"
+  resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.32.tgz#544dbfdfe0cd0887548d9bcbd28527ea4f4b3c9b"
+  integrity sha512-LOBZKZ9As3f8KRMPCUT2H0JZbZfWfkcUnO3w/1BFAbL/X9+cADTF6bczDGGaKVENJ3P8SaKheKmBgpt5h1x+EQ==
   dependencies:
   dependencies:
-    "@sqltools/formatter" "1.2.2"
+    "@sqltools/formatter" "^1.2.2"
     app-root-path "^3.0.0"
     app-root-path "^3.0.0"
-    buffer "^5.5.0"
+    buffer "^6.0.3"
     chalk "^4.1.0"
     chalk "^4.1.0"
     cli-highlight "^2.1.10"
     cli-highlight "^2.1.10"
-    debug "^4.1.1"
+    debug "^4.3.1"
     dotenv "^8.2.0"
     dotenv "^8.2.0"
     glob "^7.1.6"
     glob "^7.1.6"
-    js-yaml "^3.14.0"
+    js-yaml "^4.0.0"
     mkdirp "^1.0.4"
     mkdirp "^1.0.4"
     reflect-metadata "^0.1.13"
     reflect-metadata "^0.1.13"
     sha.js "^2.4.11"
     sha.js "^2.4.11"
-    tslib "^1.13.0"
+    tslib "^2.1.0"
     xml2js "^0.4.23"
     xml2js "^0.4.23"
-    yargonaut "^1.1.2"
-    yargs "^16.0.3"
+    yargonaut "^1.1.4"
+    yargs "^16.2.0"
+    zen-observable-ts "^1.0.0"
 
 
 typescript@^4.2.3:
 typescript@^4.2.3:
   version "4.2.4"
   version "4.2.4"
@@ -20146,9 +20119,9 @@ y18n@^3.2.1:
   resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
   resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
 
 
 y18n@^5.0.5:
 y18n@^5.0.5:
-  version "5.0.5"
-  resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18"
-  integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==
+  version "5.0.8"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+  integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
 
 
 yallist@^2.1.2:
 yallist@^2.1.2:
   version "2.1.2"
   version "2.1.2"
@@ -20188,7 +20161,7 @@ yaml@^1.7.2:
   dependencies:
   dependencies:
     "@babel/runtime" "^7.6.3"
     "@babel/runtime" "^7.6.3"
 
 
-yargonaut@^1.1.2:
+yargonaut@^1.1.4:
   version "1.1.4"
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/yargonaut/-/yargonaut-1.1.4.tgz#c64f56432c7465271221f53f5cc517890c3d6e0c"
   resolved "https://registry.yarnpkg.com/yargonaut/-/yargonaut-1.1.4.tgz#c64f56432c7465271221f53f5cc517890c3d6e0c"
   integrity sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==
   integrity sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==
@@ -20374,7 +20347,7 @@ yargs@^15.3.1:
     y18n "^4.0.0"
     y18n "^4.0.0"
     yargs-parser "^18.1.2"
     yargs-parser "^18.1.2"
 
 
-yargs@^16.0.0, yargs@^16.0.3, yargs@^16.2.0:
+yargs@^16.0.0, yargs@^16.2.0:
   version "16.2.0"
   version "16.2.0"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
   integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
   integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
@@ -20423,6 +20396,19 @@ z-schema@^4.1.0:
   optionalDependencies:
   optionalDependencies:
     commander "^2.7.1"
     commander "^2.7.1"
 
 
+zen-observable-ts@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.0.0.tgz#30d1202b81d8ba4c489e3781e8ca09abf0075e70"
+  integrity sha512-KmWcbz+9kKUeAQ8btY8m1SsEFgBcp7h/Uf3V5quhan7ZWdjGsf0JcGLULQiwOZibbFWnHkYq8Nn2AZbJabovQg==
+  dependencies:
+    "@types/zen-observable" "^0.8.2"
+    zen-observable "^0.8.15"
+
+zen-observable@^0.8.15:
+  version "0.8.15"
+  resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15"
+  integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==
+
 zip-stream@^2.1.2:
 zip-stream@^2.1.2:
   version "2.1.2"
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-2.1.2.tgz#841efd23214b602ff49c497cba1a85d8b5fbc39c"
   resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-2.1.2.tgz#841efd23214b602ff49c497cba1a85d8b5fbc39c"