From d0dc300a598e635cd539d0b961ba85097c84d0b9 Mon Sep 17 00:00:00 2001 From: Nick <github@ngpixel.com> Date: Sun, 22 Sep 2019 16:32:39 -0400 Subject: [PATCH] feat: docker auto upgrade --- client/components/admin/admin-system.vue | 85 ++++++++++++- .../editor/editor-modal-editorselect.vue | 8 +- client/components/setup.vue | 8 +- .../admin/system/system-mutation-upgrade.gql | 12 ++ .../graph/admin/system/system-query-info.gql | 9 +- package.json | 1 + server/graph/resolvers/system.js | 74 +++++++---- server/graph/schemas/system.graphql | 3 + yarn.lock | 117 +++++++++++++++++- 9 files changed, 273 insertions(+), 44 deletions(-) create mode 100644 client/graph/admin/system/system-mutation-upgrade.gql diff --git a/client/components/admin/admin-system.vue b/client/components/admin/admin-system.vue index 939473f7..e00d4ca5 100644 --- a/client/components/admin/admin-system.vue +++ b/client/components/admin/admin-system.vue @@ -27,6 +27,16 @@ v-list-item-subtitle {{ info.latestVersion }} v-list-item-action 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-subheader {{ $t('admin:system.hostInfo') }} @@ -92,24 +102,58 @@ 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-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> <script> import _ from 'lodash' +import { SelfBuildingSquareSpinner } from 'epic-spinners' + import systemInfoQuery from 'gql/admin/system/system-query-info.gql' +import performUpgradeMutation from 'gql/admin/system/system-mutation-upgrade.gql' export default { - data() { + components: { + SelfBuildingSquareSpinner + }, + data () { return { + isUpgrading: false, + isUpgradingStarted: false, + upgradeProgress: 0, info: {} } }, computed: { - dbVersion() { + dbVersion () { return _.get(this.info, 'dbVersion', '').replace(/(?:\r\n|\r|\n)/g, '<br />') }, - platformLogo() { + platformLogo () { switch (this.info.platform) { case 'docker': return 'mdi-docker' @@ -127,18 +171,49 @@ export default { return '' } }, - isDbLimited() { + isDbLimited () { return this.info.dbType === 'MySQL' && this.dbVersion.indexOf('5.') === 0 + }, + isLatestVersion () { + return this.info.currentVersion === this.info.latestVersion } }, methods: { - async refresh() { + async refresh () { await this.$apollo.queries.info.refetch() this.$store.commit('showNotification', { message: this.$t('admin:system.refreshSuccess'), style: 'success', 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: { diff --git a/client/components/editor/editor-modal-editorselect.vue b/client/components/editor/editor-modal-editorselect.vue index f9e48a11..82732a9e 100644 --- a/client/components/editor/editor-modal-editorselect.vue +++ b/client/components/editor/editor-modal-editorselect.vue @@ -169,16 +169,16 @@ v-toolbar(dense, flat, color='light-green darken-3') v-spacer .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 .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 .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 .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 .body-2.text-none WikiText v-spacer diff --git a/client/components/setup.vue b/client/components/setup.vue index 310387c3..1d840967 100644 --- a/client/components/setup.vue +++ b/client/components/setup.vue @@ -168,10 +168,12 @@ export default { }).then(res => res.json()) if (resp.ok === true) { - this.success = true _.delay(() => { - window.location.assign('/login') - }, 3000) + this.success = true + _.delay(() => { + window.location.assign('/login') + }, 3000) + }, 10000) } else { this.error = true this.errorMessage = resp.error diff --git a/client/graph/admin/system/system-mutation-upgrade.gql b/client/graph/admin/system/system-mutation-upgrade.gql new file mode 100644 index 00000000..030a4449 --- /dev/null +++ b/client/graph/admin/system/system-mutation-upgrade.gql @@ -0,0 +1,12 @@ +mutation { + system { + performUpgrade { + responseResult { + succeeded + errorCode + slug + message + } + } + } +} diff --git a/client/graph/admin/system/system-query-info.gql b/client/graph/admin/system/system-query-info.gql index 400a7405..e14cf680 100644 --- a/client/graph/admin/system/system-query-info.gql +++ b/client/graph/admin/system/system-query-info.gql @@ -2,19 +2,20 @@ query { system { info { configFile + cpuCores currentVersion + dbHost dbType dbVersion - dbHost + hostname latestVersion latestVersionReleaseDate + nodeVersion operatingSystem platform - hostname - cpuCores ramTotal + upgradeCapable workingDirectory - nodeVersion } } } diff --git a/package.json b/package.json index 502076d6..c11074dc 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "dependency-graph": "0.8.0", "diff": "4.0.1", "diff2html": "2.11.3", + "dockerode": "2.5.8", "dotize": "0.3.0", "elasticsearch6": "npm:@elastic/elasticsearch@6", "elasticsearch7": "npm:@elastic/elasticsearch@7", diff --git a/server/graph/resolvers/system.js b/server/graph/resolvers/system.js index 6ada5607..14d85ed6 100644 --- a/server/graph/resolvers/system.js +++ b/server/graph/resolvers/system.js @@ -7,6 +7,7 @@ const path = require('path') const fs = require('fs-extra') const moment = require('moment') const graphHelper = require('../../helpers/graph') +const Docker = require('dockerode') /* global WIKI */ @@ -20,13 +21,13 @@ const dbTypes = { module.exports = { Query: { - async system() { return {} } + async system () { return {} } }, Mutation: { - async system() { return {} } + async system () { return {} } }, SystemQuery: { - flags() { + flags () { return _.transform(WIKI.config.flags, (result, value, key) => { result.push({ key, value }) }, []) @@ -34,7 +35,7 @@ module.exports = { async info() { return {} } }, SystemMutation: { - async updateFlags(obj, args, context) { + async updateFlags (obj, args, context) { WIKI.config.flags = _.transform(args.flags, (result, row) => { _.set(result, row.key, row.value) }, {}) @@ -44,7 +45,7 @@ module.exports = { responseResult: graphHelper.generateSuccess('System Flags applied successfully') } }, - async resetTelemetryClientId(obj, args, context) { + async resetTelemetryClientId (obj, args, context) { try { WIKI.telemetry.generateClientId() await WIKI.configSvc.saveToDb(['telemetry']) @@ -55,7 +56,7 @@ module.exports = { return graphHelper.generateError(err) } }, - async setTelemetry(obj, args, context) { + async setTelemetry (obj, args, context) { try { _.set(WIKI.config, 'telemetry.isEnabled', args.enabled) WIKI.telemetry.enabled = args.enabled @@ -66,22 +67,44 @@ module.exports = { } catch (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: { - configFile() { + configFile () { return path.join(process.cwd(), 'config.yml') }, - cpuCores() { + cpuCores () { return os.cpus().length }, - currentVersion() { + currentVersion () { return WIKI.version }, - dbType() { + dbType () { return _.get(dbTypes, WIKI.config.db.type, 'Unknown DB') }, - async dbVersion() { + async dbVersion () { let version = 'Unknown Version' switch (WIKI.config.db.type) { case 'mariadb': @@ -102,26 +125,26 @@ module.exports = { } return version }, - dbHost() { + dbHost () { if (WIKI.config.db.type === 'sqlite') { return WIKI.config.db.storage } else { return WIKI.config.db.host } }, - hostname() { + hostname () { return os.hostname() }, - latestVersion() { + latestVersion () { return WIKI.system.updates.version }, - latestVersionReleaseDate() { + latestVersionReleaseDate () { return moment.utc(WIKI.system.updates.releaseDate) }, - nodeVersion() { + nodeVersion () { return process.version.substr(1) }, - async operatingSystem() { + async operatingSystem () { let osLabel = `${os.type()} (${os.platform()}) ${os.release()} ${os.arch()}` if (os.platform() === 'linux') { const osInfo = await getos() @@ -136,27 +159,30 @@ module.exports = { } return os.platform() }, - ramTotal() { + ramTotal () { return filesize(os.totalmem()) }, - telemetry() { + telemetry () { return WIKI.telemetry.enabled }, - telemetryClientId() { + telemetryClientId () { return WIKI.config.telemetry.clientId }, - workingDirectory() { + async upgradeCapable () { + return fs.pathExists('/var/run/docker.sock') + }, + workingDirectory () { return process.cwd() }, - async groupsTotal() { + async groupsTotal () { const total = await WIKI.models.groups.query().count('* as total').first().pluck('total') return _.toSafeInteger(total) }, - async pagesTotal() { + async pagesTotal () { const total = await WIKI.models.pages.query().count('* as total').first().pluck('total') return _.toSafeInteger(total) }, - async usersTotal() { + async usersTotal () { const total = await WIKI.models.users.query().count('* as total').first().pluck('total') return _.toSafeInteger(total) } diff --git a/server/graph/schemas/system.graphql b/server/graph/schemas/system.graphql index d876daa3..3da9c3c8 100644 --- a/server/graph/schemas/system.graphql +++ b/server/graph/schemas/system.graphql @@ -33,6 +33,8 @@ type SystemMutation { setTelemetry( enabled: Boolean! ): DefaultResponse @auth(requires: ["manage:system"]) + + performUpgrade: DefaultResponse @auth(requires: ["manage:system"]) } # ----------------------------------------------- @@ -67,6 +69,7 @@ type SystemInfo { ramTotal: String @auth(requires: ["manage:system"]) telemetry: Boolean @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"]) workingDirectory: String @auth(requires: ["manage:system"]) } diff --git a/yarn.lock b/yarn.lock index 8e785f50..5c15b094 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1766,6 +1766,14 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" 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: version "2.0.1" 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" 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: version "2.2.0" 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" 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: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 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: version "1.1.1" 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: fsevents "^1.2.7" -chownr@^1.1.1: +chownr@^1.0.1, chownr@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" 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" 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" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -4563,6 +4597,25 @@ dir-glob@^2.0.0: dependencies: 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: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" @@ -7565,6 +7618,11 @@ jsonfile@^5.0.0: optionalDependencies: 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: version "8.5.1" 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-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: version "2.0.1" 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" 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" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 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" 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: version "2.2.1" 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" 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: version "3.1.0" 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" 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: version "2.1.0" 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" 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" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 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" 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: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"