feat: docker auto upgrade
This commit is contained in:
		@@ -27,6 +27,16 @@
 | 
				
			|||||||
                    v-list-item-subtitle {{ info.latestVersion }}
 | 
					                    v-list-item-subtitle {{ info.latestVersion }}
 | 
				
			||||||
                  v-list-item-action
 | 
					                  v-list-item-action
 | 
				
			||||||
                    v-list-item-action-text {{ $t('admin:system.published') }} {{ info.latestVersionReleaseDate | moment('from') }}
 | 
					                    v-list-item-action-text {{ $t('admin:system.published') }} {{ info.latestVersionReleaseDate | moment('from') }}
 | 
				
			||||||
 | 
					              v-card-actions(v-if='upgradeCapable && !isLatestVersion && info.platform === `docker`', :class='$vuetify.theme.dark ? `grey darken-3-d5` : `indigo lighten-5`')
 | 
				
			||||||
 | 
					                .caption.indigo--text.pl-3(:class='$vuetify.theme.dark ? `text--lighten-4` : ``') Wiki.js can perform the upgrade to the latest version for you.
 | 
				
			||||||
 | 
					                v-spacer
 | 
				
			||||||
 | 
					                v-btn.px-3(
 | 
				
			||||||
 | 
					                  color='indigo'
 | 
				
			||||||
 | 
					                  dark
 | 
				
			||||||
 | 
					                  @click='performUpgrade'
 | 
				
			||||||
 | 
					                  )
 | 
				
			||||||
 | 
					                  v-icon(left) mdi-upload
 | 
				
			||||||
 | 
					                  span Perform Upgrade
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            v-card.mt-4.animated.fadeInUp.wait-p2s
 | 
					            v-card.mt-4.animated.fadeInUp.wait-p2s
 | 
				
			||||||
              v-subheader {{ $t('admin:system.hostInfo') }}
 | 
					              v-subheader {{ $t('admin:system.hostInfo') }}
 | 
				
			||||||
