瀏覽代碼

feat: extensions check + resolver

NGPixel 5 年之前
父節點
當前提交
e1382771cf

+ 60 - 115
client/components/admin/admin-extensions.vue

@@ -17,7 +17,7 @@
                   v-expansion-panel-header(disable-icon-rotate)
                     span {{ext.title}}
                     template(v-slot:actions)
-                      v-chip(label, color='success', small, v-if='ext.installed') Installed
+                      v-chip(label, color='success', small, v-if='ext.isInstalled') Installed
                       v-chip(label, color='warning', small, v-else) Not Installed
                   v-expansion-panel-content.pa-0
                     v-card(flat, :class='$vuetify.theme.dark ? `grey darken-3` : `grey lighten-5`', tile)
@@ -25,18 +25,15 @@
                         .body-2 {{ext.description}}
                         v-divider.my-4
                         .body-2
-                          strong.mr-3 Supported Platforms:
-                          v-chip.mr-1(label, small, :color='ext.platforms[`linux-amd64`] ? `success` : `error`') Linux (x64)
-                          v-chip.mr-1(label, small, :color='ext.platforms[`linux-arm64`] ? `success` : `error`') Linux (arm64)
-                          v-chip.mr-1(label, small, :color='ext.platforms[`linux-armv7`] ? `success` : `error`') Linux (armv7)
-                          v-chip.mr-1(label, small, :color='ext.platforms.macos ? `success` : `error`') MacOS
-                          v-chip.mr-1(label, small, :color='ext.platforms.windows ? `success` : `error`') Windows
+                          strong.mr-2 This extensions is
+                          v-chip.mr-2(v-if='ext.isCompatible', label, outlined, small, color='success') compatible
+                          v-chip.mr-2(v-else, label, small, color='error') not compatible
+                          strong with your host.
                       v-card-chin
                         v-spacer
                         v-btn(disabled)
                           v-icon(left) mdi-plus
                           span Install
-
 </template>
 
 <script>
@@ -46,122 +43,70 @@ import gql from 'graphql-tag'
 export default {
   data() {
     return {
-      config: {},
-      extensions: [
-        {
-          key: 'git',
-          title: 'Git',
-          description: 'Distributed version control system. Required for the Git storage module.',
-          platforms: {
-            'linux-amd64': true,
-            'linux-arm64': true,
-            'linux-armv7': true,
-            'macos': true,
-            'windows': true
-          },
-          installed: true
-        },
-        {
-          key: 'pandoc',
-          title: 'Pandoc',
-          description: 'Convert between markup formats. Required for converting from other formats such as MediaWiki, AsciiDoc, Textile and other wikis.',
-          platforms: {
-            'linux-amd64': true,
-            'linux-arm64': false,
-            'linux-armv7': false,
-            'macos': true,
-            'windows': true
-          },
-          installed: false
-        },
-        {
-          key: 'puppeteer',
-          title: 'Puppeteer',
-          description: 'Headless chromium browser for server-side rendering. Required for generating PDF versions of pages and render content elements on the server (e.g. Mermaid diagrams)',
-          platforms: {
-            'linux-amd64': true,
-            'linux-arm64': false,
-            'linux-armv7': false,
-            'macos': true,
-            'windows': true
-          },
-          installed: false
-        },
-        {
-          key: 'sharp',
-          title: 'Sharp',
-          description: 'Process and transform images. Required to generate thumbnails of uploaded images and perform transformations.',
-          platforms: {
-            'linux-amd64': true,
-            'linux-arm64': false,
-            'linux-armv7': false,
-            'macos': true,
-            'windows': true
-          },
-          installed: false
-        }
-      ]
+      extensions: []
     }
   },
-  computed: {
-  },
   methods: {
     async save () {
-      try {
-        await this.$apollo.mutate({
-          mutation: gql`
-            mutation (
-              $host: String!
-            ) {
-              site {
-                updateConfig(
-                  host: $host
-                ) {
-                  responseResult {
-                    succeeded
-                    errorCode
-                    slug
-                    message
-                  }
-                }
-              }
+      // try {
+      //   await this.$apollo.mutate({
+      //     mutation: gql`
+      //       mutation (
+      //         $host: String!
+      //       ) {
+      //         site {
+      //           updateConfig(
+      //             host: $host
+      //           ) {
+      //             responseResult {
+      //               succeeded
+      //               errorCode
+      //               slug
+      //               message
+      //             }
+      //           }
+      //         }
+      //       }
+      //     `,
+      //     variables: {
+      //       host: _.get(this.config, 'host', '')
+      //     },
+      //     watchLoading (isLoading) {
+      //       this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-extensions-update')
+      //     }
+      //   })
+      //   this.$store.commit('showNotification', {
+      //     style: 'success',
+      //     message: 'Configuration saved successfully.',
+      //     icon: 'check'
+      //   })
+      // } catch (err) {
+      //   this.$store.commit('pushGraphError', err)
+      // }
+    }
+  },
+  apollo: {
+    extensions: {
+      query: gql`
+        {
+          system {
+            extensions {
+              key
+              title
+              description
+              isInstalled
+              isCompatible
             }
-          `,
-          variables: {
-            host: _.get(this.config, 'host', '')
-          },
-          watchLoading (isLoading) {
-            this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-site-update')
           }
-        })
-        this.$store.commit('showNotification', {
-          style: 'success',
-          message: 'Configuration saved successfully.',
-          icon: 'check'
-        })
-      } catch (err) {
-        this.$store.commit('pushGraphError', err)
+        }
+      `,
+      fetchPolicy: 'network-only',
+      update: (data) => _.cloneDeep(data.system.extensions),
+      watchLoading (isLoading) {
+        this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-extensions-refresh')
       }
     }
   }
-  // apollo: {
-  //   config: {
-  //     query: gql`
-  //       {
-  //         site {
-  //           config {
-  //             host
-  //           }
-  //         }
-  //       }
-  //     `,
-  //     fetchPolicy: 'network-only',
-  //     update: (data) => _.cloneDeep(data.site.config),
-  //     watchLoading (isLoading) {
-  //       this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-site-refresh')
-  //     }
-  //   }
-  // }
 }
 </script>
 

+ 2 - 1
client/store/page.js

@@ -19,7 +19,8 @@ const state = {
     view: false,
     post: false,
     manage: false
-  }
+  },
+  commentsCount: 0
 }
 
 export default {

+ 3 - 2
client/themes/default/components/page.vue

@@ -103,10 +103,10 @@
                     dark
                     style='min-width: 50px; justify-content: center;'
                     )
