DESKTOP-D85FA51\111
2020-11-20 cfede04a7991297ef09ea5c23dae645cfd11fdfe
阿里云上传组件
3 files added
10 files modified
2164 ■■■■ changed files
debug.log 2 ●●●●● patch | view | raw | blame | history
package-lock.json 783 ●●●● patch | view | raw | blame | history
package.json 1 ●●●● patch | view | raw | blame | history
src/apis/coursewareSource/index.js 4 ●●●● patch | view | raw | blame | history
src/assets/js/aliOss.js 14 ●●●●● patch | view | raw | blame | history
src/assets/js/axios.js 202 ●●●● patch | view | raw | blame | history
src/assets/js/methods.js 190 ●●●● patch | view | raw | blame | history
src/assets/js/utils.js 500 ●●●●● patch | view | raw | blame | history
src/components/coursewareSource/AliFileUpdate.vue 274 ●●●●● patch | view | raw | blame | history
src/views/coursewareSource/sourceManage/SourceClassify.vue 14 ●●●●● patch | view | raw | blame | history
src/views/coursewareSource/sourceManage/SourceList.vue 67 ●●●●● patch | view | raw | blame | history
src/views/coursewareSource/sourceManage/router.js 55 ●●●● patch | view | raw | blame | history
vue.config.js 58 ●●●● patch | view | raw | blame | history
debug.log
@@ -2,3 +2,5 @@
[0714/170936.478:ERROR:process_info.cc(118)] ReadProcessMemory bool __cdecl crashpad::(anonymous namespace)::ReadStruct(HANDLE, crashpad::WinVMAddress, T *) [T = crashpad::process_types::PEB<crashpad::process_types::internal::Traits64>]: 仅完成部分的 ReadProcessMemory 或 WriteProcessMemory 请求。 (0x12B)
[0714/170936.487:ERROR:process_info.cc(551)] ReadProcessData failed
[0925/051411.023:ERROR:crash_report_database_win.cc(428)] unexpected header
[1119/091252.221:ERROR:directory_reader_win.cc(43)] FindFirstFile: 系统找不到指定的路径。 (0x3)
[1120/091707.655:ERROR:directory_reader_win.cc(43)] FindFirstFile: 系统找不到指定的路径。 (0x3)
package-lock.json
@@ -1740,8 +1740,7 @@
    "address": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz",
      "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==",
      "dev": true
      "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA=="
    },
    "adler-32": {
      "version": "1.2.0",
@@ -1750,6 +1749,22 @@
      "requires": {
        "exit-on-epipe": "~1.0.1",
        "printj": "~1.1.0"
      }
    },
    "agent-base": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
      "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
      "requires": {
        "es6-promisify": "^5.0.0"
      }
    },
    "agentkeepalive": {
      "version": "3.5.2",
      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz",
      "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==",
      "requires": {
        "humanize-ms": "^1.2.1"
      }
    },
    "aggregate-error": {
@@ -1785,6 +1800,76 @@
      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz",
      "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==",
      "dev": true
    },
    "ali-oss": {
      "version": "6.11.2",
      "resolved": "https://registry.npmjs.org/ali-oss/-/ali-oss-6.11.2.tgz",
      "integrity": "sha512-rNeYm5yogNOABCY9G27RgB6BGJ0BK+nQGicfDXKp1Fq7G/eJMZYwBNXdM420uAIUoMM81uFOtSIRYBRF6IxPwA==",
      "requires": {
        "address": "^1.0.0",
        "agentkeepalive": "^3.4.1",
        "any-promise": "^1.3.0",
        "bowser": "^1.6.0",
        "co-defer": "^1.0.0",
        "copy-to": "^2.0.1",
        "dateformat": "^2.0.0",
        "debug": "^2.2.0",
        "destroy": "^1.0.4",
        "end-or-error": "^1.0.1",
        "get-ready": "^1.0.0",
        "humanize-ms": "^1.2.0",
        "is-type-of": "^1.0.0",
        "js-base64": "^2.5.2",
        "jstoxml": "^0.2.3",
        "merge-descriptors": "^1.0.1",
        "mime": "^2.4.5",
        "mz-modules": "^2.1.0",
        "platform": "^1.3.1",
        "pump": "^3.0.0",
        "sdk-base": "^2.0.1",
        "stream-http": "2.8.2",
        "stream-wormhole": "^1.0.4",
        "urllib": "^2.33.1",
        "utility": "^1.8.0",
        "xml2js": "^0.4.16"
      },
      "dependencies": {
        "debug": {
          "version": "2.6.9",
          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
          "requires": {
            "ms": "2.0.0"
          }
        },
        "js-base64": {
          "version": "2.6.4",
          "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz",
          "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ=="
        },
        "mime": {
          "version": "2.4.6",
          "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
          "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA=="
        },
        "ms": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        },
        "stream-http": {
          "version": "2.8.2",
          "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz",
          "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==",
          "requires": {
            "builtin-status-codes": "^3.0.0",
            "inherits": "^2.0.1",
            "readable-stream": "^2.3.6",
            "to-arraybuffer": "^1.0.0",
            "xtend": "^4.0.0"
          }
        }
      }
    },
    "alphanum-sort": {
      "version": "1.0.2",
@@ -1828,8 +1913,7 @@
    "any-promise": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
      "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=",
      "dev": true
      "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
    },
    "anymatch": {
      "version": "2.0.0",
@@ -1983,6 +2067,21 @@
      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
      "dev": true
    },
    "ast-types": {
      "version": "0.14.2",
      "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz",
      "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==",
      "requires": {
        "tslib": "^2.0.1"
      },
      "dependencies": {
        "tslib": {
          "version": "2.0.3",
          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
        }
      }
    },
    "astral-regex": {
      "version": "1.0.0",
@@ -2180,8 +2279,7 @@
    "balanced-match": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
      "dev": true
      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
    },
    "base": {
      "version": "0.11.2",
@@ -2364,11 +2462,15 @@
      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
      "dev": true
    },
    "bowser": {
      "version": "1.9.4",
      "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz",
      "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ=="
    },
    "brace-expansion": {
      "version": "1.1.11",
      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
      "dev": true,
      "requires": {
        "balanced-match": "^1.0.0",
        "concat-map": "0.0.1"
@@ -2529,14 +2631,12 @@
    "builtin-status-codes": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
      "dev": true
      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
    },
    "bytes": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
      "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
      "dev": true
      "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
    },
    "cacache": {
      "version": "12.0.3",
@@ -2969,6 +3069,16 @@
      "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
      "dev": true
    },
    "co": {
      "version": "4.6.0",
      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
    },
    "co-defer": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/co-defer/-/co-defer-1.0.0.tgz",
      "integrity": "sha1-Pkp4eo7tawoh7ih8CU9+jeDTyBg="
    },
    "coa": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
@@ -3128,8 +3238,7 @@
    "concat-map": {
      "version": "0.0.1",
      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
      "dev": true
      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
    },
    "concat-stream": {
      "version": "1.6.2",
@@ -3185,8 +3294,7 @@
    "content-type": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
      "dev": true
      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
    },
    "convert-source-map": {
      "version": "1.6.0",
@@ -3228,6 +3336,11 @@
      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
      "dev": true
    },
    "copy-to": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz",
      "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU="
    },
    "copy-webpack-plugin": {
      "version": "5.0.4",
@@ -3352,8 +3465,7 @@
    "core-util-is": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
      "dev": true
      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
    },
    "cosmiconfig": {
      "version": "5.2.1",
@@ -3737,11 +3849,21 @@
        "assert-plus": "^1.0.0"
      }
    },
    "data-uri-to-buffer": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz",
      "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ=="
    },
    "date-now": {
      "version": "0.1.4",
      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
      "dev": true
    },
    "dateformat": {
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
      "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI="
    },
    "de-indent": {
      "version": "1.0.2",
@@ -3753,7 +3875,6 @@
      "version": "4.1.1",
      "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
      "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
      "dev": true,
      "requires": {
        "ms": "^2.1.1"
      }
@@ -3792,8 +3913,7 @@
    "deep-is": {
      "version": "0.1.3",
      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
      "dev": true
      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
    },
    "deepmerge": {
      "version": "1.5.2",
@@ -3920,6 +4040,14 @@
      "resolved": "https://registry.npmjs.org/default-passive-events/-/default-passive-events-1.0.10.tgz",
      "integrity": "sha1-KK0yaWSKdqAVj0E9ZuN68k2tBTo="
    },
    "default-user-agent": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/default-user-agent/-/default-user-agent-1.0.0.tgz",
      "integrity": "sha1-FsRu/cq6PtxF8k8r1IaLAbfCrcY=",
      "requires": {
        "os-name": "~1.0.3"
      }
    },
    "defaults": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