@@ -92,24 +102,58 @@
 | 
				
			|||||||
                    v-list-item-subtitle {{ info.dbHost }}
 | 
					                    v-list-item-subtitle {{ info.dbHost }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                v-alert.mt-3.mx-4(:value='isDbLimited', color='deep-orange darken-2', icon='mdi-alert', dark) {{ $t('admin:system.dbPartialSupport') }}
 | 
					                v-alert.mt-3.mx-4(:value='isDbLimited', color='deep-orange darken-2', icon='mdi-alert', dark) {{ $t('admin:system.dbPartialSupport') }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    v-dialog(
 | 
				
			||||||
 | 
					      v-model='isUpgrading'
 | 
				
			||||||
 | 
					      persistent
 | 
				
			||||||
 | 
					      width='450'
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					      v-card.blue.darken-5(dark)
 | 
				
			||||||
 | 
					        v-card-text.text-center.pa-10
 | 
				
			||||||
 | 
					          self-building-square-spinner(
 | 
				
			||||||
 | 
					            :animation-duration='4000'
 | 
				
			||||||
 | 
					            :size='40'
 | 
				
			||||||
 | 
					            color='#FFF'
 | 
				
			||||||
 | 
					            style='margin: 0 auto;'
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					          .body-2.mt-5.blue--text.text--lighten-4 Your Wiki.js container is being upgraded...
 | 
				
			||||||
 | 
					          .caption.blue--text.text--lighten-2 Please wait
 | 
				
			||||||
 | 
					          v-progress-linear.mt-5(
 | 
				
			||||||
 | 
					            color='blue lighten-2'
 | 
				
			||||||
 | 
					            :value='upgradeProgress'
 | 
				
			||||||
 | 
					            :buffer-value='upgradeProgress'
 | 
				
			||||||
 | 
					            rounded
 | 
				
			||||||
 | 
					            :stream='isUpgradingStarted'
 | 
				
			||||||
 | 
					            query
 | 
				
			||||||
 | 
					            :indeterminate='!isUpgradingStarted'
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
import _ from 'lodash'
 | 
					import _ from 'lodash'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { SelfBuildingSquareSpinner } from 'epic-spinners'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import systemInfoQuery from 'gql/admin/system/system-query-info.gql'
 | 
					import systemInfoQuery from 'gql/admin/system/system-query-info.gql'
 | 
				
			||||||
 | 
					import performUpgradeMutation from 'gql/admin/system/system-mutation-upgrade.gql'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
  data() {
 | 
					  components: {
 | 
				
			||||||
 | 
					    SelfBuildingSquareSpinner
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  data () {
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
 | 
					      isUpgrading: false,
 | 
				
			||||||
 | 
					      isUpgradingStarted: false,
 | 
				
			||||||
 | 
					      upgradeProgress: 0,
 | 
				
			||||||
      info: {}
 | 
					      info: {}
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  computed: {
 | 
					  computed: {
 | 
				
			||||||
    dbVersion() {
 | 
					    dbVersion () {
 | 
				
			||||||
      return _.get(this.info, 'dbVersion', '').replace(/(?:\r\n|\r|\n)/g, '<br />')
 | 
					      return _.get(this.info, 'dbVersion', '').replace(/(?:\r\n|\r|\n)/g, '<br />')
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    platformLogo() {
 | 
					    platformLogo () {
 | 
				
			||||||
      switch (this.info.platform) {
 | 
					      switch (this.info.platform) {
 | 
				
			||||||
        case 'docker':
 | 
					        case 'docker':
 | 
				
			||||||
          return 'mdi-docker'
 | 
					          return 'mdi-docker'
 | 
				
			||||||
@@ -127,18 +171,49 @@ export default {
 | 
				
			|||||||
          return ''
 | 
					          return ''
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    isDbLimited() {
 | 
					    isDbLimited () {
 | 
				
			||||||
      return this.info.dbType === 'MySQL' && this.dbVersion.indexOf('5.') === 0
 | 
					      return this.info.dbType === 'MySQL' && this.dbVersion.indexOf('5.') === 0
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    isLatestVersion () {
 | 
				
			||||||
 | 
					      return this.info.currentVersion === this.info.latestVersion
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  methods: {
 | 
					  methods: {
 | 
				
			||||||
    async refresh() {
 | 
					    async refresh () {
 | 
				
			||||||
      await this.$apollo.queries.info.refetch()
 | 
					      await this.$apollo.queries.info.refetch()
 | 
				
			||||||
      this.$store.commit('showNotification', {
 | 
					      this.$store.commit('showNotification', {
 | 
				
			||||||
        message: this.$t('admin:system.refreshSuccess'),
 | 
					        message: this.$t('admin:system.refreshSuccess'),
 | 
				
			||||||
        style: 'success',
 | 
					        style: 'success',
 | 
				
			||||||
        icon: 'cached'
 | 
					        icon: 'cached'
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    async performUpgrade () {
 | 
				
			||||||
 | 
					      this.isUpgrading = true
 | 
				
			||||||
 | 
					      this.isUpgradingStarted = false
 | 
				
			||||||
 | 
					      this.upgradeProgress = 0
 | 
				
			||||||
 | 
					      this.$store.commit(`loadingStart`, 'admin-system-upgrade')
 | 
				
			||||||
 | 
					      try {
 | 
				
			||||||
 | 
					        const respRaw = await this.$apollo.mutate({
 | 
				
			||||||
 | 
					          mutation: performUpgradeMutation
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        const resp = _.get(respRaw, 'data.system.performUpgrade.responseResult', {})
 | 
				
			||||||
 | 
					        if (resp.succeeded) {
 | 
				
			||||||
 | 
					          this.isUpgradingStarted = true
 | 
				
			||||||
 | 
					          let progressInterval = setInterval(() => {
 | 
				
			||||||
 | 
					            this.upgradeProgress += 0.83
 | 
				
			||||||
 | 
					          }, 500)
 | 
				
			||||||
 | 
					          _.delay(() => {
 | 
				
			||||||
 | 
					            clearInterval(progressInterval)
 | 
				
			||||||
 | 
					            window.location.reload(true)
 | 
				
			||||||
 | 
					          }, 60000)
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          throw new Error(resp.message)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      } catch (err) {
 | 
				
			||||||
 | 
					        this.$store.commit('pushGraphError', err)
 | 
				
			||||||
 | 
					        this.$store.commit(`loadingStop`, 'admin-system-upgrade')
 | 
				
			||||||
 | 
					        this.isUpgrading = false
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  apollo: {
 | 
					  apollo: {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -169,16 +169,16 @@
 | 
				
			|||||||
          v-toolbar(dense, flat, color='light-green darken-3')
 | 
					          v-toolbar(dense, flat, color='light-green darken-3')
 | 
				
			||||||
            v-spacer
 | 
					            v-spacer
 | 
				
			||||||
            .caption.mr-1 or convert from
 | 
					            .caption.mr-1 or convert from
 | 
				
			||||||
            v-btn.mx-1(depressed, color='light-green darken-2', @click='', disabled)
 | 
					            v-btn.mx-1.animated.fadeInUp(depressed, color='light-green darken-2', @click='', disabled)
 | 
				
			||||||
              v-icon(left) mdi-alpha-a-circle
 | 
					              v-icon(left) mdi-alpha-a-circle
 | 
				
			||||||
              .body-2.text-none AsciiDoc
 | 
					              .body-2.text-none AsciiDoc
 | 
				
			||||||
            v-btn.mx-1(depressed, color='light-green darken-2', @click='', disabled)
 | 
					            v-btn.mx-1.animated.fadeInUp.wait-p1s(depressed, color='light-green darken-2', @click='', disabled)
 | 
				
			||||||
              v-icon(left) mdi-alpha-c-circle
 | 
					              v-icon(left) mdi-alpha-c-circle
 | 
				
			||||||
              .body-2.text-none CREOLE
 | 
					              .body-2.text-none CREOLE
 | 
				
			||||||
            v-btn.mx-1(depressed, color='light-green darken-2', @click='', disabled)
 | 
					            v-btn.mx-1.animated.fadeInUp.wait-p2s(depressed, color='light-green darken-2', @click='', disabled)
 | 
				
			||||||
              v-icon(left) mdi-alpha-t-circle
 | 
					              v-icon(left) mdi-alpha-t-circle
 | 
				
			||||||
              .body-2.text-none Textile
 | 
					              .body-2.text-none Textile
 | 
				
			||||||
            v-btn.mx-1(depressed, color='light-green darken-2', @click='', disabled)
 | 
					            v-btn.mx-1.animated.fadeInUp.wait-p3s(depressed, color='light-green darken-2', @click='', disabled)
 | 
				
			||||||
              v-icon(left) mdi-alpha-w-circle
 | 
					              v-icon(left) mdi-alpha-w-circle
 | 
				
			||||||
              .body-2.text-none WikiText
 | 
					              .body-2.text-none WikiText
 | 
				
			||||||
            v-spacer
 | 
					            v-spacer
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -168,10 +168,12 @@ export default {
 | 
				
			|||||||
          }).then(res => res.json())
 | 
					          }).then(res => res.json())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          if (resp.ok === true) {
 | 
					          if (resp.ok === true) {
 | 
				
			||||||
            this.success = true
 | 
					 | 
				
			||||||
            _.delay(() => {
 | 
					            _.delay(() => {
 | 
				
			||||||
              window.location.assign('/login')
 | 
					              this.success = true
 | 
				
			||||||
            }, 3000)
 | 
					              _.delay(() => {
 | 
				
			||||||
 | 
					                window.location.assign('/login')
 | 
				
			||||||
 | 
					              }, 3000)
 | 
				
			||||||
 | 
					            }, 10000)
 | 
				
			||||||
          } else {
 | 
					          } else {
 | 
				
			||||||
            this.error = true
 | 
					            this.error = true
 | 
				
			||||||
            this.errorMessage = resp.error
 | 
					            this.errorMessage = resp.error
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								client/graph/admin/system/system-mutation-upgrade.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								client/graph/admin/system/system-mutation-upgrade.gql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					mutation {
 | 
				
			||||||
 | 
					  system {
 | 
				
			||||||
 | 
					    performUpgrade {
 | 
				
			||||||
 | 
					      responseResult {
 | 
				
			||||||
 | 
					        succeeded
 | 
				
			||||||
 | 
					        errorCode
 | 
				
			||||||
 | 
					        slug
 | 
				
			||||||
 | 
					        message
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -2,19 +2,20 @@ query {
 | 
				
			|||||||
  system {
 | 
					  system {
 | 
				
			||||||
    info {
 | 
					    info {
 | 
				
			||||||
      configFile
 | 
					      configFile
 | 
				
			||||||
 | 
					      cpuCores
 | 
				
			||||||
      currentVersion
 | 
					      currentVersion
 | 
				
			||||||
 | 
					      dbHost
 | 
				
			||||||
      dbType
 | 
					      dbType
 | 
				
			||||||
      dbVersion
 | 
					      dbVersion
 | 
				
			||||||
      dbHost
 | 
					      hostname
 | 
				
			||||||
      latestVersion
 | 
					      latestVersion
 | 
				
			||||||
      latestVersionReleaseDate
 | 
					      latestVersionReleaseDate
 | 
				
			||||||
 | 
					      nodeVersion
 | 
				
			||||||
      operatingSystem
 | 
					      operatingSystem
 | 
				
			||||||
      platform
 | 
					      platform
 | 
				
			||||||
      hostname
 | 
					 | 
				
			||||||
      cpuCores
 | 
					 | 
				
			||||||
      ramTotal
 | 
					      ramTotal
 | 
				
			||||||
 | 
					      upgradeCapable
 | 
				
			||||||
      workingDirectory
 | 
					      workingDirectory
 | 
				
			||||||
      nodeVersion
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,6 +60,7 @@
 | 
				
			|||||||
    "dependency-graph": "0.8.0",
 | 
					    "dependency-graph": "0.8.0",
 | 
				
			||||||
    "diff": "4.0.1",
 | 
					    "diff": "4.0.1",
 | 
				
			||||||
    "diff2html": "2.11.3",
 | 
					    "diff2html": "2.11.3",
 | 
				
			||||||
 | 
					    "dockerode": "2.5.8",
 | 
				
			||||||
    "dotize": "0.3.0",
 | 
					    "dotize": "0.3.0",
 | 
				
			||||||
    "elasticsearch6": "npm:@elastic/elasticsearch@6",
 | 
					    "elasticsearch6": "npm:@elastic/elasticsearch@6",
 | 
				
			||||||
    "elasticsearch7": "npm:@elastic/elasticsearch@7",
 | 
					    "elasticsearch7": "npm:@elastic/elasticsearch@7",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,6 +7,7 @@ const path = require('path')
 | 
				
			|||||||
const fs = require('fs-extra')
 | 
					const fs = require('fs-extra')
 | 
				
			||||||
const moment = require('moment')
 | 
					const moment = require('moment')
 | 
				
			||||||
const graphHelper = require('../../helpers/graph')
 | 
					const graphHelper = require('../../helpers/graph')
 | 
				
			||||||
 | 
					const Docker = require('dockerode')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* global WIKI */
 | 
					/* global WIKI */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -20,13 +21,13 @@ const dbTypes = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
module.exports = {
 | 
					module.exports = {
 | 
				
			||||||
  Query: {
 | 
					  Query: {
 | 
				
			||||||
    async system() { return {} }
 | 
					    async system () { return {} }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  Mutation: {
 | 
					  Mutation: {
 | 
				
			||||||
    async system() { return {} }
 | 
					    async system () { return {} }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  SystemQuery: {
 | 
					  SystemQuery: {
 | 
				
			||||||
    flags() {
 | 
					    flags () {
 | 
				
			||||||
      return _.transform(WIKI.config.flags, (result, value, key) => {
 | 
					      return _.transform(WIKI.config.flags, (result, value, key) => {
 | 
				
			||||||
        result.push({ key, value })
 | 
					        result.push({ key, value })
 | 
				
			||||||
      }, [])
 | 
					      }, [])
 | 
				
			||||||
@@ -34,7 +35,7 @@ module.exports = {
 | 
				
			|||||||
    async info() { return {} }
 | 
					    async info() { return {} }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  SystemMutation: {
 | 
					  SystemMutation: {
 | 
				
			||||||
    async updateFlags(obj, args, context) {
 | 
					    async updateFlags (obj, args, context) {
 | 
				
			||||||
      WIKI.config.flags = _.transform(args.flags, (result, row) => {
 | 
					      WIKI.config.flags = _.transform(args.flags, (result, row) => {
 | 
				
			||||||
        _.set(result, row.key, row.value)
 | 
					        _.set(result, row.key, row.value)
 | 
				
			||||||
      }, {})
 | 
					      }, {})
 | 
				
			||||||
@@ -44,7 +45,7 @@ module.exports = {
 | 
				
			|||||||
        responseResult: graphHelper.generateSuccess('System Flags applied successfully')
 | 
					        responseResult: graphHelper.generateSuccess('System Flags applied successfully')
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    async resetTelemetryClientId(obj, args, context) {
 | 
					    async resetTelemetryClientId (obj, args, context) {
 | 
				
			||||||
      try {
 | 
					      try {
 | 
				
			||||||
        WIKI.telemetry.generateClientId()
 | 
					        WIKI.telemetry.generateClientId()
 | 
				
			||||||
        await WIKI.configSvc.saveToDb(['telemetry'])
 | 
					        await WIKI.configSvc.saveToDb(['telemetry'])
 | 
				
			||||||
@@ -55,7 +56,7 @@ module.exports = {
 | 
				
			|||||||
        return graphHelper.generateError(err)
 | 
					        return graphHelper.generateError(err)
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    async setTelemetry(obj, args, context) {
 | 
					    async setTelemetry (obj, args, context) {
 | 
				
			||||||
      try {
 | 
					      try {
 | 
				
			||||||
        _.set(WIKI.config, 'telemetry.isEnabled', args.enabled)
 | 
					        _.set(WIKI.config, 'telemetry.isEnabled', args.enabled)
 | 
				
			||||||
        WIKI.telemetry.enabled = args.enabled
 | 
					        WIKI.telemetry.enabled = args.enabled
 | 
				
			||||||
@@ -66,22 +67,44 @@ module.exports = {
 | 
				
			|||||||
      } catch (err) {
 | 
					      } catch (err) {
 | 
				
			||||||
        return graphHelper.generateError(err)
 | 
					        return graphHelper.generateError(err)
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    async performUpgrade (obj, args, context) {
 | 
				
			||||||
 | 
					      try {
 | 
				
			||||||
 | 
					        const dockerEngine = new Docker({ socketPath: '/var/run/docker.sock' })
 | 
				
			||||||
 | 
					        await dockerEngine.run('containrrr/watchtower', ['--cleanup', '--run-once', 'wiki'], process.stdout, {
 | 
				
			||||||
 | 
					          HostConfig: {
 | 
				
			||||||
 | 
					            AutoRemove: true,
 | 
				
			||||||
 | 
					            Mounts: [
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                Target: '/var/run/docker.sock',
 | 
				
			||||||
 | 
					                Source: '/var/run/docker.sock',
 | 
				
			||||||
 | 
					                Type: 'bind'
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        return {
 | 
				
			||||||
 | 
					          responseResult: graphHelper.generateSuccess('Upgrade has started.')
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      } catch (err) {
 | 
				
			||||||
 | 
					        return graphHelper.generateError(err)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  SystemInfo: {
 | 
					  SystemInfo: {
 | 
				
			||||||
    configFile() {
 | 
					    configFile () {
 | 
				
			||||||
      return path.join(process.cwd(), 'config.yml')
 | 
					      return path.join(process.cwd(), 'config.yml')
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    cpuCores() {
 | 
					    cpuCores () {
 | 
				
			||||||
      return os.cpus().length
 | 
					      return os.cpus().length
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    currentVersion() {
 | 
					    currentVersion () {
 | 
				
			||||||
      return WIKI.version
 | 
					      return WIKI.version
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    dbType() {
 | 
					    dbType () {
 | 
				
			||||||
      return _.get(dbTypes, WIKI.config.db.type, 'Unknown DB')
 | 
					      return _.get(dbTypes, WIKI.config.db.type, 'Unknown DB')
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    async dbVersion() {
 | 
					    async dbVersion () {
 | 
				
			||||||
      let version = 'Unknown Version'
 | 
					      let version = 'Unknown Version'
 | 
				
			||||||
      switch (WIKI.config.db.type) {
 | 
					      switch (WIKI.config.db.type) {
 | 
				
			||||||
        case 'mariadb':
 | 
					        case 'mariadb':
 | 
				
			||||||
@@ -102,26 +125,26 @@ module.exports = {
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
      return version
 | 
					      return version
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    dbHost() {
 | 
					    dbHost () {
 | 
				
			||||||
      if (WIKI.config.db.type === 'sqlite') {
 | 
					      if (WIKI.config.db.type === 'sqlite') {
 | 
				
			||||||
        return WIKI.config.db.storage
 | 
					        return WIKI.config.db.storage
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        return WIKI.config.db.host
 | 
					        return WIKI.config.db.host
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    hostname() {
 | 
					    hostname () {
 | 
				
			||||||
      return os.hostname()
 | 
					      return os.hostname()
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    latestVersion() {
 | 
					    latestVersion () {
 | 
				
			||||||
      return WIKI.system.updates.version
 | 
					      return WIKI.system.updates.version
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    latestVersionReleaseDate() {
 | 
					    latestVersionReleaseDate () {
 | 
				
			||||||
      return moment.utc(WIKI.system.updates.releaseDate)
 | 
					      return moment.utc(WIKI.system.updates.releaseDate)
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    nodeVersion() {
 | 
					    nodeVersion () {
 | 
				
			||||||
      return process.version.substr(1)
 | 
					      return process.version.substr(1)
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    async operatingSystem() {
 | 
					    async operatingSystem () {
 | 
				
			||||||
      let osLabel = `${os.type()} (${os.platform()}) ${os.release()} ${os.arch()}`
 | 
					      let osLabel = `${os.type()} (${os.platform()}) ${os.release()} ${os.arch()}`
 | 
				
			||||||
      if (os.platform() === 'linux') {
 | 
					      if (os.platform() === 'linux') {
 | 
				
			||||||
        const osInfo = await getos()
 | 
					        const osInfo = await getos()
 | 
				
			||||||
@@ -136,27 +159,30 @@ module.exports = {
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
      return os.platform()
 | 
					      return os.platform()
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    ramTotal() {
 | 
					    ramTotal () {
 | 
				
			||||||
      return filesize(os.totalmem())
 | 
					      return filesize(os.totalmem())
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    telemetry() {
 | 
					    telemetry () {
 | 
				
			||||||
      return WIKI.telemetry.enabled
 | 
					      return WIKI.telemetry.enabled
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    telemetryClientId() {
 | 
					    telemetryClientId () {
 | 
				
			||||||
      return WIKI.config.telemetry.clientId
 | 
					      return WIKI.config.telemetry.clientId
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    workingDirectory() {
 | 
					    async upgradeCapable () {
 | 
				
			||||||
 | 
					      return fs.pathExists('/var/run/docker.sock')
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    workingDirectory () {
 | 
				
			||||||
      return process.cwd()
 | 
					      return process.cwd()
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    async groupsTotal() {
 | 
					    async groupsTotal () {
 | 
				
			||||||
      const total = await WIKI.models.groups.query().count('* as total').first().pluck('total')
 | 
					      const total = await WIKI.models.groups.query().count('* as total').first().pluck('total')
 | 
				
			||||||
      return _.toSafeInteger(total)
 | 
					      return _.toSafeInteger(total)
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    async pagesTotal() {
 | 
					    async pagesTotal () {
 | 
				
			||||||
      const total = await WIKI.models.pages.query().count('* as total').first().pluck('total')
 | 
					      const total = await WIKI.models.pages.query().count('* as total').first().pluck('total')
 | 
				
			||||||
      return _.toSafeInteger(total)
 | 
					      return _.toSafeInteger(total)
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    async usersTotal() {
 | 
					    async usersTotal () {
 | 
				
			||||||
      const total = await WIKI.models.users.query().count('* as total').first().pluck('total')
 | 
					      const total = await WIKI.models.users.query().count('* as total').first().pluck('total')
 | 
				
			||||||
      return _.toSafeInteger(total)
 | 
					      return _.toSafeInteger(total)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,6 +33,8 @@ type SystemMutation {
 | 
				
			|||||||
  setTelemetry(
 | 
					  setTelemetry(
 | 
				
			||||||
    enabled: Boolean!
 | 
					    enabled: Boolean!
 | 
				
			||||||
  ): DefaultResponse @auth(requires: ["manage:system"])
 | 
					  ): DefaultResponse @auth(requires: ["manage:system"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  performUpgrade: DefaultResponse @auth(requires: ["manage:system"])
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# -----------------------------------------------
 | 
					# -----------------------------------------------
 | 
				
			||||||
@@ -67,6 +69,7 @@ type SystemInfo {
 | 
				
			|||||||
  ramTotal: String @auth(requires: ["manage:system"])
 | 
					  ramTotal: String @auth(requires: ["manage:system"])
 | 
				
			||||||
  telemetry: Boolean @auth(requires: ["manage:system"])
 | 
					  telemetry: Boolean @auth(requires: ["manage:system"])
 | 
				
			||||||
  telemetryClientId: String @auth(requires: ["manage:system"])
 | 
					  telemetryClientId: String @auth(requires: ["manage:system"])
 | 
				
			||||||
 | 
					  upgradeCapable: Boolean @auth(requires: ["manage:system"])
 | 
				
			||||||
  usersTotal: Int @auth(requires: ["manage:system", "manage:navigation", "manage:groups", "write:groups", "manage:users", "write:users"])
 | 
					  usersTotal: Int @auth(requires: ["manage:system", "manage:navigation", "manage:groups", "write:groups", "manage:users", "write:users"])
 | 
				
			||||||
  workingDirectory: String @auth(requires: ["manage:system"])
 | 
					  workingDirectory: String @auth(requires: ["manage:system"])
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										117
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										117
									
								
								yarn.lock
									
									
									
									
									
								
							@@ -1766,6 +1766,14 @@
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
 | 
					  resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
 | 
				
			||||||
  integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
 | 
					  integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					JSONStream@1.3.2:
 | 
				
			||||||
 | 
					  version "1.3.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea"
 | 
				
			||||||
 | 
					  integrity sha1-wQI3G27Dp887hHygDCC7D85Mbeo=
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    jsonparse "^1.2.0"
 | 
				
			||||||
 | 
					    through ">=2.2.7 <3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
abab@^2.0.0:
 | 
					abab@^2.0.0:
 | 
				
			||||||
  version "2.0.1"
 | 
					  version "2.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.1.tgz#3fa17797032b71410ec372e11668f4b4ffc86a82"
 | 
					  resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.1.tgz#3fa17797032b71410ec372e11668f4b4ffc86a82"
 | 
				
			||||||
@@ -2868,6 +2876,14 @@ binary-extensions@^2.0.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c"
 | 
					  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c"
 | 
				
			||||||
  integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==
 | 
					  integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bl@^1.0.0:
 | 
				
			||||||
 | 
					  version "1.2.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
 | 
				
			||||||
 | 
					  integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    readable-stream "^2.3.5"
 | 
				
			||||||
 | 
					    safe-buffer "^5.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bl@^2.0.1:
 | 
					bl@^2.0.1:
 | 
				
			||||||
  version "2.2.0"
 | 
					  version "2.2.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.0.tgz#e1a574cdf528e4053019bb800b041c0ac88da493"
 | 
					  resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.0.tgz#e1a574cdf528e4053019bb800b041c0ac88da493"
 | 
				
			||||||
@@ -3058,11 +3074,29 @@ bson@^1.1.1:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.1.tgz#4330f5e99104c4e751e7351859e2d408279f2f13"
 | 
					  resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.1.tgz#4330f5e99104c4e751e7351859e2d408279f2f13"
 | 
				
			||||||
  integrity sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg==
 | 
					  integrity sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					buffer-alloc-unsafe@^1.1.0:
 | 
				
			||||||
 | 
					  version "1.1.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
 | 
				
			||||||
 | 
					  integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					buffer-alloc@^1.2.0:
 | 
				
			||||||
 | 
					  version "1.2.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
 | 
				
			||||||
 | 
					  integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    buffer-alloc-unsafe "^1.1.0"
 | 
				
			||||||
 | 
					    buffer-fill "^1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
buffer-equal-constant-time@1.0.1:
 | 
					buffer-equal-constant-time@1.0.1:
 | 
				
			||||||
  version "1.0.1"
 | 
					  version "1.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
 | 
					  resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
 | 
				
			||||||
  integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
 | 
					  integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					buffer-fill@^1.0.0:
 | 
				
			||||||
 | 
					  version "1.0.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
 | 
				
			||||||
 | 
					  integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
buffer-from@^1.0.0:
 | 
					buffer-from@^1.0.0:
 | 
				
			||||||
  version "1.1.1"
 | 
					  version "1.1.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
 | 
					  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
 | 
				
			||||||
@@ -3430,7 +3464,7 @@ chokidar@^2.0.2, chokidar@^2.1.8:
 | 
				
			|||||||
  optionalDependencies:
 | 
					  optionalDependencies:
 | 
				
			||||||
    fsevents "^1.2.7"
 | 
					    fsevents "^1.2.7"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
chownr@^1.1.1:
 | 
					chownr@^1.0.1, chownr@^1.1.1:
 | 
				
			||||||
  version "1.1.2"
 | 
					  version "1.1.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6"
 | 
					  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6"
 | 
				
			||||||
  integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==
 | 
					  integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==
 | 
				
			||||||
@@ -3773,7 +3807,7 @@ concat-map@0.0.1:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
 | 
					  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
 | 
				
			||||||
  integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
 | 
					  integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
concat-stream@^1.5.0, concat-stream@^1.5.2:
 | 
					concat-stream@^1.5.0, concat-stream@^1.5.2, concat-stream@~1.6.2:
 | 
				
			||||||
  version "1.6.2"
 | 
					  version "1.6.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
 | 
					  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
 | 
				
			||||||
  integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
 | 
					  integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
 | 
				
			||||||
@@ -4563,6 +4597,25 @@ dir-glob@^2.0.0:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    path-type "^3.0.0"
 | 
					    path-type "^3.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					docker-modem@^1.0.8:
 | 
				
			||||||
 | 
					  version "1.0.9"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/docker-modem/-/docker-modem-1.0.9.tgz#a1f13e50e6afb6cf3431b2d5e7aac589db6aaba8"
 | 
				
			||||||
 | 
					  integrity sha512-lVjqCSCIAUDZPAZIeyM125HXfNvOmYYInciphNrLrylUtKyW66meAjSPXWchKVzoIYZx69TPnAepVSSkeawoIw==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    JSONStream "1.3.2"
 | 
				
			||||||
 | 
					    debug "^3.2.6"
 | 
				
			||||||
 | 
					    readable-stream "~1.0.26-4"
 | 
				
			||||||
 | 
					    split-ca "^1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dockerode@2.5.8:
 | 
				
			||||||
 | 
					  version "2.5.8"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/dockerode/-/dockerode-2.5.8.tgz#1b661e36e1e4f860e25f56e0deabe9f87f1d0acc"
 | 
				
			||||||
 | 
					  integrity sha512-+7iOUYBeDTScmOmQqpUYQaE7F4vvIt6+gIZNHWhqAQEI887tiPFB9OvXI/HzQYqfUNvukMK+9myLW63oTJPZpw==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    concat-stream "~1.6.2"
 | 
				
			||||||
 | 
					    docker-modem "^1.0.8"
 | 
				
			||||||
 | 
					    tar-fs "~1.16.3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
doctrine@1.5.0:
 | 
					doctrine@1.5.0:
 | 
				
			||||||
  version "1.5.0"
 | 
					  version "1.5.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
 | 
					  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
 | 
				
			||||||
@@ -7565,6 +7618,11 @@ jsonfile@^5.0.0:
 | 
				
			|||||||
  optionalDependencies:
 | 
					  optionalDependencies:
 | 
				
			||||||
    graceful-fs "^4.1.6"
 | 
					    graceful-fs "^4.1.6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jsonparse@^1.2.0:
 | 
				
			||||||
 | 
					  version "1.3.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
 | 
				
			||||||
 | 
					  integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jsonwebtoken@8.5.1, jsonwebtoken@^8.2.0:
 | 
					jsonwebtoken@8.5.1, jsonwebtoken@^8.2.0:
 | 
				
			||||||
  version "8.5.1"
 | 
					  version "8.5.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d"
 | 
					  resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d"
 | 
				
			||||||
@@ -11130,6 +11188,14 @@ pug@2.0.4:
 | 
				
			|||||||
    pug-runtime "^2.0.5"
 | 
					    pug-runtime "^2.0.5"
 | 
				
			||||||
    pug-strip-comments "^1.0.4"
 | 
					    pug-strip-comments "^1.0.4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pump@^1.0.0:
 | 
				
			||||||
 | 
					  version "1.0.3"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954"
 | 
				
			||||||
 | 
					  integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    end-of-stream "^1.1.0"
 | 
				
			||||||
 | 
					    once "^1.3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pump@^2.0.0:
 | 
					pump@^2.0.0:
 | 
				
			||||||
  version "2.0.1"
 | 
					  version "2.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
 | 
					  resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
 | 
				
			||||||
@@ -11345,7 +11411,7 @@ read-pkg@^3.0.0:
 | 
				
			|||||||
    normalize-package-data "^2.3.2"
 | 
					    normalize-package-data "^2.3.2"
 | 
				
			||||||
    path-type "^3.0.0"
 | 
					    path-type "^3.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
 | 
					"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
 | 
				
			||||||
  version "2.3.6"
 | 
					  version "2.3.6"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
 | 
					  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
 | 
				
			||||||
  integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
 | 
					  integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
 | 
				
			||||||
@@ -11377,6 +11443,16 @@ readable-stream@^3.0.1, readable-stream@^3.0.3, readable-stream@^3.1.1:
 | 
				
			|||||||
    string_decoder "^1.1.1"
 | 
					    string_decoder "^1.1.1"
 | 
				
			||||||
    util-deprecate "^1.0.1"
 | 
					    util-deprecate "^1.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					readable-stream@~1.0.26-4:
 | 
				
			||||||
 | 
					  version "1.0.34"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
 | 
				
			||||||
 | 
					  integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    core-util-is "~1.0.0"
 | 
				
			||||||
 | 
					    inherits "~2.0.1"
 | 
				
			||||||
 | 
					    isarray "0.0.1"
 | 
				
			||||||
 | 
					    string_decoder "~0.10.x"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
readdirp@^2.2.1:
 | 
					readdirp@^2.2.1:
 | 
				
			||||||
  version "2.2.1"
 | 
					  version "2.2.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
 | 
					  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
 | 
				
			||||||
@@ -12266,6 +12342,11 @@ spdx-license-ids@^3.0.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654"
 | 
					  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654"
 | 
				
			||||||
  integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==
 | 
					  integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					split-ca@^1.0.0:
 | 
				
			||||||
 | 
					  version "1.0.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/split-ca/-/split-ca-1.0.1.tgz#6c83aff3692fa61256e0cd197e05e9de157691a6"
 | 
				
			||||||
 | 
					  integrity sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
split-string@^3.0.1, split-string@^3.0.2:
 | 
					split-string@^3.0.1, split-string@^3.0.2:
 | 
				
			||||||
  version "3.1.0"
 | 
					  version "3.1.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
 | 
					  resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
 | 
				
			||||||
@@ -12678,6 +12759,29 @@ tar-fs@2.0.0:
 | 
				
			|||||||
    pump "^3.0.0"
 | 
					    pump "^3.0.0"
 | 
				
			||||||
    tar-stream "^2.0.0"
 | 
					    tar-stream "^2.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tar-fs@~1.16.3:
 | 
				
			||||||
 | 
					  version "1.16.3"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509"
 | 
				
			||||||
 | 
					  integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    chownr "^1.0.1"
 | 
				
			||||||
 | 
					    mkdirp "^0.5.1"
 | 
				
			||||||
 | 
					    pump "^1.0.0"
 | 
				
			||||||
 | 
					    tar-stream "^1.1.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tar-stream@^1.1.2:
 | 
				
			||||||
 | 
					  version "1.6.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
 | 
				
			||||||
 | 
					  integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    bl "^1.0.0"
 | 
				
			||||||
 | 
					    buffer-alloc "^1.2.0"
 | 
				
			||||||
 | 
					    end-of-stream "^1.0.0"
 | 
				
			||||||
 | 
					    fs-constants "^1.0.0"
 | 
				
			||||||
 | 
					    readable-stream "^2.3.0"
 | 
				
			||||||
 | 
					    to-buffer "^1.1.1"
 | 
				
			||||||
 | 
					    xtend "^4.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
tar-stream@^2.0.0:
 | 
					tar-stream@^2.0.0:
 | 
				
			||||||
  version "2.1.0"
 | 
					  version "2.1.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.0.tgz#d1aaa3661f05b38b5acc9b7020efdca5179a2cc3"
 | 
					  resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.0.tgz#d1aaa3661f05b38b5acc9b7020efdca5179a2cc3"
 | 
				
			||||||
@@ -12794,7 +12898,7 @@ through2@^2.0.0:
 | 
				
			|||||||
    readable-stream "~2.3.6"
 | 
					    readable-stream "~2.3.6"
 | 
				
			||||||
    xtend "~4.0.1"
 | 
					    xtend "~4.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
through@2, through@^2.3.6, through@~2.3.4:
 | 
					through@2, "through@>=2.2.7 <3", through@^2.3.6, through@~2.3.4:
 | 
				
			||||||
  version "2.3.8"
 | 
					  version "2.3.8"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
 | 
					  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
 | 
				
			||||||
  integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
 | 
					  integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
 | 
				
			||||||
@@ -12850,6 +12954,11 @@ to-arraybuffer@^1.0.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
 | 
					  resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
 | 
				
			||||||
  integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
 | 
					  integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					to-buffer@^1.1.1:
 | 
				
			||||||
 | 
					  version "1.1.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
 | 
				
			||||||
 | 
					  integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
to-fast-properties@^1.0.3:
 | 
					to-fast-properties@^1.0.3:
 | 
				
			||||||
  version "1.0.3"
 | 
					  version "1.0.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
 | 
					  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user