-                    span 334
+                    span {{commentsCount}}
                 .d-flex
                   v-btn.text-none(
-                    @click='goToComments'
+                    @click='goToComments()'
                     :color='$vuetify.theme.dark ? `pink` : `pink darken-3`'
                     outlined
                     style='flex: 1 1 100%;'
@@ -441,6 +441,7 @@ export default {
   },
   computed: {
     isAuthenticated: get('user/authenticated'),
+    commentsCount: get('page/commentsCount'),
     rating: {
       get () {
         return 3.5

+ 1 - 1
package.json

@@ -57,6 +57,7 @@
     "cheerio": "1.0.0-rc.3",
     "chokidar": "3.4.0",
     "clean-css": "4.2.3",
+    "command-exists": "1.2.9",
     "compression": "1.7.4",
     "connect-session-knex": "1.6.0",
     "cookie-parser": "1.4.5",
@@ -162,7 +163,6 @@
     "scim-query-filter-parser": "2.0.4",
     "semver": "7.3.2",
     "serve-favicon": "2.5.0",
-    "sharp": "0.25.2",
     "simple-git": "2.4.0",
     "solr-node": "1.2.1",
     "sqlite3": "4.2.0",

+ 21 - 0
server/core/extensions.js

@@ -0,0 +1,21 @@
+const fs = require('fs-extra')
+const path = require('path')
+
+/* global WIKI */
+
+module.exports = {
+  ext: {},
+  async init () {
+    const extDirs = await fs.readdir(path.join(WIKI.SERVERPATH, 'modules/extensions'))
+    WIKI.logger.info(`Checking for installed optional extensions...`)
+    for (let dir of extDirs) {
+      WIKI.extensions.ext[dir] = require(path.join(WIKI.SERVERPATH, 'modules/extensions', dir, 'ext.js'))
+      const isInstalled = await WIKI.extensions.ext[dir].check()
+      if (isInstalled) {
+        WIKI.logger.info(`Optional extension ${dir} is installed. [ OK ]`)
+      } else {
+        WIKI.logger.info(`Optional extension ${dir} was not found on this system. [ SKIPPED ]`)
+      }
+    }
+  }
+}

+ 3 - 0
server/core/kernel.js

@@ -40,6 +40,7 @@ module.exports = {
         inbound: new EventEmitter(),
         outbound: new EventEmitter()
       }
+      WIKI.extensions = require('./extensions')
     } catch (err) {
       WIKI.logger.error(err)
       process.exit(1)
@@ -76,6 +77,8 @@ module.exports = {
     await WIKI.models.searchEngines.refreshSearchEnginesFromDisk()
     await WIKI.models.storage.refreshTargetsFromDisk()
 
+    await WIKI.extensions.init()
+
     await WIKI.auth.activateStrategies()
     await WIKI.models.commentProviders.initProvider()
     await WIKI.models.searchEngines.initEngine()

+ 8 - 1
server/graph/resolvers/system.js

@@ -34,7 +34,14 @@ module.exports = {
         result.push({ key, value })
       }, [])
     },
-    async info() { return {} }
+    async info () { return {} },
+    async extensions () {
+      const exts = Object.values(WIKI.extensions.ext).map(ext => _.pick(ext, ['key', 'title', 'description', 'isInstalled']))
+      for (let ext of exts) {
+        ext.isCompatible = await WIKI.extensions.ext[ext.key].isCompatible()
+      }
+      return exts
+    }
   },
   SystemMutation: {
     async updateFlags (obj, args, context) {

+ 9 - 0
server/graph/schemas/system.graphql

@@ -17,6 +17,7 @@ extend type Mutation {
 type SystemQuery {
   flags: [SystemFlag] @auth(requires: ["manage:system"])
   info: SystemInfo
+  extensions: [SystemExtension]! @auth(requires: ["manage:system"])
 }
 
 # -----------------------------------------------
@@ -112,3 +113,11 @@ type SystemImportUsersResponseFailed {
   email: String
   error: String
 }
+
+type SystemExtension {
+  key: String!
+  title: String!
+  description: String!
+  isInstalled: Boolean!
+  isCompatible: Boolean!
+}

+ 2 - 2
server/models/commentProviders.js

@@ -45,9 +45,9 @@ module.exports = class CommentProvider extends Model {
       const dbProviders = await WIKI.models.commentProviders.query()
 
       // -> Fetch definitions from disk
-      const authDirs = await fs.readdir(path.join(WIKI.SERVERPATH, 'modules/comments'))
+      const commentDirs = await fs.readdir(path.join(WIKI.SERVERPATH, 'modules/comments'))
       let diskProviders = []
-      for (let dir of authDirs) {
+      for (let dir of commentDirs) {
         const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/comments', dir, 'definition.yml'), 'utf8')
         diskProviders.push(yaml.safeLoad(def))
       }

+ 20 - 0
server/modules/extensions/git/ext.js

@@ -0,0 +1,20 @@
+const cmdExists = require('command-exists')
+
+module.exports = {
+  key: 'git',
+  title: 'Git',
+  description: 'Distributed version control system. Required for the Git storage module.',
+  isInstalled: false,
+  async isCompatible () {
+    return true
+  },
+  async check () {
+    try {
+      await cmdExists('git')
+      this.isInstalled = true
+    } catch (err) {
+      this.isInstalled = false
+    }
+    return this.isInstalled
+  }
+}

+ 21 - 0
server/modules/extensions/pandoc/ext.js

@@ -0,0 +1,21 @@
+const cmdExists = require('command-exists')
+const os = require('os')
+
+module.exports = {
+  key: 'pandoc',
+  title: 'Pandoc',
+  description: 'Convert between markup formats. Required for converting from other formats such as MediaWiki, AsciiDoc, Textile and other wikis.',
+  async isCompatible () {
+    return os.arch() === 'x64'
+  },
+  isInstalled: false,
+  async check () {
+    try {
+      await cmdExists('pandoc')
+      this.isInstalled = true
+    } catch (err) {
+      this.isInstalled = false
+    }
+    return this.isInstalled
+  }
+}

+ 21 - 0
server/modules/extensions/puppeteer/ext.js

@@ -0,0 +1,21 @@
+const cmdExists = require('command-exists')
+const os = require('os')
+
+module.exports = {
+  key: 'puppeteer',
+  title: 'Puppeteer',
+  description: 'Headless chromium browser for server-side rendering. Required for generating PDF versions of pages and render content elements on the server (e.g. Mermaid diagrams)',
+  async isCompatible () {
+    return os.arch() === 'x64'
+  },
+  isInstalled: false,
+  async check () {
+    try {
+      await cmdExists('pandoc')
+      this.isInstalled = true
+    } catch (err) {
+      this.isInstalled = false
+    }
+    return this.isInstalled
+  }
+}

+ 19 - 0
server/modules/extensions/sharp/ext.js

@@ -0,0 +1,19 @@
+const fs = require('fs-extra')
+const os = require('os')
+const path = require('path')
+
+/* global WIKI */
+
+module.exports = {
+  key: 'sharp',
+  title: 'Sharp',
+  description: 'Process and transform images. Required to generate thumbnails of uploaded images and perform transformations.',
+  async isCompatible () {
+    return os.arch() === 'x64'
+  },
+  isInstalled: false,
+  async check () {
+    this.isInstalled = await fs.pathExists(path.join(WIKI.ROOTPATH, 'node_modules/sharp'))
+    return this.isInstalled
+  }
+}

+ 10 - 136
yarn.lock

@@ -4874,11 +4874,6 @@ chownr@^1.1.1:
   resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6"
   integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==
 
-chownr@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
-  integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
-
 chrome-trace-event@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
@@ -5151,7 +5146,7 @@ color@^2.0.1:
     color-convert "^1.9.1"
     color-string "^1.5.2"
 
-color@^3.0.0, color@^3.1.2:
+color@^3.0.0:
   version "3.1.2"
   resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10"
   integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==
@@ -5189,6 +5184,11 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
   dependencies:
     delayed-stream "~1.0.0"
 
+command-exists@1.2.9:
+  version "1.2.9"
+  resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69"
+  integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==
+
 commander@2:
   version "2.20.3"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
@@ -7193,11 +7193,6 @@ expand-brackets@^2.1.4:
     snapdragon "^0.8.1"
     to-regex "^3.0.1"
 
-expand-template@^2.0.3:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
-  integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
-
 expand-tilde@^2.0.0, expand-tilde@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
@@ -7704,13 +7699,6 @@ fs-minipass@^1.2.5:
   dependencies:
     minipass "^2.2.1"
 
-fs-minipass@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
-  integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
-  dependencies:
-    minipass "^3.0.0"
-
 fs-readdir-recursive@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27"
@@ -7833,11 +7821,6 @@ getpass@^0.1.1:
   dependencies:
     assert-plus "^1.0.0"
 
-github-from-package@0.0.0:
-  version "0.0.0"
-  resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
-  integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=
-
 glob-parent@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
@@ -10581,13 +10564,6 @@ minipass@^2.2.1, minipass@^2.3.5:
     safe-buffer "^5.1.2"
     yallist "^3.0.0"
 
-minipass@^3.0.0:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5"
-  integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==
-  dependencies:
-    yallist "^4.0.0"
-
 minizlib@^1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614"
@@ -10595,14 +10571,6 @@ minizlib@^1.2.1:
   dependencies:
     minipass "^2.2.1"
 
-minizlib@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.0.tgz#fd52c645301ef09a63a2c209697c294c6ce02cf3"
-  integrity sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==
-  dependencies:
-    minipass "^3.0.0"
-    yallist "^4.0.0"
-
 mississippi@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
@@ -10651,7 +10619,7 @@ mkdirp@^0.5.3:
   dependencies:
     minimist "^1.2.5"
 
-mkdirp@^1.0.3, mkdirp@^1.0.4, mkdirp@~1.0.3:
+mkdirp@^1.0.4, mkdirp@~1.0.3:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
   integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
@@ -10817,11 +10785,6 @@ nanomatch@^1.2.9:
     snapdragon "^0.8.1"
     to-regex "^3.0.1"
 
-napi-build-utils@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806"
-  integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==
-
 native-duplexpair@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/native-duplexpair/-/native-duplexpair-1.0.0.tgz#7899078e64bf3c8a3d732601b3d40ff05db58fa0"
@@ -10897,18 +10860,6 @@ node-2fa@1.1.2:
     notp "^2.0.3"
     thirty-two "0.0.2"
 
-node-abi@^2.7.0:
-  version "2.16.0"
-  resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.16.0.tgz#7df94e9c0a7a189f4197ab84bac8089ef5894992"
-  integrity sha512-+sa0XNlWDA6T+bDLmkCUYn6W5k5W6BPRL6mqzSCs6H/xUgtl4D5x2fORKDzopKiU6wsyn/+wXlRXwXeSp+mtoA==
-  dependencies:
-    semver "^5.4.1"
-
-node-addon-api@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.0.tgz#f9afb8d777a91525244b01775ea0ddbe1125483b"
-  integrity sha512-ASCL5U13as7HhOExbT6OlWJJUV/lLzL2voOSP1UVehpRD8FbSrSDjfScK/KwAvVTI5AS6r4VwbOMlIqtvRidnA==
-
 node-cache@5.1.0:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/node-cache/-/node-cache-5.1.0.tgz#266786c28dcec0fd34385ee29c383e6d6f1aa5de"
@@ -11060,11 +11011,6 @@ nodemailer@6.4.6:
   resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.4.6.tgz#d37f504f6560b36616f646a606894fe18819107f"
   integrity sha512-/kJ+FYVEm2HuUlw87hjSqTss+GU35D4giOpdSfGp7DO+5h6RlJj7R94YaYHOkoxu1CSaM0d3WRBtCzwXrY6MKA==
 
-noop-logger@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2"
-  integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=
-
 nopt@1.0.10:
   version "1.0.10"
   resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
@@ -11162,7 +11108,7 @@ npm-run-path@^4.0.0:
   dependencies:
     path-key "^3.0.0"
 
-npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2:
+npmlog@^4.0.2:
   version "4.1.2"
   resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
   integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
@@ -13207,27 +13153,6 @@ postgres-interval@^1.1.0:
   dependencies:
     xtend "^4.0.0"
 
-prebuild-install@^5.3.3:
-  version "5.3.3"
-  resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.3.tgz#ef4052baac60d465f5ba6bf003c9c1de79b9da8e"
-  integrity sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==
-  dependencies:
-    detect-libc "^1.0.3"
-    expand-template "^2.0.3"
-    github-from-package "0.0.0"
-    minimist "^1.2.0"
-    mkdirp "^0.5.1"
-    napi-build-utils "^1.0.1"
-    node-abi "^2.7.0"
-    noop-logger "^0.1.1"
-    npmlog "^4.0.1"
-    pump "^3.0.0"
-    rc "^1.2.7"
-    simple-get "^3.0.3"
-    tar-fs "^2.0.0"
-    tunnel-agent "^0.6.0"
-    which-pm-runs "^1.0.0"
-
 precond@0.2:
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac"
@@ -14553,7 +14478,7 @@ semver@7.0.0:
   resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
   integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
 
-semver@7.3.2, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2:
+semver@7.3.2, semver@^7.2.1, semver@^7.3.2:
   version "7.3.2"
   resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
   integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
@@ -14658,21 +14583,6 @@ shallow-clone@^3.0.0:
   dependencies:
     kind-of "^6.0.2"
 
-sharp@0.25.2:
-  version "0.25.2"
-  resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.25.2.tgz#f9003d73be50e9265e98f79f04fe53d8c66a3967"
-  integrity sha512-l1GN0kFNtJr3U9i9pt7a+vo2Ij0xv4tTKDIPx8W6G9WELhPwrMyZZJKAAQNBSI785XB4uZfS5Wpz8C9jWV4AFQ==
-  dependencies:
-    color "^3.1.2"
-    detect-libc "^1.0.3"
-    node-addon-api "^2.0.0"
-    npmlog "^4.1.2"
-    prebuild-install "^5.3.3"
-    semver "^7.1.3"
-    simple-get "^3.1.0"
-    tar "^6.0.1"
-    tunnel-agent "^0.6.0"
-
 shebang-command@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
@@ -14717,20 +14627,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
   integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
 
-simple-concat@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6"
-  integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=
-
-simple-get@^3.0.3, simple-get@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3"
-  integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==
-  dependencies:
-    decompress-response "^4.2.0"
-    once "^1.3.1"
-    simple-concat "^1.0.0"
-
 simple-git@2.4.0:
   version "2.4.0"
   resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-2.4.0.tgz#b7fe438ed9b818dd6f5f3ec240f2611a499d60d4"
@@ -15397,7 +15293,7 @@ tapable@^1.0.0, tapable@^1.1.3:
   resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
   integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
 
-tar-fs@2.1.0, tar-fs@^2.0.0:
+tar-fs@2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.0.tgz#d1cdd121ab465ee0eb9ccde2d35049d3f3daf0d5"
   integrity sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==
@@ -15431,18 +15327,6 @@ tar@^4:
     safe-buffer "^5.1.2"
     yallist "^3.0.3"
 
-tar@^6.0.1:
-  version "6.0.2"
-  resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.2.tgz#5df17813468a6264ff14f766886c622b84ae2f39"
-  integrity sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==
-  dependencies:
-    chownr "^2.0.0"
-    fs-minipass "^2.0.0"
-    minipass "^3.0.0"
-    minizlib "^2.1.0"
-    mkdirp "^1.0.3"
-    yallist "^4.0.0"
-
 tarn@^1.1.5:
   version "1.1.5"
   resolved "https://registry.yarnpkg.com/tarn/-/tarn-1.1.5.tgz#7be88622e951738b9fa3fb77477309242cdddc2d"
@@ -16630,11 +16514,6 @@ which-module@^2.0.0:
   resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
   integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
 
-which-pm-runs@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb"
-  integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=
-
 which@^1.2.14, which@^1.2.9, which@^1.3.1:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
@@ -16948,11 +16827,6 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
   resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
   integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==
 
-yallist@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
-  integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
-
 yargs-parser@^13.1.0:
   version "13.1.1"
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0"