@@ -3979,6 +4107,23 @@
        }
      }
    },
    "degenerator": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz",
      "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=",
      "requires": {
        "ast-types": "0.x.x",
        "escodegen": "1.x.x",
        "esprima": "3.x.x"
      },
      "dependencies": {
        "esprima": {
          "version": "3.1.3",
          "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
          "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM="
        }
      }
    },
    "del": {
      "version": "4.1.1",
      "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
@@ -4032,8 +4177,7 @@
    "depd": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
      "dev": true
      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
    },
    "des.js": {
      "version": "1.0.0",
@@ -4048,8 +4192,7 @@
    "destroy": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
      "dev": true
      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
    },
    "detect-node": {
      "version": "2.0.4",
@@ -4066,6 +4209,24 @@
        "bn.js": "^4.1.0",
        "miller-rabin": "^4.0.0",
        "randombytes": "^2.0.0"
      }
    },
    "digest-header": {
      "version": "0.0.1",
      "resolved": "https://registry.npmjs.org/digest-header/-/digest-header-0.0.1.tgz",
      "integrity": "sha1-Ecz23uxXZqw3l0TZAcEsuklRS+Y=",
      "requires": {
        "utility": "0.1.11"
      },
      "dependencies": {
        "utility": {
          "version": "0.1.11",
          "resolved": "https://registry.npmjs.org/utility/-/utility-0.1.11.tgz",
          "integrity": "sha1-/eYM+bTkdRlHoM9dEEzik2ciZxU=",
          "requires": {
            "address": ">=0.0.1"
          }
        }
      }
    },
    "dir-glob": {
@@ -4227,8 +4388,7 @@
    "ee-first": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
      "dev": true
      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
    },
    "ejs": {
      "version": "2.7.1",
@@ -4292,10 +4452,14 @@
      "version": "1.4.4",
      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
      "dev": true,
      "requires": {
        "once": "^1.4.0"
      }
    },
    "end-or-error": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/end-or-error/-/end-or-error-1.0.1.tgz",
      "integrity": "sha1-3HpiEP5403L+4kqLSJnb0VVBTcs="
    },
    "enhanced-resolve": {
      "version": "4.1.1",
@@ -4382,11 +4546,23 @@
        "is-symbol": "^1.0.2"
      }
    },
    "es6-promise": {
      "version": "4.2.8",
      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
      "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="
    },
    "es6-promisify": {
      "version": "5.0.0",
      "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
      "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
      "requires": {
        "es6-promise": "^4.0.3"
      }
    },
    "escape-html": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
      "dev": true
      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
    },
    "escape-latex": {
      "version": "1.2.0",
@@ -4398,6 +4574,26 @@
      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
      "dev": true
    },
    "escodegen": {
      "version": "1.14.3",
      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
      "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
      "requires": {
        "esprima": "^4.0.1",
        "estraverse": "^4.2.0",
        "esutils": "^2.0.2",
        "optionator": "^0.8.1",
        "source-map": "~0.6.1"
      },
      "dependencies": {
        "source-map": {
          "version": "0.6.1",
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
          "optional": true
        }
      }
    },
    "eslint": {
      "version": "5.16.0",
@@ -4537,8 +4733,7 @@
    "esprima": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
      "dev": true
      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
    },
    "esquery": {
      "version": "1.0.1",
@@ -4561,14 +4756,12 @@
    "estraverse": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
      "dev": true
      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
    },
    "esutils": {
      "version": "2.0.3",
      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
      "dev": true
      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
    },
    "etag": {
      "version": "1.8.1",
@@ -4747,8 +4940,7 @@
    "extend": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
      "dev": true
      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
    },
    "extend-shallow": {
      "version": "3.0.2",
@@ -4881,8 +5073,7 @@
    "fast-levenshtein": {
      "version": "2.0.6",
      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
      "dev": true
      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
    },
    "faye-websocket": {
      "version": "0.10.0",
@@ -4943,6 +5134,11 @@
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz",
      "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw=="
    },
    "file-uri-to-path": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
    },
    "filesize": {
      "version": "3.6.1",
@@ -5124,6 +5320,23 @@
        "mime-types": "^2.1.12"
      }
    },
    "formstream": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/formstream/-/formstream-1.1.0.tgz",
      "integrity": "sha1-UfOXDyYTbrCtRDBN5M67UCB7RHk=",
      "requires": {
        "destroy": "^1.0.4",
        "mime": "^1.3.4",
        "pause-stream": "~0.0.11"
      },
      "dependencies": {
        "mime": {
          "version": "1.6.0",
          "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
          "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
        }
      }
    },
    "forwarded": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
@@ -5200,8 +5413,7 @@
    "fs.realpath": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
      "dev": true
      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
    },
    "fsevents": {
      "version": "1.2.9",
@@ -5751,6 +5963,38 @@
        }
      }
    },
    "ftp": {
      "version": "0.3.10",
      "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz",
      "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=",
      "requires": {
        "readable-stream": "1.1.x",
        "xregexp": "2.0.0"
      },
      "dependencies": {
        "isarray": {
          "version": "0.0.1",
          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
        },
        "readable-stream": {
          "version": "1.1.14",
          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
          "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
          "requires": {
            "core-util-is": "~1.0.0",
            "inherits": "~2.0.1",
            "isarray": "0.0.1",
            "string_decoder": "~0.10.x"
          }
        },
        "string_decoder": {
          "version": "0.10.31",
          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
        }
      }
    },
    "function-bind": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -5769,6 +6013,11 @@
      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
      "dev": true
    },
    "get-ready": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/get-ready/-/get-ready-1.0.0.tgz",
      "integrity": "sha1-+RgX8emt7P6hOlYq38jeiDqzR4I="
    },
    "get-stream": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
@@ -5776,6 +6025,34 @@
      "dev": true,
      "requires": {
        "pump": "^3.0.0"
      }
    },
    "get-uri": {
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.4.tgz",
      "integrity": "sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==",
      "requires": {
        "data-uri-to-buffer": "1",
        "debug": "2",
        "extend": "~3.0.2",
        "file-uri-to-path": "1",
        "ftp": "~0.3.10",
        "readable-stream": "2"
      },
      "dependencies": {
        "debug": {
          "version": "2.6.9",
          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
          "requires": {
            "ms": "2.0.0"
          }
        },
        "ms": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        }
      }
    },
    "get-value": {
@@ -5797,7 +6074,6 @@
      "version": "7.1.5",
      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz",
      "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==",
      "dev": true,
      "requires": {
        "fs.realpath": "^1.0.0",
        "inflight": "^1.0.4",
@@ -6184,7 +6460,6 @@
      "version": "1.7.2",
      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
      "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
      "dev": true,
      "requires": {
        "depd": "~1.1.2",
        "inherits": "2.0.3",
@@ -6196,8 +6471,7 @@
        "inherits": {
          "version": "2.0.3",
          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
          "dev": true
          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
        }
      }
    },
@@ -6216,6 +6490,30 @@
        "eventemitter3": "^4.0.0",
        "follow-redirects": "^1.0.0",
        "requires-port": "^1.0.0"
      }
    },
    "http-proxy-agent": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz",
      "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==",
      "requires": {
        "agent-base": "4",
        "debug": "3.1.0"
      },
      "dependencies": {
        "debug": {
          "version": "3.1.0",
          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
          "requires": {
            "ms": "2.0.0"
          }
        },
        "ms": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        }
      }
    },
    "http-proxy-middleware": {
@@ -6247,17 +6545,43 @@
      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
      "dev": true
    },
    "https-proxy-agent": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz",
      "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==",
      "requires": {
        "agent-base": "^4.3.0",
        "debug": "^3.1.0"
      },
      "dependencies": {
        "debug": {
          "version": "3.2.6",
          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
          "requires": {
            "ms": "^2.1.1"
          }
        }
      }
    },
    "human-signals": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
      "dev": true
    },
    "humanize-ms": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
      "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=",
      "requires": {
        "ms": "^2.0.0"
      }
    },
    "iconv-lite": {
      "version": "0.4.24",
      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
      "dev": true,
      "requires": {
        "safer-buffer": ">= 2.1.2 < 3"
      }
@@ -6362,7 +6686,6 @@
      "version": "1.0.6",
      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
      "dev": true,
      "requires": {
        "once": "^1.3.0",
        "wrappy": "1"
@@ -6371,8 +6694,7 @@
    "inherits": {
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
      "dev": true
      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
    },
    "inquirer": {
      "version": "6.5.2",
@@ -6435,8 +6757,7 @@
    "ip": {
      "version": "1.1.5",
      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
      "dev": true
      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
    },
    "ip-regex": {
      "version": "2.1.0",
@@ -6518,6 +6839,11 @@
        "ci-info": "^1.5.0"
      }
    },
    "is-class-hotfix": {
      "version": "0.0.6",
      "resolved": "https://registry.npmjs.org/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz",
      "integrity": "sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ=="
    },
    "is-color-stop": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
@@ -6586,8 +6912,7 @@
    "is-extendable": {
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
      "dev": true
      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
    },
    "is-extglob": {
      "version": "2.1.1",
@@ -6720,6 +7045,16 @@
        "has-symbols": "^1.0.0"
      }
    },
    "is-type-of": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/is-type-of/-/is-type-of-1.2.1.tgz",
      "integrity": "sha512-uK0kyX9LZYhSDS7H2sVJQJop1UnWPWmo5RvR3q2kFH6AUHYs7sOrVg0b4nyBHw29kRRNFofYN/JbHZDlHiItTA==",
      "requires": {
        "core-util-is": "^1.0.2",
        "is-class-hotfix": "~0.0.6",
        "isstream": "~0.1.2"
      }
    },
    "is-typedarray": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
@@ -6741,8 +7076,7 @@
    "isarray": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
      "dev": true
      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
    },
    "isexe": {
      "version": "2.0.0",
@@ -6759,8 +7093,7 @@
    "isstream": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
      "dev": true
      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
    },
    "javascript-natural-sort": {
      "version": "0.7.1",
@@ -6929,6 +7262,11 @@
        "verror": "1.10.0"
      }
    },
    "jstoxml": {
      "version": "0.2.4",
      "resolved": "https://registry.npmjs.org/jstoxml/-/jstoxml-0.2.4.tgz",
      "integrity": "sha1-/z+2eFaIOgMpU8fOjOdIYhD0hEc="
    },
    "killable": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
@@ -6940,6 +7278,14 @@
      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
      "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
      "dev": true
    },
    "ko-sleep": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/ko-sleep/-/ko-sleep-1.0.3.tgz",
      "integrity": "sha1-KKKgoUhei39BX/SI3uF9JHiKsII=",
      "requires": {
        "ms": "^2.0.0"
      }
    },
    "launch-editor": {
      "version": "2.2.1",
@@ -7031,7 +7377,6 @@
      "version": "0.3.0",
      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
      "dev": true,
      "requires": {
        "prelude-ls": "~1.1.2",
        "type-check": "~0.3.2"
@@ -7208,7 +7553,6 @@
      "version": "5.1.1",
      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
      "dev": true,
      "requires": {
        "yallist": "^3.0.2"
      }
@@ -7333,8 +7677,7 @@
    "merge-descriptors": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
      "dev": true
      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
    },
    "merge-source-map": {
      "version": "1.1.0",
@@ -7471,7 +7814,6 @@
      "version": "3.0.4",
      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
      "dev": true,
      "requires": {
        "brace-expansion": "^1.1.7"
      }
@@ -7479,8 +7821,7 @@
    "minimist": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
      "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
      "dev": true
      "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
    },
    "minipass": {
      "version": "3.1.1",
@@ -7569,7 +7910,6 @@
      "version": "0.5.1",
      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
      "dev": true,
      "requires": {
        "minimist": "0.0.8"
      },
@@ -7577,8 +7917,7 @@
        "minimist": {
          "version": "0.0.8",
          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
          "dev": true
          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
        }
      }
    },
@@ -7604,8 +7943,7 @@
    "ms": {
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
      "dev": true
      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
    },
    "multicast-dns": {
      "version": "6.2.3",
@@ -7633,11 +7971,22 @@
      "version": "2.7.0",
      "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
      "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
      "dev": true,
      "requires": {
        "any-promise": "^1.0.0",
        "object-assign": "^4.0.1",
        "thenify-all": "^1.0.0"
      }
    },
    "mz-modules": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/mz-modules/-/mz-modules-2.1.0.tgz",
      "integrity": "sha512-sjk8lcRW3vrVYnZ+W+67L/2rL+jbO5K/N6PFGIcLWTiYytNr22Ah9FDXFs+AQntTM1boZcoHi5qS+CV1seuPog==",
      "requires": {
        "glob": "^7.1.2",
        "ko-sleep": "^1.0.3",
        "mkdirp": "^0.5.1",
        "pump": "^3.0.0",
        "rimraf": "^2.6.1"
      }
    },
    "nan": {
@@ -7683,6 +8032,11 @@
      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
      "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==",
      "dev": true
    },
    "netmask": {
      "version": "1.0.6",
      "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz",
      "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU="
    },
    "nice-try": {
      "version": "1.0.5",
@@ -7846,8 +8200,7 @@
    "object-assign": {
      "version": "4.1.1",
      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
      "dev": true
      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
    },
    "object-copy": {
      "version": "0.1.0",
@@ -7981,7 +8334,6 @@
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
      "dev": true,
      "requires": {
        "wrappy": "1"
      }
@@ -8023,7 +8375,6 @@
      "version": "0.8.2",
      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
      "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
      "dev": true,
      "requires": {
        "deep-is": "~0.1.3",
        "fast-levenshtein": "~2.0.4",
@@ -8073,11 +8424,28 @@
        "mem": "^4.0.0"
      }
    },
    "os-name": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/os-name/-/os-name-1.0.3.tgz",
      "integrity": "sha1-GzefZINa98Wn9JizV8uVIVwVnt8=",
      "requires": {
        "osx-release": "^1.0.0",
        "win-release": "^1.0.0"
      }
    },
    "os-tmpdir": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
      "dev": true
    },
    "osx-release": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/osx-release/-/osx-release-1.1.0.tgz",
      "integrity": "sha1-8heRGigTaUmvG/kwiyQeJzfTzWw=",
      "requires": {
        "minimist": "^1.1.0"
      }
    },
    "p-defer": {
      "version": "1.0.0",
@@ -8138,6 +8506,33 @@
      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
      "dev": true
    },
    "pac-proxy-agent": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz",
      "integrity": "sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ==",
      "requires": {
        "agent-base": "^4.2.0",
        "debug": "^4.1.1",
        "get-uri": "^2.0.0",
        "http-proxy-agent": "^2.1.0",
        "https-proxy-agent": "^3.0.0",
        "pac-resolver": "^3.0.0",
        "raw-body": "^2.2.0",
        "socks-proxy-agent": "^4.0.1"
      }
    },
    "pac-resolver": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz",
      "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==",
      "requires": {
        "co": "^4.6.0",
        "degenerator": "^1.0.4",
        "ip": "^1.1.5",
        "netmask": "^1.0.6",
        "thunkify": "^2.1.2"
      }
    },
    "pako": {
      "version": "1.0.10",
@@ -8245,8 +8640,7 @@
    "path-is-absolute": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
      "dev": true
      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
    },
    "path-is-inside": {
      "version": "1.0.2",
@@ -8287,6 +8681,14 @@
          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
          "dev": true
        }
      }
    },
    "pause-stream": {
      "version": "0.0.11",
      "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
      "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
      "requires": {
        "through": "~2.3"
      }
    },
    "pbkdf2": {
@@ -8391,6 +8793,11 @@
      "requires": {
        "find-up": "^2.1.0"
      }
    },
    "platform": {
      "version": "1.3.6",
      "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
      "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="
    },
    "portfinder": {
      "version": "1.0.25",
@@ -8903,8 +9310,7 @@
    "prelude-ls": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
      "dev": true
      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
    },
    "prepend-http": {
      "version": "1.0.4",
@@ -8948,8 +9354,7 @@
    "process-nextick-args": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
      "dev": true
      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
    },
    "progress": {
      "version": "2.0.3",
@@ -8982,6 +9387,26 @@
        "forwarded": "~0.1.2",
        "ipaddr.js": "1.9.0"
      }
    },
    "proxy-agent": {
      "version": "3.1.1",
      "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz",
      "integrity": "sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw==",
      "requires": {
        "agent-base": "^4.2.0",
        "debug": "4",
        "http-proxy-agent": "^2.1.0",
        "https-proxy-agent": "^3.0.0",
        "lru-cache": "^5.1.1",
        "pac-proxy-agent": "^3.0.1",
        "proxy-from-env": "^1.0.0",
        "socks-proxy-agent": "^4.0.1"
      }
    },
    "proxy-from-env": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
    },
    "prr": {
      "version": "1.0.1",
@@ -9019,7 +9444,6 @@
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
      "dev": true,
      "requires": {
        "end-of-stream": "^1.1.0",
        "once": "^1.3.1"
@@ -9122,7 +9546,6 @@
      "version": "2.4.0",
      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
      "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
      "dev": true,
      "requires": {
        "bytes": "3.1.0",
        "http-errors": "1.7.2",
@@ -9160,7 +9583,6 @@
      "version": "2.3.6",
      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
      "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
      "dev": true,
      "requires": {
        "core-util-is": "~1.0.0",
        "inherits": "~2.0.3",
@@ -9503,7 +9925,6 @@
      "version": "2.7.1",
      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
      "dev": true,
      "requires": {
        "glob": "^7.1.3"
      }
@@ -9548,8 +9969,7 @@
    "safe-buffer": {
      "version": "5.1.2",
      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
      "dev": true
      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
    },
    "safe-regex": {
      "version": "1.1.0",
@@ -9563,14 +9983,12 @@
    "safer-buffer": {
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
      "dev": true
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
    },
    "sax": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
      "dev": true
      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
    },
    "schema-utils": {
      "version": "1.0.0",
@@ -9581,6 +9999,14 @@
        "ajv": "^6.1.0",
        "ajv-errors": "^1.0.0",
        "ajv-keywords": "^3.1.0"
      }
    },
    "sdk-base": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/sdk-base/-/sdk-base-2.0.1.tgz",
      "integrity": "sha1-ukAonovfJy7RHdnql+r5jgNtJMY=",
      "requires": {
        "get-ready": "~1.0.0"
      }
    },
    "seed-random": {
@@ -9606,8 +10032,7 @@
    "semver": {
      "version": "5.7.1",
      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
      "dev": true
      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
    },
    "send": {
      "version": "0.17.1",
@@ -9773,8 +10198,7 @@
    "setprototypeof": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
      "dev": true
      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
    },
    "sha.js": {
      "version": "2.4.11",
@@ -9846,6 +10270,11 @@
        "astral-regex": "^1.0.0",
        "is-fullwidth-code-point": "^2.0.0"
      }
    },
    "smart-buffer": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz",
      "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw=="
    },
    "snapdragon": {
      "version": "0.8.2",
@@ -10009,6 +10438,34 @@
          "dev": true,
          "requires": {
            "websocket-driver": ">=0.5.1"
          }
        }
      }
    },
    "socks": {
      "version": "2.3.3",
      "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz",
      "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==",
      "requires": {
        "ip": "1.1.5",
        "smart-buffer": "^4.1.0"
      }
    },
    "socks-proxy-agent": {
      "version": "4.0.2",
      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz",
      "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==",
      "requires": {
        "agent-base": "~4.2.1",
        "socks": "~2.3.2"
      },
      "dependencies": {
        "agent-base": {
          "version": "4.2.1",
          "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
          "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==",
          "requires": {
            "es6-promisify": "^5.0.0"
          }
        }
      }
@@ -10228,8 +10685,7 @@
    "statuses": {
      "version": "1.5.0",
      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
      "dev": true
      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
    },
    "stealthy-require": {
      "version": "1.1.1",
@@ -10275,6 +10731,11 @@
      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
      "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
      "dev": true
    },
    "stream-wormhole": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/stream-wormhole/-/stream-wormhole-1.1.0.tgz",
      "integrity": "sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew=="
    },
    "strict-uri-encode": {
      "version": "1.1.0",
@@ -10355,7 +10816,6 @@
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
      "dev": true,
      "requires": {
        "safe-buffer": "~5.1.0"
      }
@@ -10538,7 +10998,6 @@
      "version": "3.3.0",
      "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz",
      "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=",
      "dev": true,
      "requires": {
        "any-promise": "^1.0.0"
      }
@@ -10547,7 +11006,6 @@
      "version": "1.6.0",
      "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
      "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
      "dev": true,
      "requires": {
        "thenify": ">= 3.1.0 < 4"
      }
@@ -10571,8 +11029,7 @@
    "through": {
      "version": "2.3.8",
      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
      "dev": true
      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
    },
    "through2": {
      "version": "2.0.5",
@@ -10583,6 +11040,11 @@
        "readable-stream": "~2.3.6",
        "xtend": "~4.0.1"
      }
    },
    "thunkify": {
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz",
      "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0="
    },
    "thunky": {
      "version": "1.1.0",
@@ -10622,8 +11084,7 @@
    "to-arraybuffer": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
      "dev": true
      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
    },
    "to-fast-properties": {
      "version": "2.0.0",
@@ -10676,8 +11137,7 @@
    "toidentifier": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
      "dev": true
      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
    },
    "toposort": {
      "version": "1.0.7",
@@ -10740,7 +11200,6 @@
      "version": "0.3.2",
      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
      "dev": true,
      "requires": {
        "prelude-ls": "~1.1.2"
      }
@@ -10793,6 +11252,24 @@
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
          "dev": true
        }
      }
    },
    "unescape": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/unescape/-/unescape-1.0.1.tgz",
      "integrity": "sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==",
      "requires": {
        "extend-shallow": "^2.0.1"
      },
      "dependencies": {
        "extend-shallow": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
          "requires": {
            "is-extendable": "^0.1.0"
          }
        }
      }
    },
@@ -10875,8 +11352,7 @@
    "unpipe": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
      "dev": true
      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
    },
    "unquote": {
      "version": "1.1.1",
@@ -11002,6 +11478,43 @@
        "requires-port": "^1.0.0"
      }
    },
    "urllib": {
      "version": "2.36.1",
      "resolved": "https://registry.npmjs.org/urllib/-/urllib-2.36.1.tgz",
      "integrity": "sha512-g0Gh7bH5AwfPUzFetxPtJwumGHE6D7KQn0K68MwcJXPgO2K0AliwEIxLAwGMF+TpY75DYAsvz1h9ekagYoq33w==",
      "requires": {
        "any-promise": "^1.3.0",
        "content-type": "^1.0.2",
        "debug": "^2.6.9",
        "default-user-agent": "^1.0.0",
        "digest-header": "^0.0.1",
        "ee-first": "~1.1.1",
        "formstream": "^1.1.0",
        "humanize-ms": "^1.2.0",
        "iconv-lite": "^0.4.15",
        "ip": "^1.1.5",
        "proxy-agent": "^3.1.0",
        "pump": "^3.0.0",
        "qs": "^6.4.0",
        "statuses": "^1.3.1",
        "utility": "^1.16.1"
      },
      "dependencies": {
        "debug": {
          "version": "2.6.9",
          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
          "requires": {
            "ms": "2.0.0"
          }
        },
        "ms": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        }
      }
    },
    "use": {
      "version": "3.1.1",
      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
@@ -11028,8 +11541,7 @@
    "util-deprecate": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
      "dev": true
      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
    },
    "util.promisify": {
      "version": "1.0.0",
@@ -11046,6 +11558,18 @@
      "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
      "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
      "dev": true
    },
    "utility": {
      "version": "1.16.3",
      "resolved": "https://registry.npmjs.org/utility/-/utility-1.16.3.tgz",
      "integrity": "sha512-kYghm8fknkPkUd9ncODj/b2Zojc23gnRC29QmpmL3BBsSX6W++RNRTQ1tB7l0UA7d4SisIjUyvRfVET3lBwurw==",
      "requires": {
        "copy-to": "^2.0.1",
        "escape-html": "^1.0.3",
        "mkdirp": "^0.5.1",
        "mz": "^2.7.0",
        "unescape": "^1.0.1"
      }
    },
    "utils-merge": {
      "version": "1.0.1",
@@ -11592,6 +12116,14 @@
      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
      "dev": true
    },
    "win-release": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz",
      "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=",
      "requires": {
        "semver": "^5.0.1"
      }
    },
    "wmf": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz",
@@ -11600,8 +12132,7 @@
    "wordwrap": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
      "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
      "dev": true
      "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
    },
    "worker-farm": {
      "version": "1.7.0",
@@ -11639,8 +12170,7 @@
    "wrappy": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
      "dev": true
      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
    },
    "write": {
      "version": "1.0.3",
@@ -11682,6 +12212,25 @@
        }
      }
    },
    "xml2js": {
      "version": "0.4.23",
      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
      "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
      "requires": {
        "sax": ">=0.6.0",
        "xmlbuilder": "~11.0.0"
      }
    },
    "xmlbuilder": {
      "version": "11.0.1",
      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
      "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
    },
    "xregexp": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz",
      "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM="
    },
    "xss": {
      "version": "1.0.6",
      "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.6.tgz",
@@ -11694,8 +12243,7 @@
    "xtend": {
      "version": "4.0.2",
      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
      "dev": true
      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
    },
    "y18n": {
      "version": "4.0.0",
@@ -11706,8 +12254,7 @@
    "yallist": {
      "version": "3.1.1",
      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
      "dev": true
      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
    },
    "yargs": {
      "version": "13.3.0",
package.json
@@ -14,6 +14,7 @@
    "@fullcalendar/moment": "^4.4.0",
    "@fullcalendar/timegrid": "^4.4.0",
    "@fullcalendar/vue": "^4.4.0",
    "ali-oss": "^6.11.2",
    "axios": "^0.19.0",
    "core-js": "^3.3.2",
    "crypto": "^1.0.1",
src/apis/coursewareSource/index.js
New file
@@ -0,0 +1,4 @@
import { axios } from "../../assets/js/axios";
const stsUrl = "https://testresource.anniekids.com/Api/v1/Resources/getSts";
const getSTS = () => axios.get(stsUrl);
export { getSTS };
src/assets/js/aliOss.js
New file
@@ -0,0 +1,14 @@
//Client.js
const OSS = require("ali-oss");
export const Client = (data) => {
  //后端提供数据
  return new OSS({
    region: data.region, //oss-cn-beijing-internal.aliyuncs.com
    accessKeyId: data.accessKeyId,
    secure: true,
    accessKeySecret: data.accessKeySecret,
    stsToken: data.stsToken,
    bucket: data.bucket,
  });
};
src/assets/js/axios.js
@@ -3,140 +3,140 @@
 * @Date: 2019-11-21 16:45:00
 * @description: 普通接口请求
 */
import axios from 'axios'
import qs from 'qs'
import {
    Loading,
    Message
} from 'element-ui';
import md5 from 'js-md5';
let Base64 = require('js-base64').Base64;
import {
    Utils
} from './utils'
import router from '../../router'
import store from '@/store'
import axios from "axios";
import qs from "qs";
import { Loading, Message } from "element-ui";
import md5 from "js-md5";
let Base64 = require("js-base64").Base64;
import { Utils } from "./utils";
import router from "../../router";
import store from "@/store";
let utils = new Utils();
import cookie from 'js-cookie'
import cookie from "js-cookie";
// 响应时间
axios.defaults.timeout = 60000;
// 配置请求头
axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
axios.defaults.headers["Content-Type"] =
  "application/x-www-form-urlencoded;charset=UTF-8";
// axios.defaults.withCredentials = 'true';
// baseUrl
// baseUrl
let baseURL;
// 地址待更换
if (window.location.host === 'class.anniekids.com') {
    // 线上
    baseURL = 'https://portalapi.anniekids.com';
if (window.location.host === "class.anniekids.com") {
  // 线上
  baseURL = "https://portalapi.anniekids.com";
} else {
    baseURL = 'https://testportalapi.anniekids.com';
  baseURL = "https://testportalapi.anniekids.com";
}
axios.defaults.baseURL = baseURL;
let loading = '';
let loading = "";
// 获取userId
let userId = '';
let userId = "";
// POST传参序列化(添加请求拦截器)
axios.interceptors.request.use((config) => {
axios.interceptors.request.use(
  (config) => {
    // 获取 ANNIEKIDSUSS
    // let ANNIEKIDSUSS = utils.getCookie("ANNIEKIDSUSS");
    let ANNIEKIDSUSS = cookie.get('ANNIEKIDSUSS');
    ANNIEKIDSUSS ? config.headers['ANNIEKIDSUSS'] = ANNIEKIDSUSS : '';
    userId = localStorage.getItem('annieUser') ? JSON.parse(utils.decrypt(localStorage.getItem('annieUser'))).userId : '';
    let ANNIEKIDSUSS = cookie.get("ANNIEKIDSUSS");
    ANNIEKIDSUSS ? (config.headers["ANNIEKIDSUSS"] = ANNIEKIDSUSS) : "";
    userId = localStorage.getItem("annieUser")
      ? JSON.parse(utils.decrypt(localStorage.getItem("annieUser"))).userId
      : "";
    loading = Loading.service({
        lock: true,
        text: '加载中...',
        spinner: 'el-icon-loading',
        background: 'rgba(255,255,255,0.7)',
        customClass: 'request-loading'
      lock: true,
      text: "加载中...",
      spinner: "el-icon-loading",
      background: "rgba(255,255,255,0.7)",
      customClass: "request-loading",
    });
    if (config.method === 'post') {
        config.data = {
            time: parseInt((new Date()).getTime() / 1000),
            SystemType: 2,
            userId,
            ...config.data
        };
        let sort = utils.getSign(config.data); //排序
        let filtered = utils.splitParam(sort); // 转小写
        let signed = filtered + '&annieportalkey=0f977b6090bc11e89de47ef7fbe91ebc';
        config.data.signature = Base64.encode(md5(signed));
        config.data = qs.stringify(config.data);
    } else if (config.method === 'get') {
        config.params = {
            time: parseInt((new Date()).getTime() / 1000),
            SystemType: 2,
            userId,
            ...config.params
        };
        let sort = utils.getSign(config.params); //排序
        let filtered = utils.splitParam(sort); // 转小写
        let signed = filtered + '&annieportalkey=0f977b6090bc11e89de47ef7fbe91ebc';
    if (config.method === "post") {
      config.data = {
        time: parseInt(new Date().getTime() / 1000),
        SystemType: 2,
        userId,
        ...config.data,
      };
      let sort = utils.getSign(config.data); //排序
      let filtered = utils.splitParam(sort); // 转小写
      let signed =
        filtered + "&annieportalkey=0f977b6090bc11e89de47ef7fbe91ebc";
      config.data.signature = Base64.encode(md5(signed));
      config.data = qs.stringify(config.data);
    } else if (config.method === "get") {
      config.params = {
        time: parseInt(new Date().getTime() / 1000),
        SystemType: 2,
        userId,
        ...config.params,
      };
      let sort = utils.getSign(config.params); //排序
      let filtered = utils.splitParam(sort); // 转小写
      let signed =
        filtered + "&annieportalkey=0f977b6090bc11e89de47ef7fbe91ebc";
        config.params.signature = Base64.encode(md5(signed));
      config.params.signature = Base64.encode(md5(signed));
    }
    return config
}, (error) => {
    console.log('错误的传参', 'fail')
    return Promise.reject(error)
});
    return config;
  },
  (error) => {
    console.log("错误的传参", "fail");
    return Promise.reject(error);
  }
);
// 返回状态判断(添加响应拦截器)
axios.interceptors.response.use(response => {
axios.interceptors.response.use(
  (response) => {
    loading.close();
    let reqUrl = '/api/v1/login';
    let reqUrl = "/api/v1/login";
    // 这个根据后台返回的状态码判断token有没有过期,若过期,跳到登录页面
    if (response.data.code === 1013) {
        localStorage.removeItem("annieUser");
        sessionStorage.removeItem('error');
        if (cookie.get('ANNIEKIDSUSS')) {
            if (window.location.host.includes('anniekids')) {
                cookie.remove('ANNIEKIDSUSS', {
                    domain: 'anniekids.com'
                });
            } else {
                cookie.remove('ANNIEKIDSUSS');
            }
      localStorage.removeItem("annieUser");
      sessionStorage.removeItem("error");
      if (cookie.get("ANNIEKIDSUSS")) {
        if (window.location.host.includes("anniekids")) {
          cookie.remove("ANNIEKIDSUSS", {
            domain: "anniekids.com",
          });
        } else {
          cookie.remove("ANNIEKIDSUSS");
        }
        router.push({
            path: '/login'
        });
      }
      router.push({
        path: "/login",
      });
    } else if (
        (response.config.url.indexOf(reqUrl) === -1) &&
        response.data.code === 0
      response.config.url.indexOf(reqUrl) === -1 &&
      response.data.code === 0
    ) {
        Message({
            message: response.data.msg,
            type: 'error',
            duration: 2000
        })
      Message({
        message: response.data.msg,
        type: "error",
        duration: 2000,
      });
    } else if (response.data.code === 1012) {
        store.dispatch('common/setError', response.data.msg);
        this.$router.push({
            path: '/error'
        });
      store.dispatch("common/setError", response.data.msg);
      this.$router.push({
        path: "/error",
      });
    }
    return response.data
}, error => {
    return response.data;
  },
  (error) => {
    // Do something with response error
    loading.close();
    console.warn('axios response error')
    const {
        config,
        code,
        message
    } = error;
    if (code === 'ECONNABORTED' || message === 'Network Error') { // 请求超时
        store.dispatch('common/setNetTimeOut', true);
    console.warn("axios response error");
    const { config, code, message } = error;
    if (code === "ECONNABORTED" || message === "Network Error") {
      // 请求超时
      store.dispatch("common/setNetTimeOut", true);
    }
    return Promise.reject(error)
})
    return Promise.reject(error);
  }
);
export {
    axios
}
export { axios };
src/assets/js/methods.js
@@ -3,101 +3,101 @@
 * @Date: 2019-11-21 16:45:01
 * @description: 添加vue原型方法
 */
import {
    axios
} from './axios'
import {
    uploadInstance
} from './uploadInstance'
import {
    MessageBox
} from 'element-ui';
import components from '../../components/common'
import { axios } from "./axios";
import { uploadInstance } from "./uploadInstance";
import { MessageBox } from "element-ui";
import components from "../../components/common";
class Methods {
    constructor() {
        this.domainUrl = "";
    }
    install(Vue, options) {
        this.installPrototype(Vue);
        this.installComponent(Vue);
    }
    // *----------------添加vue实例方法---------------------*
    installPrototype(Vue) {
        Vue.prototype.domainUrl = this.domainUrl;
        Vue.prototype.isEmpty = value => {
            if (
                value === null ||
                value === undefined ||
                value === "null" ||
                value === "undefined" ||
                value === ""
            ) {
                return true;
            } else {
                return false;
            }
        };
        /**
         * 封装弹窗提示
         * @param {String} content tipContent
         * @param {String} title title
         */
        Vue.prototype.tip = (content, title) => {
            MessageBox({
                title: title ? title : '提示',
                message: content,
                showCancelButton: false,
                showConfirmButton: false,
                type: "",
                $type: 'confirm',
                callback: actiion => {}
            });
        };
        /**
         * get请求
         * @param url
         * @param data
         * @returns {Promise.<TResult>}
         */
        Vue.prototype.get = (url, data) => {
            return new Promise((resolve, reject) => {
                axios.get(url, {
                    params: data
                }).then(response => {
                    resolve(response.data)
                }).catch((error) => {
                    reject(error)
                })
            })
        };
        /**
         * post请求
         * @param url
         * @param data
         * @returns {Promise.<TResult>}
         */
        Vue.prototype.post = (url, data) => {
            return new Promise((resolve, reject) => {
                axios.post(url, data)
                    .then(response => {
                        resolve(response.data)
                    }).catch((error) => {
                        reject(error)
                    })
            })
        };
        /**
         * 上传文件
         */
        Vue.prototype.instance = uploadInstance;
    }
    /*------------------全局注册组件方法------------------*/
    installComponent(Vue) {
        // 可以在此注册全局组件
        Object.keys(components).forEach((key) => {
            Vue.component(key, components[key]);
        })
    }
  constructor() {
    this.domainUrl = "";
  }
  install(Vue, options) {
    this.installPrototype(Vue);
    this.installComponent(Vue);
  }
  // *----------------添加vue实例方法---------------------*
  installPrototype(Vue) {
    Vue.prototype.domainUrl = this.domainUrl;
    Vue.prototype.isEmpty = (value) => {
      if (
        value === null ||
        value === undefined ||
        value === "null" ||
        value === "undefined" ||
        value === ""
      ) {
        return true;
      } else {
        return false;
      }
    };
    /**
     * 封装弹窗提示
     * @param {String} content tipContent
     * @param {String} title title
     */
    Vue.prototype.tip = (content, title) => {
      MessageBox({
        title: title ? title : "提示",
        message: content,
        showCancelButton: false,
        showConfirmButton: false,
        type: "",
        $type: "confirm",
        callback: (actiion) => {},
      });
    };
    /**
     * get请求
     * @param url
     * @param data
     * @returns {Promise.<TResult>}
     */
    Vue.prototype.get = (url, data) => {
      return new Promise((resolve, reject) => {
        axios
          .get(url, {
            params: data,
          })
          .then((response) => {
            resolve(response.data);
          })
          .catch((error) => {
            reject(error);
          });
      });
    };
    /**
     * post请求
     * @param url
     * @param data
     * @returns {Promise.<TResult>}
     */
    Vue.prototype.post = (url, data) => {
      return new Promise((resolve, reject) => {
        axios
          .post(url, data)
          .then((response) => {
            resolve(response.data);
          })
          .catch((error) => {
            reject(error);
          });
      });
    };
    /**
     * 上传文件
     */
    Vue.prototype.instance = uploadInstance;
  }
  /*------------------全局注册组件方法------------------*/
  installComponent(Vue) {
    // 可以在此注册全局组件
    Object.keys(components).forEach((key) => {
      console.log(key, "key");
      Vue.component(key, components[key]);
    });
  }
}
export default new Methods()
export default new Methods();
src/assets/js/utils.js
@@ -3,228 +3,302 @@
 * @Date: 2019-11-21 16:45:01
 * @description: 工具文件
 */
import md5 from 'js-md5';
let Base64 = require('js-base64').Base64;
import crypto from 'crypto'
import md5 from "js-md5";
import { Client } from "@/assets/js/aliOss";
let Base64 = require("js-base64").Base64;
import crypto from "crypto";
class Utils {
    constructor() {}
    /**
     * 随机数字+字母函数
     * @param {Number} len 传入出多少位的随机数
     */
    getRandomAlphaNum(len) {
        var rdmString = "";
        for (; rdmString.length < len; rdmString += Math.random().toString(36).substr(2));
        return rdmString.substr(0, len);
    }
  constructor() {}
  /**
   * 随机数字+字母函数
   * @param {Number} len 传入出多少位的随机数
   */
  getRandomAlphaNum(len) {
    var rdmString = "";
    for (
      ;
      rdmString.length < len;
      rdmString += Math.random()
        .toString(36)
        .substr(2)
    );
    return rdmString.substr(0, len);
  }
    /**
     * 去除字符串空格
     * @param {String} str
     */
    removeAllSpace(str) {
        str = str + '';
        return str.replace(/\s+/g, "");
  /**
   * 去除字符串空格
   * @param {String} str
   */
  removeAllSpace(str) {
    str = str + "";
    return str.replace(/\s+/g, "");
  }
  /**
   * 生成签名函数
   * @param {*} params
   *
   *
   */
  getSign(params) {
    if (typeof params == "string") {
      return this.paramsStrSort(params);
    } else if (typeof params == "object") {
      var arr = [];
      for (var i in params) {
        arr.push(i + "=" + params[i]);
      }
      return this.paramsStrSort(arr.join("&"));
    }
    /**
     * 生成签名函数
     * @param {*} params
     *
     *
     */
    getSign(params) {
        if (typeof params == "string") {
            return this.paramsStrSort(params);
        } else if (typeof params == "object") {
            var arr = [];
            for (var i in params) {
                arr.push((i + "=" + params[i]));
            }
            return this.paramsStrSort(arr.join(("&")));
        }
    }
    /**
     * 排序
     * @param {*} paramsStr
     */
    paramsStrSort(paramsStr) {
        var urlStr = paramsStr.split("&").sort().join("&");
        return urlStr;
    }
    /**
     *
     * @param {Object} uploadData 需要加密的sign参数
     * @param {Object} file 当前file对象
     */
    fnUploadPara(uploadData, file) {
        let sign = Base64.encode(md5(this.getSign(uploadData)));
        uploadData.sign = sign;
        let formData = new FormData();
        formData.append('file', file);
        Object.keys(uploadData).forEach(item => {
            formData.append(item, uploadData[item])
        });
        return formData;
  }
    }
    /**
     *
     * @param {Object} obj 传入的参数对象
     */
    filterParams(obj) {
        let filterObj = {};
        for (let k in obj) {
            if (typeof (obj[k]) !== 'object') {
                filterObj[k.toLocaleLowerCase()] = obj[k];
            }
  //
  /**
   * 阿里云上传
   * @param {*} filename //文件名称
   * @param {*} file //文件
   * @param {*} params //oss参数sts授权参数
   * @param {*} vm //vue对象
   */
  updateAliOSS(filename, file, params, vm) {
    let client = Client(params);
    client
      .multipartUpload(filename, file, {
        progress: function(p, checkpoint) {
          option.onProgress({ percent: Math.floor(p * 100) }); // 触发el-upload组件的onProgress方法
        },
      })
      .then(({ res }) => {
        if (res.statusCode === 200) {
          // option.onSuccess(ret)
          vm.disabled = false;
          vm.showList.push(res);
          return res.requestUrls;
        } else {
          vm.disabled = false;
          option.onError("上传失败");
        }
        return filterObj;
    }
    /**
     * 分割字符串
     * @param {*} para
     */
    splitParam(para) {
        let arr = para.split("&");
        let allArr = [];
        arr.forEach(item => {
            let keyArr = [];
            let index = item.indexOf('=');
            keyArr = [item.substring(0,index), item.substring(index+1,item.length)];
            if (typeof (keyArr[1]) !== 'object') {
                keyArr[0] = keyArr[0].toLocaleLowerCase();
                keyArr[1] = keyArr[1].toLocaleLowerCase();
                allArr.push(keyArr.join("="));
            }
        });
        return allArr.join("&");
    }
    /**
     * 获取当前高亮导航
     * @param {Object} menus 所有导航
     * @param {String} menuPath 当前路径path
     */
    getCurrentTab(menus, menuPath) {
        let currentNav = {};
        const random = (menus, menuPath) => {
            for (let i = 0; i < menus.length; i++) {
                let item = menus[i];
                if (menuPath.indexOf(item.WebUrl) > -1) {
                    currentNav = item;
                    break;
                }
                random(item.son, menuPath);
            }
        }
        random(menus, menuPath);
        return currentNav;
    }
    /**
     * 表单必填项校验
     * @param {Object} verifyObj 需要校验的对象
     * @param {Object} dataObj 控制错误提示对象
     */
    handleRequired(verifyObj, dataObj) {
        let flag = '-1';
        for (let k in verifyObj) {
            if (Object.prototype.toString.call(verifyObj[k]) == "[object Object]" &&
                !Object.keys(verifyObj[k]).length) {
                dataObj[k] = true;
            } else if (Object.prototype.toString.call(verifyObj[k]) == "[object Array]" &&
                !verifyObj[k].length) {
                dataObj[k] = true;
      })
      .catch((error) => {
        client
          .put(filename, file, {
            progress: function(p, checkpoint) {
              vm.$refs["upload"].onProgress({
                percent: Math.floor(p * 100),
              });
              option.onProgress({ percent: Math.floor(p * 100) }); // 触发el-upload组件的onProgress方法
            },
          })
          .then(({ res }) => {
            if (res.statusCode == 200) {
              vm.disabled = false;
              vm.showList.push(res);
            } else {
                dataObj[k] = this.removeAllSpace(verifyObj[k]).toString() ? false : true;
              vm.disabled = false;
              option.onError("上传失败");
            }
            if (dataObj[k]) {
                flag = k;
            }
          });
      });
  }
  /**
   * 排序
   * @param {*} paramsStr
   */
  paramsStrSort(paramsStr) {
    var urlStr = paramsStr
      .split("&")
      .sort()
      .join("&");
    return urlStr;
  }
  /**
   *
   * @param {Object} uploadData 需要加密的sign参数
   * @param {Object} file 当前file对象
   */
  fnUploadPara(uploadData, file) {
    let sign = Base64.encode(md5(this.getSign(uploadData)));
    uploadData.sign = sign;
    let formData = new FormData();
    formData.append("file", file);
    Object.keys(uploadData).forEach((item) => {
      formData.append(item, uploadData[item]);
    });
    return formData;
  }
  /**
   *
   * @param {Object} obj 传入的参数对象
   */
  filterParams(obj) {
    let filterObj = {};
    for (let k in obj) {
      if (typeof obj[k] !== "object") {
        filterObj[k.toLocaleLowerCase()] = obj[k];
      }
    }
    return filterObj;
  }
  /**
   * 分割字符串
   * @param {*} para
   */
  splitParam(para) {
    let arr = para.split("&");
    let allArr = [];
    arr.forEach((item) => {
      let keyArr = [];
      let index = item.indexOf("=");
      keyArr = [
        item.substring(0, index),
        item.substring(index + 1, item.length),
      ];
      if (typeof keyArr[1] !== "object") {
        keyArr[0] = keyArr[0].toLocaleLowerCase();
        keyArr[1] = keyArr[1].toLocaleLowerCase();
        allArr.push(keyArr.join("="));
      }
    });
    return allArr.join("&");
  }
  /**
   * 获取当前高亮导航
   * @param {Object} menus 所有导航
   * @param {String} menuPath 当前路径path
   */
  getCurrentTab(menus, menuPath) {
    let currentNav = {};
    const random = (menus, menuPath) => {
      for (let i = 0; i < menus.length; i++) {
        let item = menus[i];
        if (menuPath.indexOf(item.WebUrl) > -1) {
          currentNav = item;
          break;
        }
        return flag;
    }
    /**
     * 加密
     * @param {*} data
     */
    encrypt(data) {
        let key = 'anniekids2020051';
        let iv = '1221993112812340';
        let cipher = crypto.createCipheriv('aes-128-cbc', key, iv);
        let crypted = cipher.update(data, 'utf8', 'binary');
        crypted += cipher.final('binary');
        crypted = new Buffer(crypted, 'binary').toString('base64');
        return crypted;
    }
    /**
     * 解密aes
     * @param {*} crypted
     */
    decrypt(crypted) {
        let key = 'anniekids2020051';
        let iv = '1221993112812340';
        crypted = new Buffer(crypted, 'base64').toString('binary');
        let decipher = crypto.createDecipheriv('aes-128-cbc', key, iv);
        let decoded = decipher.update(crypted, 'binary', 'utf8');
        decoded += decipher.final('utf8');
        return decoded;
    }
    /**
     * 设置cookie
     * @param {*} key
     * @param {*} val
     */
    setCookie(key, val, domain = '') {
        let cdata = key + '=' + val + ';domain=' + domain;
        let d = new Date();
        d.setTime(d.getTime() + 32 * 60 * 60 * 1000);
        cdata += '; expires=' + d.toGMTString();
        document.cookie = cdata;
    }
    /**
     * 获取cookie
     * @param {*} key
     */
    getCookie(key) {
        if (document.cookie.length > 0) {
            let begin = document.cookie.indexOf(key + "=");
            if (begin !== -1) {
                begin += key.length + 1;
                let end = document.cookie.indexOf(";", begin);
                if (end === -1) end = document.cookie.length;
                return unescape(document.cookie.substring(begin, end));
            }
        }
        return null;
    }
    /**
     * 删除cookie
     * @param {*} key
     */
    delCookie(key, domain = '') {
        let exp = new Date()
        exp.setTime(exp.getTime() - 1)
        let cval = this.getCookie(key)
        if (cval != null) {
            document.cookie = domain ?
                key + '=' + cval + ';domain=' + domain + ';expires=' + exp.toGMTString() :
                key + '=' + cval + ';expires=' + exp.toGMTString()
        }
    }
    controlUrl = value => {
        if(!value) return '';
        let url = "http://ossfile.anniekids.com";
        if (value.startsWith("/test") || value.startsWith("/reso") || value.startsWith("/resn") || value.startsWith("/norm")) {
            url = "http://mpfile.anniekids.com";
        }
        return url;
    }
        random(item.son, menuPath);
      }
    };
    random(menus, menuPath);
    return currentNav;
  }
  /**
   * 表单必填项校验
   * @param {Object} verifyObj 需要校验的对象
   * @param {Object} dataObj 控制错误提示对象
   */
  handleRequired(verifyObj, dataObj) {
    let flag = "-1";
    for (let k in verifyObj) {
      if (
        Object.prototype.toString.call(verifyObj[k]) == "[object Object]" &&
        !Object.keys(verifyObj[k]).length
      ) {
        dataObj[k] = true;
      } else if (
        Object.prototype.toString.call(verifyObj[k]) == "[object Array]" &&
        !verifyObj[k].length
      ) {
        dataObj[k] = true;
      } else {
        dataObj[k] = this.removeAllSpace(verifyObj[k]).toString()
          ? false
          : true;
      }
      if (dataObj[k]) {
        flag = k;
      }
    }
    return flag;
  }
  /**
   * 加密
   * @param {*} data
   */
  encrypt(data) {
    let key = "anniekids2020051";
    let iv = "1221993112812340";
    let cipher = crypto.createCipheriv("aes-128-cbc", key, iv);
    let crypted = cipher.update(data, "utf8", "binary");
    crypted += cipher.final("binary");
    crypted = new Buffer(crypted, "binary").toString("base64");
    return crypted;
  }
  /**
   * 解密aes
   * @param {*} crypted
   */
  decrypt(crypted) {
    let key = "anniekids2020051";
    let iv = "1221993112812340";
    crypted = new Buffer(crypted, "base64").toString("binary");
    let decipher = crypto.createDecipheriv("aes-128-cbc", key, iv);
    let decoded = decipher.update(crypted, "binary", "utf8");
    decoded += decipher.final("utf8");
    return decoded;
  }
  /**
   * 设置cookie
   * @param {*} key
   * @param {*} val
   */
  setCookie(key, val, domain = "") {
    let cdata = key + "=" + val + ";domain=" + domain;
    let d = new Date();
    d.setTime(d.getTime() + 32 * 60 * 60 * 1000);
    cdata += "; expires=" + d.toGMTString();
    document.cookie = cdata;
  }
  /**
   * 获取cookie
   * @param {*} key
   */
  getCookie(key) {
    if (document.cookie.length > 0) {
      let begin = document.cookie.indexOf(key + "=");
      if (begin !== -1) {
        begin += key.length + 1;
        let end = document.cookie.indexOf(";", begin);
        if (end === -1) end = document.cookie.length;
        return unescape(document.cookie.substring(begin, end));
      }
    }
    return null;
  }
  /**
   * 删除cookie
   * @param {*} key
   */
  delCookie(key, domain = "") {
    let exp = new Date();
    exp.setTime(exp.getTime() - 1);
    let cval = this.getCookie(key);
    if (cval != null) {
      document.cookie = domain
        ? key +
          "=" +
          cval +
          ";domain=" +
          domain +
          ";expires=" +
          exp.toGMTString()
        : key + "=" + cval + ";expires=" + exp.toGMTString();
    }
  }
  controlUrl = (value) => {
    if (!value) return "";
    let url = "http://ossfile.anniekids.com";
    if (
      value.startsWith("/test") ||
      value.startsWith("/reso") ||
      value.startsWith("/resn") ||
      value.startsWith("/norm")
    ) {
      url = "http://mpfile.anniekids.com";
    }
    return url;
  };
}
export {
    Utils
}
export { Utils };
src/components/coursewareSource/AliFileUpdate.vue
New file
@@ -0,0 +1,274 @@
<template>
  <!--在此处添加渲染的内容-->
  <div class="upload-wrapper">
    <div class="upload-box fl mr-20">
      <el-upload
        class="upload-demo"
        ref="upload"
        :before-upload="beforeUpload"
        :on-success="handleSuccess"
        :show-file-list="false"
        :http-request="handleHttpRequest"
        :headers="uploadHeaders"
        :limit="files"
        :disabled="disabled"
        action=""
        :file-list="fileList"
      >
        <el-button type="primary" size="small" icon="el-icon-upload"
          >上传</el-button
        >
      </el-upload>
    </div>
    <!-- 上传loading -->
    <!-- 图片预览 -->
    <el-dialog title="预览" :visible.sync="imgVisible">
      <img
        class="auto"
        style="display: block; margin: 0 auto"
        :src="bigImgUrl"
        alt=""
      />
    </el-dialog>
    <!-- imgList -->
    <div class="imgList fl" v-if="dataType == 1">
      <div
        class="imgItem fl ml-10"
        v-for="item in showList"
        :key="JSON.stringify(item)"
        @click="preView(item.requestUrls)"
      >
        <img style="width: 70px; height: 50px" :src="item.requestUrls" alt="" />
      </div>
    </div>
    <!-- audioList -->
    <div class="audioList fl" v-if="dataType == 2">
      <div
        class="audioItem fl"
        v-for="(item, index) in showList"
        :key="JSON.stringify(item + index)"
      >
        <audio :src="item.requestUrls" controls></audio>
        <img
          src="@/assets/images/deleteImg.png"
          alt
          class="delete deImg"
          @click="delAudio(index)"
        />
      </div>
    </div>
    <!-- videoList -->
    <div class="videoList fl" v-if="dataType == 3">
      <div
        class="videoItem fl"
        v-for="(item, index) in showList"
        :key="JSON.stringify(item + index)"
      >
        <video
          style="width: 200px; height: 100px"
          :src="item.requestUrls"
          controls
        ></video>
        <img src="@/assets/images/deleteImg.png" alt />
      </div>
    </div>
  </div>
</template>
<script type="text/ecmascript-6">
import { Client } from "@/assets/js/aliOss";
import { getSTS } from "@/apis/coursewareSource/index";
import { Utils } from "@/assets/js/utils";
const utils = new Utils();
//将渲染的内容导出
export default {
  props: {
    dataType: {
      type: String,
      default: "1",
    },
  },
  data() {
    return {
      region: "oss-cn-hangzhou",
      bucket: "annnieminiprogram", //这里选择OSS容器
      percentage: 0,
      url: "https://testresource.anniekids.com/Api/v1/Resources/getSts", //后台获取token地址
      ClientObj: null,
      showList: [],
      dataObj: {},
      imgVisible: false,
      expiration: "",
      fileList: [],
      bigImgUrl: "",
      files: 10,
      uploadHeaders: {
        authorization: "*",
      },
      disabled: false,
    };
  },
  methods: {
    getDate() {
      const date = new Date(),
        year = date.getFullYear(),
        month =
          date.getMonth() > 9 ? date.getMonth() + 1 : `0${date.getMonth() + 1}`,
        day = date.getDate() > 9 ? date.getDate() : `0${date.getDate()}`,
        hh = date.getHours() > 9 ? date.getHours() : `0${date.getHours()}`,
        mm =
          date.getMinutes() > 9 ? date.getMinutes() : `0${date.getMinutes()}`;
      return `${year}${month}${day}${hh}${mm}`;
    },
    handlePeogress(event, file, fileList) {
      console.log(event, file, fileList, "文件正在上传");
    },
    delAudio(index) {
      console.log(this.getDate(), "时间");
    },
    //图片预览
    preView(url) {
      // 弹窗预览
      this.bigImgUrl = url;
      this.imgVisible = true;
      //页面预览
      // let { href } = this.$router.resolve({
      //   path: `/business/feedback/checkImg?imgUrl=${url}`,
      //   query: { imgUrl: url },
      // });
      // window.open(href, "_blank");
    },
    //获取ststoken
    getAliToken() {
      //获取Token
      let uploadUrl = "/Api/v1/Resources/getSts";
      let cid = 0;
      let fileObj = {};
      return new Promise((resolve, reject) => {
        this.instance
          .get(uploadUrl)
          .then((res) => {
            if (res.status === 200) {
              const {
                expiration,
                AccessKeyId,
                AccessKeySecret,
                SecurityToken,
              } = res.data;
              this.expiration = expiration;
              this.dataObj = {
                region: this.region,
                bucket: this.bucket,
                accessKeyId: AccessKeyId,
                accessKeySecret: AccessKeySecret,
                stsToken: SecurityToken,
              };
              resolve(true);
            } else {
              reject(false);
            }
          })
          .catch((err) => {
            console.log(err);
            reject(false);
          });
      });
    },
    //上传文件前验证文件格式
    beforeUpload(file) {
      return new Promise((resolve, reject) => {
        let fileExtend = file.name
          .substring(file.name.lastIndexOf("."))
          .toLowerCase();
        let rulefileExtend = [];
        switch (this.dataType) {
          case "1":
            rulefileExtend = [".jpeg", ".jpg", ".png", ".gif"];
            break;
          case "2":
            rulefileExtend = [".mp3"];
            break;
          case "3":
            rulefileExtend = [".mp4"];
        }
        if (rulefileExtend.indexOf(fileExtend) === -1) {
          this.$message.error("文件格式有误");
          reject(false);
        } else {
          // 判断大小
          if (this.dataType == "1") {
            let isLt100M = file.size / 1024 / 1024 <= 5;
            if (!isLt100M) {
              this.$message.error("图片文件大小不超过5M!");
              reject(false);
            }
          }
          this.getAliToken()
            .then((response) => {
              if (response) {
                resolve(response);
              } else {
                reject(response);
              }
            })
            .catch((err) => {
              console.log(err);
              reject(err);
            });
        }
      });
    },
    //上传阿里云
    handleHttpRequest(option) {
      let vueObject = this;
      //随机命名
      let random_name =
        this.random_string(6) +
        "_" +
        new Date().getTime() +
        "." +
        option.file.name.split(".").pop();
      random_name = "test/" + random_name;
      utils.updateAliOSS(random_name, option.file, this.dataObj, vueObject);
    },
    handleSuccess(response, file, fileList) {
      console.log("上传完成", fileList);
    },
    // 随机生成文件名
    random_string(len) {
      len = len || 32;
      let chars = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz12345678",
        maxPos = chars.length,
        pwd = "";
      for (let i = 0; i < len; i++) {
        pwd += chars.charAt(Math.floor(Math.random() * maxPos));
      }
      return pwd;
    },
  },
  watch: {
    url(val) {
      if (val) {
        this.urls.push(val);
      }
    },
    dataType: function (newValue, oldValue) {
      this.showList = [];
    },
  },
  components: {},
  computed: {},
  created() {},
  mounted() {
    this.random_string(7);
  },
};
</script>
<style scoped>
/**渲染内容的样式**/
</style>
src/views/coursewareSource/sourceManage/SourceClassify.vue
@@ -1,10 +1,14 @@
<template>
    <div class="source">
        资源分类
    </div>
  <div class="source">
    <AliFileUpdate />
  </div>
</template>
<script>
import AliFileUpdate from "@/components/coursewareSource/AliFileUpdate";
export default {
    name: 'SourceClassify',
}
  name: "SourceClassify",
  components: {
    AliFileUpdate,
  },
};
</script>
src/views/coursewareSource/sourceManage/SourceList.vue
@@ -1,10 +1,69 @@
<template>
    <div class="source">
        资源管理
  <div class="source">
    <div class="s-query">
      <bread-crumb :breadList="breadList"></bread-crumb>
      <div class="top-bar mb-20">
        <ul class="bar-ul">
          <li class="active">资源管理</li>
          <li @click="jump('2')">资源分类</li>
        </ul>
      </div>
      <li class="wd-300" style="float: right">
        <el-select v-model="selectType">
          <el-option
            v-for="item in options"
            :key="item.value"
            :label="item.label"
            :value="item.value"
          >
          </el-option>
        </el-select>
      </li>
      <AliFileUpdate :dataType="selectType" />
    </div>
  </div>
</template>
<script>
import AliFileUpdate from "../../../components/coursewareSource/AliFileUpdate";
export default {
    name: 'SourceList',
}
  name: "SourceList",
  components: {
    AliFileUpdate,
  },
  data() {
    return {
      breadList: [
        {
          bread_name: "资源管理",
          bread_url: "",
        },
      ],
      selectType: "1",
      options: [
        {
          value: "1",
          label: "图片",
        },
        {
          value: "2",
          label: "音频",
        },
        {
          value: "3",
          label: "视频",
        },
      ],
    };
  },
  methods: {
    jump(index) {
      switch (index) {
        case "2":
          this.$router.push({
            path: "/courseware/source/classify",
          });
      }
    },
  },
};
</script>
src/views/coursewareSource/sourceManage/router.js
@@ -1,33 +1,32 @@
// 资源模块
const Index = () => import("./Index.vue");
// 资源管理
const SourceList = () => import("./SourceList.vue")
const SourceClassify = () => import("./SourceClassify.vue")
const SourceList = () => import("./SourceList.vue");
const SourceClassify = () => import("./SourceClassify.vue");
const source = [
    {
        path: 'source',
        component: Index,
        children:[
            {
                path: '',
                component: SourceList,
                name: 'SourceList',
                meta:{
                    title: '资源管理',
                    auth: true
                }
            },
            {
                path: 'classify',
                component: SourceClassify,
                name: 'SourceClassify',
                meta:{
                    title: '资源分类',
                    auth: true
                }
            }
        ]
    }
  {
    path: "source",
    component: Index,
    children: [
      {
        path: "",
        component: SourceList,
        name: "SourceList",
        meta: {
          title: "资源管理",
          auth: true,
        },
      },
      {
        path: "classify",
        component: SourceClassify,
        name: "SourceClassify",
        meta: {
          title: "资源分类",
          auth: true,
        },
      },
    ],
  },
];
export default source
export default source;
vue.config.js
@@ -1,52 +1,52 @@
const path = require('path')
const webpack = require('webpack')
const path = require("path");
const webpack = require("webpack");
module.exports = {
  publicPath: process.env.NODE_ENV === 'production' ? '/' : '/',
  publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
  filenameHashing: true,
  // 生产环境 sourceMap
  productionSourceMap: false,
  // 关闭eslint
  lintOnSave: false,
  devServer: {
    disableHostCheck: true,
    open: true,
    port: 3000
    host: "oss.anniekids.com",
    port: 80,
  },
  css: {
    extract: false
    extract: false,
  },
  configureWebpack:{
    devtool: 'source-map',
  configureWebpack: {
    devtool: "source-map",
    performance: {
      hints: 'warning',
      hints: "warning",
      //入口起点的最大体积 整数类型(以字节为单位)
      maxEntrypointSize: 50000000,
      //生成文件的最大体积 整数类型(以字节为单位 300k)
      maxAssetSize: 30000000,
      //只给出 js 文件的性能提示
      assetFilter: function (assetFilename) {
        return assetFilename.endsWith('.js');
      }
      assetFilter: function(assetFilename) {
        return assetFilename.endsWith(".js");
      },
    },
    plugins: [
      new webpack.ProvidePlugin({
        $: "jquery",
        jQuery: "jquery",
        "windows.jQuery": "jquery"
      })
    ]
        "windows.jQuery": "jquery",
      }),
    ],
  },
  chainWebpack: config => {
    config.plugin('copy')
      .use(require('copy-webpack-plugin'), [
        [{
          from: path.resolve(__dirname, './public'),
          to: path.resolve(__dirname, './dist'),
          toType: 'dir',
          ignore: [
            '.DS_Store',
            'UEditor/**/*'
          ]
        }]
      ])
  }
}
  chainWebpack: (config) => {
    config.plugin("copy").use(require("copy-webpack-plugin"), [
      [
        {
          from: path.resolve(__dirname, "./public"),
          to: path.resolve(__dirname, "./dist"),
          toType: "dir",
          ignore: [".DS_Store", "UEditor/**/*"],
        },
      ],
    ]);
  },
};