diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..7d6cf97 --- /dev/null +++ b/.clang-format @@ -0,0 +1,3 @@ +Language: JavaScript +BasedOnStyle: Google +ColumnLimit: 80 \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index a5b82de..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - "extends": "standard" -}; \ No newline at end of file diff --git a/.gitignore b/.gitignore index e9fd048..8f32488 100644 --- a/.gitignore +++ b/.gitignore @@ -64,4 +64,16 @@ typings/ package-lock.json static/ build/ -manager/**/*.css \ No newline at end of file +dist/ +assets/manager/**/*.css + +# vscode +.vscode/ + +# portable data +data/ + +# exported files +*.mspm +*.mspe +*.mspt \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 5efb4a3..9a07650 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,7 @@ language: node_js - 10 cache: - apt: true + - yarn: true - directories: - node_modules - $HOME/.electron @@ -16,21 +17,9 @@ addons: homebrew: packages: zip before_install: - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then npm i --save-dev node@8.15.0; fi + - nvm install 10 + - npm install -g yarn install: - - npm install - - npm update + - yarn script: - - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then npm run build-linux; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then npm run build-darwin; fi -after_success: if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then bash pack.sh; fi -deploy: - provider: releases - api_key: $GITHUB_TOKEN - file: './build/packed/*.{zip,dmg}' - file_glob: true - skip_cleanup: true - on: - branch: master - tags: true - all_branches: true + - yarn dist diff --git a/README.MD b/Readme.md similarity index 90% rename from README.MD rename to Readme.md index c90d10c..65c0f36 100644 --- a/README.MD +++ b/Readme.md @@ -11,7 +11,7 @@ - 本地缓存机制,可有效提高游戏加载速度 - 适配 OBS 等视频采集软件,方便播主直播使用 - 易于自定义的本地缓存 -- 为额外功能提供插件接口支持 +- 为额外功能提供扩展接口支持 [稳定版: ![VersionLatest](https://img.shields.io/github/release/MajsoulPlus/majsoul-plus-client.svg) ![DownloadsLatest](https://img.shields.io/github/downloads/iamapig120/majsoul-plus-client/latest/total.svg)](https://github.com/iamapig120/majsoul-plus-client/releases/latest) @@ -44,12 +44,18 @@ ## 从源码启动 -请确保 Git, node.js 和 NPM 已经被正确安装 +请确保 Git, Node.js 和 yarn 已经被正确安装 1. `git clone git@github.com:MajsoulPlus/majsoul-plus-client.git` 2. `cd majsoul-plus-client` -3. `npm install` -4. `npm start` +3. `yarn` +4. `yarn start` + +如果你使用的是 ArchLinux 系,注意要在 `yarn start` 之前安装 `gconf` 才能正常运行: + +```bash +sudo pacman -S gconf +``` ## 快捷键 @@ -59,9 +65,9 @@ ## 制作模组 -- 模组 [浏览 Wiki](https://github.com/MajsoulPlus/majsoul-plus/wiki/CourseMod) -- 插件 [浏览 Wiki](https://github.com/MajsoulPlus/majsoul-plus/wiki/CourseExecute) -- 工具 [浏览 Wiki](https://github.com/MajsoulPlus/majsoul-plus/wiki/CourseTool) +- 资源包 [浏览 Wiki](https://github.com/MajsoulPlus/majsoul-plus/wiki/v2_resourcepack) +- 扩展 [浏览 Wiki](https://github.com/MajsoulPlus/majsoul-plus/wiki/v2_extension) +- 工具 [浏览 Wiki](https://github.com/MajsoulPlus/majsoul-plus/wiki/v2_tool) ## 协助翻译 @@ -98,6 +104,6 @@ ## 参与讨论 -使用答疑,资源分享,约战交流 QQ群 [660996459](https://jq.qq.com/?_wv=1027&k=5PMNS8D) +使用答疑,资源分享,约战交流 QQ 群 [660996459](https://jq.qq.com/?_wv=1027&k=5PMNS8D) -开发问题,技术疑问,批判一番 QQ群 [106475557](https://jq.qq.com/?_wv=1027&k=5iayYP5) +开发问题,技术疑问,批判一番 QQ 群 [106475557](https://jq.qq.com/?_wv=1027&k=5iayYP5) diff --git a/Util.js b/Util.js deleted file mode 100644 index 6a4a1c8..0000000 --- a/Util.js +++ /dev/null @@ -1,585 +0,0 @@ -/* eslint no-console: ["error", { allow: ["warn", "error"] }] */ -/* eslint-disable prefer-promise-reject-errors */ - -const path = require('path') -const fs = require('fs') -const electron = require('electron') - -const configs = require('./configs') -const AdmZip = require('adm-zip') -const childProcess = require('child_process') - -const url = require('url') - -/** - * @type {typeof import("https")} - */ -const https = require('https') - -// 用于存储Mod对象 -let mods - -/** - * 播放器 - * @type {Electron.BrowserWindow} - */ -let audioPlayer - -const Util = { - /** - * 加密或者解密文件 - * @param {Buffer} buffer - * @returns {Buffer} - */ - XOR (buffer) { - let array = [] - for (let index = 0; index < buffer.length; index++) { - const byte = buffer.readUInt8(index) - array.push(configs.XOR_KEY ^ byte) - } - return Buffer.from(array) - }, - - /** - * 判断请求资源是否是加密资源 - * @param {string} originalUrl 原始请求的相对路径 - * @returns {boolean} - */ - isEncryptRes (originalUrl) { - return originalUrl.includes(configs.EXTEND_RES_KEYWORD) - }, - - /** - * 判断请求是否为路由路径 - * @param {string} originalUrl - * @return {boolean} - */ - isPath (originalUrl) { - return ( - originalUrl.endsWith('\\') || - originalUrl.endsWith('/') || - originalUrl.includes('?') - ) - }, - - /** - * 递归创建目录,异步方法 - * @author huqiji - * @description http://huqiji.iteye.com/blog/2278036 - * @param {string} dirname 文件夹路径 - * @returns {Promise} - */ - mkdirs (dirname) { - return new Promise(resolve => { - fs.stat(dirname, err => { - if (!err) { - resolve() - } else { - resolve( - this.mkdirs(path.dirname(dirname)).then(() => { - return new Promise(resolve => fs.mkdir(dirname, resolve)) - }) - ) - } - }) - }) - }, - - /** - * 递归创建目录,同步方法 - * @param {string} dirname 文件夹路径 - * @returns {void} - */ - mkdirsSync (dirname) { - try { - fs.statSync(dirname) - } catch (error) { - this.mkdirsSync(path.dirname(dirname)) - fs.mkdirSync(dirname) - } - }, - - /** - * 转换远程Url - * @param {string} originalUrl - * @returns {string} - */ - getRemoteUrl (originalUrl) { - return configs.REMOTE_DOMAIN + originalUrl - }, - - /** - * 读取远程的官方资源数据 - * @param {string} originalUrl 原始请求的相对路径 - * @param {boolean} encrypt 是否是加密数据 - * @param {string} encoding 请求的数据格式,默认是binary - * @returns {Promise<{statusCode: number,data:Buffer | string}>} - */ - getRemoteSource (originalUrl, encrypt, encoding = 'binary') { - return new Promise((resolve, reject) => { - const remoteUrl = this.getRemoteUrl(originalUrl) - https.get( - { - ...url.parse(remoteUrl), - headers: { 'User-Agent': configs.HTTP_GET_USER_AGENT } - }, - httpRes => { - const { statusCode } = httpRes - httpRes.setEncoding(encoding) - const chunks = [] - let chunksSize = 0 - httpRes.on('data', chunk => { - chunks.push(chunk) - chunksSize += chunk.length - }) - httpRes.on('end', () => { - let fileData = null - switch (chunks.length) { - case 0: - fileData = Buffer.alloc(0) - break - case 1: - fileData = Buffer.from(chunks[0], encoding) - break - default: - fileData = Buffer.alloc(chunksSize) - for (let i = 0, position = 0, l = chunks.length; i < l; i++) { - /** - * @type {string | Buffer} - */ - const chunk = chunks[i] - if (Buffer.isBuffer(chunk)) { - chunk.copy(fileData, position) - } else { - Buffer.from(chunk, encoding).copy(fileData, position) - } - position += chunk.length - } - break - } - if (statusCode < 200 || statusCode >= 400) { - console.warn( - `从远端服务器请求 ${remoteUrl} 失败, statusCode = ${statusCode}` - ) - reject({ - res: httpRes, - data: (encrypt ? this.XOR(fileData) : fileData).toString( - encoding - ) - }) - } else { - if (statusCode === 302 || statusCode === 301) { - return resolve( - this.getRemoteSource( - httpRes.headers.location, - encrypt, - encoding - ) - ) - } - resolve({ - res: httpRes, - data: (encrypt ? this.XOR(fileData) : fileData).toString( - encoding - ) - }) - } - }) - } - ) - }) - }, - - /** - * 使用https,从指定网址获取一个文件到一个指定路径 - * @param {string} URI 远程URI地址 - * @param {string} encoding 编码格式 - * @param {Function} dataCallback 当获取到数据时候的callback - */ - httpsGetFile (URI, encoding = 'binary', dataCallback) { - return new Promise((resolve, reject) => { - https.get( - { - ...url.parse(URI), - headers: { 'User-Agent': configs.HTTP_GET_USER_AGENT } - }, - httpRes => { - const { statusCode } = httpRes - httpRes.setEncoding(encoding) - const chunks = [] - let chunksSize = 0 - httpRes.on('data', chunk => { - chunks.push(chunk) - chunksSize += chunk.length - if (dataCallback) { - dataCallback(chunk) - } - }) - httpRes.on('end', () => { - let fileData = null - switch (chunks.length) { - case 0: - fileData = Buffer.alloc(0) - break - case 1: - fileData = chunks[0] - break - default: - fileData = Buffer.alloc(chunksSize) - for (let i = 0, position = 0, l = chunks.length; i < l; i++) { - /** - * @type {string | Buffer} - */ - const chunk = chunks[i] - if (Buffer.isBuffer(chunk)) { - chunk.copy(fileData, position) - } else { - Buffer.from(chunk, encoding).copy(fileData, position) - } - position += chunk.length - } - break - } - if (statusCode < 200 || statusCode >= 400) { - console.warn( - `尝试下载资源 ${URI} 失败, statusCode = ${statusCode}` - ) - reject({ - res: httpRes, - data: fileData - }) - } else { - if (statusCode === 302 || statusCode === 301) { - console.warn(`访问 ${URI} 被重定向, statusCode = ${statusCode}`) - return resolve( - this.httpsGetFile( - httpRes.headers.location, - encoding, - dataCallback - ) - ) - } - resolve({ - res: httpRes, - data: fileData - }) - } - }) - } - ) - }) - }, - - /** - * 从远程URI转成本地存储路径 - * @param {string} originalUrl - * @param {boolean} isPath - * @return {string} - */ - getLocalURI ( - originalUrl, - isPath, - dirBase = path.join(__dirname, configs.LOCAL_DIR) - ) { - const indexOfProps = originalUrl.indexOf('?') - originalUrl = originalUrl.substring( - 0, - indexOfProps === -1 ? undefined : indexOfProps - ) - let localURI = path.join(dirBase, originalUrl) - return isPath ? localURI : localURI // `${localURI}localfile.dirindexfile` : localURI - }, - - /** - * 写入本地文件 - * @param {string} pathToWrite - * @param {Buffer | string} data - * @param {string} encoding 默认是'binary' - * @return {Promise} - */ - writeFile (pathToWrite, data, encoding = 'binary') { - return new Promise((resolve, reject) => { - this.mkdirs(path.dirname(pathToWrite)).then(() => { - fs.writeFile(pathToWrite, data, encoding, err => { - if (err) { - reject(err) - } - resolve() - }) - }) - }) - }, - - /** - * 读取本地文件 - * @param {string} filepath - * @return {Promise} - */ - readFile (filepath) { - return new Promise((resolve, reject) => { - fs.readFile(filepath, (err, data) => { - if (err) { - reject(err) - } - resolve(data) - }) - }) - }, - - /** - * @param {Buffer | string} data - * @param {string} encoding - */ - encodeData (data, encoding = 'binary') { - return Buffer.from(data, encoding) - }, - - /** - * 获取文件的路由函数 - * @param {express.Request} req Request对象 - * @param {express.Response} res Response对象 - * @param {express.NextFunction} next NextFunction对象 - */ - processRequest (req, res) { - if (!mods) { - this.loadMods() - } - - const originalUrl = req.originalUrl - const encrypt = this.isEncryptRes(originalUrl) - const isPath = this.isPath(originalUrl) - const localURI = this.getLocalURI(originalUrl, isPath) - - let promise = Promise.reject() - mods.forEach(mod => { - promise = promise.then( - data => data, - () => { - const modDir = mod.dir - let promiseMod = Promise.reject() - // const readModFile = path => { - // return this.readFile(localURI) - // } - if (mod.replace && mod.replace.length > 0) { - mod.replace.forEach(replaceInfo => { - const regExp = new RegExp(replaceInfo.from) - if (!regExp.test(originalUrl)) { - return - } - const localURI = this.getLocalURI( - originalUrl.replace(regExp, replaceInfo.to), - isPath, - path.join(mod.filesDir, modDir || '/files') - ) - promiseMod = promiseMod.then( - data => data, - () => this.readFile(localURI) - ) - }) - } - const localURI = this.getLocalURI( - originalUrl, - isPath, - path.join(mod.filesDir, modDir || '/files') - ) - promiseMod = promiseMod.then( - data => data, - () => this.readFile(localURI) - ) - return promiseMod - } - ) - }) - promise - .then(data => data, () => this.readFile(localURI)) - .then( - data => data, - () => { - return this.getRemoteSource(originalUrl, encrypt && !isPath).then( - ({ data, res: result }) => { - res.statusCode = result.statusCode - if (!isPath) { - this.writeFile(localURI, data) - } - return data - }, - ({ data, res: result }) => { - res.statusCode = result.statusCode - return Promise.reject(data) - } - ) - } - ) - .then( - data => { - let sendData = isPath - ? this.encodeData(data).toString('utf-8') - : this.encodeData(data) - if (encrypt) { - sendData = this.XOR(sendData) - } - res.end(sendData) - }, - data => { - let sendData = this.encodeData(data).toString('utf-8') - res.send(sendData) - } - ) - .catch(err => console.error(err)) - }, - - /** - * 加载Mod - */ - loadMods () { - // Mod文件根目录 - // const modRootDir = path.join(__dirname, configs.MODS_DIR) - // 所有已在目录中的Mod目录 - // const modDirs = fs.readdirSync(modRootDir) - try { - const data = fs.readFileSync(configs.MODS_CONFIG_PATH) - mods = JSON.parse(data.toString('utf-8')) - } catch (error) { - console.error(error) - mods = [] - } - }, - - /** - * 同步删除文件夹 - * @param {string} dir 要删除的目录 - */ - removeDirSync (dir) { - let command = '' - if (process.platform === 'win32') { - command = `rmdir /s/q "${dir}"` - } else { - command = `rm -rf "${dir}"` - } - childProcess.execSync(command) - }, - - /** - * 截取屏幕画面 - * @param {Electron.WebContents} webContents - */ - takeScreenshot (webContents) { - audioPlayer.webContents.send( - 'audio-play', - path.join(__dirname, 'bin/audio/screenshot.mp3') - ) - webContents.send('take-screenshot') - }, - /** - * 初始化音频播放器 - */ - initPlayer () { - audioPlayer = new electron.BrowserWindow({ - show: false - }) - audioPlayer.loadURL( - 'file://' + path.join(__dirname, 'bin/audio/player.html') - ) - }, - /** - * 退出播放器窗口 - */ - shutoffPlayer () { - audioPlayer.close() - }, - /** - * 选取一个路径和目标,生成一个压缩文件,返回生成的压缩文件路径 - * @param {string} from 要被打包的文件夹 - * @param {string} to 打包到的路径 - */ - zipDir (from, to) { - const zip = new AdmZip() - zip.addLocalFolder(from, path.basename(from)) - zip.writeZip(to, true) - return to - }, - /** - * 判断A标签是否比B标签较新 - * @param {string} taga A标签,类似 v1.2.3 - * @param {string} tagb B标签,类似 v1.2.3 - * @return {number} 返回0,则版本相同,1为需要完整下载版本如引用新依赖,2为新小功能版本,3为小版本修复,4为开发版本更新 - */ - compareVersion (taga, tagb) { - let tagaArr = taga.substring(1).split('-') - let tagbArr = tagb.substring(1).split('-') - let tagaDev = false - let tagbDev = false - if (tagaArr.length > 1) { - tagaDev = true - } - if (tagbArr.length > 1) { - tagbDev = true - } - let tagaMain = tagaArr[0].split('.') - let tagbMain = tagbArr[0].split('.') - - let laterFlag - for (let i = 0; i < 3; i++) { - if (parseInt(tagaMain[i], 10) > parseInt(tagbMain[i], 10)) { - laterFlag = i + 1 - break - } else if (parseInt(tagaMain[i], 10) < parseInt(tagbMain[i], 10)) { - laterFlag = 0 - break - } - } - - if (typeof laterFlag === 'number') { - return laterFlag - } - if (laterFlag === undefined) { - if (tagbDev && !tagaDev) { - return true - } else if (tagaDev && !tagbDev) { - return false - } else if (tagaDev && tagbDev) { - const tagaDevArr = tagaArr[1].split('.') - const tagbDevArr = tagbArr[1].split('.') - const devStrToNum = devStr => { - switch (devStr) { - case 'alpha': - return 1 - case 'beta': - return 2 - case 'rc': - return 3 - default: - return 0 - } - } - tagaDevArr[0] = devStrToNum(tagaDevArr[0]) - tagbDevArr[0] = devStrToNum(tagbDevArr[0]) - for (let i = 0; i < 2; i++) { - if (parseInt(tagaDevArr[i], 10) > parseInt(tagbDevArr[i], 10)) { - laterFlag = 4 - break - } else if ( - parseInt(tagaDevArr[i], 10) < parseInt(tagbDevArr[i], 10) - ) { - laterFlag = 0 - break - } - } - if (laterFlag === undefined) { - return 0 - } - return laterFlag - } else { - return 0 - } - } - } -} - -Object.keys(Util).forEach(key => { - if (typeof Util[key] === 'function') { - Util[key] = Util[key].bind(Util) - } -}) - -module.exports = Util diff --git a/appveyor.yml b/appveyor.yml index 61f4ee8..37a4266 100755 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,20 +1,19 @@ +cache: + - node_modules + - '%APPDATA%\npm-cache' + - '%USERPROFILE%\.electron' + - '%USERPROFILE%\AppData\Local\Yarn\cache' + install: - ps: Install-Product node 10 - - choco install 7zip - - npm install - - npm update -build_script: - - npm run build-win32 -after_build: - - ps: .\pack.ps1 + - yarn + - node --version + artifacts: + - name: zips + path: build\*.zip - name: releases - path: build\packed\*.zip -deploy: - - provider: GitHub - auth_token: $(GITHUB_TOKEN) - artifacts: releases - description: '' - on: - branch: master - APPVEYOR_REPO_TAG: true \ No newline at end of file + path: build\*.exe + +build_script: + - yarn dist diff --git a/bin/audio/player.html b/assets/bin/audio/player.html similarity index 100% rename from bin/audio/player.html rename to assets/bin/audio/player.html diff --git a/bin/audio/screenshot.mp3 b/assets/bin/audio/screenshot.mp3 similarity index 100% rename from bin/audio/screenshot.mp3 rename to assets/bin/audio/screenshot.mp3 diff --git a/bin/icons/icon.icns b/assets/bin/icons/icon.icns similarity index 100% rename from bin/icons/icon.icns rename to assets/bin/icons/icon.icns diff --git a/bin/icons/icon.ico b/assets/bin/icons/icon.ico similarity index 100% rename from bin/icons/icon.ico rename to assets/bin/icons/icon.ico diff --git a/bin/icons/icon.png b/assets/bin/icons/icon.png similarity index 100% rename from bin/icons/icon.png rename to assets/bin/icons/icon.png diff --git a/bin/main/index.html b/assets/bin/main/index.html similarity index 91% rename from bin/main/index.html rename to assets/bin/main/index.html index c98de56..4ec8209 100644 --- a/bin/main/index.html +++ b/assets/bin/main/index.html @@ -79,12 +79,19 @@
- +
screenshot

screenshotText

- + diff --git a/bin/main/loading.html b/assets/bin/main/loading.html similarity index 91% rename from bin/main/loading.html rename to assets/bin/main/loading.html index 59f8c97..d95e243 100644 --- a/bin/main/loading.html +++ b/assets/bin/main/loading.html @@ -11,7 +11,7 @@ width: 100vw; overflow: hidden; background-color: #000; - background-image: url('./logo.svg'); + background-image: url("./logo.svg"); background-size: cover; background-repeat: no-repeat; } diff --git a/bin/main/logo.svg b/assets/bin/main/logo.svg similarity index 100% rename from bin/main/logo.svg rename to assets/bin/main/logo.svg diff --git a/certificate/cert.crt b/assets/certificate/cert.crt similarity index 100% rename from certificate/cert.crt rename to assets/certificate/cert.crt diff --git a/certificate/key.pem b/assets/certificate/key.pem similarity index 100% rename from certificate/key.pem rename to assets/certificate/key.pem diff --git a/manager/SourceHanSansCN-Light.otf b/assets/manager/SourceHanSansCN-Light.otf similarity index 100% rename from manager/SourceHanSansCN-Light.otf rename to assets/manager/SourceHanSansCN-Light.otf diff --git a/manager/SourceHanSansCN-Normal.otf b/assets/manager/SourceHanSansCN-Normal.otf similarity index 100% rename from manager/SourceHanSansCN-Normal.otf rename to assets/manager/SourceHanSansCN-Normal.otf diff --git a/manager/defaultPreview.jpg b/assets/manager/defaultPreview.jpg similarity index 100% rename from manager/defaultPreview.jpg rename to assets/manager/defaultPreview.jpg diff --git a/manager/styles/chiku-rin/chiku-rin.scss b/assets/manager/extra/chiku-rin/chiku-rin.scss similarity index 100% rename from manager/styles/chiku-rin/chiku-rin.scss rename to assets/manager/extra/chiku-rin/chiku-rin.scss diff --git a/manager/styles/dark/dark.scss b/assets/manager/extra/darkMode/style.scss similarity index 100% rename from manager/styles/dark/dark.scss rename to assets/manager/extra/darkMode/style.scss diff --git a/manager/styles/springfestival/background.jpg b/assets/manager/extra/springFestivalTheme/background.jpg similarity index 100% rename from manager/styles/springfestival/background.jpg rename to assets/manager/extra/springFestivalTheme/background.jpg diff --git a/manager/styles/springfestival/springfestival.scss b/assets/manager/extra/springFestivalTheme/style.scss similarity index 100% rename from manager/styles/springfestival/springfestival.scss rename to assets/manager/extra/springFestivalTheme/style.scss diff --git a/manager/iconfont.eot b/assets/manager/iconfont.eot similarity index 100% rename from manager/iconfont.eot rename to assets/manager/iconfont.eot diff --git a/manager/iconfont.ttf b/assets/manager/iconfont.ttf similarity index 100% rename from manager/iconfont.ttf rename to assets/manager/iconfont.ttf diff --git a/manager/iconfont.woff b/assets/manager/iconfont.woff similarity index 100% rename from manager/iconfont.woff rename to assets/manager/iconfont.woff diff --git a/manager/index.html b/assets/manager/index.html similarity index 69% rename from manager/index.html rename to assets/manager/index.html index aee5270..877d9f9 100644 --- a/manager/index.html +++ b/assets/manager/index.html @@ -15,50 +15,30 @@

雀魂Plus

    -
  • 模组
  • -
  • 插件
  • +
  • + 资源包 +
  • +
  • 扩展
  • 工具箱
  • 设置
  • 关于
- -
- - - -
-
- -

千织普通改绿头鸭

-
Handle
-

- 图片来源pixabay,由Capri23auto上传,CC0协议\n这是一个Mod示范,用途为将普通千织立绘和头像改为绿头鸭。 -

- - - -
-
+ +
+ + + +
-
- - - -
-
- -

强制开启语音报番型

-
aoarashi1988
-

可以强制在本地打开报番型效果。

- - - -
-
+
+ + + +
@@ -66,7 +46,7 @@

强制开启语音报番型

-
+
@@ -90,7 +70,6 @@

更新

-
@@ -167,7 +146,8 @@

- - + diff --git a/manager/style.scss b/assets/manager/style.scss similarity index 95% rename from manager/style.scss rename to assets/manager/style.scss index 21560ee..adbcedb 100644 --- a/manager/style.scss +++ b/assets/manager/style.scss @@ -455,6 +455,19 @@ h1 { margin: 0; } } + & > input[type='text'] { + height: 20px; + margin-top: 4px; + margin-left: 2px; + line-height: 20px; + font-size: 14px; + width: max-content; + &::-webkit-outer-spin-button, + &::-webkit-inner-spin-button { + -webkit-appearance: none !important; + margin: 0; + } + } & > input[type='checkbox'] { display: none; } @@ -469,6 +482,17 @@ h1 { padding-left: 10px; color: var(--light-text); } + & > input[type='text'] + label { + width: max-content; + height: 20px; + margin-top: 4px; + line-height: 20px; + font-size: 14px; + cursor: pointer; + outline: none !important; + padding-left: 10px; + color: var(--light-text); + } & > input[type='checkbox'] + label { width: max-content; height: 20px; @@ -579,10 +603,10 @@ h1 { line-height: 48px; color: var(--icon-color); } - &[data-target='modPage']::before { + &[data-target='resourcepackPage']::before { content: ''; } - &[data-target='executePage']::before { + &[data-target='extensionPage']::before { content: ''; font-size: 16px; } diff --git a/bin/main/mainLoader.js b/bin/main/mainLoader.js deleted file mode 100644 index e7bcdc2..0000000 --- a/bin/main/mainLoader.js +++ /dev/null @@ -1,387 +0,0 @@ -/* eslint no-console: ["error", { allow: ["warn", "error"] }] */ - -const fs = require('fs') -const path = require('path') -const electron = require('electron') -const { ipcRenderer } = electron -const configs = require('../../configs') -const userConfigs = require(configs.USER_CONFIG_PATH) - -const electronScreen = electron.screen -const i18n = require('../../i18nInstance') - -/** - * @type {Electron.WebviewTag} - */ -const mainWindow = document.getElementById('mainWindow') - -/** - * @type {HTMLDivElement} - */ -const mainWindowBox = document.getElementById('mainWindowBox') - -let scalePercent = userConfigs.window.renderingMultiple - -/** - * @type {Electron.webContents} - */ -let webContents - -/** - * @type {Array} - */ -let executeScriptsCodes = [] - -/** - * @type {number} - */ -let serverPort - -/** - * @type {ClientRectList | DOMRectList} - */ -let clientRect - -const prebuildExecuteCode = executeScriptInfo => { - executePreferences = executeScriptInfo.executePreferences - ? executeScriptInfo.executePreferences - : {} - let codeEntry = executeScriptInfo.entry - if (!codeEntry) { - codeEntry = 'script.js' - } - let code = '' - if (Array.isArray(codeEntry)) { - codeEntry.forEach(codeEntry => { - code += - '\n' + - fs - .readFileSync(path.join(executeScriptInfo.filesDir, codeEntry)) - .toString('utf-8') - }) - } else { - code = fs - .readFileSync(path.join(executeScriptInfo.filesDir, codeEntry)) - .toString('utf-8') - } - const sanboxCode = `const sandbox = new Proxy({}, { - get(target, prop) { - const eventHandlers = [] - if (target.hasOwnProperty(prop)) { - return target[prop] - } - if (prop === "window") { - return sandbox - } - if (prop === "global") { - return sandbox - } - if (prop === "open") { - return window.open.bind(window) - } - if (prop === "setTimeout") { - return (fun, ...props)=>{return setTimeout(fun.bind(sandbox), ...props)} - } - if (prop === "clearTimeout") { - return (...props)=>{return clearTimeout(...props).bind(window)} - } - if (prop === "setInterval") { - return (fun, ...props)=>{return setInterval(fun.bind(sandbox), ...props)} - } - if (prop === "clearInterval") { - return (...props)=>{return clearInterval(...props).bind(window)} - } - if (prop === "requestAnimationFrame") { - return (fun, ...props)=>{return requestAnimationFrame(fun.bind(sandbox), ...props)} - } - if (prop === "cancelAnimationFrame") { - return (...props)=>{return cancelAnimationFrame(...props).bind(window)} - } - if (prop === "addEventListener") { - return (evt, fun, ...props)=>{ - const bindFun = fun.bind(sandbox) - eventHandlers.push({ - unbind: fun, - bind: bindFun - }) - window.addEventListener(evt, bindFun, ...props) - } - } - if (prop === "removeEventListener") { - return (evt, fun, ...props)=>{ - let flag = false - eventHandlers.some((element,index,arr)=>{ - const found = element.unbind === fun - if(found){ - flag = window.removeEventListener(evt, bindFun, ...props) - arr.splice(index,1) - return true - }else{ - return false - } - }) - } - } - if (prop === "require" && ${!!executePreferences.nodeRequire} === false) { - return undefined - } - if (prop === "document" && ${!!executePreferences.document} === false) { - return undefined - } - if (prop === "localStorage" && ${!!executePreferences.localStorage} === false) { - return undefined - } - if (prop === "XMLHttpRequest" && ${!!executePreferences.XMLHttpRequest} === false) { - return undefined - } - if (prop === "WebSocket" && ${!!executePreferences.WebSocket} === false) { - return undefined - } - if (prop === Symbol.unscopables) { - return undefined - } - return window[prop] - }, - has() { return true }, - set(target, prop, value) { - target[prop] = value - if (${!!executePreferences.writeableWindowObject} === true) { - window[prop] = target[prop] - } - return target[prop] - } - })` - if (!executeScriptInfo.sync) { - code = `(()=>{ - let __raf; - ${sanboxCode} - const __rafFun=()=>{ - if(window.game) { - with (sandbox) { - ${code} - } - } else - {__raf=requestAnimationFrame(__rafFun) - } - } - __raf=requestAnimationFrame(__rafFun) - })()` - } else { - code = `(()=>{ - ${sanboxCode} - with (sandbox) {${code}} - })()` - } - return code -} - -// Sanbox from https://zhuanlan.zhihu.com/p/58602800 -const sandbox = new Proxy( - {}, - { - get(target, prop) { - if (target.hasOwnProperty(prop)) { - return target[prop] - } - if (prop === 'window') { - return sandbox - } - if (prop === 'global') { - return sandbox - } - if (prop === 'require' && false === false) { - return undefined - } - if (prop === 'document' && false === false) { - return undefined - } - if (prop === 'localStorage' && false === false) { - return undefined - } - if (prop === 'XMLHttpRequest' && false === false) { - return undefined - } - if (prop === 'WebSocket' && false === false) { - return undefined - } - if (prop === Symbol.unscopables) { - return undefined - } - return window[prop] - }, - has() { - return true - }, - set(target, prop, value) { - target[prop] = value - if (true === true) { - window[prop] = target[prop] - } - } - } -) -with (sandbox) { -} - -let screenshotCounter = 0 -let screenshotTimer -const showScreenshotLabel = src => { - /** - * @type {HTMLImageElement} - */ - const screenshotImage = document.getElementById('screenshotImage') - const screenshotText = document.getElementById('screenshotText') - const screenshotLabel = document.getElementById('screenshotLabel') - screenshotImage.src = src - screenshotText.innerText = screenshotCounter++ - ? i18n.t.main.screenshotsSaved(screenshotCounter) - : i18n.t.main.screenshotSaved() - screenshotLabel.classList.remove('hide') - screenshotLabel.classList.add('show') - clearTimeout(screenshotTimer) - screenshotTimer = setTimeout(() => { - screenshotLabel.classList.remove('show') - clearTimeout(screenshotTimer) - screenshotTimer = setTimeout(() => { - screenshotLabel.classList.add('hide') - screenshotCounter = 0 - }, 300) - }, 8000) -} - -ipcRenderer.on('window-resize', (event, ...args) => { - clientRect = args[0] -}) - -ipcRenderer.on('take-screenshot', () => { - if (webContents) { - /** - * 回调函数 - * @param {Electron.NativeImage} image - */ - const callbackFunction = image => { - ipcRenderer.send('application-message', 'take-screenshot', image.toPNG()) - } - const rect = clientRect - const display = electronScreen.getDisplayMatching({ - x: parseInt(rect.x), - y: parseInt(rect.y), - width: parseInt(rect.width), - height: parseInt(rect.height) - }) - webContents.capturePage( - { - x: 0, - y: 0, - width: parseInt(mainWindow.clientWidth * display.scaleFactor), - height: parseInt(mainWindow.clientHeight * display.scaleFactor) - }, - callbackFunction - ) - } -}) - -ipcRenderer.on('screenshot-saved', (event, ...args) => { - const src = args[0] - showScreenshotLabel('file://' + src) -}) - -ipcRenderer.on('open-devtools', () => { - if (webContents) { - mainWindow.openDevTools({ mode: 'detach' }) - } -}) - -const testRedirectGameWindow = url => { - return ( - url.startsWith(configs.REMOTE_DOMAIN) || - url.startsWith(configs.HTTP_REMOTE_DOMAIN) - ) -} - -const testIsLocalGameWindow = url => { - return url.startsWith('https://localhost:') -} -const getLocalUrlWithParams = url => { - if (url.includes('?')) { - return `https://localhost:${serverPort}/0/${url.substring( - url.indexOf('?') - )}` - } - return `https://localhost:${serverPort}/0/` -} -const redirectGameWindow = (url, gameWindow) => { - const localUrl = getLocalUrlWithParams(url) - console.warn('Redirect Target:' + localUrl) - gameWindow.loadURL(localUrl) -} - -ipcRenderer.on('server-port-load', (event, ...args) => { - console.warn('server-port-load') - serverPort = args[0] - ipcRenderer.send('main-loader-message', 'server-port-loaded') -}) - -ipcRenderer.on('executes-load', (event, ...args) => { - console.warn('executes-load') - const executeScripts = args[0] - executeScriptsCodes = [] - executeScripts.forEach(executeScript => { - const code = prebuildExecuteCode(executeScript) - executeScriptsCodes.push(code) - }) - ipcRenderer.send('main-loader-message', 'executes-loaded') -}) - -const scaleWindow = (percent = scalePercent) => { - mainWindowBox.style.width = `${percent}vw` - mainWindowBox.style.height = `${percent}vh` - mainWindowBox.style.transform = `scale(${100 / percent}) translate(${(100 - - percent) / - 2}%, ${(100 - percent) / 2}%)` -} - -mainWindow.addEventListener('dom-ready', () => { - if (!webContents) { - webContents = mainWindow.getWebContents() - webContents.setZoomFactor(1) - ipcRenderer.send('main-loader-message', 'main-loader-ready') - - webContents.on('dom-ready', () => { - executeScriptsCodes.forEach(executeScriptCode => { - webContents.executeJavaScript(executeScriptCode) - }) - }) - - webContents.on('will-navigate', (evt, url) => { - if (testRedirectGameWindow(url)) { - evt.preventDefault() - redirectGameWindow(url, mainWindow) - } - }) - - if (process.env.NODE_ENV === 'development') { - mainWindow.openDevTools({ mode: 'detach' }) - } - } - - if (testIsLocalGameWindow(mainWindow.src)) { - scaleWindow(scalePercent) - mainWindow.insertCSS('body{overflow:hidden;}') - } else { - scaleWindow(100) - } -}) - -ipcRenderer.on('load-url', (event, ...args) => { - const url = args[0] - console.warn('LoadURL', url) - if (testRedirectGameWindow(url)) { - redirectGameWindow(url, mainWindow) - } else { - mainWindow.loadURL(url) - } - mainWindowBox.style.width = '100vw' - mainWindowBox.style.height = '100vh' - mainWindowBox.style.transform = 'none' -}) diff --git a/build.js b/build.js new file mode 100644 index 0000000..8eecc1b --- /dev/null +++ b/build.js @@ -0,0 +1,64 @@ +const { ncp } = require('ncp') +const fs = require('fs') +const path = require('path') + +const dest = path.resolve('./dist/') + +// 移除包含 exports 的第二行 +function simpleBrowserify(dir) { + fs.readFile(path.resolve(dest, dir), { encoding: 'utf-8' }, function( + err, + data + ) { + if (err) { + console.error(err) + return + } + const lines = data.split('\n') + lines.splice(1, 1) + fs.writeFile( + path.resolve(dest, dir), + lines.join('\n'), + { encoding: 'utf-8' }, + () => {} + ) + }) +} + +// Copy files +function copy(from, to = from, callback = () => {}) { + ncp(path.resolve('./', from), path.resolve(dest, to), err => { + if (err) console.error(err) + else callback() + }) +} + +function copyA(from, parent = 'bin', callback = () => {}) { + copy(from, parent + '/' + from, callback) +} + +function copyDesktopCreatorFonts() { + // 桌布生成工具的字体 + fs.copyFile( + './assets/manager/SourceHanSansCN-Light.otf', + './dist/bin/tool/desktopCreator/SourceHanSansCN-Light.otf', + err => { + if (err) console.error(err) + } + ) + fs.copyFile( + './assets/manager/SourceHanSansCN-Normal.otf', + './dist/bin/tool/desktopCreator/SourceHanSansCN-Normal.otf', + err => { + if (err) console.error(err) + } + ) +} + +copy('assets', '') +copy('i18n') +copyA('resourcepack') +copyA('extension') +copyA('tool', 'bin', copyDesktopCreatorFonts) + +simpleBrowserify('windows/sandbox-preload.js') diff --git a/configs-user.json b/configs-user.json deleted file mode 100644 index a1797e4..0000000 --- a/configs-user.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "window": { - "OSTheme": "light", - "gameWindowSize": "", - "zoomFactor": 1, - "renderingMultiple": 100, - "isKioskModeOn": false, - "isNoBorder": false, - "isManagerHide": false - }, - "update": { - "prerelease": false - }, - "chromium": { - "isHardwareAccelerationDisable": false, - "isInProcessGpuOn": true, - "isIgnoreGpuBlacklist": false - }, - "userData": { - "useAppdataLibrary": false - } -} diff --git a/configs.js b/configs.js deleted file mode 100644 index cc4eea9..0000000 --- a/configs.js +++ /dev/null @@ -1,116 +0,0 @@ -const os = require('os') -const fs = require('fs') -const electron = require('electron') -const path = require('path') - -// 提供app模块 -let app = electron.app -if (!app) { - app = electron.remote.app -} - -// 防止首次运行时扑街 -const appDataDir = app.getPath('userData') -try { - fs.statSync(appDataDir) -} catch (error) { - fs.mkdirSync(appDataDir) -} - -const getIcon = () => { - switch (os.platform()) { - case 'win32': - return path.join(__dirname, '/bin/icons/icon.ico') - case 'darwin': - return path.join(__dirname, '/bin/icons/icon.icns') - case 'linux': - default: - return path.join(__dirname, '/bin/icons/icon.png') - } -} -const CONFIGS = { - SERVER_PORT: 8887, - // PIPE_PORT: 8888, - XOR_KEY: 73, - EXTEND_RES_KEYWORD: 'extendRes', - REMOTE_DOMAIN: 'https://majsoul.union-game.com/', - HTTP_REMOTE_DOMAIN: 'http://majsoul.union-game.com/', - LOCAL_DIR: '/static', - MODS_DIR: '/mod', - MODS_CONFIG_PATH: path.join(appDataDir, 'modsEnabled.json'), - PLUGINS_DIR: '/plugin', - TOOLS_DIR: '/tool', - EXECUTES_DIR: '/execute', - EXECUTES_CONFIG_PATH: path.join(appDataDir, 'executesEnabled.json'), - USER_CONFIG_PATH: path.join(appDataDir, 'configs-user.json'), - GAME_WINDOW_CONFIG: { - width: 1280 + 16, - height: 720 + 39, - frame: true, - resizable: true, - backgroundColor: '#000000', - webPreferences: { - webSecurity: false - // nodeIntegration: false - // plugins: true - }, - autoHideMenuBar: true, - // useContentSize: true, - icon: getIcon(), - show: false, - enableLargerThanScreen: true - }, - MANAGER_WINDOW_CONFIG: { - width: 1280, // + 16, - height: 720, // + 39, - frame: false, - resizable: false, - backgroundColor: '#FFFFFF', - webPreferences: { - webSecurity: false, - allowRunningInsecureContent: true - }, - title: '雀魂Plus', - autoHideMenuBar: true, - icon: getIcon(), - maximizable: false, - fullscreenable: false, - show: false - }, - TOOL_WINDOW_CONFIG: { - width: 960, // + 16, - height: 540, // + 39, - frame: true, - resizable: false, - backgroundColor: '#FFFFFF', - webPreferences: { - webSecurity: false, - allowRunningInsecureContent: true - }, - autoHideMenuBar: true, - icon: getIcon(), - maximizable: false, - fullscreenable: false, - useContentSize: true - }, - HTTP_GET_USER_AGENT: `Mozilla/5.0 (${os.type()} ${os.release()}; ${os.arch()}) MajsoulPlus/${app.getVersion()} Chrome/${ - process.versions.chrome - }` -} -try { - fs.statSync(CONFIGS.EXECUTES_CONFIG_PATH) -} catch (error) { - fs.copyFileSync( - path.join(__dirname, CONFIGS.EXECUTES_DIR, 'active.json'), - CONFIGS.EXECUTES_CONFIG_PATH - ) -} -try { - fs.statSync(CONFIGS.MODS_CONFIG_PATH) -} catch (error) { - fs.copyFileSync( - path.join(__dirname, CONFIGS.MODS_DIR, 'active.json'), - CONFIGS.MODS_CONFIG_PATH - ) -} -module.exports = CONFIGS diff --git a/docs/IPC.md b/docs/IPC.md new file mode 100644 index 0000000..30763e9 --- /dev/null +++ b/docs/IPC.md @@ -0,0 +1,59 @@ +# IPC + +雀魂 Plus 在主进程和渲染进程之间使用了大量的 IPC 进行数据交换。 + +## ipcMain + +下表列出了主进程接收到的请求: + +| ID | 接收者 | 名称 | 参数 | 说明 | +| --- | ------------- | ----------------------- | -------- | ------------------------------------------------ | +| 01 | ManagerWindow | start-game | 无 | 启动游戏。 | +| 02 | ManagerWindow | start-tool | `id` | 启动 `id` 对应的工具。 | +| 03 | ManagerWindow | close-manager | 无 | 关闭 Manager 窗口。 | +| 04 | ManagerWindow | clear-cache | 无 | 清理缓存(`appDataDir/static/`) | +| 05 | ManagerWindow | update-user-config | `config` | 更新主进程中的 `config` 并保存。 | +| 06 | GameWindow | main-loader-ready | 无 | 游戏宿主窗口已创建并初始化完毕,需要加载端口信息 | +| 07 | sandbox | sandbox-dirname-request | 无 | 返回当前的 `dirname`。 | +| 08 | sandbox | sandbox-appdata-request | 无 | 返回当前的 `appDataDir` | +| 09 | screenshot | take-screenshot | `buffer` | 对截屏进行保存。 | + +### 通用请求 + +对每个雀魂 Plus 功能(资源包、扩展、工具,下表中用 `${name}` 表示),存在一些通用请求。通用请求都由 ManagerWindow 发出,如下表所示: + +| ID | 名称 | 参数 | 说明 | 返回 / 响应 IPC 名 | +| --- | -------------------------- | ---------------- | ---------------------------------------------------- | ------------------------------ | +| 01 | `get-${name}-details` | 无 | 获取 `${name}` 的加载情况 | `get-${name}-details-response` | +| 02 | `change-${name}-enability` | `id`, `enabled` | 修改 `${name}` 中 `id` 的加载情况为 `enabled` | `GetDetailMetadataResponse` | +| 03 | `save-${name}-enabled` | 无 | 保存 `${name}` 的加载情况 | 无 | +| 04 | `import-${name}` | `filePath` | 从 `filePath` 加载打包的 `${name}` | 无 | +| 05 | `export-${name}` | `id`, `filePath` | 对 `id` 指定的 `${name}` 进行打包,保存到 `filePath` | `{ err: string | undefined }` | +| 06 | `remove-${name}` | `id` | 删除 `id` 对应的 `${name}` | 无 | +| 07 | `refresh-${name}` | 无 | 刷新 `${name}` 列表 | `GetDetailMetadataResponse` | + +## ipcRenderer + +### GameWindow(mainLoader) + +| ID | 名称 | 参数 | 说明 | +| --- | ---------------- | -------------------------- | ------------------------ | +| 01 | load-url | `url`, `port`, `http` | 加载服务器对应网页 | +| 02 | window-resize | `rect: Electron.Rectangle` | 更新游戏窗口的 Rectangle | +| 03 | take-screenshot | 无 | 截图 | +| 04 | screenshot-saved | `filePath` | 表示截图保存成功 | +| 05 | open-devtools | 无 | 打开开发者工具 | + +### ManagerWindow + +| ID | 名称 | 参数 | 说明 | +| --- | ------------------------------ | ---------------- | ---------------------------------------- | +| 01 | change-config-game-window-size | `gameWindowSize` | 修改 `userConfigs.window.gameWindowSize` | +| 02 | save-config | 无 | 保存 Manager 窗口中的各项设定。 | + +### AudioPlayer + +| ID | 名称 | 参数 | 说明 | +| --- | ------------ | ----------- | -------------------------------- | +| 01 | audio-play | `audioPath` | 播放指定音乐(目前只有截屏声)。 | +| 02 | close-window | 无 | 关闭窗口(暂无调用)。 | diff --git a/docs/Readme.md b/docs/Readme.md new file mode 100644 index 0000000..9c39999 --- /dev/null +++ b/docs/Readme.md @@ -0,0 +1,60 @@ +# 雀魂 Plus 设计文档 + +这里是雀魂 Plus 的设计文档,通过阅读这里的内容,你可以简要地了解雀魂 Plus 的设计思路,运行流程,以及决定是否加入雀魂 Plus 的维护之中。 + +## 加载流程 + +下面简单通过顺序的形式介绍雀魂 Plus 的加载流程 + +0. 执行之前 + 在这一步初始化了很多顺序无关的内容,比如: + + - appDataDir:用户保存所有内容的路径 + - UserConfigs:加载用户设置 + - i18n:初始化 i18n 实例 + - httpsServer:创建默认的服务器 + - manager:资源包、扩展的 Manager 实例构造 + - default:各项默认配置的初始化,以及对需要的变量进行 `Object.freeze` + +1. 加载全局变量 + 此处加载的全局变量包括“资源包路径”,“扩展路径”和“工具路径”。在加载全局变量的过程中,如果对应的目录不存在,则会将雀魂 Plus 自带的资源包、扩展和工具复制到对应的目录下。 +1. 加载资源包 + 此处会对对应目录下启用的资源包进行加载。注:此步骤应该移动到启动游戏时进行。 +1. 加载扩展 + 此处会对对应目录下启用的扩展进行加载。注:此步骤应该移动到启动游戏时进行。 +1. 设置代理 + 当用户配置的代理存在时,启用代理。 +1. 针对操作系统禁用/启用进程内 GPU 处理 + 当用户设置中启用 `isInProcessGpuOn` 后,对 `Windows` 和 `macOS` 进行 `in-process-gpu` 参数附加。 +1. 忽略 GPU 黑名单 + 当用户设置中启用 `isIgnoreGpuBlacklist` 后,进行 `ignore-gpu-blacklist` 参数附加,忽略 GPU 黑名单。 +1. 禁用硬件加速 + 当用户设置中启用 `isHardwareAccelerationDisable` 后,禁用硬件加速。 +1. `process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'` +1. // 忽略证书错误 +1. 允许自动播放音视频 + 允许在后台不经用户手动授权播放截图的背景音。 +1. 当全部窗口退出后,结束进程 +1. 阻止证书验证 +1. 在 `ready` 后执行的操作 +1. 监听各项崩溃事件 + +### `ready` 后执行的操作 + +1. 收到 Manager 发送的 `start-game` 后执行的操作 +1. 注册老板键功能 +1. 注册截图功能 +1. 注册工具窗口的沙盒功能 +1. 初始化扩展资源管理器窗口 + +### `start-game` 后执行的操作 + +1. 加载服务器路由规则 +1. 初始化本地镜像服务器 + 这一步中会根据用户配置决定启动 http 服务器还是 https 服务器。 +1. 初始化游戏窗口 +1. 根据设置决定销毁 / 隐藏 Manager 窗口 + +## IPC + +见 [IPC.md](IPC.md) diff --git a/execute/active.json b/execute/active.json deleted file mode 100644 index f7a3897..0000000 --- a/execute/active.json +++ /dev/null @@ -1,23 +0,0 @@ -[ - { - "name": "解锁所有语音", - "author": "Majsoul Plus Team", - "description": "可以在本地解锁全部报番型、主菜单交互语音。\n让您获得完整麻将体验。", - "entry": "script.js", - "executePreferences": { - "document": false, - "nodeRequire": false, - "XMLHTTPRequest": false, - "WebSocket": false, - "localStorage": false, - "writeableWindowObject": false - } - }, - { - "name": "解除强制实名认证", - "author": "Handle", - "description": "如果您是海外玩家或没有中国身份证号码,这个插件能够帮到您!\n游戏时请遵守当地法律法规。", - "entry": "script.js", - "preview": "preview.png" - } -] diff --git a/execute/reportVoice/execute.json b/execute/reportVoice/execute.json deleted file mode 100644 index cea6a51..0000000 --- a/execute/reportVoice/execute.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "解锁所有语音", - "author": "Majsoul Plus Team", - "description": "可以在本地解锁全部报番型、主菜单交互语音。\n让您获得完整麻将体验。", - "entry": "script.js", - "executePreferences": { - "document": false, - "nodeRequire": false, - "XMLHTTPRequest": false, - "WebSocket": false, - "localStorage": false, - "writeableWindowObject": false - } -} diff --git a/extension/active.json b/extension/active.json new file mode 100644 index 0000000..e2bf5c1 --- /dev/null +++ b/extension/active.json @@ -0,0 +1 @@ +["reportVoice", "shimingRenzheng", "yoFix"] diff --git a/extension/reportVoice/extension.json b/extension/reportVoice/extension.json new file mode 100644 index 0000000..f8af92f --- /dev/null +++ b/extension/reportVoice/extension.json @@ -0,0 +1,9 @@ +{ + "id": "reportVoice", + "version": "2.0.0", + "name": "解锁所有语音", + "author": "Majsoul Plus Team", + "description": "可以在本地解锁全部报番型、主菜单交互语音。\n让您获得完整麻将体验。", + "preview": "preview.jpg", + "entry": "script.js" +} diff --git a/execute/reportVoice/preview.jpg b/extension/reportVoice/preview.jpg similarity index 100% rename from execute/reportVoice/preview.jpg rename to extension/reportVoice/preview.jpg diff --git a/execute/reportVoice/script.js b/extension/reportVoice/script.js similarity index 100% rename from execute/reportVoice/script.js rename to extension/reportVoice/script.js diff --git a/execute/shimingRenzheng/execute.json b/extension/shimingRenzheng/extension.json similarity index 56% rename from execute/shimingRenzheng/execute.json rename to extension/shimingRenzheng/extension.json index 4cb9538..1085af3 100644 --- a/execute/shimingRenzheng/execute.json +++ b/extension/shimingRenzheng/extension.json @@ -1,7 +1,9 @@ { + "id": "shimingRenzheng", + "version": "1.0.0", "name": "解除强制实名认证", "author": "Handle", - "description": "如果您是海外玩家或没有中国身份证号码,这个插件能够帮到您!\n游戏时请遵守当地法律法规。", + "description": "如果您是海外玩家或没有中国身份证号码,这个扩展能够帮到您!\n游戏时请遵守当地法律法规。", "entry": "script.js", - "preview": "preview.png" + "applyServer": [0] } diff --git a/execute/shimingRenzheng/preview.png b/extension/shimingRenzheng/preview.png similarity index 100% rename from execute/shimingRenzheng/preview.png rename to extension/shimingRenzheng/preview.png diff --git a/execute/shimingRenzheng/script.js b/extension/shimingRenzheng/script.js similarity index 100% rename from execute/shimingRenzheng/script.js rename to extension/shimingRenzheng/script.js diff --git a/extension/yoFix/extension.json b/extension/yoFix/extension.json new file mode 100644 index 0000000..f69c1d3 --- /dev/null +++ b/extension/yoFix/extension.json @@ -0,0 +1,11 @@ +{ + "id": "yoFix", + "version": "1.0.0", + "name": "修复日服和美服的 Yo is undefined 问题", + "author": "某昨P", + "description": "这个扩展修复了日服和美服卡在10/10的加载问题!", + "preview": "preview.jpg", + "loadBeforeGame": true, + "entry": "https://passport.mahjongsoul.com/js/yo_acc.prod_ja.js", + "applyServer": [1, 2] +} diff --git a/extension/yoFix/preview.jpg b/extension/yoFix/preview.jpg new file mode 100644 index 0000000..f8e158e Binary files /dev/null and b/extension/yoFix/preview.jpg differ diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index a3ff746..0000000 --- a/gulpfile.js +++ /dev/null @@ -1,13 +0,0 @@ -const gulp = require('gulp') -const sass = require('gulp-sass') - -sass.complier = require('node-sass') - -gulp.task('sass', () => gulp.src('manager/**/*.scss') - .pipe(sass()) - .pipe(gulp.dest('manager/')) -) - -gulp.task('auto', () => gulp.watch('manager/**/*.scss', gulp.series('sass'))) - -gulp.task('default', gulp.series('sass', 'auto')) diff --git a/i18n/csv.js b/i18n/csv.js deleted file mode 100644 index de7288f..0000000 --- a/i18n/csv.js +++ /dev/null @@ -1,466 +0,0 @@ -(function(root, factory) { - if (typeof define === "function" && define.amd) { - define([], factory); - } else if (typeof module === "object" && module.exports) { - module.exports = factory(); - } else { - root.CSV = factory(); - } -}(this, function() { - 'use strict'; - - var ESCAPE_DELIMITERS = ['|', '^'], - CELL_DELIMITERS = [',', ';', '\t', '|', '^'], - LINE_DELIMITERS = ['\r\n', '\r', '\n']; - - function isObject(object) { - var type = typeof object; - return type === 'function' || type === 'object' && !!object; - } - var isArray = Array.isArray || function(object) { - return toString.call(object) === '[object Array]'; - } - function isString(object) { - return typeof object === 'string'; - } - function isNumber(object) { - return !isNaN(Number(object)); - } - function isBoolean(value) { - return value == false || value == true; - } - function isNull(value) { - return value == null; - } - function isPresent(value) { - return value != null; - } - - function fallback(value, fallback) { - return isPresent(value) ? value : fallback; - } - - function forEach(collection, iterator) { - for (var _i = 0, _len = collection.length; _i < _len; _i += 1) { - if (iterator(collection[_i], _i) === false) break; - } - } - - function sanitizeString(string) { - return string.replace(/"/g,'\\"'); - } - - function buildCell(index) { - return 'attrs[' + index + ']'; - } - - function castCell(value, index) { - if (isNumber(value)) { - return 'Number(' + buildCell(index) + ')'; - } else if (isBoolean(value)) { - return 'Boolean(' + buildCell(index) + ' == true)'; - } else { - return 'String(' + buildCell(index) + ')'; - } - } - - function buildConstructor(deserialize, cast, values, attrs) { - var definition = []; - if (arguments.length == 3) { - if (cast) { - if (isArray(cast)) { - forEach(values, function(value, index) { - if (isString(cast[index])) { - cast[index] = cast[index].toLowerCase(); - } else { - deserialize[cast[index]] = cast[index]; - } - definition.push('deserialize[cast[' + index + ']](' + buildCell(index) + ')'); - }); - } else { - forEach(values, function(value, index) { - definition.push(castCell(value, index)); - }); - } - } else { - forEach(values, function(value, index) { - definition.push(buildCell(index)); - }); - } - definition = 'return [' + definition.join(',') + ']'; - } else { - if (cast) { - if (isArray(cast)) { - forEach(values, function(value, index) { - if (isString(cast[index])) { - cast[index] = cast[index].toLowerCase(); - } else { - deserialize[cast[index]] = cast[index]; - } - definition.push('"' + sanitizeString(attrs[index]) + '": deserialize[cast[' + index + ']](' + buildCell(index) + ')'); - }); - } else { - forEach(values, function(value, index) { - definition.push('"' + sanitizeString(attrs[index]) + '": ' + castCell(value, index)); - }); - } - } else { - forEach(values, function(value, index) { - definition.push('"' + sanitizeString(attrs[index]) + '": ' + buildCell(index)); - }); - } - definition = 'return {' + definition.join(',') + '}'; - } - return new Function('attrs', 'deserialize', 'cast', definition); - } - - function detectDelimiter(string, delimiters) { - var count = 0, - detected; - - forEach(delimiters, function(delimiter) { - var needle = delimiter, - matches; - if (ESCAPE_DELIMITERS.indexOf(delimiter) != -1) { - needle = '\\' + needle; - } - matches = string.match(new RegExp(needle, 'g')); - if (matches && matches.length > count) { - count = matches.length; - detected = delimiter; - } - }); - return (detected || delimiters[0]); - } - - var CSV = (function() { - function CSV(data, options) { - if (!options) options = {}; - - if (isArray(data)) { - this.mode = 'encode'; - } else if (isString(data)) { - this.mode = 'parse'; - } else { - throw new Error("Incompatible format!"); - } - - this.data = data; - - this.options = { - header: fallback(options.header, false), - cast: fallback(options.cast, true) - } - - var lineDelimiter = options.lineDelimiter || options.line, - cellDelimiter = options.cellDelimiter || options.delimiter; - - if (this.isParser()) { - this.options.lineDelimiter = lineDelimiter || detectDelimiter(this.data, LINE_DELIMITERS); - this.options.cellDelimiter = cellDelimiter || detectDelimiter(this.data, CELL_DELIMITERS); - this.data = normalizeCSV(this.data, this.options.lineDelimiter); - } else if (this.isEncoder()) { - this.options.lineDelimiter = lineDelimiter || '\r\n'; - this.options.cellDelimiter = cellDelimiter || ','; - } - } - - function invoke(method, constructor, attributes, deserialize, cast) { - method(new constructor(attributes, deserialize, cast)); - } - - function normalizeCSV(text, lineDelimiter) { - if (text.slice(-lineDelimiter.length) != lineDelimiter) text += lineDelimiter; - return text; - } - - CSV.prototype.set = function(setting, value) { - return this.options[setting] = value; - } - - CSV.prototype.isParser = function() { - return this.mode == 'parse'; - } - - CSV.prototype.isEncoder = function() { - return this.mode == 'encode'; - } - - CSV.prototype.parse = function(callback) { - if (this.mode != 'parse') return; - if (this.data.trim().length === 0) return []; - - var data = this.data, - options = this.options, - header = options.header, - current = { cell: '', line: [] }, - deserialize = this.deserialize, - flag, record, response; - - if (!callback) { - response = []; - callback = function(record) { - response.push(record); - } - } - - function resetFlags() { - flag = { escaped: false, quote: false, cell: true }; - } - function resetCell() { - current.cell = ''; - } - function resetLine() { - current.line = []; - } - - function saveCell(cell) { - current.line.push(flag.escaped ? cell.slice(1, -1).replace(/""/g, '"') : cell); - resetCell(); - resetFlags(); - } - function saveLastCell(cell) { - saveCell(cell.slice(0, 1 - options.lineDelimiter.length)); - } - function saveLine() { - if (header) { - if (isArray(header)) { - record = buildConstructor(deserialize, options.cast, current.line, header); - saveLine = function() { - invoke(callback, record, current.line, deserialize, options.cast); - }; - saveLine(); - } else { - header = current.line; - } - } else { - if (!record) { - record = buildConstructor(deserialize, options.cast, current.line); - } - saveLine = function() { - invoke(callback, record, current.line, deserialize, options.cast); - }; - saveLine(); - } - } - - if (options.lineDelimiter.length == 1) saveLastCell = saveCell; - - var dataLength = data.length, - cellDelimiter = options.cellDelimiter.charCodeAt(0), - lineDelimiter = options.lineDelimiter.charCodeAt(options.lineDelimiter.length - 1), - _i, _c, _ch; - - resetFlags(); - - for (_i = 0, _c = 0; _i < dataLength; _i++) { - _ch = data.charCodeAt(_i); - - if (flag.cell) { - flag.cell = false; - if (_ch == 34) { - flag.escaped = true; - continue; - } - } - - if (flag.escaped && _ch == 34) { - flag.quote = !flag.quote; - continue; - } - - if ((flag.escaped && flag.quote) || !flag.escaped) { - if (_ch == cellDelimiter) { - saveCell(current.cell + data.slice(_c, _i)); - _c = _i + 1; - } else if (_ch == lineDelimiter) { - saveLastCell(current.cell + data.slice(_c, _i)); - _c = _i + 1; - if (current.line.length > 1 || current.line[0] !== "") { - saveLine(); - } - resetLine(); - } - } - } - - if (response) { - return response; - } else { - return this; - } - } - - function serializeType(object) { - if (isArray(object)) { - return 'array'; - } else if (isObject(object)) { - return 'object'; - } else if (isString(object)) { - return 'string'; - } else if (isNull(object)) { - return 'null'; - } else { - return 'primitive'; - } - } - - CSV.prototype.deserialize = { - "string": function(string) { - return String(string); - }, - "number": function(number) { - return Number(number); - }, - "boolean": function(b) { - return Boolean(b); - } - } - - CSV.prototype.serialize = { - "object": function(object) { - var that = this, - attributes = Object.keys(object), - serialized = Array(attributes.length); - forEach(attributes, function(attr, index) { - serialized[index] = that[serializeType(object[attr])](object[attr]); - }); - return serialized; - }, - "array": function(array) { - var that = this, - serialized = Array(array.length); - forEach(array, function(value, index) { - serialized[index] = that[serializeType(value)](value); - }); - return serialized; - }, - "string": function(string) { - return '"' + String(string).replace(/"/g, '""') + '"'; - }, - "null": function(value) { - return ''; - }, - "primitive": function(value) { - return value; - } - } - - CSV.prototype.encode = function(callback) { - if (this.mode != 'encode') return; - - if (this.data.length == 0) return ''; - - var data = this.data, - options = this.options, - header = options.header, - sample = data[0], - serialize = this.serialize, - offset = 0, - attributes, response; - - if (!callback) { - response = Array(data.length); - callback = function(record, index) { - response[index + offset] = record; - } - } - - function serializeLine(record) { - return record.join(options.cellDelimiter); - } - - if (header) { - if (!isArray(header)) { - attributes = Object.keys(sample); - header = attributes; - } - callback(serializeLine(serialize.array(header)), 0); - offset = 1; - } - - var recordType = serializeType(sample), - map; - - if (recordType == 'array') { - if (isArray(options.cast)) { - map = Array(options.cast.length); - forEach(options.cast, function(type, index) { - if (isString(type)) { - map[index] = type.toLowerCase(); - } else { - map[index] = type; - serialize[type] = type; - } - }); - } else { - map = Array(sample.length); - forEach(sample, function(value, index) { - map[index] = serializeType(value); - }); - } - forEach(data, function(record, recordIndex) { - var serializedRecord = Array(map.length); - forEach(record, function(value, valueIndex) { - serializedRecord[valueIndex] = serialize[map[valueIndex]](value); - }); - callback(serializeLine(serializedRecord), recordIndex); - }); - } else if (recordType == 'object') { - attributes = Object.keys(sample); - if (isArray(options.cast)) { - map = Array(options.cast.length); - forEach(options.cast, function(type, index) { - if (isString(type)) { - map[index] = type.toLowerCase(); - } else { - map[index] = type; - serialize[type] = type; - } - }); - } else { - map = Array(attributes.length); - forEach(attributes, function(attr, index) { - map[index] = serializeType(sample[attr]); - }); - } - forEach(data, function(record, recordIndex) { - var serializedRecord = Array(attributes.length); - forEach(attributes, function(attr, attrIndex) { - serializedRecord[attrIndex] = serialize[map[attrIndex]](record[attr]); - }); - callback(serializeLine(serializedRecord), recordIndex); - }); - } - - if (response) { - return response.join(options.lineDelimiter); - } else { - return this; - } - } - - CSV.prototype.forEach = function(callback) { - return this[this.mode](callback); - } - - return CSV; - })(); - - CSV.parse = function(data, options) { - return new CSV(data, options).parse(); - } - - CSV.encode = function(data, options) { - return new CSV(data, options).encode(); - } - - CSV.forEach = function(data, options, callback) { - if (arguments.length == 2) { - callback = options; - } - return new CSV(data, options).forEach(callback); - } - - return CSV; -})); diff --git a/i18n/csv_js_LICENSE b/i18n/csv_js_LICENSE deleted file mode 100644 index 418e8c7..0000000 --- a/i18n/csv_js_LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Kash Nouroozi - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/i18n/locales/en-US/main.json b/i18n/en-US/main.json similarity index 75% rename from i18n/locales/en-US/main.json rename to i18n/en-US/main.json index 6d29236..cbfd161 100644 --- a/i18n/locales/en-US/main.json +++ b/i18n/en-US/main.json @@ -2,13 +2,12 @@ "screenshotSaved": "Screenshot saved", "screenshotsSaved": "$0 screenshots saved", "programName": "Majsoul Plus", - "mod": "Mods", - "execute": "Plugins", + "resourcepack": "Resource Packs", + "extension": "Extensions", "tool": "Tools", "setting": "Settings", "about": "About", "community": "Community", - "server": "Server", "delay": "Delay", "launch": "Launch Game", "loading": "Loading", @@ -19,5 +18,10 @@ "httpsGetFileRedirect": "$0 is redirected, Code: $1", "portInUse": "Port in use, Retrying...", "consoleMessage": "ConsoleMsg", - "webContentsCrashed": "Web Contents Crashed" + "webContentsCrashed": "Web Contents Crashed", + + "server": "Server", + "serverzh": "ZH Server", + "serverjp": "JP Server", + "serveren": "EN Server" } diff --git a/i18n/locales/en-US/manager.json b/i18n/en-US/manager.json similarity index 68% rename from i18n/locales/en-US/manager.json rename to i18n/en-US/manager.json index a2979ec..6e6891e 100644 --- a/i18n/locales/en-US/manager.json +++ b/i18n/en-US/manager.json @@ -9,11 +9,14 @@ "chromium": "Core (Application restarting is required)", "isHardwareAccelerationDisable": "Disable GPU acceleration", "isInProcessGpuOn": "Enable GPU in-process ( Windows / macOS )", - "isIgnoreGpuBlacklist":"Ignore WebGL GPU Blacklist", + "isIgnoreGpuBlacklist": "Ignore WebGL GPU Blacklist", "isNoBorder": "Launch game with borderless window", "userData": "User Data", "isUseDefaultPath": "Use 'User Library'", "useAppdataLibrary": "Use AppData dir to storage resources", + "useHttpServer": "User http server(avoid certificate error)", + "serverToPlay": "Server to play (0 is China server, 1 is Japan server, 2 is America server)", + "proxyUrl": "Proxy server address (leave it empty if you don't want to use it)", "userLibPath": "'User Library' Path", "localVersion": "Version", "isManagerHide": "Re-open the launcher when the game quit", @@ -45,13 +48,7 @@ "downloadFinished": "Download Finished", "downloadFinishedInfo": "A new version has been downloaded, update and relaunch now?", - "executeSafeAlert": "这个插件需要以下权限,您确定要启用么?", - "executeSafeAlertScript": "- 完全的脚本权限,可以获取和操作您页面的所有数据", - "executeSafeAlertDocument": "- 访问根文档和对象,可以获取和操作您的整个显示页面", - "executeSafeAlertLocalStorage": "- 访问页面本地存储内容,通常会包含敏感内容", - "executeSafeAlertWriteableWindowObject": "- 修改页面的全局对象,可能会导致页面更容易遭受攻击", - "executeSafeAlertXMLHttpRequest": "- 进行网络访问,与其它网站进行通信", - "executeSafeAlertWebSocket": "- 进行网络连接,与其它网站建立长时间通信", - "executeSafeAlertNodeRequire": "- 使用标准 Node 模块,访问和修改您的操作系统", - "executeSafeAlertWebSecurity": "- 访问跨域资源,从其它网站或您的计算机的任意位置加载文件" + "dependencyNotFound": "Dependency $0 not found!", + "dependencyNotEnabled": "Please enable dependency $0 first!", + "dependencyVersionMismatch": "Dependency version mismatch! Requires $0:$1, but enabled $2" } diff --git a/i18n/locales/en-US/menu.json b/i18n/en-US/menu.json similarity index 100% rename from i18n/locales/en-US/menu.json rename to i18n/en-US/menu.json diff --git a/i18n/locales/en-US/servers.json b/i18n/en-US/servers.json similarity index 87% rename from i18n/locales/en-US/servers.json rename to i18n/en-US/servers.json index fc71538..822282a 100644 --- a/i18n/locales/en-US/servers.json +++ b/i18n/en-US/servers.json @@ -1,5 +1,5 @@ { - "mainland": "Mainland China", + "mainland": "Mainland", "cn": "China", "hk": "Hong Kong", "tw": "Taiwan", diff --git a/i18n/locales/en-US/update.json b/i18n/en-US/update.json similarity index 100% rename from i18n/locales/en-US/update.json rename to i18n/en-US/update.json diff --git a/i18n/i18n.d.ts b/i18n/i18n.d.ts deleted file mode 100644 index 503c246..0000000 --- a/i18n/i18n.d.ts +++ /dev/null @@ -1,190 +0,0 @@ -/// - -/** - * 本地化,单条语句翻译对象 - * @param params 格式化参数,会自动替换文本中的 $1、$2 - */ -declare function Locale( - /** - * 若干个字符串,依次填充到 $1、$2 - */ - ...params: string[] -): string -declare interface Locale { - /** - * 格式化该键对应的翻译文本并返回 - */ - ( - /** - * 若干个字符串,依次填充到 $1、$2 - */ - ...params: string[] - ): string - /** - * 翻译文本的键 - */ - [localeKey: string]: Locale - /** - * 绑定该条翻译到指定DOM元素的 innerText - * @param htmlElement 要绑定的 HTMLElement 元素 - * @param params 格式化参数,会自动替换文本中的 $1、$2 - */ - renderAsText( - /** - * 必须是标准的 HTMLElement DOM 元素 - */ - htmlElement: HTMLElement, - /** - * 若干个字符串,依次填充到 $1、$2 - */ - ...params: string[] - ): void - /** - * 绑定该条翻译到指定DOM元素的 innerHTML - * @param htmlElement 要绑定的 HTMLElement 元素 - * @param params 格式化参数,会自动替换文本中的 $1、$2 - */ - renderAsHTML( - /** - * 必须是标准的 HTMLElement DOM 元素 - */ - htmlElement: HTMLElement, - /** - * 若干个字符串,依次填充到 $1、$2 - */ - ...params: string[] - ): void -} - -declare interface StringPack extends String { - /** - * 翻译文本的键 - */ - [localeKey: string]: StringPack -} - -/** - * 本地化,根级翻译文本对象 - */ -declare interface LocaleMain { - /** - * 翻译文本的键 - */ - [localeKey: string]: Locale -} - -declare class i18n { - /** - * 构造函数 - */ - constructor(i18nInitConfigs?: { - /** - * 翻译文件所在的文件夹路径 - */ - directory?: string - /** - * 语言偏好列表,越靠前越优先 - */ - actives?: string[] - /** - * 在找不到翻译文本时的默认语言 - */ - defaultLocale?: string - /** - * 是否监听文件修改,以自动更新翻译 - */ - autoReload?: boolean - }) - /** - * 解绑指定DOM元素的所有绑定的翻译 - * @param htmlElement 要解绑的 HTMLElement - */ - unbindElement( - /** - * @param htmlElement 必须是标准的 HTMLElement DOM 元素 - */ - htmlElement: HTMLElement - ): void - /** - * 绑定一条翻译到指定DOM元素的 innerText - * @param locale 一个要绑定的单条语句翻译对象 - * @param htmlElement 要绑定的 HTMLElement - * @param params 格式化参数,会自动替换文本中的 $1、$2 - */ - bindElementText( - /** - * 这个对象必须是一个 Locale 类型函数对象 - */ - locale: Locale, - /** - * 必须是标准的 HTMLElement DOM 元素 - */ - htmlElement: HTMLElement, - /** - * 若干个字符串,依次填充到 $1、$2 - */ - ...params: string[] - ): void - /** - * 绑定一条翻译到指定DOM元素的 innerHTML - * @param locale 一个要绑定的单条语句翻译对象 - * @param htmlElement 要绑定的 HTMLElement - * @param params 格式化参数,会自动替换文本中的 $1、$2 - */ - bindElementHTML( - /** - * 这个对象必须是一个 Locale 类型函数对象 - */ - locale: Locale, - /** - * 必须是标准的 HTMLElement DOM 元素 - */ - htmlElement: HTMLElement, - /** - * 若干个字符串,依次填充到 $1、$2 - */ - ...params: string[] - ): void - /** - * 根据 dataset.i18n 绑定翻译到DOM元素树 Text - * @param {HTMLElement} htmlElement HTMLElement - */ - parseAllElementsText( - /** - * 必须是标准的 HTMLElement DOM 元素 - */ - htmlElement: HTMLElement - ): void - /** - * 根据 dataset.i18n 绑定翻译到DOM元素树 HTML - * @param {HTMLElement} htmlElement HTMLElement - */ - parseAllElementsHTML( - /** - * 必须是标准的 HTMLElement DOM 元素 - */ - htmlElement: HTMLElement - ): void - /** - * 根级翻译文本对象 - */ - get text(): LocaleMain - /** - * 根级翻译文本对象 - */ - get t(): LocaleMain - /** - * 根级翻译文本对象 - */ - get _(): LocaleMain - /** - * 已经加载的翻译文本 - */ - get locals(): StringPack - /** - * 活动的语言列表的拷贝 - */ - get actives(): string[] - set actives(localeTags: string[]) -} -export = i18n diff --git a/i18n/i18n.js b/i18n/i18n.js deleted file mode 100644 index da5eb8e..0000000 --- a/i18n/i18n.js +++ /dev/null @@ -1,347 +0,0 @@ -const path = require('path') -const fs = require('fs') -const CSV = require('./csv') - -/** - * 自动地判断并读取一个js或者是json - * @param {string} filePath Path - */ -const readLangFile = filePath => { - switch (path.extname(filePath)) { - case '.js': - delete require.cache[filePath] - return require(filePath) - case '.json': - return JSON.parse(fs.readFileSync(filePath)) - case '.csv': - /** - * @type {string[][]} - */ - const csv = new CSV(fs.readFileSync(filePath).toString(), { - cast: false - }).parse() - const localeObj = {} - csv.forEach(line => { - localeObj[line[0]] = line[2] - }) - return localeObj - default: - return {} - } -} -/** - * 读取一个文件夹以及内部所有类JSON文件 - * @param {string} dirPath Path - */ -const readLangDir = dirPath => { - const lang = {} - const files = fs.readdirSync(dirPath) - const filesPath = files.map(fileName => { - return path.join(dirPath, fileName) - }) - filesPath.forEach((filePath, index) => { - const stat = fs.statSync(filePath) - if (stat.isDirectory()) { - lang[files[index]] = readLangDir(filePath) - } else { - const fileName = files[index] - lang[path.basename(fileName, path.extname(fileName))] = readLangFile( - filePath - ) - } - }) - return lang -} -class i18n { - /** - * 构造函数 - */ - constructor ({ - directory = path.join(__dirname, 'locales'), - actives = [], - defaultLocale = 'en-US', - autoReload = false - } = {}) { - // 如果文件夹参数不是文件夹,报错 - const stat = fs.statSync(directory) - if (!stat.isDirectory()) { - throw new Error('param directory is not a directory') - } - // 如果文件夹为空,报错 - const files = fs.readdirSync(directory) - if (!files) { - throw new Error('directory is empty, please make sure there is any files') - } - // 读取所有翻译文本 - this._locals = readLangDir(directory) - // 设置一个绑定列表 - /** - * @type {any[]} - */ - this._bindElementList = [] - // 当优先语言全部不存在,则加载该默认语言 - this.defaultLocale = defaultLocale - // 设置活动的语言列表 - this.actives = actives - // 设置 text 的 Proxy 对象 - ;(() => { - /** - * 格式化模板字符串 - * @param {string} string - * @param {...string} args - */ - const formatString = (string, ...args) => { - for (let index in args) { - string = string.replace(`$${index}`, args[index]) - } - return string - } - /** - * 创建一个被包装过的Object - * @param {string[]} chainsArray 调用链 - */ - const createProxy = chainsArray => { - return new Proxy( - (() => { - const f = (...args) => { - for (let i = 0; i < this._actives.length; i++) { - let localeObj = this.locals[this._actives[i]] - if (!localeObj) { - continue - } - for (let j = 0; j < f._chains.length; j++) { - localeObj = localeObj[f._chains[j]] - if (!localeObj) { - break - } else if (j === f._chains.length - 1) { - return formatString(localeObj, ...args) - } - } - } - return 'MissingText' - } - f._chains = chainsArray - /** - * @param {HTMLElement} htmlElement - * @param {...string} args - */ - f.renderAsText = (htmlElement, ...args) => { - this.bindElementText(f, htmlElement, ...args) - } - /** - * @param {HTMLElement} htmlElement - * @param {...string} args - */ - f.renderAsHTML = (htmlElement, ...args) => { - this.bindElementHTML(f, htmlElement, ...args) - } - f.toString = () => f.call(this) - return f - })(), - { - get: (target, key) => { - if (!target[key]) { - target[key] = createProxy(target._chains.concat(key)) - } - return target[key] - } - } - ) - } - this._text = new Proxy( - {}, - { - get: (target, key) => { - return createProxy([].concat(key)) - } - } - ) - })() - // 如果设置了自动更新翻译 - if (autoReload) { - /** - * @type {string[]} 已被监听的文件夹列表 - */ - const calledList = [] - /** - * 递归为一个文件夹内全部文件夹执行事件,重复调用不会执行 - * @param {string} filePath - * @param {function} callback - */ - const recursiveDir = (filePath, callback) => { - fs.stat(filePath, (error, stat) => { - if (error) { - throw error - } - if (stat.isDirectory()) { - if (!calledList.includes(filePath)) { - callback.call(this, filePath) - calledList.push(filePath) - } - fs.readdir(filePath, (error, files) => { - if (error) { - throw error - } - files.forEach(file => { - recursiveDir(path.join(filePath, file), callback) - }) - }) - } - }) - } - const dirWatcher = dirPath => { - fs.watch(dirPath, eventType => { - if (eventType === 'change') { - // 重新载入所有翻译文本 - this._locals = readLangDir(directory) - // 如果出现新文件夹,自动监听 - recursiveDir(dirPath, dirWatcher) - // 更新绑定的翻译 - this._updateLocales() - } - }) - } - recursiveDir(directory, dirWatcher) - } - } - /** - * 更新所有绑定翻译的内容 - */ - _updateLocales () { - this._bindElementList.forEach(({ locale, htmlElement, type, args }) => { - const text = locale(...args) - switch (type) { - case 'text': { - htmlElement.innerText = text - break - } - case 'html': { - htmlElement.innerHTML = text - } - } - }) - } - /** - * 绑定一条翻译到指定DOM元素 - * @param {function} locale 一个locale函数对象 - * @param {HTMLElement} htmlElement HTMLElement - * @param {"text" | "html"} type 绑定到的类型 - * @param {...string} args locale参数 - */ - _bindElement (locale, htmlElement, type, ...args) { - this._bindElementList.push({ - locale: locale, - htmlElement: htmlElement, - type: type, - args: args - }) - this._updateLocales() - } - /** - * 解绑指定DOM元素的所有绑定 - * @param {HTMLElement} htmlElement HTMLElement - */ - unbindElement (htmlElement) { - this._bindElementList = this._bindElementList.filter( - ({ htmlElementTest }) => { - return htmlElementTest !== htmlElement - } - ) - } - /** - * 绑定一条翻译到指定DOM元素的 innerText - * @param {function} locale 一个locale函数对象 - * @param {HTMLElement} htmlElement HTMLElement - * @param {...string} args locale参数 - */ - bindElementText (locale, htmlElement, ...args) { - return this._bindElement(locale, htmlElement, 'text', ...args) - } - /** - * 绑定一条翻译到指定DOM元素的 innerHTML - * @param {function} locale 一个locale函数对象 - * @param {HTMLElement} htmlElement HTMLElement - * @param {...string} args locale参数 - */ - bindElementHTML (locale, htmlElement, ...args) { - return this._bindElement(locale, htmlElement, 'html', ...args) - } - /** - * 获取翻译文本 - * @returns {(...params?:string)=>{[key:string]:function}} - */ - get text () { - return this._text - } - /** - * 根据 dataset.i18n 绑定翻译到DOM元素树 - * @param {HTMLElement} htmlElement HTMLElement - * @param {"text" | "html"} type 绑定到的类型 - * @param {...string} args locale参数 - */ - _parseAllElements (htmlElement, type, ...args) { - /** - * 渲染翻译 - * @param {HTMLElement} element - */ - const renderElement = element => { - const i18nLocaleKeyChain = element.dataset.i18n.split('.') - const i18nLocaleElement = (() => { - let SelectedElement = this.text - i18nLocaleKeyChain.forEach(i18nLocaleKey => { - SelectedElement = SelectedElement[i18nLocaleKey] - }) - return SelectedElement - })() - this._bindElement(i18nLocaleElement, element, type, ...args) - } - if (htmlElement.getAttribute('data-i18n')) { - renderElement(htmlElement) - } - htmlElement.querySelectorAll('[data-i18n]').forEach(renderElement) - } - /** - * 根据 dataset.i18n 绑定翻译到DOM元素树 Text - * @param {HTMLElement} htmlElement HTMLElement - */ - parseAllElementsText (htmlElement) { - return this._parseAllElements(htmlElement, 'text') - } - /** - * 根据 dataset.i18n 绑定翻译到DOM元素树 HTML - * @param {HTMLElement} htmlElement HTMLElement - */ - parseAllElementsHTML (htmlElement) { - return this._parseAllElements(htmlElement, 'html') - } - get t () { - return this.text - } - get _ () { - return this.text - } - /** - * 已经加载的翻译文本 - * @returns {{[localTag: string] : {[type:string]:string}}} - */ - get locals () { - return this._locals - } - /** - * 活动的语言列表的拷贝 - * @returns {string[]} - */ - get actives () { - const copy = this._actives.concat() - copy.pop() - return copy - } - /** - * @param {string[]} localTags - */ - set actives (localTags) { - this._actives = localTags.concat(this.defaultLocale) - this._updateLocales() - } -} -module.exports = i18n diff --git a/i18n/locales/ja-JP/main.csv b/i18n/ja-JP/main.csv similarity index 84% rename from i18n/locales/ja-JP/main.csv rename to i18n/ja-JP/main.csv index f18666d..67ed9d0 100644 --- a/i18n/locales/ja-JP/main.csv +++ b/i18n/ja-JP/main.csv @@ -1,6 +1,6 @@ programName,雀魂Plus,雀魂Plus -mod,模组,モジュール -execute,插件,プラグイン +resourcepack,资源包,リソースパック +extension,扩展,エクステンション tool,工具,ツール setting,设置,設定 about,关于,雀魂Plusについて @@ -12,10 +12,13 @@ portInUse,端口被占用,重试中……,ポートが既に使われていま consoleMessage,控制台消息,コンソールメッセージ community,社区,コミュニティ webContentsCrashed,Web Contents 崩溃,WebContentsがクラッシュしました -server,服务器,サーバ delay,网络延迟,ネットワーク遅延 launch,启动游戏,ゲームスタート loading,加载中,ロード中 millisecond,毫秒,ミリ秒 screenshotSaved,截图已保存,スクリーンショットを保存しました -screenshotsSaved,已保存 $0 张截图,$0 枚のスクリーンショットを保存しました \ No newline at end of file +screenshotsSaved,已保存 $0 张截图,$0 枚のスクリーンショットを保存しました +server,服务器,サーバ +serverzh,国服,中国サーバ +serverjp,日服,日本サーバ +serveren,美服,アメリカサーバ \ No newline at end of file diff --git a/i18n/locales/ja-JP/manager.csv b/i18n/ja-JP/manager.csv similarity index 79% rename from i18n/locales/ja-JP/manager.csv rename to i18n/ja-JP/manager.csv index 8780b78..f08568b 100644 --- a/i18n/locales/ja-JP/manager.csv +++ b/i18n/ja-JP/manager.csv @@ -13,6 +13,9 @@ isNoBorder,使用无边框窗口进入游戏,ボーダーレスウインドウ userData,用户数据,ユーザーデータ isUseDefaultPath,使用默认用户库目录,デフォルトのユーザーライブラリディレクトリを使用する useAppdataLibrary,使用 AppData 存储扩展资源,AppDataディレクトリを拡張リソースの保存先として使用する +useHttpServer,使用 http 服务器(不存在证书错误),http サービスを使用する(証明書エラーがない) +serverToPlay,游戏服务器(0为国服,1为日服,2为美服),ゲームサーバー(0は中国サーバー、1は日本サーバー、2は米国サーバー) +proxyUrl,"代理服务器地址(留空为不使用代理)",プロキシサーバーアドレス(プロキシを使用しない場合は空白のままにします) userLibPath,用户库目录,ユーザライブラリディレクトリ localVersion,版本,バージョン isManagerHide,退出游戏后回到管理器界面,ゲーム終了後、管理画面に戻る @@ -39,12 +42,6 @@ needNotToUpdate,无需更新,必要なアップデート情報はありません XMLHttpRequestFailed,AJAX 请求失败,状态码: $0,"AJAX通信に失敗しました, ステータスコード:$0" downloadFinished,下载完毕,ダウンロード完了 downloadFinishedInfo,更新已下载完毕,是否安装并重启?,更新プログラムのダウンロードが完了しました、インストールをするため再起動を行いますか? -executeSafeAlert,这个插件需要以下权限,您确定要启用么?, -executeSafeAlertScript,- 完全的脚本权限,可以获取和操作您页面的所有数据, -executeSafeAlertDocument,- 访问根文档和对象,可以获取和操作您的整个显示页面, -executeSafeAlertLocalStorage,- 访问页面本地存储内容,通常会包含敏感内容, -executeSafeAlertWriteableWindowObject,- 修改页面的全局对象,可能会导致页面更容易遭受攻击, -executeSafeAlertXMLHttpRequest,- 进行网络访问,与其它网站进行通信, -executeSafeAlertWebSocket,- 进行网络连接,与其它网站建立长时间通信, -executeSafeAlertNodeRequire,- 使用标准Node模块,访问和修改您的操作系统, -executeSafeAlertWebSecurity,- 访问跨域资源,从其它网站或您的计算机的任意位置加载文件, \ No newline at end of file +dependencyNotFound,依赖 $0 未找到!,依存関係が見つかりません:$0 +dependencyNotEnabled,请先启用依赖 $0!,まず $0 を有効にしてください +dependencyVersionMismatch,依赖版本不符!依赖 $0:$1,安装了 $2,依存バージョンが一致しません!依存 $0:$1、インストール済み $2 \ No newline at end of file diff --git a/i18n/locales/ja-JP/menu.csv b/i18n/ja-JP/menu.csv similarity index 100% rename from i18n/locales/ja-JP/menu.csv rename to i18n/ja-JP/menu.csv diff --git a/i18n/locales/ja-JP/servers.csv b/i18n/ja-JP/servers.csv similarity index 87% rename from i18n/locales/ja-JP/servers.csv rename to i18n/ja-JP/servers.csv index ccbfd15..ebf9b0f 100644 --- a/i18n/locales/ja-JP/servers.csv +++ b/i18n/ja-JP/servers.csv @@ -1,4 +1,4 @@ -mainland,中国大陆,中国大陸 +mainland,本土,本土 cn,中国,中国 hk,中国香港,香港 tw,中国台湾,台湾 diff --git a/i18n/locales/ja-JP/update.csv b/i18n/ja-JP/update.csv similarity index 100% rename from i18n/locales/ja-JP/update.csv rename to i18n/ja-JP/update.csv diff --git a/i18n/locales/zh-CN/main.json b/i18n/zh-CN/main.json similarity index 79% rename from i18n/locales/zh-CN/main.json rename to i18n/zh-CN/main.json index 5b21acc..d65793c 100644 --- a/i18n/locales/zh-CN/main.json +++ b/i18n/zh-CN/main.json @@ -1,12 +1,11 @@ { "programName": "雀魂Plus", - "mod": "模组", - "execute": "插件", + "resourcepack": "资源包", + "extension": "扩展", "tool": "工具", "setting": "设置", "about": "关于", "community": "社区", - "server": "服务器", "delay": "延迟", "launch": "启动游戏", "loading": "加载中", @@ -23,5 +22,10 @@ "webContentsCrashed": "游戏宿主窗口崩溃", "screenshotSaved": "截图已保存", - "screenshotsSaved": "已保存 $0 张截图" + "screenshotsSaved": "已保存 $0 张截图", + + "server": "服务器", + "serverzh": "国服", + "serverjp": "日服", + "serveren": "美服" } diff --git a/i18n/locales/zh-CN/manager.json b/i18n/zh-CN/manager.json similarity index 66% rename from i18n/locales/zh-CN/manager.json rename to i18n/zh-CN/manager.json index 0766e53..7c56f56 100644 --- a/i18n/locales/zh-CN/manager.json +++ b/i18n/zh-CN/manager.json @@ -9,11 +9,14 @@ "chromium": "核心(需重启软件)", "isHardwareAccelerationDisable": "关闭 GPU 硬件加速", "isInProcessGpuOn": "启用进程内 GPU 处理 (Windows / macOS)", - "isIgnoreGpuBlacklist":"忽略 WebGL GPU 黑名单", + "isIgnoreGpuBlacklist": "忽略 WebGL GPU 黑名单", "isNoBorder": "使用无边框窗口进入游戏", "userData": "用户数据", "isUseDefaultPath": "使用默认用户库目录", "useAppdataLibrary": "使用 AppData 存储扩展资源", + "useHttpServer": "使用 http 服务器(不存在证书错误)", + "serverToPlay": "游戏服务器(0为国服,1为日服,2为美服)", + "proxyUrl": "代理服务器地址(留空为不使用代理)", "userLibPath": "用户库目录", "localVersion": "版本", "isManagerHide": "退出游戏后回到管理器界面", @@ -48,13 +51,7 @@ "downloadFinished": "下载完毕", "downloadFinishedInfo": "更新已下载完毕,是否安装并重启?", - "executeSafeAlert": "这个插件需要以下权限,您确定要启用么?", - "executeSafeAlertScript": "- 完全的脚本权限,可以获取和操作您页面的所有数据", - "executeSafeAlertDocument": "- 访问根文档和对象,可以获取和操作您的整个显示页面", - "executeSafeAlertLocalStorage": "- 访问页面本地存储内容,通常会包含敏感内容", - "executeSafeAlertWriteableWindowObject": "- 修改页面的全局对象,可能会导致页面更容易遭受攻击", - "executeSafeAlertXMLHttpRequest": "- 进行网络访问,与其它网站进行通信", - "executeSafeAlertWebSocket": "- 进行网络连接,与其它网站建立长时间通信", - "executeSafeAlertNodeRequire": "- 使用标准 Node 模块,访问和修改您的操作系统", - "executeSafeAlertWebSecurity": "- 访问跨域资源,从其它网站或您的计算机的任意位置加载文件" + "dependencyNotFound": "依赖 $0 未找到!", + "dependencyNotEnabled": "请先启用依赖 $0!", + "dependencyVersionMismatch": "依赖版本不符!依赖 $0:$1,安装了 $2" } diff --git a/i18n/locales/zh-CN/menu.json b/i18n/zh-CN/menu.json similarity index 100% rename from i18n/locales/zh-CN/menu.json rename to i18n/zh-CN/menu.json diff --git a/i18n/locales/zh-CN/servers.json b/i18n/zh-CN/servers.json similarity index 87% rename from i18n/locales/zh-CN/servers.json rename to i18n/zh-CN/servers.json index 35645fe..2ff639b 100644 --- a/i18n/locales/zh-CN/servers.json +++ b/i18n/zh-CN/servers.json @@ -1,5 +1,5 @@ { - "mainland": "中国大陆", + "mainland": "本土", "cn": "中国", "hk": "中国香港", "tw": "中国台湾", diff --git a/i18n/locales/zh-CN/update.json b/i18n/zh-CN/update.json similarity index 100% rename from i18n/locales/zh-CN/update.json rename to i18n/zh-CN/update.json diff --git a/i18n/locales/zh-TW/main.json b/i18n/zh-TW/main.json similarity index 85% rename from i18n/locales/zh-TW/main.json rename to i18n/zh-TW/main.json index 80d4e68..aea0287 100644 --- a/i18n/locales/zh-TW/main.json +++ b/i18n/zh-TW/main.json @@ -2,13 +2,12 @@ "screenshotSaved": "\u64f7\u5716\u5df2\u5132\u5b58", "screenshotsSaved": "\u5df2\u5132\u5b58 $0 \u5f35\u64f7\u5716", "programName": "\u96c0\u9b42Plus", - "mod": "\u6a21\u7d44", - "execute": "\u63d2\u4ef6", + "resourcepack": "\u8d44\u6e90\u5305", + "extension": "\u6269\u5c55", "tool": "\u5de5\u5177", "setting": "\u63a7\u5236\u53f0", "about": "\u95dc\u65bc", "community": "\u793e\u5340", - "server": "\u4f3a\u670d\u5668", "delay": "\u5ef6\u9072", "launch": "\u5553\u52d5\u6e38\u6232", "loading": "\u52a0\u8f09\u4e2d", @@ -19,5 +18,9 @@ "httpsGetFileRedirect": "\u8a2a\u554f $0 \u88ab\u91cd\u5b9a\u5411\uff0c\u72c0\u614b\u78bc $1", "portInUse": "\u57e0 \u88ab\u5360\u7528\uff0c\u91cd\u8a66\u4e2d\u2026\u2026", "consoleMessage": "\u63a7\u5236\u53f0\u6d88\u606f", - "webContentsCrashed": "\u6e38\u6232\u5bbf\u4e3b\u7a97\u53e3\u5d29\u6f70" + "webContentsCrashed": "\u6e38\u6232\u5bbf\u4e3b\u7a97\u53e3\u5d29\u6f70", + "server": "\u4f3a\u670d\u5668", + "serverzh": "\u570b\u4f3a", + "serverjp": "\u65e5\u4f3a", + "serveren": "\u7f8e\u4f3a" } diff --git a/i18n/locales/zh-TW/manager.json b/i18n/zh-TW/manager.json similarity index 80% rename from i18n/locales/zh-TW/manager.json rename to i18n/zh-TW/manager.json index b23957b..3531bb1 100644 --- a/i18n/locales/zh-TW/manager.json +++ b/i18n/zh-TW/manager.json @@ -13,6 +13,9 @@ "userData": "\u7528\u6236\u8cc7\u6599", "isUseDefaultPath": "\u4f7f\u7528\u9ed8\u8a8d\u7528\u6236\u8cc7\u6599\u6a94\u6848\u593e", "useAppdataLibrary": "\u4f7f\u7528\u7cfb\u7d71\u7528\u6236\u8cc7\u6599\u6a94\u6848\u593e\u5b58\u653e\u64f4\u5c55\u8cc7\u6e90", + "useHttpServer": "\u4f7f\u7528 http \u670d\u52d9\u5668\uff08\u4e0d\u5b58\u5728\u8b49\u66f8\u932f\u8aa4\uff09", + "serverToPlay": "\u904a\u6232\u670d\u52d9\u5668\uff080\u70ba\u570b\u670d\uff0c1\u70ba\u65e5\u670d\uff0c2\u70ba\u7f8e\u670d\uff09", + "proxyUrl": "\u4ee3\u7406\u670d\u52d9\u5668\u5730\u5740\uff08\u7559\u7a7a\u70ba\u4e0d\u4f7f\u7528\u4ee3\u7406\uff09", "userLibPath": "\u7528\u6236\u5eab\u76ee\u9304", "localVersion": "\u7248\u672c", "isManagerHide": "\u9000\u51fa\u6e38\u6232\u540e\uff0c\u8fd4\u56de\u6a94\u6848\u7e3d\u7ba1", @@ -42,5 +45,9 @@ "needNotToUpdate": "\u7121\u9700\u66f4\u65b0", "XMLHttpRequestFailed": "AJAX \u8acb\u6c42\u5931\u6557\uff0c\u72c0\u614b\u78bc\uff1a$0", "downloadFinished": "\u4e0b\u8f09\u5b8c\u7562", - "downloadFinishedInfo": "\u66f4\u65b0\u5df2\u4e0b\u8f09\u5b8c\u7562\uff0c\u662f\u5426\u5b89\u88dd\u4e26\u91cd\u5553\uff1f" + "downloadFinishedInfo": "\u66f4\u65b0\u5df2\u4e0b\u8f09\u5b8c\u7562\uff0c\u662f\u5426\u5b89\u88dd\u4e26\u91cd\u5553\uff1f", + + "dependencyNotFound": "\u4f9d\u8d56 $0 \u672a\u627e\u5230\uff01", + "dependencyNotEnabled": "\u8bf7\u5148\u542f\u7528\u4f9d\u8d56 $0\uff01", + "dependencyVersionMismatch": "\u4f9d\u8d56\u7248\u672c\u4e0d\u7b26\uff01\u4f9d\u8d56 $0:$1\uff0c\u5b89\u88c5\u4e86 $2" } diff --git a/i18n/locales/zh-TW/menu.json b/i18n/zh-TW/menu.json similarity index 100% rename from i18n/locales/zh-TW/menu.json rename to i18n/zh-TW/menu.json diff --git a/i18n/locales/zh-TW/servers.json b/i18n/zh-TW/servers.json similarity index 90% rename from i18n/locales/zh-TW/servers.json rename to i18n/zh-TW/servers.json index c093bb6..6257d45 100644 --- a/i18n/locales/zh-TW/servers.json +++ b/i18n/zh-TW/servers.json @@ -1,5 +1,5 @@ { - "mainland": "\u5927\u9678", + "mainland": "\u672c\u571f", "cn": "\u4e2d\u570b", "hk": "\u9999\u6e2f", "tw": "\u53f0\u7063", diff --git a/i18n/locales/zh-TW/update.json b/i18n/zh-TW/update.json similarity index 100% rename from i18n/locales/zh-TW/update.json rename to i18n/zh-TW/update.json diff --git a/i18nInstance.js b/i18nInstance.js deleted file mode 100644 index 9ef9945..0000000 --- a/i18nInstance.js +++ /dev/null @@ -1,16 +0,0 @@ -const I18n = require('./i18n/i18n') -const electron = require('electron') -/** - * @type {Electron.App} - */ -let app -if (electron.app) { - app = electron.app -} else { - app = electron.remote.app -} -const i18nInstance = new I18n({ - autoReload: process.env.NODE_ENV === 'development', - actives: [app.getLocale()] -}) -module.exports = exports = i18nInstance diff --git a/index.js b/index.js deleted file mode 100644 index a1ed73c..0000000 --- a/index.js +++ /dev/null @@ -1,685 +0,0 @@ -/* eslint no-console: ["error", { allow: ["warn", "error"] }] */ - -const express = require('express') -const server = express() -const Util = require('./Util.js') -const configs = require('./configs') -const fs = require('fs') -const path = require('path') -const https = require('https') -const os = require('os') - -const electron = require('electron') -const { - app: electronApp, - BrowserWindow, - ipcMain, - clipboard, - dialog, - globalShortcut -} = electron -const { Menu, MenuItem } = electron - -// const i18n = require('./i18nInstance') -const I18n = require('./i18n/i18n') -const i18n = new I18n({ - autoReload: process.env.NODE_ENV === 'development', - actives: [electronApp.getLocale()] -}) - -let userConfigs -try { - userConfigs = JSON.parse(fs.readFileSync(configs.USER_CONFIG_PATH)) -} catch (error) { - userConfigs = {} -} - -// 同步 configs-user.json -function jsonKeyUpdate (ja, jb) { - Object.keys(ja).forEach(key => { - if (typeof ja[key] === 'object' && typeof jb[key] === 'object') { - jsonKeyUpdate(ja[key], jb[key]) - } - if (jb[key] === undefined) { - delete ja[key] - } - }) - Object.keys(jb).forEach(key => { - if (ja[key] === undefined) { - ja[key] = jb[key] - } - }) -} - -jsonKeyUpdate(userConfigs, require(path.join(__dirname, '/configs-user.json'))) -fs.writeFileSync(configs.USER_CONFIG_PATH, JSON.stringify(userConfigs)) - -const userDataDir = electronApp.getPath('userData') -const paths = [configs.EXECUTES_DIR, configs.MODS_DIR, configs.TOOLS_DIR] -paths - .map(dir => path.join(userDataDir, dir)) - .forEach(dir => !fs.existsSync(dir) && fs.mkdirSync(dir)) - -if (userConfigs.chromium.isInProcessGpuOn) { - const osplatform = os.platform() - switch (osplatform) { - case 'darwin': - case 'win32': - electronApp.commandLine.appendSwitch('in-process-gpu') - break - case 'aix': - case 'android': - case 'cygwin': - case 'freebsd': - case 'openbsd': - case 'sunos': - default: - break - } -} -if (userConfigs.chromium.isIgnoreGpuBlacklist) { - electronApp.commandLine.appendSwitch('ignore-gpu-blacklist') -} - -const sererHttps = https.createServer( - { - key: fs.readFileSync(path.join(__dirname, './certificate/key.pem')), - cert: fs.readFileSync(path.join(__dirname, './certificate/cert.crt')) - }, - server -) - -if ( - (() => { - try { - if (userConfigs.chromium['isHardwareAccelerationDisable'] === true) { - return true - } - } catch (err) { - return false - } - return false - })() -) { - electronApp.disableHardwareAcceleration() -} - -process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0' - -server.get('*', Util.processRequest) - -electronApp.commandLine.appendSwitch( - 'autoplay-policy', - 'no-user-gesture-required' -) - -// 当所有窗口被关闭了,退出。 -electronApp.on('window-all-closed', () => { - // 在 OS X 上,通常用户在明确地按下 Cmd + Q 之前 - // 应用会保持活动状态 - // if (process.platform !== 'darwin') { - electronApp.quit() - // } -}) - -// 阻止证书验证 -electronApp.on( - 'certificate-error', - (event, webContents, url, error, certificate, callback) => { - if ( - certificate.fingerprint === 'sha256/UMNIGcBbbIcru/0L2e1idl+aQS7PUHqsZDcrETqdMsc=' - ) { - event.preventDefault() - callback(true) // eslint-disable-line standard/no-callback-literal - } else { - callback(false) - } - } -) - -// 设置一个菜单 -const gameWindowMenu = new Menu() -gameWindowMenu.append( - new MenuItem({ - label: '游戏', - role: 'services', - submenu: [ - new MenuItem({ - label: '截图', - accelerator: 'F12', - click: (menuItem, browserWindow) => { - Util.takeScreenshot(browserWindow.webContents) - } - }), - new MenuItem({ - label: '截图', - accelerator: 'CmdOrCtrl+P', - enabled: true, - visible: false, - click: (menuItem, browserWindow) => { - Util.takeScreenshot(browserWindow.webContents) - } - }), - new MenuItem({ - label: '重新载入', - accelerator: 'CmdOrCtrl+R', - click: (menuItem, browserWindow) => { - browserWindow.reload() - } - }), - new MenuItem({ - label: '退出游戏', - accelerator: 'Alt+F4', - click: (menuItem, browserWindow) => { - browserWindow.close() - } - }) - ] - }) -) -gameWindowMenu.append( - new MenuItem({ - label: '窗口', - role: 'window', - submenu: [ - new MenuItem({ - label: '置顶', - accelerator: 'CmdOrCtrl+T', - click: (menuItem, browserWindow) => { - browserWindow.setAlwaysOnTop(!browserWindow.isAlwaysOnTop()) - } - }), - new MenuItem({ - label: '全屏', - accelerator: 'F11', - click: (menuItem, browserWindow) => { - if (!userConfigs.window.isKioskModeOn) { - browserWindow.setFullScreen(!browserWindow.isFullScreen()) - } else { - browserWindow.setKiosk(!browserWindow.isKiosk()) - } - } - }), - new MenuItem({ - label: '全屏', - accelerator: 'F5', - enabled: true, - visible: false, - click: (menuItem, browserWindow) => { - if (!userConfigs.window.isKioskModeOn) { - browserWindow.setFullScreen(!browserWindow.isFullScreen()) - } else { - browserWindow.setKiosk(!browserWindow.isKiosk()) - } - } - }), - new MenuItem({ - label: '退出全屏', - accelerator: 'Esc', - click: (menuItem, browserWindow) => { - if (browserWindow.isFullScreen()) { - browserWindow.setFullScreen(false) - return - } - if (browserWindow.isKiosk()) { - browserWindow.setKiosk(false) - } - } - }) - ] - }) -) -gameWindowMenu.append( - new MenuItem({ - label: '编辑', - role: 'editMenu' - }) -) -gameWindowMenu.append( - new MenuItem({ - label: '更多', - submenu: [ - new MenuItem({ - label: '开发者工具', - accelerator: 'CmdOrCtrl+I', - click: (menuItem, browserWindow) => { - browserWindow.openDevTools({ mode: 'detach' }) - browserWindow.send('open-devtools') - } - }) - ] - }) -) - -const windowControl = { - windowMap: { toolsMap: {} }, - _getGameWindowTitle: () => { - const titles = [ - { - text: i18n.t.main.programName(), - weight: 200 - }, - { - text: i18n.t.main.nya(), - weight: 1 - } - ] - let sumWeight = titles.reduce((last, value) => last + value.weight, 0) - let randomResult = Math.random() * sumWeight - /** - * @type {number} - */ - const index = titles.reduce((last, value, index) => { - if (Number.isInteger(last)) { - return last - } - if ((randomResult -= value.weight) <= 0) { - return index - } - return null - }, null) - return titles[index].text - }, - - _getExecuteScripts: () => { - let executeScripts - try { - const data = fs.readFileSync(configs.EXECUTES_CONFIG_PATH) - executeScripts = JSON.parse(data.toString('utf-8')) - } catch (error) { - console.error(error) - executeScripts = [] - } - try { - const data = fs.readFileSync(configs.MODS_CONFIG_PATH) - const mods = JSON.parse(data.toString('utf-8')) - mods.forEach(mod => { - if (mod.execute) { - mod.execute.filesDir = mod.filesDir - executeScripts.push(mod.execute) - } - }) - } catch (error) { - console.error(error) - } - return executeScripts - }, - - electronReady: () => { - return new Promise(resolve => electronApp.once('ready', resolve)) - }, - - /** - * @param {https.Server} sererHttps - */ - initLocalMirrorServer: (sererHttps, port) => { - return new Promise(resolve => { - sererHttps.listen(port) - sererHttps.on('listening', resolve) - sererHttps.on('error', err => { - if (err.code === 'EADDRINUSE') { - console.warn(i18n.t.main.portInUse()) - sererHttps.close() - sererHttps.listen(0) - } - }) - }) - }, - initManagerWindow: managerWindowConfig => { - const config = { - ...managerWindowConfig - } - // hack macOS config - if (process.platform === 'darwin') { - config.frame = false - config.titleBarStyle = 'hidden' - if (parseInt(process.versions.electron.split('.')[0], 10) > 2) { - config.vibrancy = 'light' - config.backgroundColor = 'rgba(0,0,0,0)' - } - } - - config.width *= userConfigs.window.zoomFactor - config.height *= userConfigs.window.zoomFactor - - const managerWindow = new BrowserWindow(config) - - managerWindow.once('ready-to-show', () => { - managerWindow.webContents.setZoomFactor(userConfigs.window.zoomFactor) - managerWindow.show() - }) - - managerWindow.on('page-title-updated', evt => evt.preventDefault()) - managerWindow.once('close', evt => { - evt.preventDefault() - managerWindow.hide() - evt.sender.send('saveConfig') - }) - managerWindow.loadURL( - 'file://' + path.join(__dirname, '/manager/index.html') - ) - - // Add environment config to open developer tools - if (process.env.NODE_ENV === 'development') { - managerWindow.openDevTools({ mode: 'detach' }) - } - - windowControl.windowMap['manager'] = managerWindow - }, - - initGameWindow: gameWindowConfig => { - const config = { - ...gameWindowConfig, - title: windowControl._getGameWindowTitle(), - frame: !userConfigs.window.isNoBorder - } - // TODO: wait new setting system - if (userConfigs['window']['gameWindowSize'] !== '') { - let windowSize = userConfigs['window']['gameWindowSize'] - .split(',') - .map(value => parseInt(value)) - config.width = windowSize[0] - config.height = windowSize[1] - } - const gameWindow = new BrowserWindow(config) - gameWindow.on('page-title-updated', event => event.preventDefault()) - gameWindow.on('resize', () => { - userConfigs['window']['gameWindowSize'] = gameWindow.getSize().toString() - let obj = { - mainKey: 'window', - key: 'gameWindowSize', - value: userConfigs['window']['gameWindowSize'] - } - windowControl.windowMap['manager'].send( - 'changeConfig', - JSON.stringify(obj) - ) - gameWindow.webContents.send('window-resize', gameWindow.getBounds()) - }) - gameWindow.on('move', () => { - gameWindow.webContents.send('window-resize', gameWindow.getBounds()) - }) - gameWindow.on('moved', () => { - gameWindow.webContents.send('window-resize', gameWindow.getBounds()) - }) - gameWindow.on('closed', () => { - Util.shutoffPlayer() - sererHttps.close() - if (userConfigs.window.isManagerHide) { - const managerWindow = windowControl.windowMap['manager'] - managerWindow && managerWindow.show() - } - }) - Util.initPlayer() - // 如果重复启动游戏,则重新加载模组 - Util.loadMods() - gameWindow.webContents.on('crashed', () => - console.warn(i18n.t.main.webContentsCrashed()) - ) - gameWindow.once('ready-to-show', () => { - gameWindow.webContents.setZoomFactor(1) - gameWindow.show() - gameWindow.webContents.send('window-resize', gameWindow.getBounds()) - }) - gameWindow.webContents.on('console-message', ( - evt, - level, - msg /*, line, sourceId */ - ) => { - if (level !== 'log') { - console.warn(i18n.t.main.consoleMessage() + msg) - } - }) - // 载入本地启动器 - gameWindow.loadURL('file://' + path.join(__dirname, 'bin/main/index.html')) - - // Add environment config to open developer tools - if (process.env.NODE_ENV === 'development') { - gameWindow.openDevTools({ mode: 'detach' }) - } - - Menu.setApplicationMenu(gameWindowMenu) - - windowControl.windowMap['game'] = gameWindow - }, - - closeManagerWindow: () => { - const managerWindow = windowControl.windowMap['manager'] - managerWindow && managerWindow.close() - }, - - hideManagerWindow: () => { - /** - * @type {Electron.BrowserWindow} - */ - const managerWindow = windowControl.windowMap['manager'] - managerWindow && managerWindow.hide() - }, - - addAppListener: () => { - ipcMain.on('application-message', (evt, ...args) => { - if (args && args.length > 0) { - switch (args[0]) { - case 'start-game': { - windowControl - .initLocalMirrorServer(sererHttps, configs.SERVER_PORT) - .then(() => { - windowControl.initGameWindow(configs.GAME_WINDOW_CONFIG) - if (userConfigs.window.isManagerHide) { - windowControl.hideManagerWindow() - } else { - windowControl.closeManagerWindow() - } - }) - break - } - case 'start-tool': { - const toolInfo = args[1] - if (!toolInfo.windowOptions) { - toolInfo.windowOption = {} - } - const toolConfig = { - ...configs.TOOL_WINDOW_CONFIG, - ...toolInfo.windowOptions - } - const indexPage = toolInfo.index ? toolInfo.index : 'index.html' - toolConfig.parent = windowControl.windowMap['manager'] - - const toolWindow = new BrowserWindow(toolConfig) - - windowControl.windowMap.toolsMap[toolInfo.filesDir] = toolWindow - - if (process.env.NODE_ENV === 'development') { - toolWindow.openDevTools({ mode: 'detach' }) - } - - toolWindow.loadURL( - 'file://' + path.join(toolInfo.filesDir, indexPage) - ) - break - } - case 'update-user-config': { - userConfigs = JSON.parse(fs.readFileSync(configs.USER_CONFIG_PATH)) - windowControl.windowMap['manager'].setContentSize( - configs.MANAGER_WINDOW_CONFIG.width * - userConfigs.window.zoomFactor, - configs.MANAGER_WINDOW_CONFIG.height * - userConfigs.window.zoomFactor - ) - windowControl.windowMap['manager'].webContents.setZoomFactor( - userConfigs.window.zoomFactor - ) - break - } - case 'take-screenshot': { - /** - * @type {Buffer} - */ - const buffer = args[1] - const filePath = path.join( - electron.app.getPath('pictures'), - electron.app.getName(), - Date.now() + '.png' - ) - Util.writeFile(filePath, buffer).then(() => { - windowControl.windowMap['game'].webContents.send( - 'screenshot-saved', - filePath - ) - }) - clipboard.writeImage(electron.nativeImage.createFromBuffer(buffer)) - break - } - case 'close-ready': { - windowControl.windowMap['manager'].close() - break - } - default: - break - } - } - }) - ipcMain.on('main-loader-message', (evt, ...args) => { - if (args && args.length > 0) { - switch (args[0]) { - case 'main-loader-ready': { - windowControl.windowMap['game'].webContents.send( - 'server-port-load', - sererHttps.address().port - ) - break - } - case 'server-port-loaded': { - const executeScripts = windowControl._getExecuteScripts() - windowControl.windowMap['game'].webContents.send( - 'executes-load', - executeScripts - ) - break - } - case 'executes-loaded': { - const clipboardText = clipboard.readText() - if ( - clipboardText && - clipboardText.includes(configs.REMOTE_DOMAIN) - ) { - windowControl.windowMap['game'].webContents.send( - 'load-url', - new RegExp( - configs.REMOTE_DOMAIN.replace(/\./g, '\\.') + - '[-A-Za-z0-9+&@#/%?=~_|!:,.;]*' - ).exec(clipboardText)[0] - ) - } else if ( - clipboardText && - clipboardText.includes(configs.HTTP_REMOTE_DOMAIN) - ) { - windowControl.windowMap['game'].webContents.send( - 'load-url', - new RegExp( - configs.HTTP_REMOTE_DOMAIN.replace(/\./g, '\\.') + - '[-A-Za-z0-9+&@#/%?=~_|!:,.;]*' - ).exec(clipboardText)[0] - ) - } else { - windowControl.windowMap['game'].webContents.send( - 'load-url', - `https://localhost:${sererHttps.address().port}/0/` - ) - } - break - } - case 'open-file-dialog': { - dialog.showOpenDialog( - { - properties: ['openFile', 'openDirectory'] - }, - function (files) { - if (files) evt.sender.send('selected-directory', files) - } - ) - break - } - default: - break - } - } - }) - }, - - addAccelerator () { - const addBossKey = () => { - const windowsStatus = { - gameWindowVisible: false, - gameWindowMuted: false, - managerWindowVisible: false, - managerWindowMuted: false, - bosskeyActive: false - } - globalShortcut.register('Alt+X', function () { - /** - * @type {Electron.BrowserWindow} - */ - const gameWindow = windowControl.windowMap['game'] - /** - * @type {Electron.BrowserWindow} - */ - const managerWindow = windowControl.windowMap['manager'] - - if (windowsStatus.bosskeyActive) { - // 如果老板键已经被按下 - windowsStatus.bosskeyActive = false - - if (managerWindow) { - if (windowsStatus.managerWindowVisible) { - managerWindow.show() - } - managerWindow.webContents.setAudioMuted( - windowsStatus.managerWindowMuted - ) - } - if (gameWindow) { - if (windowsStatus.gameWindowVisible) { - gameWindow.show() - } - gameWindow.webContents.setAudioMuted(windowsStatus.gameWindowMuted) - } - } else { - // 备份窗口信息并隐藏窗口 - windowsStatus.bosskeyActive = true - - if (managerWindow) { - windowsStatus.managerWindowVisible = managerWindow.isVisible() - windowsStatus.managerWindowMuted = managerWindow.webContents.isAudioMuted() - - managerWindow.hide() - managerWindow.webContents.setAudioMuted(true) - } - if (gameWindow) { - windowsStatus.gameWindowVisible = gameWindow.isVisible() - windowsStatus.gameWindowMuted = gameWindow.webContents.isAudioMuted() - - gameWindow.hide() - gameWindow.webContents.setAudioMuted(true) - } - } - }) - } - addBossKey() - }, - - start: () => { - windowControl.electronReady().then(() => { - Menu.setApplicationMenu(null) - - windowControl.addAccelerator() - windowControl.addAppListener() - windowControl.initManagerWindow({ ...configs.MANAGER_WINDOW_CONFIG }) - }) - } -} -windowControl.start() - -process.on('uncaughtException', err => { - console.error(err) -}) diff --git a/manager/About.js b/manager/About.js deleted file mode 100644 index 38da1be..0000000 --- a/manager/About.js +++ /dev/null @@ -1,84 +0,0 @@ - -const i18n = require('../i18nInstance') -const { shell, remote: { app } } = require('electron') -const Util = require('../Util') -const configs = require('../configs') -const path = require('path') -class About { - constructor () { - this.render = this.render.bind(this) - this._addBlock = this._addBlock.bind(this) - this._addToUsers = this._addToUsers.bind(this) - this._addGitHubLink = this._addGitHubLink.bind(this) - this._bindAlink = this._bindAlink.bind(this) - this._getGitHubHTML = this._getGitHubHTML.bind(this) - } - - render () { - const aboutInner = document.getElementById('aboutInner') - aboutInner.innerHTML = '' - this._addToUsers() - this._addGitHubLink() - } - - _addBlock ({ title, value }) { - const aboutInner = document.getElementById('aboutInner') - const h3 = document.createElement('h3') - const info = document.createElement('p') - if (typeof value === 'string') { - h3.innerText = title - info.innerText = value - aboutInner.append(h3) - aboutInner.append(info) - } else { - h3.innerText = title - aboutInner.append(h3) - aboutInner.append(value) - } - } - - _addToUsers () { - const title = '致用户' - const value = '  感谢您正在阅读这段文字,我是《雀魂 Plus》开发者之一:Handle。首先,感谢您信赖并使用《雀魂 Plus》,这是我第一个破 10 Star 的项目,同时也是我倾注了大量心血的作品,对于其意外登上一些论坛的置顶,我感到兴奋,但同时更多的是震惊。\n\n  相信您和我一样是喜欢着《雀魂》这款游戏才能让您读到这段文字,同样,也相信您了解一款游戏的生存无非能否长期稳定地盈利,《雀魂 Plus》提供的功能最初只是为了方便修改桌布和音乐,但目前的发展情况,但很明显,《雀魂 Plus》的传播已经明显超出了可控范围。试想,如果您是《雀魂》的付费用户,在得知免费玩家可以享受到付费体验,心中会有什么想法?还会继续为《雀魂》付费么?如果大家都在使用修改实现的装扮而不为《雀魂》付费,那么这款游戏的未来会怎样?会继续盈利下去么?相信您您的内心现在已经想到了未来可能发生的事,我们都不希望那样的未来。\n\n  作为“始作俑者”,我不希望《雀魂 Plus》被滥用,我希望的是《雀魂 Plus》可以为《雀魂》提供一个PC稳定的游戏环境和体验,在这基础上体验一些《雀魂》尚未实现的、或是其他游戏中存在的优秀功能,并非为了让使用者白嫖《雀魂》,这是一个不健康的发展路径,无论你我,当然不希望《雀魂》会走上《雀龙门》的老路,成为一款冷门游戏,或是成为下一个《X海战记》。《雀魂》当前的付费点主要就是装扮,还望各位手下留情,使用魔改的同时别忘为游戏付费,一款好的游戏值得去为其体验埋单。\n\n  《雀魂 Plus》现在的更新重点是作为一个游戏浏览器体验的优化上,对于目前已有的扩展功能将仅做维护,感谢您的理解。相信您在思考后,也会在《雀魂》中“补票”吧。' - this._addBlock({ title, value }) - } - - _addGitHubLink () { - const title = i18n.t.main.programName() - const value = this._getGitHubHTML() - this._addBlock({ title, value }) - } - - _getGitHubHTML () { - const info = document.createElement('p') - info.innerHTML = `在 PC 上跨平台的雀魂麻将第三方浏览器,提供资源替换和代码注入功能,并对直播环境进行了一定优化 -
- - Github Stars -
- -
- ${i18n.t.manager.localVersion()} ${app.getVersion()}` - const alinks = info.getElementsByTagName('a') - this._bindAlink(alinks) - info.querySelector('input[type="button"]') - .addEventListener('click', evt => { - evt.preventDefault() - Util.removeDirSync(path.join(__dirname, '../', configs.LOCAL_DIR)) - alert(i18n.t.manager.clearCacheSucceeded()) - }) - return info - } - - _bindAlink (alinks) { - alinks = Array.from(alinks || []) - alinks.forEach((a, i) => { - a.addEventListener('click', evt => { - evt.preventDefault() - shell.openExternal(a.href) - }) - }) - } -} - -module.exports = About diff --git a/manager/Executes.js b/manager/Executes.js deleted file mode 100644 index 80d0660..0000000 --- a/manager/Executes.js +++ /dev/null @@ -1,97 +0,0 @@ -const fs = require('fs') -const path = require('path') -const CardList = require('./common/CardList') -const configs = require('../configs') -const i18n = require('../i18nInstance') - -const enabledExecutes = (() => { - try { - return JSON.parse( - fs.readFileSync(configs.EXECUTES_CONFIG_PATH).toString('utf-8') - ) - } catch (error) { - return [] - } -})() -const defaultOptions = { - settingFilePath: configs.EXECUTES_CONFIG_PATH, - checkedKeys: enabledExecutes.map( - item => `${item.name || '未命名'}|${item.author || '无名氏'}` - ), - rootDir: path.join(__dirname, '../', configs.EXECUTES_DIR), - config: 'execute.json', - renderTarget: 'executeInfos', - executePreferences: { - document: false, // 允许访问 document 对象 - nodeRequire: false, // 启用 node 的 require 支持, - XMLHTTPRequest: false, // 启用 XMLHTTPRequest - WebSocket: false, // 启用 WebSocket, - localStorage: false, // 允许访问 localStorage - writeableWindowObject: false // 允许对 window 对象进行写入(如果为 false 则修改仅在作用域内有效) - } -} - -class Executes extends CardList { - constructor (options = {}) { - super({ - ...defaultOptions, - ...options - }) - } - _getCardInfo (dir) { - const info = super._getCardInfo.call(this, dir) - if (typeof info === 'object' && info !== null) { - info.executePreferences = { - ...defaultOptions.executePreferences, - ...info.executePreferences - } - } - return info - } - _getExportInfo () { - return { - extend: 'mspe', - typeText: i18n.t.manager.fileTypeMSPE() - } - } - _handleCheckedChange (key) { - const { card } = this._cardList.find(item => item.key === key) - const isAleatNeeded = Object.keys(card.options.executePreferences).filter( - key => { - return !!card.options.executePreferences[key] - }, - true - ) - if (card.checked && isAleatNeeded && isAleatNeeded.length > 0) { - let confirmText = `${i18n.text.manager.executeSafeAlert()}` - isAleatNeeded - .map(key => { - switch (key) { - case 'document': - return i18n.text.manager.executeSafeAlertDocument() - case 'nodeRequire': - return i18n.text.manager.executeSafeAlertNodeRequire() - case 'XMLHttpRequest': - return i18n.text.manager.executeSafeAlertXMLHttpRequest() - case 'WebSocket': - return i18n.text.manager.executeSafeAlertWebSocket() - case 'localStorage': - return i18n.text.manager.executeSafeAlertLocalStorage() - case 'writeableWindowObject': - return i18n.text.manager.executeSafeAlertWriteableWindowObject() - default: - return key - } - }) - .forEach(text => { - confirmText += `\n${text}` - }) - const confirmed = window.confirm(confirmText) - if (!confirmed) { - card.checked = false - } - } - return super._handleCheckedChange.call(this, key) - } -} -module.exports = Executes diff --git a/manager/InfoCard.d.ts b/manager/InfoCard.d.ts deleted file mode 100644 index 9731836..0000000 --- a/manager/InfoCard.d.ts +++ /dev/null @@ -1,42 +0,0 @@ -/// - -export = class InfoCard { - /** - * 模组和插件通用的信息卡 - * @param {{name:string,author:string,description:string,preview:string,filesDir:string}} infos - * @param {boolean} checked - */ - constructor( - infos: { - name: string - author: string - description: string - preview: string - filesDir: string - }, - checked?: boolean, - isButton?: boolean - ) - get DOM(): HTMLElement - set DOM(value: HTMLElement): HTMLElement - initDOM(): void - addEventListener(type: string, listener: EventListener): void - removeEventListener(type: string, listener: EventListener): void - get edit(): boolean - set edit(value: boolean): boolean - infos: { - name: string - author: string - description: string - preview: string - filesDir: string - } - checked: boolean - name: string - description: string - previewSrc: string - private _inputType: string - private _eventListeners: { [x: string]: Array } - private _dom: HTMLElement - private _edit: boolean -} diff --git a/manager/InfoCard.js b/manager/InfoCard.js deleted file mode 100644 index 676b9cc..0000000 --- a/manager/InfoCard.js +++ /dev/null @@ -1,160 +0,0 @@ -const path = require('path') -const infoCardIdMap = {} -/** - * 信息卡 - */ -class InfoCard { - /** - * 模组和插件通用的信息卡 - * @param {{name:string,author:string,description:string,preview:string,filesDir:string}} infos - * @param {boolean} checked - */ - constructor (infos, checked = false, isButton = false) { - this.infos = infos - this.checked = checked - this.name = infos.name ? infos.name : '未知' - this.author = infos.author ? infos.author : '无名氏' - this.description = infos.description ? infos.description : '无描述' - this.previewSrc = path.join( - infos.filesDir, - infos.preview ? infos.preview : 'preview.jpg' - ) - this._inputType = isButton ? 'button' : 'checkbox' - /** - * @type {{[x:string]:Array}} - */ - this._eventListeners = {} - this.initDOM() - this.edit = false - } - get DOM () { - return this._dom - } - set DOM (value) { - this._dom = value - return value - } - initDOM () { - const article = document.createElement('article') - const preview = document.createElement('img') - const h3 = document.createElement('h3') - const address = document.createElement('address') - const p = document.createElement('p') - const input = document.createElement('input') - const label = document.createElement('label') - const exportBtn = document.createElement('button') - const removeBtn = document.createElement('button') - - preview.src = this.previewSrc - preview.addEventListener('error', function errFun () { - preview.src = path.join(__dirname, 'defaultPreview.jpg') - preview.removeEventListener('error', errFun) - }) - preview.addEventListener('dragstart', event => { - event.preventDefault() - }) - - h3.innerText = this.name - address.innerText = this.author - p.innerText = this.description - - if (this._inputType === 'checkbox') { - input.type = 'checkbox' - input.addEventListener('change', event => { - if (this._eventListeners['change']) { - this._eventListeners['change'].forEach(listener => { - listener.call(this, event) - }) - } - }) - input.checked = this.checked - Object.defineProperty(this, 'checked', { - get: () => input.checked, - set: value => (input.checked = value) - }) - } else if (this._inputType === 'button') { - input.type = 'button' - input.addEventListener('click', event => { - if (this._eventListeners['click']) { - this._eventListeners['click'].forEach(listener => { - listener.call(this, event) - }) - } - }) - } - - input.id = (function getRandomId () { - let str = 'infoCard_' - window.crypto.getRandomValues(new Uint32Array(3)).forEach(value => { - str += value.toString(32) - }) - if (infoCardIdMap[str]) { - return getRandomId() - } - infoCardIdMap[str] = true - return str - })() - label.setAttribute('for', input.id) - - exportBtn.className = 'export-btn' - exportBtn.addEventListener('click', event => { - if (this._eventListeners['export']) { - this._eventListeners['export'].forEach(listener => { - listener.call(this, event) - }) - } - }) - - removeBtn.className = 'remove-btn' - removeBtn.addEventListener('click', event => { - if (this._eventListeners['remove']) { - this._eventListeners['remove'].forEach(listener => { - listener.call(this, event) - }) - } - }) - - article.appendChild(preview) - article.appendChild(h3) - article.appendChild(p) - - article.appendChild(address) - - article.appendChild(input) - article.appendChild(label) - - article.appendChild(exportBtn) - article.appendChild(removeBtn) - - this.DOM = article - } - addEventListener (type, listener) { - if (!this._eventListeners[type]) { - this._eventListeners[type] = [] - } - this._eventListeners[type].push(listener) - } - removeEventListener (type, listener) { - if (!this._eventListeners[type]) { - return - } - this._eventListeners[type].forEach((addedListener, index) => { - if (addedListener === listener) { - this._eventListeners[type].splice(index, 1) - } - }) - } - get edit () { - return this._edit - } - set edit (value) { - this._edit = value - if (value === true) { - this.DOM.className = 'edit' - } else { - this.DOM.className = '' - } - return value - } -} -module.exports = InfoCard diff --git a/manager/Mods.js b/manager/Mods.js deleted file mode 100644 index 1f75e5c..0000000 --- a/manager/Mods.js +++ /dev/null @@ -1,80 +0,0 @@ -const fs = require('fs') -const path = require('path') -const CardList = require('./common/CardList') -const configs = require('../configs') -const enabledMods = (() => { - try { - return JSON.parse( - fs.readFileSync(configs.MODS_CONFIG_PATH).toString('utf-8') - ) - } catch (error) { - return [] - } -})() -const i18n = require('../i18nInstance') -const defaultOptions = { - settingFilePath: configs.MODS_CONFIG_PATH, - checkedKeys: enabledMods.map( - item => `${item.name || '未命名'}|${item.author || '无名氏'}` - ), - rootDir: path.join(__dirname, '../', configs.MODS_DIR), - config: 'mod.json', - renderTarget: 'modInfos' -} - -class Mods extends CardList { - constructor (options) { - super({ ...defaultOptions, ...options }) - } - _getExportInfo () { - return { - extend: 'mspm', - typeText: i18n.t.manager.fileTypeMSPM() - } - } - _handleCheckedChange (key) { - const { card } = this._cardList.find(item => item.key === key) - if (typeof card.options.execute === 'object') { - if (!card.options.execute.executePreferences) { - card.options.execute.executePreferences = {} - } - const isAleatNeeded = Object.keys( - card.options.execute.executePreferences - ).filter(key => { - return !!card.options.execute.executePreferences[key] - }, true) - if (card.checked && isAleatNeeded && isAleatNeeded.length > 0) { - let confirmText = `${i18n.text.manager.executeSafeAlert()}` - isAleatNeeded - .map(key => { - switch (key) { - case 'document': - return i18n.text.manager.executeSafeAlertDocument() - case 'nodeRequire': - return i18n.text.manager.executeSafeAlertNodeRequire() - case 'XMLHttpRequest': - return i18n.text.manager.executeSafeAlertXMLHttpRequest() - case 'WebSocket': - return i18n.text.manager.executeSafeAlertWebSocket() - case 'localStorage': - return i18n.text.manager.executeSafeAlertLocalStorage() - case 'writeableWindowObject': - return i18n.text.manager.executeSafeAlertWriteableWindowObject() - default: - return key - } - }) - .forEach(text => { - confirmText += `\n${text}` - }) - const confirmed = window.confirm(confirmText) - if (!confirmed) { - card.checked = false - } - } - } - return super._handleCheckedChange.call(this, key) - } -} - -module.exports = Mods diff --git a/manager/Ping.js b/manager/Ping.js deleted file mode 100644 index cbd3786..0000000 --- a/manager/Ping.js +++ /dev/null @@ -1,216 +0,0 @@ -/* eslint no-console: ["error", { allow: ["warn", "error"] }] */ - -const NetworkUtil = require('./Network') -const tcpPing = require('tcp-ping') -const i18n = require('../i18nInstance') - -class Ping { - constructor () { - this.services = null - this.currentService = null - this.serviceList = [] - this.interval = null - this._getVersion = this._getVersion.bind(this) - this._getResVersion = this._getResVersion.bind(this) - this._getChildService = this._getChildService.bind(this) - this._getService = this._getService.bind(this) - this._getServices = this._getServices.bind(this) - this._getConfig = this._getConfig.bind(this) - this._saveServices = this._saveServices.bind(this) - this._renderService = this._renderService.bind(this) - this._changeService = this._changeService.bind(this) - this._getNextService = this._getNextService.bind(this) - this.ping = this.ping.bind(this) - } - - _getRandomUrl (url) { - return `${url}?randv=${Math.random() - .toString() - .substring(2, 17) - .padStart(16, '0')}` - } - - _getVersion () { - const url = this._getRandomUrl( - 'https://majsoul.union-game.com/0/version.json' - ) - return NetworkUtil.getJson(url).then(res => res.version) - } - - _getResVersion (version) { - const originUrl = `https://majsoul.union-game.com/0/resversion${version}.json` - const url = this._getRandomUrl(originUrl) - return NetworkUtil.getJson(url).then(res => res.res['config.json'].prefix) - } - - _getConfig (prefix) { - const originUrl = `https://majsoul.union-game.com/0/${prefix}/config.json` - const url = this._getRandomUrl(originUrl) - return NetworkUtil.getJson(url).then(res => res.ip) - } - - _saveServices (ips) { - this.services = ips[0].region_urls - this.serviceList = Object.keys(this.services) - } - - _getServices () { - return this._getVersion() - .then(this._getResVersion) - .then(this._getConfig) - .then(this._saveServices) - } - - _getService () { - if (!this.services) return Promise.reject(new Error('services is null')) - const choseService = window.localStorage.getItem('choseService') - if (choseService) { - this.currentService = - this.serviceList.find(service => service === choseService) || - this.serviceList[0] - } else { - this.currentService = this.serviceList[0] - } - return Promise.resolve() - } - - _getServiceName (service) { - return i18n.t.servers[service] - // const map = { - // mainland: '中国大陆', - // hk: '中国香港', - // tw: '中国台湾', - // us: '美国', - // uk: '英国', - // jp: '日本', - // fr: '法国', - // kr: '韩国', - // sg: '新加坡', - // de: '德国', - // ru: '俄罗斯' - // } - // return map[service] || service - } - - _getChildService () { - return new Promise((resolve, reject) => { - if (this.services) { - const originUrl = `${this.services[this.currentService]}` - const url = `${this._getRandomUrl( - originUrl - )}&service=ws-gateway&protocol=ws&ssl=true` - NetworkUtil.getJson(url) - .then(res => { - resolve(res.servers[0]) - }) - .catch(reject) - } else { - reject(new Error(new Error('services is not null'))) - } - }) - } - - // 这个函数没有被使用 - _renderError (err) { - console.error(err) - const serverTextDom = document.getElementById('serverText') - serverTextDom.innerText = '加载失败' - } - - _renderService () { - const serverTextDom = document.getElementById('serverText') - const pingInfoDom = document.getElementById('pingInfo') - const pingTextDom = document.getElementById('pingText') - pingInfoDom.className = 'offline' - pingTextDom.innerText = '--' - i18n.unbindElement(serverTextDom) - this._getServiceName(this.currentService).renderAsText(serverTextDom) - return Promise.resolve() - } - - _renderPing (time) { - const pingTextDom = document.getElementById('pingText') - const pingInfoDom = document.getElementById('pingInfo') - pingTextDom.innerText = time >> 0 - pingInfoDom.className = time < 150 ? 'green' : time < 500 ? 'orange' : 'red' - } - - _renderPingFail () { - const serverTextDom = document.getElementById('serverText') - i18n.unbindElement(serverTextDom) - i18n.t.manager.loadFailed.renderAsText(serverTextDom) - } - - _ping (service) { - return new Promise((resolve, reject) => { - const address = service.split(':')[0] - const port = service.split(':')[1] - tcpPing.ping( - { - address, - port, - attempts: 3 - }, - (err, data) => { - if (err) { - console.error(err) - reject(new Error('tcp-ping error')) - } - resolve(data.avg) - } - ) - }) - } - - _initPing () { - this._getServices() - .then(this._getService) - .then(this._renderService) - .then(this._getChildService) - .then(this.ping) - .catch(this._renderPingFail) - } - - _getNextService () { - let index = this.serviceList.indexOf(this.currentService) - index = index + 1 >= this.serviceList.length ? 0 : index + 1 - this.currentService = this.serviceList[index] - localStorage.setItem('choseService', this.currentService) - return Promise.resolve() - } - - _changeService () { - this._getNextService() - .then(this._renderService) - .then(this._getChildService) - .then(this.ping) - .catch(this._renderPingFail) - } - - addEventListener () { - const serverInfoDom = document.getElementById('serverInfo') - serverInfoDom.addEventListener('click', this._changeService) - } - - _refresh () { - this._getService() - .then(this._renderService) - .then(this._getChildService) - .then(this.ping) - .catch(console.error) - } - - ping (service) { - clearInterval(this.interval) - this.interval = setInterval(() => { - this._ping(service).then(this._renderPing) - }, 5000) - } - - init () { - this._initPing() - this.addEventListener() - } -} - -module.exports = new Ping() diff --git a/manager/Setting.js b/manager/Setting.js deleted file mode 100644 index ebfacae..0000000 --- a/manager/Setting.js +++ /dev/null @@ -1,178 +0,0 @@ -const fs = require('fs') -const path = require('path') -const { ipcRenderer } = require('electron') -// const { app } = remote -const configs = require('../configs') -const defaultUserConfig = require(configs.USER_CONFIG_PATH) -const i18n = require('../i18nInstance') - -class Settings { - constructor (options = {}) { - this.userConfig = options.userConfig || defaultUserConfig - this._saveConfig = this._saveConfig.bind(this) - this._renderSection = this._renderSection.bind(this) - this._renderSections = this._renderSections.bind(this) - this._renderSectionItem = this._renderSectionItem.bind(this) - this._renderCheckBoxSectionItem = this._renderCheckBoxSectionItem.bind(this) - this._renderNumberSectionItem = this._renderNumberSectionItem.bind(this) - this._handleSaveConfigClick = this._handleSaveConfigClick.bind(this) - this._addSaveListener = this._addSaveListener.bind(this) - this.render = this.render.bind(this) - this.init = this.init.bind(this) - this.save = this.save.bind(this) - } - - _getUserLocalConfig () { - const defaultConfigPath = path.join(__dirname, '../configs-user.json') - const defaultConfigJson = fs.readFileSync(defaultConfigPath) - return this.userConfig || JSON.parse(defaultConfigJson) - } - - _renderSection ({ settingInner, section, data }) { - if (typeof this.userConfig[section] === 'undefined') { - this.userConfig[section] = data - } - const h3 = document.createElement('h3') - i18n.t.manager[section].renderAsText(h3) - // const sectionName = Settings._keyToTitle(section) - // h3.innerText = sectionName - settingInner.append(h3) - Object.entries(data).forEach(([item, data], index) => { - this._renderSectionItem({ settingInner, section, item, data, index }) - }) - } - - _renderCheckBoxSectionItem ({ settingInner, section, item, data, index }) { - // const itemName = Settings._keyToTitle(item) - const checkBox = document.createElement('input') - checkBox.type = 'checkbox' - checkBox.id = `config${section}${item}${index}` - const label = document.createElement('label') - label.setAttribute('for', checkBox.id) - i18n.t.manager[item].renderAsText(label) - // label.innerText = itemName - checkBox.checked = data - checkBox.addEventListener('change', () => { - this.userConfig[section][item] = checkBox.checked - }) - settingInner.append(checkBox) - settingInner.append(label) - } - - _renderNumberSectionItem ({ settingInner, section, item, data, index }) { - // const itemName = Settings._keyToTitle(item) - const input = document.createElement('input') - input.type = 'number' - input.id = `config${section}${item}${index}` - input.value = data - const label = document.createElement('label') - label.setAttribute('for', input.id) - // label.innerText = itemName - i18n.t.manager[item].renderAsText(label) - input.addEventListener('change', () => { - this.userConfig[section][item] = Number(input.value) - }) - const br = document.createElement('br') - settingInner.append(input) - settingInner.append(label) - settingInner.append(br) - } - - _renderFunctionSectionItem ({ settingInner, section, item, data, index }) { - // TODO 这里将会插入一个按钮,从 item 读取 函数 和 名称 - } - - _renderSectionItem ({ settingInner, section, item, data, index }) { - if (typeof this.userConfig[section][item] === 'undefined') { - this.userConfig[section][item] = data - } - const processes = { - boolean: () => - this._renderCheckBoxSectionItem({ - settingInner, - section, - item, - data, - index - }), - number: () => - this._renderNumberSectionItem({ - settingInner, - section, - item, - data, - index - }), - /** - * @param {string} data - */ - string: data => { - switch (data) { - case 'function': { - this._renderFunctionSectionItem({}) - break - } - default: - break - } - } - } - const type = typeof data - processes[type] && processes[type].call(data) - } - - _renderSections () { - const userLocalConfig = this._getUserLocalConfig() - const settingInner = document.getElementById('settingInner') - settingInner.innerHTML = '' - Object.entries(userLocalConfig).forEach(([section, data]) => { - this._renderSection({ settingInner, section, data }) - }) - } - - _handleSaveConfigClick () { - this._saveConfig() - .then(() => { - alert(i18n.t.manager.saveSucceeded()) - }) - .catch(err => { - alert(i18n.t.manager.saveFailed(err)) - }) - } - - _saveConfig () { - return new Promise((resolve, reject) => { - try { - fs.writeFileSync( - configs.USER_CONFIG_PATH, - JSON.stringify(this.userConfig) - ) - ipcRenderer.send('application-message', 'update-user-config') - resolve() - } catch (error) { - reject(error) - } - }) - } - - _addSaveListener () { - const saveBtn = document.getElementById('saveConfigs') - saveBtn.addEventListener('click', this._handleSaveConfigClick) - } - - render () { - this._renderSections() - // this._renderVersionInfo() - } - - init () { - this._addSaveListener() - this.render() - } - - save () { - this._saveConfig() - } -} - -module.exports = Settings diff --git a/manager/Tools.js b/manager/Tools.js deleted file mode 100644 index f3b318b..0000000 --- a/manager/Tools.js +++ /dev/null @@ -1,45 +0,0 @@ -const path = require('path') -const { ipcRenderer } = require('electron') - -const CardList = require('./common/CardList') -const configs = require('../configs') -const ButtonCard = require('./common/ButtonCard') -const i18n = require('../i18nInstance') -const defaultOptions = { - settingFilePath: configs.TOOL_WINDOW_CONFIG, - rootDir: path.join(__dirname, '../', configs.TOOLS_DIR), - config: 'tool.json', - renderTarget: 'toolInfos' -} - -class Tools extends CardList { - constructor (options) { - super({ ...defaultOptions, ...options }) - } - _handleCardClick (key) { - const { card } = this._cardList.find(item => item.key === key) - ipcRenderer.send('application-message', 'start-tool', card.options) - } - - _getCard (cardInfo) { - const card = new ButtonCard(cardInfo) - const key = `${cardInfo.name}|${cardInfo.author}` - card.on('click', () => this._handleCardClick(key)) - card.on('export', () => this._handleExport(key)) - card.on('remove', () => this._handleRemove(key)) - return { - key, - card - } - } - - _getExportInfo () { - return { - extend: 'mspt', - typeText: i18n.t.manager.fileTypeMSPT() - } - } - - save () {} -} -module.exports = Tools diff --git a/manager/Update.js b/manager/Update.js deleted file mode 100644 index 43bf852..0000000 --- a/manager/Update.js +++ /dev/null @@ -1,89 +0,0 @@ -/* eslint no-console: ["error", { allow: ["warn", "error"] }] */ - -const NetworkUtil = require('./Network') -const Util = require('../Util') -const { - remote: { app }, - shell -} = require('electron') - -const defaultOptions = { - releaseApi: - 'https://api.github.com/repos/iamapig120/majsoul-plus-client/releases/latest', - preReleaseApi: - 'https://api.github.com/repos/iamapig120/majsoul-plus-client/releases', - prerelease: false -} - -class Update { - constructor (options) { - this.options = { ...defaultOptions, ...options } - this._getRemoteVersionInfo = this._getRemoteVersionInfo.bind(this) - this.checkUpdate = this.checkUpdate.bind(this) - } - - _getLocalVersion () { - return `v${app.getVersion()}` - } - - _getRemoteVersionInfo () { - const checkApi = this.options.prerelease - ? this.options.preReleaseApi - : this.options.releaseApi - return NetworkUtil.getJson(checkApi) - .then(res => { - const result = this.options.prerelease ? res[0] : res - return { - remoteVersion: result.tag_name, - body: result.body, - time: result.published_at, - url: result.html_url - } - }) - .catch(err => { - console.error(err) - return {} - }) - } - - _openDownloadPage () {} - - _renderUpdateHint ({ remoteVersion, localVersion, time, url }) { - const updateCard = document.getElementById('updateCard') - - const updateCardClose = document.getElementById('updateCard_close') - - const updateCardView = document.getElementById('updateCard_view') - - const localVersionDOM = document.getElementById('localVersion') - - const remoteVersionDOM = document.getElementById('remoteVersion') - - const publishTime = document.getElementById('publishTime') - updateCard.classList.add('show') - updateCardClose.addEventListener('click', () => { - updateCard.classList.remove('show') - }) - updateCardView.addEventListener('click', () => { - shell.openExternal(url) - updateCard.classList.remove('show') - }) - localVersionDOM.innerText = localVersion - remoteVersionDOM.innerText = remoteVersion - publishTime.innerText = new Date(time).toLocaleString() - } - - async checkUpdate () { - const localVersion = await this._getLocalVersion() - const remoteVersionInfo = await this._getRemoteVersionInfo() - const { remoteVersion, body, time, url } = remoteVersionInfo - const shouldUpdate = Util.compareVersion(remoteVersion, localVersion) - if (shouldUpdate) { - this._renderUpdateHint({ remoteVersion, localVersion, time, body, url }) - } - // TODO - // https://github.com/MajsoulPlus/majsoul-plus/blob/abe443fd809f1941b2ddcd2765f6b30bc1e21d12/manager/manager.js#L829 - // 重写 自动更新 内容 - } -} -module.exports = Update diff --git a/manager/common/ButtonCard.js b/manager/common/ButtonCard.js deleted file mode 100644 index 9ee29c7..0000000 --- a/manager/common/ButtonCard.js +++ /dev/null @@ -1,20 +0,0 @@ -const Card = require('./Card') - -class ButtonCard extends Card { - _createInputElements () { - const input = document.createElement('input') - const label = document.createElement('label') - input.type = 'button' - input.addEventListener('click', evt => { - this._listener.emit('click', evt) - }) - input.id = this._getRandomId() - label.setAttribute('for', input.id) - return { - input, - label - } - } -} - -module.exports = ButtonCard diff --git a/manager/common/Card.d.ts b/manager/common/Card.d.ts deleted file mode 100644 index c294ab3..0000000 --- a/manager/common/Card.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -export = class Card { - constructor(options: { - name: ?string, - author: ?string, - description: ?string, - preview: ?string, - filesDir: string, - }) - - private _getPreviewPath(): string - private _getRandomId() :string - private _createDOM():HTMLElement - private _dom: HTMLElement - private _editable: boolean - get DOM(): HTMLElement - on(event: string, handle: Function): void - off(event: string, handle: ?Function): void1 - emit(event: string): void -} \ No newline at end of file diff --git a/manager/common/Card.js b/manager/common/Card.js deleted file mode 100644 index 5b1bd86..0000000 --- a/manager/common/Card.js +++ /dev/null @@ -1,138 +0,0 @@ -const Listener = require('./Listener') -const path = require('path') -const i18n = require('../../i18nInstance') -const defaultOptions = { - name: '未知', - author: i18n.t.manager.missingAuthor(), - description: '无描述', - preview: 'preview.jpg' -} -class Card { - constructor (options) { - this.options = { ...defaultOptions, ...options } - this._listener = new Listener() - this._dom = this._createDOM() - this._editable = false - } - - _getPreviewPath () { - const { preview, filesDir } = this.options - return path.join(filesDir, preview) - } - - _getRandomId () { - var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''); var uuid = new Array(36); var rnd = 0; var r - for (var i = 0; i < 36; i++) { - if (i === 8 || i === 13 || i === 18 || i === 23) { - uuid[i] = '-' - } else if (i === 14) { - uuid[i] = '4' - } else { - if (rnd <= 0x02) { rnd = 0x2000000 + (Math.random() * 0x1000000) | 0 } - r = rnd & 0xf - rnd = rnd >> 4 - uuid[i] = chars[(i === 19) ? (r & 0x3) | 0x8 : r] - } - } - return `${uuid.join('').replace(/-/gm, '').toLowerCase()}` - } - - _createInputElements () { - - } - - _createH3Element () { - const h3 = document.createElement('h3') - h3.innerText = this.options.name - return h3 - } - - _createAddressElement () { - const address = document.createElement('address') - address.innerText = this.options.author - return address - } - - _createPreviewElement () { - const preview = document.createElement('img') - preview.src = this._getPreviewPath() - preview.addEventListener('error', function errFun () { - preview.src = path.join(__dirname, '../', 'defaultPreview.jpg') - preview.removeEventListener('error', errFun) - }) - preview.addEventListener('dragstart', evt => evt.preventDefault()) - return preview - } - - _createPElement () { - const p = document.createElement('p') - p.innerText = this.options.description - return p - } - - _createExportButton () { - const exportButton = document.createElement('button') - exportButton.className = 'export-btn' - exportButton.addEventListener('click', evt => { - this._listener.emit('export', evt) - }) - return exportButton - } - - _createRemoveButton () { - const removeButton = document.createElement('button') - removeButton.className = 'remove-btn' - removeButton.addEventListener('click', evt => { - this._listener.emit('remove', evt) - }) - return removeButton - } - - _createDOM () { - const article = document.createElement('article') - const preview = this._createPreviewElement() - const h3 = this._createH3Element() - const address = this._createAddressElement() - const p = this._createPElement() - const { input, label } = this._createInputElements() - const exportButton = this._createExportButton() - const removeButton = this._createRemoveButton() - article.appendChild(preview) - article.appendChild(h3) - article.appendChild(p) - article.appendChild(address) - article.appendChild(input) - article.appendChild(label) - article.appendChild(exportButton) - article.appendChild(removeButton) - return article - } - - get DOM () { - return this._dom - } - - get editable () { - return this._editable - } - - set editable (value) { - this._editable = value - this._dom.className = value ? 'edit' : '' - return value - } - - on (event, handle) { - this._listener.on(event, handle) - } - - off (event, handle) { - this._listener.off(event, handle) - } - - emit (event) { - this._listener.emit(event) - } -} - -module.exports = Card diff --git a/manager/common/CardList.js b/manager/common/CardList.js deleted file mode 100644 index abdf251..0000000 --- a/manager/common/CardList.js +++ /dev/null @@ -1,164 +0,0 @@ -const path = require('path') -const fs = require('fs') -const os = require('os') -const { - remote: { dialog } -} = require('electron') -const CheckboxCard = require('./CheckboxCard') -const Util = require('../../Util') -const i18n = require('../../i18nInstance') - -const defaultOptions = { - rootDir: '', - config: '', - checkedKeys: [], - renderTarget: '' -} -class CardList { - constructor (options) { - this._cardList = [] - this.options = options - this._getCardInfo = this._getCardInfo.bind(this) - this._getCards = this._getCards.bind(this) - this._getCard = this._getCard.bind(this) - this._renderCards = this._renderCards.bind(this) - } - - _getCardInfo (dir) { - const { rootDir, config } = this.options - const dirPath = path.join(rootDir, dir) - const stat = fs.statSync(dirPath) - if (stat.isDirectory()) { - try { - const data = fs.readFileSync(path.join(dirPath, config)) - const info = JSON.parse(data.toString('utf-8')) - info.filesDir = dirPath - return info - } catch (error) { - return null - } - } else { - return null - } - } - - _getCardInfos () { - const { rootDir } = this.options - const dirs = fs.readdirSync(rootDir) - return Promise.all(dirs.map(this._getCardInfo)).then(list => - list.filter(item => !!item) - ) - } - - _getCards (cardInfos = []) { - const cards = cardInfos.map(this._getCard) - this._cardList = cards - return Promise.resolve(cards) - } - - _getCard (cardInfo) { - const card = new CheckboxCard(cardInfo) - const key = `${cardInfo.name}|${cardInfo.author}` - card.checked = this.options.checkedKeys.includes(key) - card.on('change', () => this._handleCheckedChange(key)) - card.on('export', () => this._handleExport(key)) - card.on('remove', () => this._handleRemove(key)) - return { - key, - card - } - } - - _handleCheckedChange (key) { - const { card } = this._cardList.find(item => item.key === key) - if (card.checked && !this.options.checkedKeys.includes(key)) { - this.options.checkedKeys.push(key) - } else if (!card.checked && this.options.checkedKeys.includes(key)) { - const index = this.options.checkedKeys.indexOf(key) - this.options.checkedKeys.splice(index, 1) - } - } - - _getExportInfo () {} - - _handleExport (key) { - const { - card: { - options: { name, author, filesDir } - } - } = this._cardList.find(item => item.key === key) - const { extend, typeText } = this._getExportInfo() - const tempZipName = `${name}-${author}.${extend}` - const tempZipPath = path.join(os.tmpdir(), tempZipName) - Util.zipDir(filesDir, tempZipPath) - const userChosenPath = dialog.showSaveDialog({ - title: i18n.t.manager.exportTo(), - filters: [ - { - name: typeText, - extensions: [extend] - }, - { - name: i18n.t.manager.fileTypeAllfiles(), - extensions: ['*'] - } - ], - defaultPath: tempZipName - }) - if (userChosenPath) { - fs.copyFile(tempZipPath, userChosenPath, err => { - if (err) { - alert(i18n.t.manager.exportExtendResourcesFailed(err)) - } else { - alert(i18n.t.manager.exportExtendResourcesSucceeded()) - } - }) - } - } - - _handleRemove (key) { - const { card } = this._cardList.find(item => item.key === key) - card.DOM.remove() - const { filesDir } = card.options - Util.removeDirSync(filesDir) - this.load() - } - - _renderCards () { - const { renderTarget } = this.options - const target = document.getElementById(renderTarget) - target.innerHTML = '' - this._cardList.forEach(({ card }) => { - const { DOM } = card - target.appendChild(DOM) - }) - } - - load () { - return this._getCardInfos() - .then(this._getCards) - .then(this._renderCards) - } - - save () { - const { checkedKeys, settingFilePath } = this.options - const launchedCards = this._cardList - .filter(item => checkedKeys.includes(item.key)) - .map(item => item.card.options) - fs.writeFileSync(settingFilePath, JSON.stringify(launchedCards), { - encoding: 'utf-8' - }) - } - - get cardList () { - return this._cardList - } - - changeEditable () { - this._cardList.forEach(item => { - item.card.editable = !item.card.editable - }) - } -} - -module.exports = CardList diff --git a/manager/common/CheckboxCard.js b/manager/common/CheckboxCard.js deleted file mode 100644 index 6ecaa20..0000000 --- a/manager/common/CheckboxCard.js +++ /dev/null @@ -1,28 +0,0 @@ -const Card = require('./Card') -class CheckboxCard extends Card { - constructor (options) { - super(options) - this.checked = false - } - - _createInputElements () { - const input = document.createElement('input') - const label = document.createElement('label') - input.type = 'checkbox' - input.id = this._getRandomId() - input.addEventListener('change', evt => { - this._listener.emit('change', evt) - }) - Object.defineProperty(this, 'checked', { - get: () => input.checked, - set: value => { input.checked = value } - }) - label.setAttribute('for', input.id) - return { - input, - label - } - } -} - -module.exports = CheckboxCard diff --git a/manager/common/Listener.js b/manager/common/Listener.js deleted file mode 100644 index 8ec2974..0000000 --- a/manager/common/Listener.js +++ /dev/null @@ -1,44 +0,0 @@ -class Listener { - constructor () { - this.handles = [] - } - - on (event, handle) { - if (typeof event !== 'string') throw new Error('event must be a string !') - if (typeof handle !== 'function') throw new Error('handle is not a function !') - for (let index = 0; index < this.handles.length; index++) { - const element = this.handles[index] - if (element.event === event && element.handle === handle) { - return - } - } - this.handles.push({ - event, - handle }) - } - - off (event, handle) { - if (typeof event !== 'string') throw new Error('invalid event !') - if (!handle) { - this.handles = this.handles.filter(item => item.event !== event) - } else { - for (let index = 0; index < this.handles.length; index++) { - const element = this.handles[index] - if (element.event === event && element.handle === handle) { - this.handles.splice(index, 1) - } - } - } - } - - emit (event, ...args) { - if (typeof event !== 'string') throw new Error('invalid event !') - for (let index = 0; index < this.handles.length; index++) { - const element = this.handles[index] - if (element.event === event) { - element.handle.call(...args) - } - } - } -} -module.exports = Listener diff --git a/manager/extra/darkMode.js b/manager/extra/darkMode.js deleted file mode 100644 index a95face..0000000 --- a/manager/extra/darkMode.js +++ /dev/null @@ -1,26 +0,0 @@ -const { remote: electronRemote } = require('electron') - -function changeTheme (mode) { - const extraCss = document.getElementById('extraCss') - if (mode === 'dark') { - extraCss.href = './styles/dark/dark.css' - } else { - extraCss.href = './style.css' - } -} - -module.exports = function darkMode () { - if (process.platform === 'darwin') { - const { systemPreferences } = electronRemote - - const setOSTheme = function () { - let mode = systemPreferences.isDarkMode() ? 'dark' : 'light' - changeTheme(mode) - } - - systemPreferences.subscribeLocalNotification( - 'AppleInterfaceThemeChangeNotification', - setOSTheme - ) - } -} diff --git a/manager/extra/springFestivalTheme.js b/manager/extra/springFestivalTheme.js deleted file mode 100644 index 23e1de9..0000000 --- a/manager/extra/springFestivalTheme.js +++ /dev/null @@ -1,15 +0,0 @@ -function isSpringFestival () { - const start = new Date('2019-02-03 00:00:00') - const end = new Date('2019-02-13 00:00:00') - const now = Date.now() - return now < end && now > start -} - -module.exports = function springFestivalExtend () { - const extraCss = document.getElementById('extraCss') - setTimeout(() => { - if (isSpringFestival()) { - extraCss.href = './styles/springfestival/springfestival.css' - } - }, 0) -} diff --git a/manager/main.js b/manager/main.js deleted file mode 100644 index fc61df0..0000000 --- a/manager/main.js +++ /dev/null @@ -1,243 +0,0 @@ -const panel = require('./Panel') -const ping = require('./Ping') -const Update = require('./Update') -const Setting = require('./Setting') -const About = require('./About') - -const { - ipcRenderer, - remote: { dialog, app } -} = require('electron') -const AdmZip = require('adm-zip') -const path = require('path') -const os = require('os') - -const setting = new Setting() -const about = new About() -const Mods = require('./Mods') -const Executes = require('./Executes') -const Tools = require('./Tools') - -const configs = require('../configs') -const i18n = require('../i18nInstance') - -class Manager { - constructor (options) { - this.options = options - this.mods = null - this.executes = null - this.tools = null - this._extends = [] - - this._update = new Update(this.options.update) - this._addEventListener = this._addEventListener.bind(this) - this._import = this._import.bind(this) - this._changeModEditable = this._changeModEditable.bind(this) - this._changeExecuteEditable = this._changeExecuteEditable.bind(this) - this._changeToolEditable = this._changeToolEditable.bind(this) - this._loadCards = this._loadCards.bind(this) - this._saveSettings = this._saveSettings.bind(this) - this._getRootDirs = this._getRootDirs.bind(this) - this._getInstallDirByExtname = this._getInstallDirByExtname.bind(this) - this._runExtends = this._runExtends.bind(this) - this.gameStart = this.gameStart.bind(this) - } - - _saveSettings () { - setting.save() - this.mods.save() - this.executes.save() - this.tools.save() - } - - _changeModEditable () { - this.mods.changeEditable() - } - - _changeExecuteEditable () { - this.executes.changeEditable() - } - - _changeToolEditable () { - this.tools.changeEditable() - } - - _getRootDirs () { - const { - userConfig: { - userData: { useAppdataLibrary } - }, - modRootDirs, - executeRootDirs, - toolRootDirs - } = this.options - const index = Number(!!useAppdataLibrary) - return { - modRootDir: modRootDirs[index], - executeRootDir: executeRootDirs[index], - toolRootDir: toolRootDirs[index] - } - } - - _getInstallDirByExtname (extname) { - const { modRootDir, executeRootDir, toolRootDir } = this._getRootDirs() - const map = { - '.mspm': modRootDir, - '.mspe': executeRootDir, - '.mspt': toolRootDir - } - return map[extname] - } - - _import () { - dialog.showOpenDialog( - { - title: i18n.t.manager.installFrom(), - filters: [ - { - name: i18n.t.manager.fileTypeMajsoulPlusExtendResourcesPack(), - extensions: ['mspm', 'mspe', 'mspt'] - } - ], - properties: ['openFile', 'multiSelections'] - }, - filenames => { - if (filenames && filenames.length) { - filenames.forEach(filename => { - const unzip = new AdmZip(filename) - const extname = path.extname(filename) - const installDir = this._getInstallDirByExtname(extname) - unzip.extractAllToAsync(installDir, true, err => { - if (err) { - alert(i18n.t.manager.installExtendResourcesFailed(err)) - } else { - alert(i18n.t.manager.installExtendResourcesSucceeded()) - this._loadCards() - } - }) - }) - } - } - ) - } - - _addEventListener () { - const installMod = document.getElementById('installMod') - const installExecute = document.getElementById('installExecute') - const installTool = document.getElementById('installTool') - installMod.addEventListener('click', this._import) - installExecute.addEventListener('click', this._import) - installTool.addEventListener('click', this._import) - - const editMod = document.getElementById('editMod') - editMod.addEventListener('click', this._changeModEditable) - const editExecute = document.getElementById('editExecute') - editExecute.addEventListener('click', this._changeExecuteEditable) - const editTool = document.getElementById('editTool') - editTool.addEventListener('click', this._changeToolEditable) - - window.addEventListener('blur', () => document.body.classList.add('blur')) - window.addEventListener('focus', () => - document.body.classList.remove('blur') - ) - - const refreshMod = document.getElementById('refreshMod') - const refreshExecute = document.getElementById('refreshExecute') - const refreshTool = document.getElementById('refreshTool') - refreshMod.addEventListener('click', this._loadCards) - refreshExecute.addEventListener('click', this._loadCards) - refreshTool.addEventListener('click', this._loadCards) - - const launch = document.getElementById('launch') - launch.addEventListener('click', this.gameStart) - - const closeBtn = document.getElementById('closeBtn') - if (os.platform() === 'darwin') { - closeBtn.className = 'close-btn darwin' - // hack close bar - const body = document.querySelector('body') - body.classList.add('darwin') - const closeButton = document.querySelector('body > .close-btn.darwin') - body.removeChild(closeButton) - } - closeBtn.addEventListener('click', window.close) - } - - _loadCards () { - const { modRootDir, executeRootDir, toolRootDir } = this._getRootDirs() - this.mods = new Mods({ rootDir: modRootDir }) - this.executes = new Executes({ rootDir: executeRootDir }) - this.tools = new Tools({ rootDir: toolRootDir }) - this.mods.load() - this.executes.load() - this.tools.load() - } - - _runExtends () { - this._extends.forEach(fun => fun.call()) - } - - initRPC () { - ipcRenderer.on('changeConfig', (_, data) => { - let obj = JSON.parse(data) - this.options.userConfig[obj.mainKey][obj.key] = obj.value - }) - - ipcRenderer.on('saveConfig', () => { - this._saveSettings() - ipcRenderer.send('application-message', 'close-ready') - }) - } - - init () { - this._update.checkUpdate() - ping.init() - panel.init() - setting.init() - this.initRPC() - this._loadCards() - this._addEventListener() - this._runExtends() - about.render() - i18n.parseAllElementsText(document.documentElement) - } - - gameStart () { - this._saveSettings() - setting.save() - ipcRenderer.send('application-message', 'start-game') - } - - // add a function after init to run - extend (fun) { - if (typeof fun !== 'function') { - throw new Error('extend accept 1 function as argument') - } - this._extends.push(fun) - } -} - -const userDataPaths = [path.join(__dirname, '../'), app.getPath('userData')] - -const springFestivalExtend = require('./extra/springFestivalTheme') -const darkMode = require('./extra/darkMode') - -const options = { - userConfig: (() => { - try { - return require(configs.USER_CONFIG_PATH) - } catch (error) { - return require('../configs-user.json') - } - })(), - modRootDirs: userDataPaths.map(root => path.join(root, configs.MODS_DIR)), - executeRootDirs: userDataPaths.map(root => - path.join(root, configs.EXECUTES_DIR) - ), - toolRootDirs: userDataPaths.map(root => path.join(root, configs.TOOLS_DIR)) -} - -const manager = new Manager(options) -manager.extend(springFestivalExtend) -manager.extend(darkMode) -manager.init() diff --git a/mod/active.json b/mod/active.json deleted file mode 100644 index 12ac678..0000000 --- a/mod/active.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "name": "千织普通改绿头鸭", - "author": "Handle", - "description": "图片来源pixabay,由Capri23auto上传,CC0协议\n这是一个Mod示范,用途为将普通千织立绘和头像改为绿头鸭。", - "replace": [], - "execute": { - "name": "千织普通改绿头鸭台词插件", - "entry": "script.js" - } - } -] diff --git a/mod/mallard/mod.json b/mod/mallard/mod.json deleted file mode 100644 index a3024fa..0000000 --- a/mod/mallard/mod.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "千织普通改绿头鸭", - "author": "Handle", - "description": "图片来源pixabay,由Capri23auto上传,CC0协议\n这是一个Mod示范,用途为将普通千织立绘和头像改为绿头鸭。", - "replace": [], - "execute": { - "name": "千织普通改绿头鸭台词插件", - "entry": "script.js" - } -} diff --git a/mod/mallard/script.js b/mod/mallard/script.js deleted file mode 100644 index fd5e0c8..0000000 --- a/mod/mallard/script.js +++ /dev/null @@ -1,60 +0,0 @@ -// 修改千织语音台词 -let raf = requestAnimationFrame(function autoRun() { - try { - const arrBackup = cfg.voice.sound.groups_ - if (!arrBackup || arrBackup.length === 0) { - throw new Error() - } - console.log('Hacked语音') - Object.entries(cfg.voice.sound.groups_).forEach(([soundID, soundGroup]) => { - if (soundID == 4) { - const changeMap = { - 大厅交互语音1: { - words: '嘎!', - path: 'audio/sound/mallard/quack' - }, - 大厅交互语音2: { - words: '嘎!', - path: 'audio/sound/mallard/quack' - }, - 大厅交互语音3: { - words: '嘎!', - path: 'audio/sound/mallard/quack' - }, - 大厅交互语音4: { - words: '嘎!', - path: 'audio/sound/mallard/quack' - }, - 大厅交互语音5: { - words: '嘎!', - path: 'audio/sound/mallard/quack' - }, - 大厅交互语音6: { - words: '嘎!', - path: 'audio/sound/mallard/quack' - }, - 大厅交互语音7: { - words: '嘎!', - path: 'audio/sound/mallard/quack' - }, - 大厅交互语音8: { - words: '嘎!', - path: 'audio/sound/mallard/quack' - } - } - const keyArray = Object.keys(changeMap) - soundGroup.forEach((soundObject, index) => { - // soundObject.level_limit = 0 - if (keyArray.includes(soundObject.name)) { - soundGroup[index] = { - ...soundObject, - ...changeMap[soundObject.name] - } - } - }) - } - }) - } catch (error) { - raf = requestAnimationFrame(autoRun) - } -}) diff --git a/pack.ps1 b/pack.ps1 deleted file mode 100755 index cdaa169..0000000 --- a/pack.ps1 +++ /dev/null @@ -1,9 +0,0 @@ -$pwd = (Get-Location).Path -$build_folder = $pwd + "\build" -New-Item -ItemType "directory" -Path ($build_folder + "\packed") -Force -Set-Location ($build_folder + "\unpacked" ) -Get-ChildItem . | ForEach-Object -Process { - $name = $_.Name - 7z a -tzip ($build_folder + "\packed\" + $name + ".zip") $name -r -} -Set-Location $pwd \ No newline at end of file diff --git a/pack.sh b/pack.sh deleted file mode 100644 index 1ff5435..0000000 --- a/pack.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash -pwd=$(pwd) -build_folder="${pwd}/build" -mkdir -p "${build_folder}/packed" -cd "${build_folder}/unpacked" -echo "$(pwd)" -for folder in $(ls .) -do - zip -ry "${build_folder}/packed/${folder}.zip" "${folder}" -done -cd "${pwd}" \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 29d3c47..0000000 --- a/package-lock.json +++ /dev/null @@ -1,8840 +0,0 @@ -{ - "name": "majsoul-plus-client", - "version": "1.12.0-beta.4", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "7zip-bin": { - "version": "4.1.0", - "resolved": "http://registry.npm.taobao.org/7zip-bin/download/7zip-bin-4.1.0.tgz", - "integrity": "sha1-M+/2YqXDnAwgYRcMwAPFEgdD//A=", - "dev": true - }, - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "http://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.0.0.tgz", - "integrity": "sha1-BuKrGb21NThVWaq7W6WXKUgoAPg=", - "dev": true, - "requires": { - "@babel/highlight": "7.0.0" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "http://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.0.0.tgz", - "integrity": "sha1-9xDDjI1Fjm3ZogGvtjf8t4HOmeQ=", - "dev": true, - "requires": { - "chalk": "2.4.2", - "esutils": "2.0.2", - "js-tokens": "4.0.0" - } - }, - "@types/node": { - "version": "8.10.42", - "resolved": "http://registry.npm.taobao.org/@types/node/download/@types/node-8.10.42.tgz", - "integrity": "sha1-09jnOOE1QKCbP0pxTawf+/iTn30=", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz", - "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=", - "dev": true - }, - "accepts": { - "version": "1.3.5", - "resolved": "http://registry.npm.taobao.org/accepts/download/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "requires": { - "mime-types": "2.1.21", - "negotiator": "0.6.1" - } - }, - "acorn": { - "version": "6.0.6", - "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-6.0.6.tgz", - "integrity": "sha1-zXUYFnDVuZvbGxyZOUHTojmrH1Y=", - "dev": true - }, - "acorn-jsx": { - "version": "5.0.1", - "resolved": "http://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-5.0.1.tgz", - "integrity": "sha1-MqBk/ZJUKSFqCbFBECv90YX65A4=", - "dev": true - }, - "adm-zip": { - "version": "git+https://github.com/cthackers/adm-zip.git#ff17ae85000b62b9d159e2520564902724d26c17" - }, - "ajv": { - "version": "6.6.2", - "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-6.6.2.tgz", - "integrity": "sha1-ys7M9HS/P8POOxR0Q3EaJAY8ww0=", - "dev": true, - "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" - } - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "http://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", - "dev": true - }, - "amdefine": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-align": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/ansi-align/download/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "dev": true, - "requires": { - "string-width": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/ansi-colors/download/ansi-colors-1.1.0.tgz", - "integrity": "sha1-Y3S03V1HGP884npnGjscrQdxMqk=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-3.2.0.tgz", - "integrity": "sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s=", - "dev": true - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/ansi-gray/download/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "1.9.3" - } - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "http://registry.npm.taobao.org/ansi-wrap/download/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", - "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", - "dev": true, - "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" - } - }, - "app-builder-bin": { - "version": "2.6.4", - "resolved": "http://registry.npm.taobao.org/app-builder-bin/download/app-builder-bin-2.6.4.tgz", - "integrity": "sha1-ARzZ5+FE1StD//oVr/gDmATTB4o=", - "dev": true - }, - "app-builder-lib": { - "version": "20.39.0", - "resolved": "http://registry.npm.taobao.org/app-builder-lib/download/app-builder-lib-20.39.0.tgz", - "integrity": "sha1-GX+rqc18MgBdOILmrdBRxOGC/cM=", - "dev": true, - "requires": { - "7zip-bin": "4.1.0", - "app-builder-bin": "2.6.4", - "async-exit-hook": "2.0.1", - "bluebird-lst": "1.0.7", - "builder-util": "9.7.0", - "builder-util-runtime": "8.2.0", - "chromium-pickle-js": "0.2.0", - "debug": "4.1.1", - "ejs": "2.6.1", - "electron-osx-sign": "0.4.11", - "electron-publish": "20.39.0", - "fs-extra-p": "7.0.1", - "hosted-git-info": "2.7.1", - "is-ci": "2.0.0", - "isbinaryfile": "4.0.0", - "js-yaml": "3.13.0", - "lazy-val": "1.0.4", - "minimatch": "3.0.4", - "normalize-package-data": "2.5.0", - "plist": "3.0.1", - "read-config-file": "3.2.2", - "sanitize-filename": "1.6.1", - "semver": "5.6.0", - "temp-file": "3.3.2" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "isbinaryfile": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/isbinaryfile/download/isbinaryfile-4.0.0.tgz", - "integrity": "sha1-B9EGHCFZi0EpKw9caK3V6rYBrY4=", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz", - "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", - "dev": true, - "requires": { - "hosted-git-info": "2.7.1", - "resolve": "1.10.0", - "semver": "5.6.0", - "validate-npm-package-license": "3.0.4" - } - }, - "resolve": { - "version": "1.10.0", - "resolved": "http://registry.npm.taobao.org/resolve/download/resolve-1.10.0.tgz", - "integrity": "sha1-O9qur0XMB/N1ZW39LlTtCBCxAbo=", - "dev": true, - "requires": { - "path-parse": "1.0.6" - } - } - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/append-buffer/download/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "requires": { - "buffer-equal": "1.0.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz", - "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", - "dev": true - }, - "archy": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/archy/download/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "http://registry.npm.taobao.org/are-we-there-yet/download/are-we-there-yet-1.1.5.tgz", - "integrity": "sha1-SzXClE8GKov82mZBB2A1D+nd/CE=", - "dev": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - } - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "http://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "http://registry.npm.taobao.org/arr-filter/download/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "dev": true, - "requires": { - "make-iterator": "1.0.1" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", - "dev": true - }, - "arr-map": { - "version": "2.0.2", - "resolved": "http://registry.npm.taobao.org/arr-map/download/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "dev": true, - "requires": { - "make-iterator": "1.0.1" - } - }, - "arr-union": { - "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/array-each/download/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/array-find-index/download/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-includes": { - "version": "3.0.3", - "resolved": "http://registry.npm.taobao.org/array-includes/download/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "dev": true, - "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.13.0" - } - }, - "array-initial": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/array-initial/download/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dev": true, - "requires": { - "array-slice": "1.1.0", - "is-number": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-4.0.0.tgz", - "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", - "dev": true - } - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "http://registry.npm.taobao.org/array-last/download/array-last-1.3.0.tgz", - "integrity": "sha1-eqdwc/7FZd2rJJP1+IGF9ASp0zY=", - "dev": true, - "requires": { - "is-number": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-4.0.0.tgz", - "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", - "dev": true - } - } - }, - "array-slice": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/array-slice/download/array-slice-1.1.0.tgz", - "integrity": "sha1-42jqFfibxwaff/uJrsOmx9SsItQ=", - "dev": true - }, - "array-sort": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/array-sort/download/array-sort-1.0.0.tgz", - "integrity": "sha1-5MBTVkU/VvU1EqfR1hI/LFTAqIo=", - "dev": true, - "requires": { - "default-compare": "1.0.0", - "get-value": "2.0.6", - "kind-of": "5.1.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true - } - } - }, - "array-unique": { - "version": "0.3.2", - "resolved": "http://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asar": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/asar/download/asar-1.0.0.tgz", - "integrity": "sha1-ViT/oTaaqSmHHfwDbeAsIIcb3C4=", - "dev": true, - "requires": { - "chromium-pickle-js": "0.2.0", - "commander": "2.19.0", - "cuint": "0.2.2", - "glob": "7.1.3", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "pify": "4.0.1", - "tmp-promise": "1.0.5" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz", - "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", - "dev": true - } - } - }, - "asn1": { - "version": "0.2.4", - "resolved": "http://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz", - "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", - "dev": true, - "requires": { - "safer-buffer": "2.1.2" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/astral-regex/download/astral-regex-1.0.0.tgz", - "integrity": "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k=", - "dev": true - }, - "async-done": { - "version": "1.3.1", - "resolved": "http://registry.npm.taobao.org/async-done/download/async-done-1.3.1.tgz", - "integrity": "sha1-FLe3Nme4ZMjwK1slP8nG7dt3fz4=", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0", - "process-nextick-args": "1.0.7", - "stream-exhaust": "1.0.2" - }, - "dependencies": { - "process-nextick-args": { - "version": "1.0.7", - "resolved": "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - } - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/async-each/download/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "async-exit-hook": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/async-exit-hook/download/async-exit-hook-2.0.1.tgz", - "integrity": "sha1-i9iwJLDsmxwBzMua+dspvXF9+vM=", - "dev": true - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "http://registry.npm.taobao.org/async-foreach/download/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, - "async-settle": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/async-settle/download/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dev": true, - "requires": { - "async-done": "1.3.1" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "http://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz", - "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=", - "dev": true - }, - "author-regex": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/author-regex/download/author-regex-1.0.0.tgz", - "integrity": "sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "http://registry.npm.taobao.org/aws4/download/aws4-1.8.0.tgz", - "integrity": "sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8=", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "http://registry.npm.taobao.org/babel-code-frame/download/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "http://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "bach": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/bach/download/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "dev": true, - "requires": { - "arr-filter": "1.1.2", - "arr-flatten": "1.1.0", - "arr-map": "2.0.2", - "array-each": "1.0.1", - "array-initial": "1.1.0", - "array-last": "1.3.0", - "async-done": "1.3.1", - "async-settle": "1.0.0", - "now-and-later": "2.0.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "http://registry.npm.taobao.org/base/download/base-0.11.2.tgz", - "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", - "dev": true, - "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.0", - "resolved": "http://registry.npm.taobao.org/base64-js/download/base64-js-1.3.0.tgz", - "integrity": "sha1-yrHmEY8FEJXli1KBrqjBzSK/wOM=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "binary-extensions": { - "version": "1.13.0", - "resolved": "http://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.0.tgz", - "integrity": "sha1-lSPgATBqMkRLkHQj8d4hZCIvarE=", - "dev": true - }, - "block-stream": { - "version": "0.0.9", - "resolved": "http://registry.npm.taobao.org/block-stream/download/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "bluebird": { - "version": "3.5.3", - "resolved": "http://registry.npm.taobao.org/bluebird/download/bluebird-3.5.3.tgz", - "integrity": "sha1-fQHG+WFsmlGrD4xUmnnf5uwz76c=", - "dev": true - }, - "bluebird-lst": { - "version": "1.0.7", - "resolved": "http://registry.npm.taobao.org/bluebird-lst/download/bluebird-lst-1.0.7.tgz", - "integrity": "sha1-8Lq63p7x3OOYm2A/N5b/Oxa5DVA=", - "dev": true, - "requires": { - "bluebird": "3.5.3" - } - }, - "body-parser": { - "version": "1.18.3", - "resolved": "http://registry.npm.taobao.org/body-parser/download/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", - "requires": { - "bytes": "3.0.0", - "content-type": "1.0.4", - "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", - "on-finished": "2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "1.6.16" - } - }, - "boxen": { - "version": "1.3.0", - "resolved": "http://registry.npm.taobao.org/boxen/download/boxen-1.3.0.tgz", - "integrity": "sha1-VcbDmouljZxhrSLNh3Uy3rZlogs=", - "dev": true, - "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.4.2", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "2.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "http://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", - "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.3", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/buffer-alloc/download/buffer-alloc-1.2.0.tgz", - "integrity": "sha1-iQ3ZDZI6hz4I4Q5f1RpX5bfM4Ow=", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "1.1.0", - "buffer-fill": "1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/buffer-alloc-unsafe/download/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha1-vX3CauKXLQ7aJTvgYdupkjScGfA=", - "dev": true - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/buffer-equal/download/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/buffer-fill/download/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz", - "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=", - "dev": true - }, - "builder-util": { - "version": "9.7.0", - "resolved": "http://registry.npm.taobao.org/builder-util/download/builder-util-9.7.0.tgz", - "integrity": "sha1-eqvsETa/ZGAj8uviMaJugrudQs8=", - "dev": true, - "requires": { - "7zip-bin": "4.1.0", - "app-builder-bin": "2.6.4", - "bluebird-lst": "1.0.7", - "builder-util-runtime": "8.2.0", - "chalk": "2.4.2", - "debug": "4.1.1", - "fs-extra-p": "7.0.1", - "is-ci": "2.0.0", - "js-yaml": "3.13.0", - "source-map-support": "0.5.11", - "stat-mode": "0.2.2", - "temp-file": "3.3.2" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", - "dev": true - } - } - }, - "builder-util-runtime": { - "version": "8.2.0", - "resolved": "http://registry.npm.taobao.org/builder-util-runtime/download/builder-util-runtime-8.2.0.tgz", - "integrity": "sha1-5kwxG082Q8jM2Ljlulv7EIAaaCY=", - "dev": true, - "requires": { - "bluebird-lst": "1.0.7", - "debug": "4.1.1", - "fs-extra-p": "7.0.1", - "sax": "1.2.4" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", - "dev": true - } - } - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz", - "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", - "dev": true, - "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "http://registry.npm.taobao.org/caller-path/download/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "0.2.0" - }, - "dependencies": { - "callsites": { - "version": "0.2.0", - "resolved": "http://registry.npm.taobao.org/callsites/download/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - } - } - }, - "callsites": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/callsites/download/callsites-3.0.0.tgz", - "integrity": "sha1-+361abcq16RYEvk/2UMKPkELPdM=", - "dev": true - }, - "camelcase": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/camelcase-keys/download/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" - } - }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/capture-stack-trace/download/capture-stack-trace-1.0.1.tgz", - "integrity": "sha1-psC74fOPOqC5Ijjstv9Cw0TUE10=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "http://registry.npm.taobao.org/chardet/download/chardet-0.7.0.tgz", - "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=", - "dev": true - }, - "chokidar": { - "version": "2.1.2", - "resolved": "http://registry.npm.taobao.org/chokidar/download/chokidar-2.1.2.tgz", - "integrity": "sha1-nCPqQLAWOEOeBROGTTYq6sxa0Fg=", - "dev": true, - "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "normalize-path": "3.0.0", - "path-is-absolute": "1.0.1", - "readdirp": "2.2.1", - "upath": "1.1.0" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", - "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", - "dev": true - } - } - }, - "chromium-pickle-js": { - "version": "0.2.0", - "resolved": "http://registry.npm.taobao.org/chromium-pickle-js/download/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/ci-info/download/ci-info-2.0.0.tgz", - "integrity": "sha1-Z6npZL4xpR4V5QENWObxKDQAL0Y=", - "dev": true - }, - "circular-json": { - "version": "0.3.3", - "resolved": "http://registry.npm.taobao.org/circular-json/download/circular-json-0.3.3.tgz", - "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "http://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz", - "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", - "dev": true, - "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - } - } - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/cli-boxes/download/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "http://registry.npm.taobao.org/cli-width/download/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "http://registry.npm.taobao.org/cliui/download/cliui-4.1.0.tgz", - "integrity": "sha1-NIQi2+gtgAswIu709qwQvy5NG0k=", - "dev": true, - "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "http://registry.npm.taobao.org/clone/download/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/clone-buffer/download/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/clone-stats/download/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.2", - "resolved": "http://registry.npm.taobao.org/cloneable-readable/download/cloneable-readable-1.1.2.tgz", - "integrity": "sha1-1ZHe5Kj4vBXaQ86X3O66E9Q+KmU=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "process-nextick-args": "2.0.0", - "readable-stream": "2.3.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-map": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/collection-map/download/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "dev": true, - "requires": { - "arr-map": "2.0.2", - "for-own": "1.0.0", - "make-iterator": "1.0.1" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", - "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "http://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "http://registry.npm.taobao.org/color-support/download/color-support-1.1.3.tgz", - "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=", - "dev": true - }, - "combined-stream": { - "version": "1.0.7", - "resolved": "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.7.tgz", - "integrity": "sha1-LR0kMXr7ir6V1tLAsHtXgTU52Cg=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.19.0", - "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.19.0.tgz", - "integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=", - "dev": true - }, - "compare-version": { - "version": "0.1.2", - "resolved": "http://registry.npm.taobao.org/compare-version/download/compare-version-0.1.2.tgz", - "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "http://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz", - "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", - "dev": true, - "requires": { - "buffer-from": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - } - } - }, - "concurrently": { - "version": "4.1.0", - "resolved": "http://registry.npm.taobao.org/concurrently/download/concurrently-4.1.0.tgz", - "integrity": "sha1-F/3wZ9pxIQaF2epVRCPvI52jDTM=", - "dev": true, - "requires": { - "chalk": "2.4.2", - "date-fns": "1.30.1", - "lodash": "4.17.11", - "read-pkg": "4.0.1", - "rxjs": "6.4.0", - "spawn-command": "0.0.2-1", - "supports-color": "4.5.0", - "tree-kill": "1.2.1", - "yargs": "12.0.5" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-4.0.1.tgz", - "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", - "dev": true, - "requires": { - "normalize-package-data": "2.4.0", - "parse-json": "4.0.0", - "pify": "3.0.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "configstore": { - "version": "3.1.2", - "resolved": "http://registry.npm.taobao.org/configstore/download/configstore-3.1.2.tgz", - "integrity": "sha1-xvJd767vJt8S3TNBSwAf6BpUP48=", - "dev": true, - "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.15", - "make-dir": "1.3.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.4.2", - "xdg-basedir": "3.0.0" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/console-control-strings/download/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "http://registry.npm.taobao.org/contains-path/download/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "http://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" - }, - "content-type": { - "version": "1.0.4", - "resolved": "http://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "http://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.6.0.tgz", - "integrity": "sha1-UbU3qMQ+DwTewZk7/83VBOdYrCA=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "cookie": { - "version": "0.3.1", - "resolved": "http://registry.npm.taobao.org/cookie/download/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "http://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-props": { - "version": "2.0.4", - "resolved": "http://registry.npm.taobao.org/copy-props/download/copy-props-2.0.4.tgz", - "integrity": "sha1-k7scrfr9MdpbuKnUtB9HHsOnLf4=", - "dev": true, - "requires": { - "each-props": "1.3.2", - "is-plain-object": "2.0.4" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "http://registry.npm.taobao.org/create-error-class/download/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "1.0.1" - } - }, - "cross-env": { - "version": "5.2.0", - "resolved": "http://registry.npm.taobao.org/cross-env/download/cross-env-5.2.0.tgz", - "integrity": "sha1-bs1MAV1Xc+YUA57lKQdmabnRJvI=", - "dev": true, - "requires": { - "cross-spawn": "6.0.5", - "is-windows": "1.0.2" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz", - "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", - "dev": true, - "requires": { - "nice-try": "1.0.5", - "path-key": "2.0.1", - "semver": "5.6.0", - "shebang-command": "1.2.0", - "which": "1.3.1" - } - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/crypto-random-string/download/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true - }, - "cuint": { - "version": "0.2.2", - "resolved": "http://registry.npm.taobao.org/cuint/download/cuint-0.2.2.tgz", - "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", - "dev": true - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "http://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "1.0.2" - } - }, - "d": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/d/download/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.48" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "date-fns": { - "version": "1.30.1", - "resolved": "http://registry.npm.taobao.org/date-fns/download/date-fns-1.30.1.tgz", - "integrity": "sha1-LnG/CxGRU9u0zE6I2epaz7UNwFw=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "requires": { - "ms": "2.0.0" - } - }, - "debug-log": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/debug-log/download/debug-log-1.0.1.tgz", - "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "http://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "http://registry.npm.taobao.org/deep-extend/download/deep-extend-0.6.0.tgz", - "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "http://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "default-compare": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/default-compare/download/default-compare-1.0.0.tgz", - "integrity": "sha1-y2ETGESthNhHiPto/QFoHKd4Gi8=", - "dev": true, - "requires": { - "kind-of": "5.1.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true - } - } - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/default-resolution/download/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "http://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz", - "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", - "dev": true, - "requires": { - "object-keys": "1.0.12" - }, - "dependencies": { - "object-keys": { - "version": "1.0.12", - "resolved": "http://registry.npm.taobao.org/object-keys/download/object-keys-1.0.12.tgz", - "integrity": "sha1-CcU4VTd1dTEMymL1W7M0q/97PtI=", - "dev": true - } - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz", - "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - } - } - }, - "deglob": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/deglob/download/deglob-2.1.1.tgz", - "integrity": "sha1-0mjhaHJ3mYYujqwHBC4WWVfB874=", - "dev": true, - "requires": { - "find-root": "1.1.0", - "glob": "7.1.3", - "ignore": "3.3.10", - "pkg-config": "1.1.1", - "run-parallel": "1.1.9", - "uniq": "1.0.1" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.3.tgz", - "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "ignore": { - "version": "3.3.10", - "resolved": "http://registry.npm.taobao.org/ignore/download/ignore-3.3.10.tgz", - "integrity": "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM=", - "dev": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/delegates/download/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "http://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-file": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/detect-file/download/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "dmg-builder": { - "version": "6.6.0", - "resolved": "http://registry.npm.taobao.org/dmg-builder/download/dmg-builder-6.6.0.tgz", - "integrity": "sha1-MBrhI50zKIZK4UGcH/dEtZmiCNM=", - "dev": true, - "requires": { - "app-builder-lib": "20.39.0", - "bluebird-lst": "1.0.7", - "builder-util": "9.7.0", - "fs-extra-p": "7.0.1", - "iconv-lite": "0.4.24", - "js-yaml": "3.13.0", - "parse-color": "1.0.0", - "sanitize-filename": "1.6.1" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", - "dev": true, - "requires": { - "safer-buffer": "2.1.2" - } - } - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/doctrine/download/doctrine-2.1.0.tgz", - "integrity": "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=", - "dev": true, - "requires": { - "esutils": "2.0.2" - } - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "http://registry.npm.taobao.org/dot-prop/download/dot-prop-4.2.0.tgz", - "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", - "dev": true, - "requires": { - "is-obj": "1.0.1" - } - }, - "dotenv": { - "version": "6.2.0", - "resolved": "http://registry.npm.taobao.org/dotenv/download/dotenv-6.2.0.tgz", - "integrity": "sha1-lBwEEFNdlCyL7PKNPzV9vZ1HYGQ=", - "dev": true - }, - "dotenv-expand": { - "version": "4.2.0", - "resolved": "http://registry.npm.taobao.org/dotenv-expand/download/dotenv-expand-4.2.0.tgz", - "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=", - "dev": true - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "http://registry.npm.taobao.org/duplexer3/download/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "http://registry.npm.taobao.org/duplexify/download/duplexify-3.7.1.tgz", - "integrity": "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk=", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "stream-shift": "1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - } - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "http://registry.npm.taobao.org/each-props/download/each-props-1.3.2.tgz", - "integrity": "sha1-6kWkFNFt1c+kGbGoFyDVygaJIzM=", - "dev": true, - "requires": { - "is-plain-object": "2.0.4", - "object.defaults": "1.1.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "0.1.1", - "safer-buffer": "2.1.2" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "ejs": { - "version": "2.6.1", - "resolved": "http://registry.npm.taobao.org/ejs/download/ejs-2.6.1.tgz", - "integrity": "sha1-SY7A1JVlWrxvI81hho2SZGQHGqA=", - "dev": true - }, - "electron": { - "version": "2.0.17", - "resolved": "http://registry.npm.taobao.org/electron/download/electron-2.0.17.tgz", - "integrity": "sha1-hxwC6rzf4R90UsAbLzZRAkG23hk=", - "dev": true, - "requires": { - "@types/node": "8.10.42", - "electron-download": "3.3.0", - "extract-zip": "1.6.7" - }, - "dependencies": { - "electron-download": { - "version": "3.3.0", - "resolved": "http://registry.npm.taobao.org/electron-download/download/electron-download-3.3.0.tgz", - "integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=", - "dev": true, - "requires": { - "debug": "2.6.9", - "fs-extra": "0.30.0", - "home-path": "1.0.6", - "minimist": "1.2.0", - "nugget": "2.0.1", - "path-exists": "2.1.0", - "rc": "1.2.8", - "semver": "5.6.0", - "sumchecker": "1.3.1" - } - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "http://registry.npm.taobao.org/fs-extra/download/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.3" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "http://registry.npm.taobao.org/jsonfile/download/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "sumchecker": { - "version": "1.3.1", - "resolved": "http://registry.npm.taobao.org/sumchecker/download/sumchecker-1.3.1.tgz", - "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=", - "dev": true, - "requires": { - "debug": "2.6.9", - "es6-promise": "4.2.6" - } - } - } - }, - "electron-builder": { - "version": "20.39.0", - "resolved": "http://registry.npm.taobao.org/electron-builder/download/electron-builder-20.39.0.tgz", - "integrity": "sha1-qy9bVW823qOUfrQ+8xKpVbp/nRY=", - "dev": true, - "requires": { - "app-builder-lib": "20.39.0", - "bluebird-lst": "1.0.7", - "builder-util": "9.7.0", - "builder-util-runtime": "8.2.0", - "chalk": "2.4.2", - "dmg-builder": "6.6.0", - "fs-extra-p": "7.0.1", - "is-ci": "2.0.0", - "lazy-val": "1.0.4", - "read-config-file": "3.2.2", - "sanitize-filename": "1.6.1", - "update-notifier": "2.5.0", - "yargs": "13.2.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", - "dev": true - }, - "camelcase": { - "version": "5.2.0", - "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-5.2.0.tgz", - "integrity": "sha1-51IqvaXtlMwEieG4RmYQ6IQEz0U=", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz", - "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", - "dev": true, - "requires": { - "locate-path": "3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "http://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz", - "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz", - "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", - "dev": true, - "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "http://registry.npm.taobao.org/p-limit/download/p-limit-2.2.0.tgz", - "integrity": "sha1-QXyZQeYCepq8ulCS3SkE4lW1+8I=", - "dev": true, - "requires": { - "p-try": "2.1.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz", - "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", - "dev": true, - "requires": { - "p-limit": "2.2.0" - } - }, - "p-try": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/p-try/download/p-try-2.1.0.tgz", - "integrity": "sha1-waDxAw6X3gGLsscYkp0q9ZRj5QU=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz", - "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz", - "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", - "dev": true, - "requires": { - "emoji-regex": "7.0.3", - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "5.2.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "4.1.0" - } - }, - "yargs": { - "version": "13.2.2", - "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-13.2.2.tgz", - "integrity": "sha1-DBAfWArpXOp/Odkn53cOP9yX+ZM=", - "dev": true, - "requires": { - "cliui": "4.1.0", - "find-up": "3.0.0", - "get-caller-file": "2.0.5", - "os-locale": "3.1.0", - "require-directory": "2.1.1", - "require-main-filename": "2.0.0", - "set-blocking": "2.0.0", - "string-width": "3.1.0", - "which-module": "2.0.0", - "y18n": "4.0.0", - "yargs-parser": "13.0.0" - } - }, - "yargs-parser": { - "version": "13.0.0", - "resolved": "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-13.0.0.tgz", - "integrity": "sha1-P8RPPnaovbHMNgLoYBCGAuXM3os=", - "dev": true, - "requires": { - "camelcase": "5.2.0", - "decamelize": "1.2.0" - } - } - } - }, - "electron-download": { - "version": "4.1.1", - "resolved": "http://registry.npm.taobao.org/electron-download/download/electron-download-4.1.1.tgz", - "integrity": "sha1-AuaVVnBcxFblIPngNVVu1aAV6+g=", - "dev": true, - "requires": { - "debug": "3.2.6", - "env-paths": "1.0.0", - "fs-extra": "4.0.3", - "minimist": "1.2.0", - "nugget": "2.0.1", - "path-exists": "3.0.0", - "rc": "1.2.8", - "semver": "5.6.0", - "sumchecker": "2.0.2" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "fs-extra": { - "version": "4.0.3", - "resolved": "http://registry.npm.taobao.org/fs-extra/download/fs-extra-4.0.3.tgz", - "integrity": "sha1-DYUhIuW8W+tFP7Ao6cDJvzY0DJQ=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "jsonfile": "4.0.0", - "universalify": "0.1.2" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", - "dev": true - } - } - }, - "electron-notarize": { - "version": "0.0.5", - "resolved": "http://registry.npm.taobao.org/electron-notarize/download/electron-notarize-0.0.5.tgz", - "integrity": "sha1-2elcdjpq+FPOFtMd3nLXPLJbBwM=", - "dev": true, - "requires": { - "debug": "4.1.1", - "fs-extra": "7.0.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", - "dev": true - } - } - }, - "electron-osx-sign": { - "version": "0.4.11", - "resolved": "http://registry.npm.taobao.org/electron-osx-sign/download/electron-osx-sign-0.4.11.tgz", - "integrity": "sha1-g3dzL+eyB5afJktnWC7kcCnOCS8=", - "dev": true, - "requires": { - "bluebird": "3.5.3", - "compare-version": "0.1.2", - "debug": "2.6.9", - "isbinaryfile": "3.0.3", - "minimist": "1.2.0", - "plist": "3.0.1" - } - }, - "electron-packager": { - "version": "13.1.0", - "resolved": "http://registry.npm.taobao.org/electron-packager/download/electron-packager-13.1.0.tgz", - "integrity": "sha1-vi0uy1ygiTLY4uwg0CklwkXjeA0=", - "dev": true, - "requires": { - "asar": "1.0.0", - "debug": "4.1.1", - "electron-download": "4.1.1", - "electron-notarize": "0.0.5", - "electron-osx-sign": "0.4.11", - "extract-zip": "1.6.7", - "fs-extra": "7.0.1", - "galactus": "0.2.1", - "get-package-info": "1.0.0", - "parse-author": "2.0.0", - "pify": "4.0.1", - "plist": "3.0.1", - "rcedit": "1.1.1", - "resolve": "1.9.0", - "sanitize-filename": "1.6.1", - "semver": "5.6.0", - "yargs-parser": "13.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.0.0", - "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-5.0.0.tgz", - "integrity": "sha1-AylVJ9WL081Kp1Nj81sujZe+L0I=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz", - "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", - "dev": true - }, - "yargs-parser": { - "version": "13.0.0", - "resolved": "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-13.0.0.tgz", - "integrity": "sha1-P8RPPnaovbHMNgLoYBCGAuXM3os=", - "dev": true, - "requires": { - "camelcase": "5.0.0", - "decamelize": "1.2.0" - } - } - } - }, - "electron-publish": { - "version": "20.39.0", - "resolved": "http://registry.npm.taobao.org/electron-publish/download/electron-publish-20.39.0.tgz", - "integrity": "sha1-qUXYcbRptBYJM9TgJ2EnELZT8AY=", - "dev": true, - "requires": { - "bluebird-lst": "1.0.7", - "builder-util": "9.7.0", - "builder-util-runtime": "8.2.0", - "chalk": "2.4.2", - "fs-extra-p": "7.0.1", - "lazy-val": "1.0.4", - "mime": "2.4.0" - }, - "dependencies": { - "mime": { - "version": "2.4.0", - "resolved": "http://registry.npm.taobao.org/mime/download/mime-2.4.0.tgz", - "integrity": "sha1-4FH9iBNYWF8yed8zP+aU2gvP/dY=", - "dev": true - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "http://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz", - "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.1.tgz", - "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", - "dev": true, - "requires": { - "once": "1.4.0" - } - }, - "env-paths": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/env-paths/download/env-paths-1.0.0.tgz", - "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz", - "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "es-abstract": { - "version": "1.13.0", - "resolved": "http://registry.npm.taobao.org/es-abstract/download/es-abstract-1.13.0.tgz", - "integrity": "sha1-rIYUX91QmdjdSVWMy6Lq+biOJOk=", - "dev": true, - "requires": { - "es-to-primitive": "1.2.0", - "function-bind": "1.1.1", - "has": "1.0.3", - "is-callable": "1.1.4", - "is-regex": "1.0.4", - "object-keys": "1.0.12" - }, - "dependencies": { - "object-keys": { - "version": "1.0.12", - "resolved": "http://registry.npm.taobao.org/object-keys/download/object-keys-1.0.12.tgz", - "integrity": "sha1-CcU4VTd1dTEMymL1W7M0q/97PtI=", - "dev": true - } - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.0.tgz", - "integrity": "sha1-7fckeAM0VujdqO8J4ArZZQcH83c=", - "dev": true, - "requires": { - "is-callable": "1.1.4", - "is-date-object": "1.0.1", - "is-symbol": "1.0.2" - } - }, - "es5-ext": { - "version": "0.10.48", - "resolved": "http://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.48.tgz", - "integrity": "sha1-mgsx7t7TnmRFO87fb51Qu7+0OFA=", - "dev": true, - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "next-tick": "1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "http://registry.npm.taobao.org/es6-iterator/download/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.48", - "es6-symbol": "3.1.1" - } - }, - "es6-promise": { - "version": "4.2.6", - "resolved": "http://registry.npm.taobao.org/es6-promise/download/es6-promise-4.2.6.tgz", - "integrity": "sha1-toXt2CWIhjZepitX0w3ij63Nl08=", - "dev": true - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "http://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.48" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "http://registry.npm.taobao.org/es6-weak-map/download/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.48", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "http://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "5.13.0", - "resolved": "http://registry.npm.taobao.org/eslint/download/eslint-5.13.0.tgz", - "integrity": "sha1-znHMUpxFDu2VBFMJOaqXUnhh7ek=", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0", - "ajv": "6.6.2", - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "debug": "4.1.1", - "doctrine": "2.1.0", - "eslint-scope": "4.0.0", - "eslint-utils": "1.3.1", - "eslint-visitor-keys": "1.0.0", - "espree": "5.0.0", - "esquery": "1.0.1", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.3", - "globals": "11.10.0", - "ignore": "4.0.6", - "import-fresh": "3.0.0", - "imurmurhash": "0.1.4", - "inquirer": "6.2.2", - "js-yaml": "3.13.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.11", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "progress": "2.0.3", - "regexpp": "2.0.1", - "semver": "5.6.0", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "5.2.2", - "text-table": "0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.3.tgz", - "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "eslint-config-standard": { - "version": "12.0.0", - "resolved": "http://registry.npm.taobao.org/eslint-config-standard/download/eslint-config-standard-12.0.0.tgz", - "integrity": "sha1-Y4tMZdsL1aQTGflruh8V3a0hB9k=", - "dev": true - }, - "eslint-config-standard-jsx": { - "version": "6.0.2", - "resolved": "http://registry.npm.taobao.org/eslint-config-standard-jsx/download/eslint-config-standard-jsx-6.0.2.tgz", - "integrity": "sha1-kMmqFqwsT4lwwT/H78YIus0C2nA=", - "dev": true - }, - "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "http://registry.npm.taobao.org/eslint-import-resolver-node/download/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha1-WPFfuDm40FdsqYBBNHaqskcttmo=", - "dev": true, - "requires": { - "debug": "2.6.9", - "resolve": "1.9.0" - } - }, - "eslint-module-utils": { - "version": "2.3.0", - "resolved": "http://registry.npm.taobao.org/eslint-module-utils/download/eslint-module-utils-2.3.0.tgz", - "integrity": "sha1-VGF42rXgRsi1Yru1BwXiRW172kk=", - "dev": true, - "requires": { - "debug": "2.6.9", - "pkg-dir": "2.0.0" - } - }, - "eslint-plugin-es": { - "version": "1.4.0", - "resolved": "http://registry.npm.taobao.org/eslint-plugin-es/download/eslint-plugin-es-1.4.0.tgz", - "integrity": "sha1-R19luyDJk/wQ6Mj+d9HWAGgHLaY=", - "dev": true, - "requires": { - "eslint-utils": "1.3.1", - "regexpp": "2.0.1" - } - }, - "eslint-plugin-import": { - "version": "2.16.0", - "resolved": "http://registry.npm.taobao.org/eslint-plugin-import/download/eslint-plugin-import-2.16.0.tgz", - "integrity": "sha1-l6w+ddB5HE+sDhXvOIUQIXvn9m8=", - "dev": true, - "requires": { - "contains-path": "0.1.0", - "debug": "2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.3.2", - "eslint-module-utils": "2.3.0", - "has": "1.0.3", - "lodash": "4.17.11", - "minimatch": "3.0.4", - "read-pkg-up": "2.0.0", - "resolve": "1.9.0" - }, - "dependencies": { - "doctrine": { - "version": "1.5.0", - "resolved": "http://registry.npm.taobao.org/doctrine/download/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/path-type/download/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "eslint-plugin-node": { - "version": "8.0.1", - "resolved": "http://registry.npm.taobao.org/eslint-plugin-node/download/eslint-plugin-node-8.0.1.tgz", - "integrity": "sha1-Va41YAIoY9FB+noReZUyNApoWWQ=", - "dev": true, - "requires": { - "eslint-plugin-es": "1.4.0", - "eslint-utils": "1.3.1", - "ignore": "5.0.5", - "minimatch": "3.0.4", - "resolve": "1.9.0", - "semver": "5.6.0" - }, - "dependencies": { - "ignore": { - "version": "5.0.5", - "resolved": "http://registry.npm.taobao.org/ignore/download/ignore-5.0.5.tgz", - "integrity": "sha1-xmPFSNbOGG+zNhaozLXUbla9u/k=", - "dev": true - } - } - }, - "eslint-plugin-promise": { - "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/eslint-plugin-promise/download/eslint-plugin-promise-4.0.1.tgz", - "integrity": "sha1-LQdLZT81oj0bqJ2Ol2qYURfRxqI=", - "dev": true - }, - "eslint-plugin-react": { - "version": "7.11.1", - "resolved": "http://registry.npm.taobao.org/eslint-plugin-react/download/eslint-plugin-react-7.11.1.tgz", - "integrity": "sha1-wBp69vF1GUV9YRaqlPxtLMrVRDw=", - "dev": true, - "requires": { - "array-includes": "3.0.3", - "doctrine": "2.1.0", - "has": "1.0.3", - "jsx-ast-utils": "2.0.1", - "prop-types": "15.6.2" - } - }, - "eslint-plugin-standard": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/eslint-plugin-standard/download/eslint-plugin-standard-4.0.0.tgz", - "integrity": "sha1-+EW0UQnJnNkOd3lpQKNEVGyPa1w=", - "dev": true - }, - "eslint-scope": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.0.tgz", - "integrity": "sha1-UL8wcekzi83EMzF5Sgy1M/ATYXI=", - "dev": true, - "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" - } - }, - "eslint-utils": { - "version": "1.3.1", - "resolved": "http://registry.npm.taobao.org/eslint-utils/download/eslint-utils-1.3.1.tgz", - "integrity": "sha1-moUbqJ7nxGA0b5fPiTnHKYgn5RI=", - "dev": true - }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/eslint-visitor-keys/download/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha1-PzGA+y4pEBdxastMnW1bXDSmqB0=", - "dev": true - }, - "espree": { - "version": "5.0.0", - "resolved": "http://registry.npm.taobao.org/espree/download/espree-5.0.0.tgz", - "integrity": "sha1-/H+YS2Kzag9UOxP7nNe59Kf1tlw=", - "dev": true, - "requires": { - "acorn": "6.0.6", - "acorn-jsx": "5.0.1", - "eslint-visitor-keys": "1.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz", - "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", - "dev": true - }, - "esquery": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/esquery/download/esquery-1.0.1.tgz", - "integrity": "sha1-QGxRZYsfWZGl+bYrHcJbAOPlxwg=", - "dev": true, - "requires": { - "estraverse": "4.2.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "http://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.1.tgz", - "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", - "dev": true, - "requires": { - "estraverse": "4.2.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "http://registry.npm.taobao.org/estraverse/download/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "http://registry.npm.taobao.org/esutils/download/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "http://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "execa": { - "version": "0.7.0", - "resolved": "http://registry.npm.taobao.org/execa/download/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.5", - "shebang-command": "1.2.0", - "which": "1.3.1" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "http://registry.npm.taobao.org/expand-tilde/download/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "1.0.3" - } - }, - "express": { - "version": "4.16.4", - "resolved": "http://registry.npm.taobao.org/express/download/express-4.16.4.tgz", - "integrity": "sha1-/d72GSYQniTFFeqX/S8b2/Yt8S4=", - "requires": { - "accepts": "1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", - "content-type": "1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.4", - "qs": "6.5.2", - "range-parser": "1.2.0", - "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", - "utils-merge": "1.0.1", - "vary": "1.1.2" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "http://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz", - "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.0.3", - "resolved": "http://registry.npm.taobao.org/external-editor/download/external-editor-3.0.3.tgz", - "integrity": "sha1-WGbbKal4Jtvkvzr9JAcOrZ6kOic=", - "dev": true, - "requires": { - "chardet": "0.7.0", - "iconv-lite": "0.4.24", - "tmp": "0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", - "dev": true, - "requires": { - "safer-buffer": "2.1.2" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "http://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "http://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz", - "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - } - } - }, - "extract-zip": { - "version": "1.6.7", - "resolved": "http://registry.npm.taobao.org/extract-zip/download/extract-zip-1.6.7.tgz", - "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", - "dev": true, - "requires": { - "concat-stream": "1.6.2", - "debug": "2.6.9", - "mkdirp": "0.5.1", - "yauzl": "2.4.1" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "http://registry.npm.taobao.org/fancy-log/download/fancy-log-1.3.3.tgz", - "integrity": "sha1-28GRVPVYaQFQojlToK29A1vkX8c=", - "dev": true, - "requires": { - "ansi-gray": "0.1.1", - "color-support": "1.1.3", - "parse-node-version": "1.0.1", - "time-stamp": "1.1.0" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "http://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/fd-slicer/download/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, - "requires": { - "pend": "1.2.0" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/figures/download/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "1.3.4", - "object-assign": "4.1.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "finalhandler": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.1.tgz", - "integrity": "sha1-7r9O2EAHnIP0JJA4ydcDAIMBsQU=", - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.4.0", - "unpipe": "1.0.0" - } - }, - "find-root": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/find-root/download/find-root-1.1.0.tgz", - "integrity": "sha1-q8/Iunb3CMQql7PWhbfpRQv7nOQ=", - "dev": true - }, - "find-up": { - "version": "1.1.2", - "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "path-exists": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - } - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/findup-sync/download/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "1.0.0", - "is-glob": "3.1.0", - "micromatch": "3.1.10", - "resolve-dir": "1.0.1" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "fined": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/fined/download/fined-1.1.1.tgz", - "integrity": "sha1-ldiP8ykSPdGmlQ/fzTIfdGJx4B8=", - "dev": true, - "requires": { - "expand-tilde": "2.0.2", - "is-plain-object": "2.0.4", - "object.defaults": "1.1.0", - "object.pick": "1.3.0", - "parse-filepath": "1.0.2" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/flagged-respawn/download/flagged-respawn-1.0.1.tgz", - "integrity": "sha1-595vEnnd2cqarIpZcdYYYGs6q0E=", - "dev": true - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "http://registry.npm.taobao.org/flat-cache/download/flat-cache-1.3.4.tgz", - "integrity": "sha1-LC73dSXMKSkAff/6HdMUqpyd7m8=", - "dev": true, - "requires": { - "circular-json": "0.3.3", - "graceful-fs": "4.1.15", - "rimraf": "2.6.3", - "write": "0.2.1" - } - }, - "flora-colossus": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/flora-colossus/download/flora-colossus-1.0.0.tgz", - "integrity": "sha1-VHKcNh7ezuAU3UQWeeGjfB13OkU=", - "dev": true, - "requires": { - "debug": "3.2.6", - "fs-extra": "4.0.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "fs-extra": { - "version": "4.0.3", - "resolved": "http://registry.npm.taobao.org/fs-extra/download/fs-extra-4.0.3.tgz", - "integrity": "sha1-DYUhIuW8W+tFP7Ao6cDJvzY0DJQ=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "jsonfile": "4.0.0", - "universalify": "0.1.2" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", - "dev": true - } - } - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.1.1.tgz", - "integrity": "sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/for-own/download/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "http://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz", - "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.7", - "mime-types": "2.1.21" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "http://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "http://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "http://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "http://registry.npm.taobao.org/fs-extra/download/fs-extra-7.0.1.tgz", - "integrity": "sha1-TxicRKoSO4lfcigE9V6iPq3DSOk=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "jsonfile": "4.0.0", - "universalify": "0.1.2" - } - }, - "fs-extra-p": { - "version": "7.0.1", - "resolved": "http://registry.npm.taobao.org/fs-extra-p/download/fs-extra-p-7.0.1.tgz", - "integrity": "sha1-TuwLbfoVD6kPbd13O0+x1VytVOM=", - "dev": true, - "requires": { - "bluebird-lst": "1.0.7", - "fs-extra": "7.0.1" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/fs-mkdirp-stream/download/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "through2": "2.0.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "http://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", - "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", - "dev": true, - "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fstream": { - "version": "1.0.11", - "resolved": "http://registry.npm.taobao.org/fstream/download/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.3" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "galactus": { - "version": "0.2.1", - "resolved": "http://registry.npm.taobao.org/galactus/download/galactus-0.2.1.tgz", - "integrity": "sha1-y+0tIKQMH1Z5o1kI4rlBVzPnjbk=", - "dev": true, - "requires": { - "debug": "3.2.6", - "flora-colossus": "1.0.0", - "fs-extra": "4.0.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "fs-extra": { - "version": "4.0.3", - "resolved": "http://registry.npm.taobao.org/fs-extra/download/fs-extra-4.0.3.tgz", - "integrity": "sha1-DYUhIuW8W+tFP7Ao6cDJvzY0DJQ=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "jsonfile": "4.0.0", - "universalify": "0.1.2" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", - "dev": true - } - } - }, - "gauge": { - "version": "2.7.4", - "resolved": "http://registry.npm.taobao.org/gauge/download/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.3" - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "http://registry.npm.taobao.org/gaze/download/gaze-1.1.3.tgz", - "integrity": "sha1-xEFzPhO5J6yMD/C0w7Az8ogSkko=", - "dev": true, - "requires": { - "globule": "1.2.1" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "http://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz", - "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=", - "dev": true - }, - "get-package-info": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/get-package-info/download/get-package-info-1.0.0.tgz", - "integrity": "sha1-ZDJ5ZWPigRPNlHTbvQAFKYWkmZw=", - "dev": true, - "requires": { - "bluebird": "3.5.3", - "debug": "2.6.9", - "lodash.get": "4.4.2", - "read-pkg-up": "2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/path-type/download/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/get-stdin/download/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "http://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.3.tgz", - "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "http://registry.npm.taobao.org/glob-stream/download/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "3.0.2", - "glob": "7.1.3", - "glob-parent": "3.1.0", - "is-negated-glob": "1.0.0", - "ordered-read-streams": "1.0.1", - "pumpify": "1.5.1", - "readable-stream": "2.3.6", - "remove-trailing-separator": "1.1.0", - "to-absolute-glob": "2.0.2", - "unique-stream": "2.3.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - } - } - }, - "glob-watcher": { - "version": "5.0.3", - "resolved": "http://registry.npm.taobao.org/glob-watcher/download/glob-watcher-5.0.3.tgz", - "integrity": "sha1-iKir8cTRMeuTkomUvEpZPC5d1iY=", - "dev": true, - "requires": { - "anymatch": "2.0.0", - "async-done": "1.3.1", - "chokidar": "2.1.2", - "is-negated-glob": "1.0.0", - "just-debounce": "1.0.0", - "object.defaults": "1.1.0" - } - }, - "global-dirs": { - "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/global-dirs/download/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "requires": { - "ini": "1.3.5" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/global-modules/download/global-modules-1.0.0.tgz", - "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=", - "dev": true, - "requires": { - "global-prefix": "1.0.2", - "is-windows": "1.0.2", - "resolve-dir": "1.0.1" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/global-prefix/download/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "2.0.2", - "homedir-polyfill": "1.0.3", - "ini": "1.3.5", - "is-windows": "1.0.2", - "which": "1.3.1" - } - }, - "globals": { - "version": "11.10.0", - "resolved": "http://registry.npm.taobao.org/globals/download/globals-11.10.0.tgz", - "integrity": "sha1-Hgl3bf/aXgGBazu0B3yLWcJOqlA=", - "dev": true - }, - "globule": { - "version": "1.2.1", - "resolved": "http://registry.npm.taobao.org/globule/download/globule-1.2.1.tgz", - "integrity": "sha1-Xf+xsZHyLSB5epNptJ6rTpg5aW0=", - "dev": true, - "requires": { - "glob": "7.1.3", - "lodash": "4.17.11", - "minimatch": "3.0.4" - } - }, - "glogg": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/glogg/download/glogg-1.0.2.tgz", - "integrity": "sha1-LX3XAr7aIus7/634gGltpthGMT8=", - "dev": true, - "requires": { - "sparkles": "1.0.1" - } - }, - "got": { - "version": "6.7.1", - "resolved": "http://registry.npm.taobao.org/got/download/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, - "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.1", - "safe-buffer": "5.1.2", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.15.tgz", - "integrity": "sha1-/7cD4QZuig7qpMi4C6klPu77+wA=", - "dev": true - }, - "gulp": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/gulp/download/gulp-4.0.0.tgz", - "integrity": "sha1-lXZsYB2t5Kd+0+eyttwDiBtZY2Y=", - "dev": true, - "requires": { - "glob-watcher": "5.0.3", - "gulp-cli": "2.0.1", - "undertaker": "1.2.0", - "vinyl-fs": "3.0.3" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "http://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - }, - "gulp-cli": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/gulp-cli/download/gulp-cli-2.0.1.tgz", - "integrity": "sha1-eEfiIMs2YvK+im1XK/FOF75amUs=", - "dev": true, - "requires": { - "ansi-colors": "1.1.0", - "archy": "1.0.0", - "array-sort": "1.0.0", - "color-support": "1.1.3", - "concat-stream": "1.6.2", - "copy-props": "2.0.4", - "fancy-log": "1.3.3", - "gulplog": "1.0.0", - "interpret": "1.2.0", - "isobject": "3.0.1", - "liftoff": "2.5.0", - "matchdep": "2.0.0", - "mute-stdout": "1.0.1", - "pretty-hrtime": "1.0.3", - "replace-homedir": "1.0.0", - "semver-greatest-satisfied-range": "1.1.0", - "v8flags": "3.1.2", - "yargs": "7.1.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "http://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "1.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/which-module/download/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "http://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "7.1.0", - "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, - "requires": { - "camelcase": "3.0.0" - } - } - } - }, - "gulp-sass": { - "version": "4.0.2", - "resolved": "http://registry.npm.taobao.org/gulp-sass/download/gulp-sass-4.0.2.tgz", - "integrity": "sha1-z7Hj7/K9mFJDHHzof0OICAfY1QU=", - "dev": true, - "requires": { - "chalk": "2.4.2", - "lodash.clonedeep": "4.5.0", - "node-sass": "4.11.0", - "plugin-error": "1.0.1", - "replace-ext": "1.0.0", - "strip-ansi": "4.0.0", - "through2": "2.0.5", - "vinyl-sourcemaps-apply": "0.2.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "http://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", - "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", - "dev": true, - "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/gulplog/download/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "1.0.2" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "http://registry.npm.taobao.org/har-validator/download/har-validator-5.1.3.tgz", - "integrity": "sha1-HvievT5JllV2de7ZiTEQ3DUPoIA=", - "dev": true, - "requires": { - "ajv": "6.6.2", - "har-schema": "2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "http://registry.npm.taobao.org/has/download/has-1.0.3.tgz", - "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", - "dev": true, - "requires": { - "function-bind": "1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/has-unicode/download/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "home-path": { - "version": "1.0.6", - "resolved": "http://registry.npm.taobao.org/home-path/download/home-path-1.0.6.tgz", - "integrity": "sha1-1UncJGU4in+GZyQsWzFYjSmvKfw=", - "dev": true - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "http://registry.npm.taobao.org/homedir-polyfill/download/homedir-polyfill-1.0.3.tgz", - "integrity": "sha1-dDKYzvTlrz4ZQWH7rcwhUdOgWOg=", - "dev": true, - "requires": { - "parse-passwd": "1.0.0" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.7.1.tgz", - "integrity": "sha1-l/I2l3vW4SVAiTD/bePuxigewEc=", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "http://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": "1.4.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.16.0" - } - }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.23.tgz", - "integrity": "sha1-KXhx9jvlB63Pv8pxXQzQ7thOmmM=", - "requires": { - "safer-buffer": "2.1.2" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "http://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz", - "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", - "dev": true - }, - "import-fresh": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/import-fresh/download/import-fresh-3.0.0.tgz", - "integrity": "sha1-o9iX9CDKsOZxI2iX91vBS0iFw5A=", - "dev": true, - "requires": { - "parent-module": "1.0.0", - "resolve-from": "4.0.0" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/import-lazy/download/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "http://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "in-publish": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/in-publish/download/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/indent-string/download/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.5", - "resolved": "http://registry.npm.taobao.org/ini/download/ini-1.3.5.tgz", - "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", - "dev": true - }, - "inquirer": { - "version": "6.2.2", - "resolved": "http://registry.npm.taobao.org/inquirer/download/inquirer-6.2.2.tgz", - "integrity": "sha1-RpQRdvZcnrIIBGJxSbdDohjyVAY=", - "dev": true, - "requires": { - "ansi-escapes": "3.2.0", - "chalk": "2.4.2", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "3.0.3", - "figures": "2.0.0", - "lodash": "4.17.11", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rxjs": "6.4.0", - "string-width": "2.1.1", - "strip-ansi": "5.0.0", - "through": "2.3.8" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.0.0", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.0.0.tgz", - "integrity": "sha1-949otdCGbCCyybjGG1KYUI3IdW8=", - "dev": true, - "requires": { - "ansi-regex": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.0.0.tgz", - "integrity": "sha1-cN55Ht8CFATD/WFaqJEYrgQy5ak=", - "dev": true - } - } - } - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/interpret/download/interpret-1.2.0.tgz", - "integrity": "sha1-1QYaYiS+WOgIOYX1AU2EQ1lXYpY=", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/invert-kv/download/invert-kv-2.0.0.tgz", - "integrity": "sha1-c5P1r6Weyf9fZ6J2INEcIm4+7AI=", - "dev": true - }, - "ipaddr.js": { - "version": "1.8.0", - "resolved": "http://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-absolute/download/is-absolute-1.0.0.tgz", - "integrity": "sha1-OV4a6EsR8mrReV5zwXN45IowFXY=", - "dev": true, - "requires": { - "is-relative": "1.0.0", - "is-windows": "1.0.2" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "1.13.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "http://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-builtin-module/download/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-callable": { - "version": "1.1.4", - "resolved": "http://registry.npm.taobao.org/is-callable/download/is-callable-1.1.4.tgz", - "integrity": "sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU=", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/is-ci/download/is-ci-2.0.0.tgz", - "integrity": "sha1-a8YzQYGBDgS1wis9WJ/cpVAmQEw=", - "dev": true, - "requires": { - "ci-info": "2.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/is-date-object/download/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/is-finite/download/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-glob": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "http://registry.npm.taobao.org/is-installed-globally/download/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, - "requires": { - "global-dirs": "0.1.1", - "is-path-inside": "1.0.1" - } - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-negated-glob/download/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, - "is-npm": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-npm/download/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/is-obj/download/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/is-path-inside/download/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "1.0.2" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "http://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/is-promise/download/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-redirect/download/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "http://registry.npm.taobao.org/is-regex/download/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "1.0.3" - } - }, - "is-relative": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-relative/download/is-relative-1.0.0.tgz", - "integrity": "sha1-obtpNc6MXboei5dUubLcwCDiJg0=", - "dev": true, - "requires": { - "is-unc-path": "1.0.0" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/is-resolvable/download/is-resolvable-1.1.0.tgz", - "integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg=", - "dev": true - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/is-retry-allowed/download/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/is-symbol/download/is-symbol-1.0.2.tgz", - "integrity": "sha1-oFX2rlcZLK7jKeeoYBGLSXqVDzg=", - "dev": true, - "requires": { - "has-symbols": "1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-unc-path/download/is-unc-path-1.0.0.tgz", - "integrity": "sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=", - "dev": true, - "requires": { - "unc-path-regex": "0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "http://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-valid-glob/download/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz", - "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "isbinaryfile": { - "version": "3.0.3", - "resolved": "http://registry.npm.taobao.org/isbinaryfile/download/isbinaryfile-3.0.3.tgz", - "integrity": "sha1-XW3vPt6/boyoyunDAYOoBLX4voA=", - "dev": true, - "requires": { - "buffer-alloc": "1.2.0" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "js-base64": { - "version": "2.5.1", - "resolved": "http://registry.npm.taobao.org/js-base64/download/js-base64-2.5.1.tgz", - "integrity": "sha1-Hvo57yxfeYC7F4St5KivLeMpESE=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz", - "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", - "dev": true - }, - "js-yaml": { - "version": "3.13.0", - "resolved": "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.13.0.tgz", - "integrity": "sha1-OO5xeKwO6iyX/22W//SxjH2M+Y4=", - "dev": true, - "requires": { - "argparse": "1.0.10", - "esprima": "4.0.1" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", - "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json5": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/json5/download/json5-2.1.0.tgz", - "integrity": "sha1-56DGLEgoXGKNIKELhcibuAfDKFA=", - "dev": true, - "requires": { - "minimist": "1.2.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jsx-ast-utils": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/jsx-ast-utils/download/jsx-ast-utils-2.0.1.tgz", - "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", - "dev": true, - "requires": { - "array-includes": "3.0.3" - } - }, - "just-debounce": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/just-debounce/download/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", - "dev": true - }, - "klaw": { - "version": "1.3.1", - "resolved": "http://registry.npm.taobao.org/klaw/download/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15" - } - }, - "last-run": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/last-run/download/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "requires": { - "default-resolution": "2.0.0", - "es6-weak-map": "2.0.2" - } - }, - "latest-version": { - "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/latest-version/download/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, - "requires": { - "package-json": "4.0.1" - } - }, - "lazy-val": { - "version": "1.0.4", - "resolved": "http://registry.npm.taobao.org/lazy-val/download/lazy-val-1.0.4.tgz", - "integrity": "sha1-iCY2pyRcLP5uCk47psXWihN+XGU=", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/lazystream/download/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "2.3.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - } - } - }, - "lcid": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/lcid/download/lcid-2.0.0.tgz", - "integrity": "sha1-bvXS32DlL4LrIopMNz6NHzlyU88=", - "dev": true, - "requires": { - "invert-kv": "2.0.0" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/lead/download/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "requires": { - "flush-write-stream": "1.1.1" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "http://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" - } - }, - "liftoff": { - "version": "2.5.0", - "resolved": "http://registry.npm.taobao.org/liftoff/download/liftoff-2.5.0.tgz", - "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", - "dev": true, - "requires": { - "extend": "3.0.2", - "findup-sync": "2.0.0", - "fined": "1.1.1", - "flagged-respawn": "1.0.1", - "is-plain-object": "2.0.4", - "object.map": "1.0.1", - "rechoir": "0.6.2", - "resolve": "1.9.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "http://registry.npm.taobao.org/lodash/download/lodash-4.17.11.tgz", - "integrity": "sha1-s56mIp72B+zYniyN8SU2iRysm40=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "http://registry.npm.taobao.org/lodash.assign/download/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "http://registry.npm.taobao.org/lodash.clonedeep/download/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "http://registry.npm.taobao.org/lodash.get/download/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.mergewith": { - "version": "4.6.1", - "resolved": "http://registry.npm.taobao.org/lodash.mergewith/download/lodash.mergewith-4.6.1.tgz", - "integrity": "sha1-Y5BX5ybDr72z59QnQcqo1uQzWSc=", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "http://registry.npm.taobao.org/loose-envify/download/loose-envify-1.4.0.tgz", - "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", - "dev": true, - "requires": { - "js-tokens": "4.0.0" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "http://registry.npm.taobao.org/loud-rejection/download/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/lowercase-keys/download/lowercase-keys-1.0.1.tgz", - "integrity": "sha1-b54wtHCE2XGnyCD/FabFFnt0wm8=", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "http://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz", - "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "http://registry.npm.taobao.org/make-dir/download/make-dir-1.3.0.tgz", - "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=", - "dev": true, - "requires": { - "pify": "3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/make-iterator/download/make-iterator-1.0.1.tgz", - "integrity": "sha1-KbM/MSqo9UfEpeSQ9Wr87JkTOtY=", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "http://registry.npm.taobao.org/map-age-cleaner/download/map-age-cleaner-0.1.3.tgz", - "integrity": "sha1-fVg6cwZDTAVf5HSw9FB45uG0uSo=", - "dev": true, - "requires": { - "p-defer": "1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "http://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/map-obj/download/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "1.0.1" - } - }, - "matchdep": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/matchdep/download/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, - "requires": { - "findup-sync": "2.0.0", - "micromatch": "3.1.10", - "resolve": "1.9.0", - "stack-trace": "0.0.10" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "http://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "mem": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/mem/download/mem-4.0.0.tgz", - "integrity": "sha1-ZDdpDZRxZ49syDZZwAy6/Nawza8=", - "dev": true, - "requires": { - "map-age-cleaner": "0.1.3", - "mimic-fn": "1.2.0", - "p-is-promise": "1.1.0" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "http://registry.npm.taobao.org/meow/download/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "http://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "http://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz", - "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "http://registry.npm.taobao.org/mime/download/mime-1.4.1.tgz", - "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=" - }, - "mime-db": { - "version": "1.37.0", - "resolved": "http://registry.npm.taobao.org/mime-db/download/mime-db-1.37.0.tgz", - "integrity": "sha1-C2oM5v2+lXbiXx8tL96IMNwK0Ng=" - }, - "mime-types": { - "version": "2.1.21", - "resolved": "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.21.tgz", - "integrity": "sha1-KJlaoey3cHQv5q5+WPkYHHRLP5Y=", - "requires": { - "mime-db": "1.37.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz", - "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "http://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.1.tgz", - "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", - "dev": true, - "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/mute-stdout/download/mute-stdout-1.0.1.tgz", - "integrity": "sha1-rLAwDrTeI6fd7sAU4+lgRLNHIzE=", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "http://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.12.1", - "resolved": "http://registry.npm.taobao.org/nan/download/nan-2.12.1.tgz", - "integrity": "sha1-exqhk+mqhgV+PHu9CsRI53CSVVI=", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "http://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz", - "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "http://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { - "version": "0.6.1", - "resolved": "http://registry.npm.taobao.org/negotiator/download/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" - }, - "next-tick": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/next-tick/download/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "http://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz", - "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", - "dev": true - }, - "node-gyp": { - "version": "3.8.0", - "resolved": "http://registry.npm.taobao.org/node-gyp/download/node-gyp-3.8.0.tgz", - "integrity": "sha1-VAMEJhwzDoDQ1e3OJTpoyzlkIYw=", - "dev": true, - "requires": { - "fstream": "1.0.11", - "glob": "7.1.3", - "graceful-fs": "4.1.15", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "npmlog": "4.1.2", - "osenv": "0.1.5", - "request": "2.88.0", - "rimraf": "2.6.3", - "semver": "5.3.0", - "tar": "2.2.1", - "which": "1.3.1" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "http://registry.npm.taobao.org/semver/download/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } - } - }, - "node-sass": { - "version": "4.11.0", - "resolved": "http://registry.npm.taobao.org/node-sass/download/node-sass-4.11.0.tgz", - "integrity": "sha1-GD+uw5jpy+k7pDNi4naMqYimNpo=", - "dev": true, - "requires": { - "async-foreach": "0.1.3", - "chalk": "1.1.3", - "cross-spawn": "3.0.1", - "gaze": "1.1.3", - "get-stdin": "4.0.1", - "glob": "7.1.3", - "in-publish": "2.0.0", - "lodash.assign": "4.2.0", - "lodash.clonedeep": "4.5.0", - "lodash.mergewith": "4.6.1", - "meow": "3.7.0", - "mkdirp": "0.5.1", - "nan": "2.12.1", - "node-gyp": "3.8.0", - "npmlog": "4.1.2", - "request": "2.88.0", - "sass-graph": "2.2.4", - "stdout-stream": "1.4.1", - "true-case-path": "1.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "requires": { - "lru-cache": "4.1.5", - "which": "1.3.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "http://registry.npm.taobao.org/nopt/download/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1.1.1" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", - "dev": true, - "requires": { - "hosted-git-info": "2.7.1", - "is-builtin-module": "1.0.0", - "semver": "5.6.0", - "validate-npm-package-license": "3.0.4" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "now-and-later": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/now-and-later/download/now-and-later-2.0.0.tgz", - "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", - "dev": true, - "requires": { - "once": "1.4.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "http://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "http://registry.npm.taobao.org/npmlog/download/npmlog-4.1.2.tgz", - "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", - "dev": true, - "requires": { - "are-we-there-yet": "1.1.5", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "nugget": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/nugget/download/nugget-2.0.1.tgz", - "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", - "dev": true, - "requires": { - "debug": "2.6.9", - "minimist": "1.2.0", - "pretty-bytes": "1.0.4", - "progress-stream": "1.2.0", - "request": "2.88.0", - "single-line-log": "1.1.2", - "throttleit": "0.0.2" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "http://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz", - "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "http://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "object-keys": { - "version": "0.4.0", - "resolved": "http://registry.npm.taobao.org/object-keys/download/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "http://registry.npm.taobao.org/object.assign/download/object.assign-4.1.0.tgz", - "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", - "dev": true, - "requires": { - "define-properties": "1.1.3", - "function-bind": "1.1.1", - "has-symbols": "1.0.0", - "object-keys": "1.1.0" - }, - "dependencies": { - "object-keys": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/object-keys/download/object-keys-1.1.0.tgz", - "integrity": "sha1-Eb0iNI3S4JagRasG9shbzDQPoDI=", - "dev": true - } - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/object.defaults/download/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "1.0.1", - "array-slice": "1.1.0", - "for-own": "1.0.0", - "isobject": "3.0.1" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/object.map/download/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "1.0.0", - "make-iterator": "1.0.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "http://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, - "object.reduce": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/object.reduce/download/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "requires": { - "for-own": "1.0.0", - "make-iterator": "1.0.1" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "http://registry.npm.taobao.org/optionator/download/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" - } - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/ordered-read-streams/download/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "2.3.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - } - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/os-locale/download/os-locale-3.1.0.tgz", - "integrity": "sha1-qAKm7hfyTBBIOrmTVxnO9O0Wvxo=", - "dev": true, - "requires": { - "execa": "1.0.0", - "lcid": "2.0.0", - "mem": "4.0.0" - }, - "dependencies": { - "execa": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/execa/download/execa-1.0.0.tgz", - "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=", - "dev": true, - "requires": { - "cross-spawn": "6.0.5", - "get-stream": "4.1.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "http://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz", - "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", - "dev": true, - "requires": { - "pump": "3.0.0" - } - } - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "http://registry.npm.taobao.org/osenv/download/osenv-0.1.5.tgz", - "integrity": "sha1-hc36+uso6Gd/QW4odZK18/SepBA=", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/p-defer/download/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/p-is-promise/download/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "http://registry.npm.taobao.org/p-limit/download/p-limit-1.3.0.tgz", - "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=", - "dev": true, - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.3.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "package-json": { - "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/package-json/download/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, - "requires": { - "got": "6.7.1", - "registry-auth-token": "3.4.0", - "registry-url": "3.1.0", - "semver": "5.6.0" - } - }, - "parent-module": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/parent-module/download/parent-module-1.0.0.tgz", - "integrity": "sha1-3yUL3FOR9KCF+1idrXYfWta4ZbU=", - "dev": true, - "requires": { - "callsites": "3.0.0" - } - }, - "parse-author": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/parse-author/download/parse-author-2.0.0.tgz", - "integrity": "sha1-00YL8d3Q367tQtp1QkLmX7aEqB8=", - "dev": true, - "requires": { - "author-regex": "1.0.0" - } - }, - "parse-color": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/parse-color/download/parse-color-1.0.0.tgz", - "integrity": "sha1-e3SLlag/A/FqlPU15S1/PZRlhhk=", - "dev": true, - "requires": { - "color-convert": "0.5.3" - }, - "dependencies": { - "color-convert": { - "version": "0.5.3", - "resolved": "http://registry.npm.taobao.org/color-convert/download/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", - "dev": true - } - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/parse-filepath/download/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "1.0.0", - "map-cache": "0.2.2", - "path-root": "0.1.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.2" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/parse-node-version/download/parse-node-version-1.0.1.tgz", - "integrity": "sha1-4rXb7eAOf6m8NjYH9TMn6LBzGJs=", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/parse-passwd/download/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parseurl": { - "version": "1.3.2", - "resolved": "http://registry.npm.taobao.org/parseurl/download/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz", - "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/path-root/download/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "0.1.2" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "http://registry.npm.taobao.org/path-root-regex/download/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "http://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/pend/download/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "http://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-conf": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/pkg-conf/download/pkg-conf-2.1.0.tgz", - "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "load-json-file": "4.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "pkg-config": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/pkg-config/download/pkg-config-1.1.1.tgz", - "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", - "dev": true, - "requires": { - "debug-log": "1.0.1", - "find-root": "1.1.0", - "xtend": "4.0.1" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/pkg-dir/download/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - } - } - }, - "plist": { - "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/plist/download/plist-3.0.1.tgz", - "integrity": "sha1-qbkx0XwwTokS7wujvdYYK68uH4w=", - "dev": true, - "requires": { - "base64-js": "1.3.0", - "xmlbuilder": "9.0.7", - "xmldom": "0.1.27" - } - }, - "plugin-error": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/plugin-error/download/plugin-error-1.0.1.tgz", - "integrity": "sha1-dwFr2JGdCsN3/c3QMiMolTyleBw=", - "dev": true, - "requires": { - "ansi-colors": "1.1.0", - "arr-diff": "4.0.0", - "arr-union": "3.1.0", - "extend-shallow": "3.0.2" - } - }, - "pluralize": { - "version": "7.0.0", - "resolved": "http://registry.npm.taobao.org/pluralize/download/pluralize-7.0.0.tgz", - "integrity": "sha1-KYuJ34uTsCIdv0Ia0rGx6iP8Z3c=", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "http://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "http://registry.npm.taobao.org/prepend-http/download/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "pretty-bytes": { - "version": "1.0.4", - "resolved": "http://registry.npm.taobao.org/pretty-bytes/download/pretty-bytes-1.0.4.tgz", - "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", - "dev": true, - "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" - } - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "http://registry.npm.taobao.org/pretty-hrtime/download/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.0.tgz", - "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "http://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz", - "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", - "dev": true - }, - "progress-stream": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/progress-stream/download/progress-stream-1.2.0.tgz", - "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", - "dev": true, - "requires": { - "speedometer": "0.1.4", - "through2": "0.2.3" - } - }, - "prop-types": { - "version": "15.6.2", - "resolved": "http://registry.npm.taobao.org/prop-types/download/prop-types-15.6.2.tgz", - "integrity": "sha1-BdXKd7RFPphdYPx/+MhZCUpJcQI=", - "dev": true, - "requires": { - "loose-envify": "1.4.0", - "object-assign": "4.1.1" - } - }, - "proxy-addr": { - "version": "2.0.4", - "resolved": "http://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.4.tgz", - "integrity": "sha1-7PxzO/Iv+Mb0B/onUye5q2fki5M=", - "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.8.0" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.1.31", - "resolved": "http://registry.npm.taobao.org/psl/download/psl-1.1.31.tgz", - "integrity": "sha1-6aqG0BAbWxBcvpOsa3hM1UcnYYQ=", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz", - "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "http://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz", - "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", - "dev": true, - "requires": { - "duplexify": "3.7.1", - "inherits": "2.0.3", - "pump": "2.0.1" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz", - "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz", - "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz", - "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=" - }, - "range-parser": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/range-parser/download/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" - }, - "raw-body": { - "version": "2.3.3", - "resolved": "http://registry.npm.taobao.org/raw-body/download/raw-body-2.3.3.tgz", - "integrity": "sha1-GzJOzmtXBuFThVvBFIxlu39uoMM=", - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "http://registry.npm.taobao.org/rc/download/rc-1.2.8.tgz", - "integrity": "sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=", - "dev": true, - "requires": { - "deep-extend": "0.6.0", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - } - }, - "rcedit": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/rcedit/download/rcedit-1.1.1.tgz", - "integrity": "sha1-eTIYkzV+dPeVRmF9eSxXKzjS9/A=", - "dev": true - }, - "read-config-file": { - "version": "3.2.2", - "resolved": "http://registry.npm.taobao.org/read-config-file/download/read-config-file-3.2.2.tgz", - "integrity": "sha1-V7v/fdl8ryN9DWJb1UHG0O+00Gc=", - "dev": true, - "requires": { - "ajv": "6.10.0", - "ajv-keywords": "3.4.0", - "bluebird-lst": "1.0.7", - "dotenv": "6.2.0", - "dotenv-expand": "4.2.0", - "fs-extra-p": "7.0.1", - "js-yaml": "3.13.0", - "json5": "2.1.0", - "lazy-val": "1.0.4" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-6.10.0.tgz", - "integrity": "sha1-kNDVRDnaWHzX6EO/twRfUL0ivfE=", - "dev": true, - "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "http://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.4.0.tgz", - "integrity": "sha1-S4Mee1MUFafMUYzUBOc/YZPGNJ0=", - "dev": true - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "http://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz", - "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "micromatch": "3.1.10", - "readable-stream": "2.3.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "http://registry.npm.taobao.org/rechoir/download/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "1.9.0" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/redent/download/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz", - "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", - "dev": true, - "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/regexpp/download/regexpp-2.0.1.tgz", - "integrity": "sha1-jRnTHPYySCtYkEn4KB+T28uk0H8=", - "dev": true - }, - "registry-auth-token": { - "version": "3.4.0", - "resolved": "http://registry.npm.taobao.org/registry-auth-token/download/registry-auth-token-3.4.0.tgz", - "integrity": "sha1-10RoFUM/XV7WQxzV3KIQSPZrOX4=", - "dev": true, - "requires": { - "rc": "1.2.8", - "safe-buffer": "5.1.2" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/registry-url/download/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, - "requires": { - "rc": "1.2.8" - } - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/remove-bom-buffer/download/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha1-wr8eN3Ug0yT2I4kuM8EMrCwlK1M=", - "dev": true, - "requires": { - "is-buffer": "1.1.6", - "is-utf8": "0.2.1" - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/remove-bom-stream/download/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "3.0.0", - "safe-buffer": "5.1.2", - "through2": "2.0.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "http://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", - "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", - "dev": true, - "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "http://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz", - "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "http://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/repeating/download/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/replace-ext/download/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/replace-homedir/download/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dev": true, - "requires": { - "homedir-polyfill": "1.0.3", - "is-absolute": "1.0.0", - "remove-trailing-separator": "1.1.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "http://registry.npm.taobao.org/request/download/request-2.88.0.tgz", - "integrity": "sha1-nC/KT301tZLv5Xx/ClXoEFIST+8=", - "dev": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.8.0", - "caseless": "0.12.0", - "combined-stream": "1.0.7", - "extend": "3.0.2", - "forever-agent": "0.6.1", - "form-data": "2.3.3", - "har-validator": "5.1.3", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.21", - "oauth-sign": "0.9.0", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.4.3", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "http://registry.npm.taobao.org/require-uncached/download/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" - }, - "dependencies": { - "resolve-from": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/resolve-from/download/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - } - } - }, - "resolve": { - "version": "1.9.0", - "resolved": "http://registry.npm.taobao.org/resolve/download/resolve-1.9.0.tgz", - "integrity": "sha1-oUxv36j5Kn3x2ZbLcQX6dEZY6gY=", - "dev": true, - "requires": { - "path-parse": "1.0.6" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/resolve-dir/download/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "2.0.2", - "global-modules": "1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz", - "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", - "dev": true - }, - "resolve-options": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/resolve-options/download/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "requires": { - "value-or-function": "3.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "http://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "http://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz", - "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz", - "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", - "dev": true, - "requires": { - "glob": "7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.3.tgz", - "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "http://registry.npm.taobao.org/run-async/download/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "2.1.0" - } - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "http://registry.npm.taobao.org/run-parallel/download/run-parallel-1.1.9.tgz", - "integrity": "sha1-yd06fPn0ssS2JE4XOm7YZuYd1nk=", - "dev": true - }, - "rxjs": { - "version": "6.4.0", - "resolved": "http://registry.npm.taobao.org/rxjs/download/rxjs-6.4.0.tgz", - "integrity": "sha1-87sP572n+2nerAwW8XtQsLh5BQQ=", - "dev": true, - "requires": { - "tslib": "1.9.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "0.1.15" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" - }, - "sanitize-filename": { - "version": "1.6.1", - "resolved": "http://registry.npm.taobao.org/sanitize-filename/download/sanitize-filename-1.6.1.tgz", - "integrity": "sha1-YS2hyWRz+gLczaktzVtKsWSmdyo=", - "dev": true, - "requires": { - "truncate-utf8-bytes": "1.0.2" - } - }, - "sass-graph": { - "version": "2.2.4", - "resolved": "http://registry.npm.taobao.org/sass-graph/download/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", - "dev": true, - "requires": { - "glob": "7.1.3", - "lodash": "4.17.11", - "scss-tokenizer": "0.2.3", - "yargs": "7.1.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "http://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "http://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "1.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/which-module/download/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "http://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "7.1.0", - "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, - "requires": { - "camelcase": "3.0.0" - } - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "http://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", - "dev": true - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "http://registry.npm.taobao.org/scss-tokenizer/download/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "requires": { - "js-base64": "2.5.1", - "source-map": "0.4.4" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "semver": { - "version": "5.6.0", - "resolved": "http://registry.npm.taobao.org/semver/download/semver-5.6.0.tgz", - "integrity": "sha1-fnQlb7qknHWqfHogXMInmcrIAAQ=", - "dev": true - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/semver-diff/download/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, - "requires": { - "semver": "5.6.0" - } - }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/semver-greatest-satisfied-range/download/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dev": true, - "requires": { - "sver-compat": "1.5.0" - } - }, - "send": { - "version": "0.16.2", - "resolved": "http://registry.npm.taobao.org/send/download/send-0.16.2.tgz", - "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=", - "requires": { - "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "fresh": "0.5.2", - "http-errors": "1.6.3", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "http://registry.npm.taobao.org/serve-static/download/serve-static-1.13.2.tgz", - "integrity": "sha1-CV6Ecv1bRiN9tQzkhqQ/S4bGzsE=", - "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.16.2" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/set-value/download/set-value-2.0.0.tgz", - "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz", - "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "single-line-log": { - "version": "1.1.2", - "resolved": "http://registry.npm.taobao.org/single-line-log/download/single-line-log-1.1.2.tgz", - "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", - "dev": true, - "requires": { - "string-width": "1.0.2" - } - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/slice-ansi/download/slice-ansi-2.1.0.tgz", - "integrity": "sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY=", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "astral-regex": "1.0.0", - "is-fullwidth-code-point": "2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "http://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", - "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", - "dev": true, - "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz", - "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", - "dev": true, - "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz", - "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "snazzy": { - "version": "8.0.0", - "resolved": "http://registry.npm.taobao.org/snazzy/download/snazzy-8.0.0.tgz", - "integrity": "sha1-l6bUFz0D9lSbmKndiDYnZfrA74g=", - "dev": true, - "requires": { - "chalk": "2.4.2", - "inherits": "2.0.3", - "minimist": "1.2.0", - "readable-stream": "3.1.1", - "standard-json": "1.0.3", - "strip-ansi": "4.0.0", - "text-table": "0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "readable-stream": { - "version": "3.1.1", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-3.1.1.tgz", - "integrity": "sha1-7Wu8bFuliwkAOf8YzmcFFXla6wY=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "string_decoder": "1.2.0", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.2.0.tgz", - "integrity": "sha1-/obnOLGVRK/nBGkkOyoe6SQOro0=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "http://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.2.tgz", - "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=", - "dev": true, - "requires": { - "atob": "2.1.2", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" - } - }, - "source-map-support": { - "version": "0.5.11", - "resolved": "http://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.11.tgz", - "integrity": "sha1-76ws4IADVdAmMmoMoj4WKurJpOI=", - "dev": true, - "requires": { - "buffer-from": "1.1.1", - "source-map": "0.6.1" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "http://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "sparkles": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/sparkles/download/sparkles-1.0.1.tgz", - "integrity": "sha1-AI22XtzmxQ7sDF4ijhlFBh3QQ3w=", - "dev": true - }, - "spawn-command": { - "version": "0.0.2-1", - "resolved": "http://registry.npm.taobao.org/spawn-command/download/spawn-command-0.0.2-1.tgz", - "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.0.tgz", - "integrity": "sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ=", - "dev": true, - "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.3" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "http://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.2.0.tgz", - "integrity": "sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc=", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", - "dev": true, - "requires": { - "spdx-exceptions": "2.2.0", - "spdx-license-ids": "3.0.3" - } - }, - "spdx-license-ids": { - "version": "3.0.3", - "resolved": "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.3.tgz", - "integrity": "sha1-gcDOjyFHR1YUi7tfO/wPNr8V124=", - "dev": true - }, - "speedometer": { - "version": "0.1.4", - "resolved": "http://registry.npm.taobao.org/speedometer/download/speedometer-0.1.4.tgz", - "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz", - "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", - "dev": true, - "requires": { - "extend-shallow": "3.0.2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "http://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.0", - "resolved": "http://registry.npm.taobao.org/sshpk/download/sshpk-1.16.0.tgz", - "integrity": "sha1-HUljovv/5YBQqpCEyiC+gXQcB94=", - "dev": true, - "requires": { - "asn1": "0.2.4", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.2", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.2", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" - } - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "http://registry.npm.taobao.org/stack-trace/download/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "standard": { - "version": "12.0.1", - "resolved": "http://registry.npm.taobao.org/standard/download/standard-12.0.1.tgz", - "integrity": "sha1-D8Woqmw0xUbFViquZEJCsk2uLmE=", - "dev": true, - "requires": { - "eslint": "5.4.0", - "eslint-config-standard": "12.0.0", - "eslint-config-standard-jsx": "6.0.2", - "eslint-plugin-import": "2.14.0", - "eslint-plugin-node": "7.0.1", - "eslint-plugin-promise": "4.0.1", - "eslint-plugin-react": "7.11.1", - "eslint-plugin-standard": "4.0.0", - "standard-engine": "9.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "chardet": { - "version": "0.4.2", - "resolved": "http://registry.npm.taobao.org/chardet/download/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "debug": { - "version": "3.2.6", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "eslint": { - "version": "5.4.0", - "resolved": "http://registry.npm.taobao.org/eslint/download/eslint-5.4.0.tgz", - "integrity": "sha1-0GjsAwBrueBrQp3IX35GwbafrGI=", - "dev": true, - "requires": { - "ajv": "6.6.2", - "babel-code-frame": "6.26.0", - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "debug": "3.2.6", - "doctrine": "2.1.0", - "eslint-scope": "4.0.0", - "eslint-utils": "1.3.1", - "eslint-visitor-keys": "1.0.0", - "espree": "4.1.0", - "esquery": "1.0.1", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.3", - "globals": "11.10.0", - "ignore": "4.0.6", - "imurmurhash": "0.1.4", - "inquirer": "5.2.0", - "is-resolvable": "1.1.0", - "js-yaml": "3.13.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.11", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.3", - "regexpp": "2.0.1", - "require-uncached": "1.0.3", - "semver": "5.6.0", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "4.0.3", - "text-table": "0.2.0" - } - }, - "eslint-plugin-import": { - "version": "2.14.0", - "resolved": "http://registry.npm.taobao.org/eslint-plugin-import/download/eslint-plugin-import-2.14.0.tgz", - "integrity": "sha1-axdibS4+atUs/OiAeoRdFeIhEag=", - "dev": true, - "requires": { - "contains-path": "0.1.0", - "debug": "2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.3.2", - "eslint-module-utils": "2.3.0", - "has": "1.0.3", - "lodash": "4.17.11", - "minimatch": "3.0.4", - "read-pkg-up": "2.0.0", - "resolve": "1.9.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "http://registry.npm.taobao.org/doctrine/download/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-plugin-node": { - "version": "7.0.1", - "resolved": "http://registry.npm.taobao.org/eslint-plugin-node/download/eslint-plugin-node-7.0.1.tgz", - "integrity": "sha1-puBU5QGZsu3YVRi4m057MjyfNts=", - "dev": true, - "requires": { - "eslint-plugin-es": "1.4.0", - "eslint-utils": "1.3.1", - "ignore": "4.0.6", - "minimatch": "3.0.4", - "resolve": "1.9.0", - "semver": "5.6.0" - } - }, - "espree": { - "version": "4.1.0", - "resolved": "http://registry.npm.taobao.org/espree/download/espree-4.1.0.tgz", - "integrity": "sha1-co1UUeD9FWwEOEp62J7VH/VOsl8=", - "dev": true, - "requires": { - "acorn": "6.0.6", - "acorn-jsx": "5.0.1", - "eslint-visitor-keys": "1.0.0" - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "http://registry.npm.taobao.org/external-editor/download/external-editor-2.2.0.tgz", - "integrity": "sha1-BFURz9jRM/OEZnPRBHwVTiFK09U=", - "dev": true, - "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.23", - "tmp": "0.0.33" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.3.tgz", - "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "inquirer": { - "version": "5.2.0", - "resolved": "http://registry.npm.taobao.org/inquirer/download/inquirer-5.2.0.tgz", - "integrity": "sha1-2zUMK3Paynf/EkOWLp8i8JloVyY=", - "dev": true, - "requires": { - "ansi-escapes": "3.2.0", - "chalk": "2.4.2", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.11", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rxjs": "5.5.12", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", - "dev": true - }, - "path-type": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/path-type/download/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "rxjs": { - "version": "5.5.12", - "resolved": "http://registry.npm.taobao.org/rxjs/download/rxjs-5.5.12.tgz", - "integrity": "sha1-b6YbinfD15PbrycL7i9D9lLXQcw=", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/slice-ansi/download/slice-ansi-1.0.0.tgz", - "integrity": "sha1-BE8aSdiEL/MHqta1Be0Xi9lQE00=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "table": { - "version": "4.0.3", - "resolved": "http://registry.npm.taobao.org/table/download/table-4.0.3.tgz", - "integrity": "sha1-ALXitgLxeUuayvnKkIp2OGp4E7w=", - "dev": true, - "requires": { - "ajv": "6.6.2", - "ajv-keywords": "3.2.0", - "chalk": "2.4.2", - "lodash": "4.17.11", - "slice-ansi": "1.0.0", - "string-width": "2.1.1" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "http://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2" - } - } - } - }, - "standard-engine": { - "version": "9.0.0", - "resolved": "http://registry.npm.taobao.org/standard-engine/download/standard-engine-9.0.0.tgz", - "integrity": "sha1-06PXTEwbkfUaHmY2JGUmHKdhAxY=", - "dev": true, - "requires": { - "deglob": "2.1.1", - "get-stdin": "6.0.0", - "minimist": "1.2.0", - "pkg-conf": "2.1.0" - }, - "dependencies": { - "get-stdin": { - "version": "6.0.0", - "resolved": "http://registry.npm.taobao.org/get-stdin/download/get-stdin-6.0.0.tgz", - "integrity": "sha1-ngm/cSs2CrkiXoEgSPcf3pyJZXs=", - "dev": true - } - } - }, - "standard-json": { - "version": "1.0.3", - "resolved": "http://registry.npm.taobao.org/standard-json/download/standard-json-1.0.3.tgz", - "integrity": "sha1-W1sh2UGIENxWRMET1RY1QdzY+qY=", - "dev": true, - "requires": { - "concat-stream": "1.6.2" - } - }, - "stat-mode": { - "version": "0.2.2", - "resolved": "http://registry.npm.taobao.org/stat-mode/download/stat-mode-0.2.2.tgz", - "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "http://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - } - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.4.0.tgz", - "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=" - }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "http://registry.npm.taobao.org/stdout-stream/download/stdout-stream-1.4.1.tgz", - "integrity": "sha1-WsF0zdXNcmEEqgwLK9g4FdjVNd4=", - "dev": true, - "requires": { - "readable-stream": "2.3.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - } - } - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/stream-exhaust/download/stream-exhaust-1.0.2.tgz", - "integrity": "sha1-rNrI2lnvK8HheiwMz2wyDRIOVV0=", - "dev": true - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/strip-eof/download/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/strip-indent/download/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "4.0.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "sumchecker": { - "version": "2.0.2", - "resolved": "http://registry.npm.taobao.org/sumchecker/download/sumchecker-2.0.2.tgz", - "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", - "dev": true, - "requires": { - "debug": "2.6.9" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - }, - "sver-compat": { - "version": "1.5.0", - "resolved": "http://registry.npm.taobao.org/sver-compat/download/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/symbol-observable/download/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - }, - "table": { - "version": "5.2.2", - "resolved": "http://registry.npm.taobao.org/table/download/table-5.2.2.tgz", - "integrity": "sha1-YdR0yeTY9PcGLJjHUErLPAiqc48=", - "dev": true, - "requires": { - "ajv": "6.6.2", - "lodash": "4.17.11", - "slice-ansi": "2.1.0", - "string-width": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "tar": { - "version": "2.2.1", - "resolved": "http://registry.npm.taobao.org/tar/download/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tcp-ping": { - "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/tcp-ping/download/tcp-ping-0.1.1.tgz", - "integrity": "sha1-At1/QrW/fXy3jVt6rO+hVf2PfAw=" - }, - "temp-file": { - "version": "3.3.2", - "resolved": "http://registry.npm.taobao.org/temp-file/download/temp-file-3.3.2.tgz", - "integrity": "sha1-abba8bviMjHQpdA4ROPZbz9TGqo=", - "dev": true, - "requires": { - "async-exit-hook": "2.0.1", - "bluebird-lst": "1.0.7", - "fs-extra-p": "7.0.1" - } - }, - "term-size": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/term-size/download/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, - "requires": { - "execa": "0.7.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "http://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "throttleit": { - "version": "0.0.2", - "resolved": "http://registry.npm.taobao.org/throttleit/download/throttleit-0.0.2.tgz", - "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "http://registry.npm.taobao.org/through/download/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "0.2.3", - "resolved": "http://registry.npm.taobao.org/through2/download/through2-0.2.3.tgz", - "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", - "dev": true, - "requires": { - "readable-stream": "1.1.14", - "xtend": "2.1.2" - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/through2-filter/download/through2-filter-3.0.0.tgz", - "integrity": "sha1-cA54bfI2fCyIzYqlvkz5weeDElQ=", - "dev": true, - "requires": { - "through2": "2.0.5", - "xtend": "4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "http://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", - "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", - "dev": true, - "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/time-stamp/download/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timed-out": { - "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/timed-out/download/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "http://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2" - } - }, - "tmp-promise": { - "version": "1.0.5", - "resolved": "http://registry.npm.taobao.org/tmp-promise/download/tmp-promise-1.0.5.tgz", - "integrity": "sha1-MgjX+kR1j4aipMQGDzwz/qMOgDg=", - "dev": true, - "requires": { - "bluebird": "3.5.3", - "tmp": "0.0.33" - } - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "http://registry.npm.taobao.org/to-absolute-glob/download/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "1.0.0", - "is-negated-glob": "1.0.0" - } - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "http://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "http://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz", - "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", - "dev": true, - "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/to-through/download/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "requires": { - "through2": "2.0.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "http://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", - "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", - "dev": true, - "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.4.3.tgz", - "integrity": "sha1-U/Nto/R3g7CSWvoG/587FlKA94E=", - "dev": true, - "requires": { - "psl": "1.1.31", - "punycode": "1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "tree-kill": { - "version": "1.2.1", - "resolved": "http://registry.npm.taobao.org/tree-kill/download/tree-kill-1.2.1.tgz", - "integrity": "sha1-U5jzdOLykrncx7LnHjClw7tsdDo=", - "dev": true - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/trim-newlines/download/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "true-case-path": { - "version": "1.0.3", - "resolved": "http://registry.npm.taobao.org/true-case-path/download/true-case-path-1.0.3.tgz", - "integrity": "sha1-+BO1qMhrQNpZYGcisUTjIleZ9H0=", - "dev": true, - "requires": { - "glob": "7.1.3" - } - }, - "truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/truncate-utf8-bytes/download/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", - "dev": true, - "requires": { - "utf8-byte-length": "1.0.4" - } - }, - "tslib": { - "version": "1.9.3", - "resolved": "http://registry.npm.taobao.org/tslib/download/tslib-1.9.3.tgz", - "integrity": "sha1-1+TdeSRdhUKMTX5IIqeZF5VMooY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "http://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2" - } - }, - "type-is": { - "version": "1.6.16", - "resolved": "http://registry.npm.taobao.org/type-is/download/type-is-1.6.16.tgz", - "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", - "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.21" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "http://registry.npm.taobao.org/unc-path-regex/download/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "undertaker": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/undertaker/download/undertaker-1.2.0.tgz", - "integrity": "sha1-M52kZGJS0ILcN45wgGcpl1DhG0k=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "arr-map": "2.0.2", - "bach": "1.2.0", - "collection-map": "1.0.0", - "es6-weak-map": "2.0.2", - "last-run": "1.1.1", - "object.defaults": "1.1.0", - "object.reduce": "1.0.1", - "undertaker-registry": "1.0.1" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/undertaker-registry/download/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true - }, - "union-value": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/union-value/download/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "http://registry.npm.taobao.org/set-value/download/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" - } - } - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "unique-stream": { - "version": "2.3.1", - "resolved": "http://registry.npm.taobao.org/unique-stream/download/unique-stream-2.3.1.tgz", - "integrity": "sha1-xl0RDppK35psWUiygFPZqNBMvqw=", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "1.0.1", - "through2-filter": "3.0.0" - } - }, - "unique-string": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/unique-string/download/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, - "requires": { - "crypto-random-string": "1.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "http://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz", - "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "http://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "http://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/unzip-response/download/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true - }, - "upath": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/upath/download/upath-1.1.0.tgz", - "integrity": "sha1-NSVll+RqWB20eT0M5H+prr/J+r0=", - "dev": true - }, - "update-notifier": { - "version": "2.5.0", - "resolved": "http://registry.npm.taobao.org/update-notifier/download/update-notifier-2.5.0.tgz", - "integrity": "sha1-0HRFk+E/Fh5AassdlAi3LK0Ir/Y=", - "dev": true, - "requires": { - "boxen": "1.3.0", - "chalk": "2.4.2", - "configstore": "3.1.2", - "import-lazy": "2.1.0", - "is-ci": "1.2.1", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" - }, - "dependencies": { - "ci-info": { - "version": "1.6.0", - "resolved": "http://registry.npm.taobao.org/ci-info/download/ci-info-1.6.0.tgz", - "integrity": "sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc=", - "dev": true - }, - "is-ci": { - "version": "1.2.1", - "resolved": "http://registry.npm.taobao.org/is-ci/download/is-ci-1.2.1.tgz", - "integrity": "sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw=", - "dev": true, - "requires": { - "ci-info": "1.6.0" - } - } - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "http://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz", - "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", - "dev": true, - "requires": { - "punycode": "2.1.1" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "http://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/url-parse-lax/download/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "1.0.4" - } - }, - "use": { - "version": "3.1.1", - "resolved": "http://registry.npm.taobao.org/use/download/use-3.1.1.tgz", - "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", - "dev": true - }, - "utf8-byte-length": { - "version": "1.0.4", - "resolved": "http://registry.npm.taobao.org/utf8-byte-length/download/utf8-byte-length-1.0.4.tgz", - "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "3.3.2", - "resolved": "http://registry.npm.taobao.org/uuid/download/uuid-3.3.2.tgz", - "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=", - "dev": true - }, - "v8flags": { - "version": "3.1.2", - "resolved": "http://registry.npm.taobao.org/v8flags/download/v8flags-3.1.2.tgz", - "integrity": "sha1-/FzQwidCgYHmwpspkuT48dpeDJ8=", - "dev": true, - "requires": { - "homedir-polyfill": "1.0.3" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", - "dev": true, - "requires": { - "spdx-correct": "3.1.0", - "spdx-expression-parse": "3.0.0" - } - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/value-or-function/download/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "http://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "verror": { - "version": "1.10.0", - "resolved": "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - } - }, - "vinyl": { - "version": "2.2.0", - "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-2.2.0.tgz", - "integrity": "sha1-2FsH2pbkWNJbL/4Z/s6fLKoT7YY=", - "dev": true, - "requires": { - "clone": "2.1.2", - "clone-buffer": "1.0.0", - "clone-stats": "1.0.0", - "cloneable-readable": "1.1.2", - "remove-trailing-separator": "1.1.0", - "replace-ext": "1.0.0" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "http://registry.npm.taobao.org/vinyl-fs/download/vinyl-fs-3.0.3.tgz", - "integrity": "sha1-yFhJQF9nQo/qu71cXb3WT0fTG8c=", - "dev": true, - "requires": { - "fs-mkdirp-stream": "1.0.0", - "glob-stream": "6.1.0", - "graceful-fs": "4.1.15", - "is-valid-glob": "1.0.0", - "lazystream": "1.0.0", - "lead": "1.0.0", - "object.assign": "4.1.0", - "pumpify": "1.5.1", - "readable-stream": "2.3.6", - "remove-bom-buffer": "3.0.0", - "remove-bom-stream": "1.2.0", - "resolve-options": "1.1.0", - "through2": "2.0.5", - "to-through": "2.0.0", - "value-or-function": "3.0.0", - "vinyl": "2.2.0", - "vinyl-sourcemap": "1.1.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "http://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", - "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", - "dev": true, - "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/vinyl-sourcemap/download/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "requires": { - "append-buffer": "1.0.2", - "convert-source-map": "1.6.0", - "graceful-fs": "4.1.15", - "normalize-path": "2.1.1", - "now-and-later": "2.0.0", - "remove-bom-buffer": "3.0.0", - "vinyl": "2.2.0" - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "http://registry.npm.taobao.org/vinyl-sourcemaps-apply/download/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true, - "requires": { - "source-map": "0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "which": { - "version": "1.3.1", - "resolved": "http://registry.npm.taobao.org/which/download/which-1.3.1.tgz", - "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "http://registry.npm.taobao.org/wide-align/download/wide-align-1.1.3.tgz", - "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=", - "dev": true, - "requires": { - "string-width": "1.0.2" - } - }, - "widest-line": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/widest-line/download/widest-line-2.0.1.tgz", - "integrity": "sha1-dDh2RzDsfvQ4HOTfgvuYpTFCo/w=", - "dev": true, - "requires": { - "string-width": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "0.2.1", - "resolved": "http://registry.npm.taobao.org/write/download/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "0.5.1" - } - }, - "write-file-atomic": { - "version": "2.4.2", - "resolved": "http://registry.npm.taobao.org/write-file-atomic/download/write-file-atomic-2.4.2.tgz", - "integrity": "sha1-pxgXBt+6F4VdIhFAqcBuFfzdh7k=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/xdg-basedir/download/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "http://registry.npm.taobao.org/xmlbuilder/download/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true - }, - "xmldom": { - "version": "0.1.27", - "resolved": "http://registry.npm.taobao.org/xmldom/download/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", - "dev": true - }, - "xtend": { - "version": "2.1.2", - "resolved": "http://registry.npm.taobao.org/xtend/download/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, - "requires": { - "object-keys": "0.4.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/y18n/download/y18n-4.0.0.tgz", - "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "http://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "12.0.5", - "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-12.0.5.tgz", - "integrity": "sha1-BfWZe2CWR7ZPZrgeO0sQo2jnrRM=", - "dev": true, - "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "3.0.0", - "get-caller-file": "1.0.3", - "os-locale": "3.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "4.0.0", - "yargs-parser": "11.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz", - "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", - "dev": true, - "requires": { - "locate-path": "3.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz", - "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", - "dev": true, - "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" - } - }, - "p-limit": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/p-limit/download/p-limit-2.1.0.tgz", - "integrity": "sha1-HVoNIPsScHx1imVfa7xDhrWTDWg=", - "dev": true, - "requires": { - "p-try": "2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz", - "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", - "dev": true, - "requires": { - "p-limit": "2.1.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/p-try/download/p-try-2.0.0.tgz", - "integrity": "sha1-hQgLuHxkaI+keZb+j3376CEXYLE=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-11.1.1.tgz", - "integrity": "sha1-h5oIZZc7yp9rq1y987HGfsfTvPQ=", - "dev": true, - "requires": { - "camelcase": "5.0.0", - "decamelize": "1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.0.0", - "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-5.0.0.tgz", - "integrity": "sha1-AylVJ9WL081Kp1Nj81sujZe+L0I=", - "dev": true - } - } - }, - "yauzl": { - "version": "2.4.1", - "resolved": "http://registry.npm.taobao.org/yauzl/download/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true, - "requires": { - "fd-slicer": "1.0.1" - } - } - } -} diff --git a/package.json b/package.json index c322bfe..cc73ae3 100644 --- a/package.json +++ b/package.json @@ -1,53 +1,69 @@ { "name": "majsoul-plus-client", - "version": "1.12.1", + "version": "2.0.0-alpha.1", "productName": "Majsoul Plus", "author": "MajsoulPlus Team", "description": "Majsoul Plus", - "main": "index.js", + "main": "./dist/index.js", "scripts": { - "start": "concurrently --success \"first\" --kill-others \"gulp\" \"cross-env NODE_ENV=development electron . --enable_logging\"", + "sass": "node-sass assets/manager/ -o assets/manager/", + "pre-build": "tsc && yarn sass && node build.js", + "debug": "cross-env NODE_ENV=development electron .", + "debug:detailed": "cross-env NODE_ENV=development electron . --enable-logging --v=1 --disable-gpu", + "start": "yarn pre-build && yarn debug", + "start:detailed": "yarn pre-build && yarn debug:detailed", "pack": "npm run lint && npm run build", - "lint": "standard --fix | snazzy", - "build": "npm run build-win32 && npm run build-linux && npm run build-darwin", - "build-win32": "gulp sass && electron-packager . Majsoul_Plus --platform=win32 --arch=all --out ./build/unpacked --ignore=build --overwrite --icon=bin/icons/icon.ico", - "build-linux": "gulp sass && electron-packager . Majsoul_Plus --platform=linux --arch=all --out ./build/unpacked --ignore=build --overwrite --icon=bin/icons/icon.png", - "build-darwin": "gulp sass && electron-builder --mac", - "test": "echo \"Error: no test specified\"" + "dist": "yarn pre-build && electron-builder --x64 --ia32 --publish onTagOrDraft", + "build": "yarn pre-build && electron-builder --x64 --ia32", + "build:x86": "yarn pre-build && electron-builder --ia32", + "build:x64": "yarn pre-build && electron-builder --x64", + "build-win32": "yarn pre-build && electron-builder --win --x64 --ia32", + "build-linux": "yarn pre-build && electron-builder --linux --x64 --ia32", + "build-darwin": "yarn pre-build && electron-builder --mac --x64 --ia32", + "lint": "tslint --project .", + "lint:fix": "tslint --project . --fix", + "check": "gts check", + "clean": "gts clean", + "fix": "gts fix" }, "build": { "productName": "Majsoul Plus", "directories": { - "output": "build/packed" + "output": "build/" + }, + "files": [ + "dist/**/*" + ], + "dmg": { + "artifactName": "Majsoul_Plus-${platform}-${arch}.${ext}" }, "mac": { - "icon": "bin/icons/icon.icns", - "asar": false, + "icon": "assets/bin/icons/icon.icns", + "asar": true, "artifactName": "Majsoul_Plus-${platform}-${arch}.${ext}", "darkModeSupport": true }, - "dmg": { - "artifactName": "Majsoul_Plus-${platform}-${arch}.${ext}" - } - }, - "standard": { - "env": { - "browser": true, - "commonjs": true, - "es6": true, - "node": true + "win": { + "icon": "assets/bin/icons/icon.ico", + "asar": true, + "target": [ + "nsis", + "portable", + "zip" + ] }, - "ignore": [ - "/static/", - "/mod/", - "/tool/", - "/execute", - "i18n/csv.js" - ] + "linux": { + "icon": "assets/bin/icons", + "category": "Game", + "asar": true, + "target": [ + "tar.gz", + "AppImage" + ] + } }, "pre-commit": [ - "lint", - "test" + "lint" ], "repository": { "type": "git", @@ -60,25 +76,31 @@ "homepage": "https://github.com/iamapig120/majsoul-custorm-server#readme", "dependencies": { "adm-zip": "git+https://github.com/cthackers/adm-zip.git", - "express": "^4.16.4", - "tcp-ping": "^0.1.1" + "ajv": "^6.10.0", + "chalk": "^2.4.2", + "comma-separated-values": "^3.6.4", + "electron-fetch": "^1.3.0", + "koa": "^2.7.0", + "koa-router": "^7.4.0", + "semver": "^6.0.0", + "tcp-ping": "^0.1.1", + "toposort": "^2.0.2" }, "devDependencies": { - "concurrently": "^4.1.0", + "@types/adm-zip": "^0.4.13", + "@types/koa": "^2.0.48", + "@types/koa-router": "^7.0.42", + "@types/ncp": "^2.0.1", + "@types/semver": "^6.0.0", + "@types/tcp-ping": "^0.1.0", "cross-env": "^5.2.0", - "electron": "^2.0.0", - "electron-builder": "^20.39.0", - "electron-packager": "^13.0.1", - "eslint": "^5.13.0", - "eslint-config-standard": "^12.0.0", - "eslint-plugin-import": "^2.16.0", - "eslint-plugin-node": "^8.0.1", - "eslint-plugin-promise": "^4.0.1", - "eslint-plugin-standard": "^4.0.0", - "gulp": "^4.0.0", - "gulp-sass": "^4.0.2", - "node-sass": "^4.11.0", - "snazzy": "^8.0.0", - "standard": "^12.0.1" + "electron": "^2.0.13", + "electron-builder": "^20.40.2", + "gts": "^0.9.0", + "ncp": "^2.0.0", + "node-sass": "^4.12.0", + "tslint": "^5.15.0", + "typescript": "^3.4.1", + "yarn": "^1.15.2" } } diff --git a/resourcepack/active.json b/resourcepack/active.json new file mode 100644 index 0000000..e0d316b --- /dev/null +++ b/resourcepack/active.json @@ -0,0 +1 @@ +["mallard"] diff --git a/mod/mallard/files/0/audio/sound/mallard/quack.mp3 b/resourcepack/mallard/assets/audio/quack.mp3 similarity index 100% rename from mod/mallard/files/0/audio/sound/mallard/quack.mp3 rename to resourcepack/mallard/assets/audio/quack.mp3 diff --git a/mod/mallard/files/0/v0.4.1.w/extendRes/charactor/qianzhi/bighead.png b/resourcepack/mallard/assets/extendRes/charactor/qianzhi/bighead.png similarity index 100% rename from mod/mallard/files/0/v0.4.1.w/extendRes/charactor/qianzhi/bighead.png rename to resourcepack/mallard/assets/extendRes/charactor/qianzhi/bighead.png diff --git a/mod/mallard/files/0/v0.4.1.w/extendRes/charactor/qianzhi/full.png b/resourcepack/mallard/assets/extendRes/charactor/qianzhi/full.png similarity index 100% rename from mod/mallard/files/0/v0.4.1.w/extendRes/charactor/qianzhi/full.png rename to resourcepack/mallard/assets/extendRes/charactor/qianzhi/full.png diff --git a/mod/mallard/files/0/v0.4.1.w/extendRes/charactor/qianzhi/half.png b/resourcepack/mallard/assets/extendRes/charactor/qianzhi/half.png similarity index 100% rename from mod/mallard/files/0/v0.4.1.w/extendRes/charactor/qianzhi/half.png rename to resourcepack/mallard/assets/extendRes/charactor/qianzhi/half.png diff --git a/mod/mallard/files/0/v0.4.1.w/extendRes/charactor/qianzhi/smallhead.png b/resourcepack/mallard/assets/extendRes/charactor/qianzhi/smallhead.png similarity index 100% rename from mod/mallard/files/0/v0.4.1.w/extendRes/charactor/qianzhi/smallhead.png rename to resourcepack/mallard/assets/extendRes/charactor/qianzhi/smallhead.png diff --git a/mod/mallard/files/0/v0.4.1.w/extendRes/charactor/qianzhi/waitingroom.png b/resourcepack/mallard/assets/extendRes/charactor/qianzhi/waitingroom.png similarity index 100% rename from mod/mallard/files/0/v0.4.1.w/extendRes/charactor/qianzhi/waitingroom.png rename to resourcepack/mallard/assets/extendRes/charactor/qianzhi/waitingroom.png diff --git a/mod/mallard/preview.jpg b/resourcepack/mallard/preview.jpg similarity index 100% rename from mod/mallard/preview.jpg rename to resourcepack/mallard/preview.jpg diff --git a/resourcepack/mallard/resourcepack.json b/resourcepack/mallard/resourcepack.json new file mode 100644 index 0000000..b96a97a --- /dev/null +++ b/resourcepack/mallard/resourcepack.json @@ -0,0 +1,29 @@ +{ + "id": "mallard", + "version": "1.0.0", + "name": "千织普通改绿头鸭", + "author": "Handle", + "description": "图片来源pixabay,由Capri23auto上传,CC0协议\n这是一个Mod示范,用途为将普通千织立绘和头像改为绿头鸭。", + "preview": "preview.jpg", + + "dependencies": { + "majsoul_plus": "^2.0.0" + }, + "replace": [ + { + "from": [ + "audio/sound/qianzhi/lobby_normal1.mp3", + "audio/sound/qianzhi/lobby_normal2.mp3", + "audio/sound/qianzhi/lobby_normal3.mp3", + "audio/sound/qianzhi/lobby_normal4.mp3", + "audio/sound/qianzhi/lobby_normal5.mp3" + ], + "to": "audio/quack.mp3" + }, + "extendRes/charactor/qianzhi/bighead.png", + "extendRes/charactor/qianzhi/full.png", + "extendRes/charactor/qianzhi/half.png", + "extendRes/charactor/qianzhi/smallhead.png", + "extendRes/charactor/qianzhi/waitingroom.png" + ] +} diff --git a/src/BaseManager.ts b/src/BaseManager.ts new file mode 100644 index 0000000..9c2a62b --- /dev/null +++ b/src/BaseManager.ts @@ -0,0 +1,300 @@ +import * as Ajv from 'ajv' +import { ipcMain } from 'electron' +import * as fs from 'fs' +import * as Koa from 'koa' +import * as Router from 'koa-router' +import * as path from 'path' +import * as semver from 'semver' +import { appDataDir, Logger } from './global' +import { MajsoulPlus } from './majsoul_plus' +import { fillObject, removeDirSync, unzipDir, zipDir } from './utils' +import { ManagerWindow } from './windows/manager' + +export default abstract class BaseManager { + protected name: string + protected configPath: string + protected defaultObject: MajsoulPlus.Metadata + protected schema: {} + protected loadedMap: Map = new Map() + protected loadedDetails: { + [extension: string]: { + enabled: boolean + sequence: number + errors: Array + metadata: MajsoulPlus.Metadata + } + } = {} + private enabled: string[] + + constructor( + name: string, + configPath: string, + defaultObj: MajsoulPlus.Metadata, + schema: {} + ) { + this.name = name + this.configPath = configPath + this.defaultObject = defaultObj + this.schema = schema + + ipcMain.on(`get-${name}-details`, (event: Electron.Event) => { + ManagerWindow.webContents.send( + `get-${name}-details-response`, + this.getDetails() + ) + }) + + ipcMain.on( + `change-${name}-enability`, + (event: Electron.Event, id: string, enabled: boolean) => { + enabled ? this.enable(id) : this.disable(id) + this.save() + event.returnValue = this.getDetails() + } + ) + + ipcMain.on(`save-${name}-enabled`, (event: Electron.Event) => { + this.save() + event.returnValue = 0 + }) + + ipcMain.on(`import-${name}`, (event: Electron.Event, file: string) => { + unzipDir(file, path.resolve(appDataDir, this.name)) + event.returnValue = 0 + }) + + ipcMain.on( + `export-${name}`, + (event: Electron.Event, id: string, pathToSave: string) => { + const resp = { err: '' } + try { + zipDir(path.resolve(appDataDir, this.name, id), pathToSave) + } catch (e) { + resp.err = (e as Error).message + } + event.returnValue = resp + } + ) + + ipcMain.on(`remove-${name}`, (event: Electron.Event, id: string) => { + removeDirSync(path.resolve(appDataDir, this.name, id)) + this.enabled = this.enabled.filter(pack => pack !== id) + this.save() + this.clear() + event.returnValue = 0 + }) + } + + loadEnabled() { + this.loadedMap.set('majsoul_plus', this.defaultObject) + this.enabled = JSON.parse( + fs.readFileSync(this.configPath, { encoding: 'utf-8' }) + ) + } + + use(id: string, callback: (pack: MajsoulPlus.Metadata) => void = () => {}) { + // 资源包 ID 检查 + if (!id.match(/^[_a-zA-Z0-9]+$/)) { + Logger.debug(`invalid ${this.name} id: ${id}`) + return this + } + + const folder = path.resolve(appDataDir, this.name, id) + const cfg = path.resolve(folder, `${this.name}.json`) + + // 资源包目录存在性 + if (!fs.existsSync(folder) || !fs.statSync(folder).isDirectory()) { + Logger.debug(`${id} folder not found: ${folder}`) + return this + } + + // 资源包配置文件存在性 + if (!fs.existsSync(cfg) || !fs.statSync(cfg).isFile()) { + Logger.debug(`${id} configuration file not found: ${cfg}`) + return this + } + + // 获得资源包 + const pack: MajsoulPlus.Metadata = JSON.parse( + fs.readFileSync(cfg, { + encoding: 'utf-8' + }) + ) + + // 填入默认数据 + fillObject(pack, this.defaultObject) + + // ID 与目录名必须保持一致 + if (pack.id !== id) { + Logger.debug( + `folder name & id mismatch: folder name is ${id}, but id is ${pack.id}` + ) + return this + } + + // id 唯一性检查 + // 理论上应该不存在,因为是按照目录名的 + if (this.loadedMap.has(pack.id)) { + Logger.debug(`${this.name} already loaded or duplicated id: ${id}`) + return this + } + + // JSON Schema + const ajv = new Ajv() + const valid = ajv + .addSchema(this.schema, this.name) + .validate(this.name, pack) + if (!valid) { + Logger.debug(`failed to load ${this.name} ${id}: json schema failed`) + Logger.debug(JSON.stringify(ajv.errors, null, 2)) + return this + } + + // version validate + if (!semver.valid(pack.version)) { + Logger.debug( + `failed to load ${this.name} ${id}: broken version ${pack.version}` + ) + return this + } + + // 检查依赖 + if (pack.dependencies) { + for (const dep in pack.dependencies) { + // 依赖版本表示不合法 + if (semver.validRange(pack.dependencies[dep]) === null) { + Logger.debug( + `failed to load ${this.name} ${id}: broken dependency version ${ + pack.dependencies[dep] + }` + ) + return this + } + } + } + + callback(pack) + + this.loadedMap.set(id, pack) + this.loadedDetails[id] = { + enabled: false, + metadata: pack, + sequence: 0, + errors: [] + } + + return this + } + + enableFromConfig() { + const validatedEnabled = [] + this.enabled.forEach(id => { + const value = this.loadedDetails[id] + const meta = value.metadata + + if (value.enabled) { + validatedEnabled.push(id) + return + } + + for (const dep in meta.dependencies) { + // 依赖未找到 + if (!this.loadedMap.has(dep)) { + Logger.debug(`dependency of ${id} not found: ${dep}`) + value.errors.push(['dependencyNotFound', dep]) + } else if (dep !== 'majsoul_plus' && !this.loadedDetails[dep].enabled) { + Logger.debug(`dependency of ${id} not enabled: ${dep}`) + value.errors.push(['dependencyNotEnabled', dep]) + } else { + // 解析依赖版本范围 + const range = new semver.Range(meta.dependencies[dep]) + // 检查依赖版本 + if (!semver.satisfies(this.loadedMap.get(dep).version, range)) { + Logger.debug( + `dependency version of ${id} mismatch: loaded ${dep}:${ + this.loadedMap.get(dep).version + }, but required ${dep}:${meta.dependencies[dep]}` + ) + value.errors.push([ + 'dependencyVersionMismatch', + dep, + meta.dependencies[dep], + this.loadedMap.get(dep).version + ]) + } + } + } + + if (value.errors.length === 0) { + validatedEnabled.push(id) + this.loadedDetails[id].enabled = true + } + }) + + // 确定顺序 + validatedEnabled.forEach((id, index) => { + this.loadedDetails[id].sequence = index + 1 + }) + this.enabled = validatedEnabled + } + + register(server: Koa, router: Router) {} + + getDetail(id: string) { + return { ...this.loadedDetails[id].metadata } + } + + getDetails() { + return { ...this.loadedDetails } + } + + disable(id: string) { + const toDisable = this.loadedDetails[id] + if (toDisable.enabled) { + const dependents = Object.values(this.loadedDetails).filter(pack => + pack.enabled ? !!pack.metadata.dependencies[id] : false + ) + dependents.forEach(dep => this.disable(dep.metadata.id)) + } + toDisable.sequence = 0 + toDisable.enabled = false + this.enabled = this.enabled.filter(item => item !== id) + } + + disableAll() { + for (const id in this.loadedDetails) { + if (this.loadedDetails[id]) { + this.loadedDetails[id].enabled = false + this.loadedDetails[id].errors = [] + } + } + this.enabled = [] + } + + enable(id: string) { + this.loadedDetails[id].errors = [] + this.enabled.push(id) + this.enableFromConfig() + } + + enableAll() { + for (const id in this.loadedDetails) { + if (this.loadedDetails[id]) { + this.loadedDetails[id].enabled = true + this.loadedDetails[id].errors = [] + } + } + } + + clear() { + this.loadedMap = new Map() + this.loadedDetails = {} + this.enabled = [] + } + + save() { + fs.writeFileSync(this.configPath, JSON.stringify(this.enabled, null, 2), { + encoding: 'utf-8' + }) + } +} diff --git a/src/bin/main/mainLoader.ts b/src/bin/main/mainLoader.ts new file mode 100644 index 0000000..2ff622c --- /dev/null +++ b/src/bin/main/mainLoader.ts @@ -0,0 +1,179 @@ +import { ipcRenderer, screen as electronScreen } from 'electron' +import i18n from '../../i18n' +import Global from '../../manager/global' +import { MajsoulPlus } from '../../majsoul_plus' + +const userConfigs: MajsoulPlus.UserConfig = require(Global.UserConfigPath) + +const remoteDomains = [ + { id: 0, name: 'zh', domain: 'https://majsoul.union-game.com/0/' }, + { id: 1, name: 'jp', domain: 'https://game.mahjongsoul.com/' }, + { id: 2, name: 'en', domain: 'https://mahjongsoul.game.yo-star.com/' } +] + +const mainWindow: Electron.WebviewTag = document.querySelector('#mainWindow') +const mainWindowBox: HTMLDivElement = document.querySelector('#mainWindowBox') +const scalePercent = userConfigs.window.renderingMultiple + +let webContents: Electron.webContents +let clientRect: Electron.Rectangle + +let screenshotCounter = 0 +let screenshotTimer: NodeJS.Timeout +function showScreenshotLabel(src: string) { + const screenshotImage: HTMLImageElement = document.querySelector( + '#screenshotImage' + ) + const screenshotText: HTMLParagraphElement = document.querySelector( + '#screenshotText' + ) + const screenshotLabel: HTMLDivElement = document.querySelector( + '#screenshotLabel' + ) + screenshotImage.src = src + screenshotText.innerText = screenshotCounter++ + ? i18n.text.main.screenshotsSaved(screenshotCounter) + : i18n.text.main.screenshotSaved() + screenshotLabel.classList.remove('hide') + screenshotLabel.classList.add('show') + clearTimeout(screenshotTimer) + screenshotTimer = setTimeout(() => { + screenshotLabel.classList.remove('show') + clearTimeout(screenshotTimer) + screenshotTimer = setTimeout(() => { + screenshotLabel.classList.add('hide') + screenshotCounter = 0 + }, 300) + }, 8000) +} + +ipcRenderer.on('window-resize', (event, rect: Electron.Rectangle) => { + clientRect = rect +}) + +ipcRenderer.on('take-screenshot', () => { + if (webContents) { + // 回调函数 + const callbackFunction = (image: Electron.NativeImage) => { + ipcRenderer.send('take-screenshot', image.toPNG()) + } + const rect = clientRect + const display = electronScreen.getDisplayMatching({ + x: Math.floor(rect.x), + y: Math.floor(rect.y), + width: Math.floor(rect.width), + height: Math.floor(rect.height) + }) + webContents.capturePage( + { + x: 0, + y: 0, + width: Math.floor(mainWindow.clientWidth * display.scaleFactor), + height: Math.floor(mainWindow.clientHeight * display.scaleFactor) + }, + callbackFunction + ) + } +}) + +ipcRenderer.on( + 'screenshot-saved', + (event: Electron.Event, filePath: string) => { + showScreenshotLabel('file://' + filePath) + } +) + +ipcRenderer.on('open-devtools', () => { + if (webContents) { + mainWindow.openDevTools() + } +}) + +let serverInfo: { + url: string + port: number + http: boolean +} + +function isVanillaGameUrl(url: string) { + return ( + url.startsWith(remoteDomains[0].domain) || + url.startsWith(remoteDomains[1].domain) || + url.startsWith(remoteDomains[2].domain) + ) +} + +function isLocalHost(url: string) { + return url.match(/https?:\/\/localhost:/) +} + +function getLocalUrlWithParams(url: string) { + if (url.includes('?')) { + return `${serverInfo.url}${url.substring(url.indexOf('?'))}` + } + return serverInfo.url +} + +function redirectGameWindow(url: string, gameWindow: Electron.WebviewTag) { + const localUrl = getLocalUrlWithParams(url) + console.log('[Majsoul Plus] Redirect Target:' + localUrl) + gameWindow.loadURL(localUrl) +} + +function scaleWindow(percent = scalePercent) { + mainWindowBox.style.width = `${percent}vw` + mainWindowBox.style.height = `${percent}vh` + mainWindowBox.style.transform = `scale(${100 / percent}) translate(${(100 - + percent) / + 2}%, ${(100 - percent) / 2}%)` +} + +mainWindow.addEventListener('dom-ready', () => { + if (!webContents) { + webContents = mainWindow.getWebContents() + webContents.setZoomFactor(1) + ipcRenderer.send('main-loader-ready') + + webContents.on('will-navigate', (event, url) => { + if (isVanillaGameUrl(url)) { + event.preventDefault() + redirectGameWindow(url, mainWindow) + } + }) + + if (process.env.NODE_ENV === 'development') { + mainWindow.openDevTools() + } + } + + if (isLocalHost(mainWindow.src)) { + scaleWindow(scalePercent) + mainWindow.insertCSS('body{overflow:hidden;}') + } else { + scaleWindow(100) + } +}) + +ipcRenderer.on( + 'load-url', + (event: Electron.Event, url: string, port: number, http: boolean) => { + serverInfo = { url, port, http } + console.log('[Majsoul Plus] LoadURL', serverInfo) + + mainWindow.loadURL(url) + mainWindowBox.style.width = '100vw' + mainWindowBox.style.height = '100vh' + mainWindowBox.style.transform = 'none' + } +) + +ipcRenderer.on('get-local-storage', () => { + mainWindow.executeJavaScript( + 'Object.entries(localStorage)', + false, + result => { + console.log(result) + ipcRenderer.send('save-local-storage', result) + } + ) +}) diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..a476731 --- /dev/null +++ b/src/config.ts @@ -0,0 +1,86 @@ +import * as fs from 'fs' +import { Global } from './global' +import { MajsoulPlus } from './majsoul_plus' +import { fillObject } from './utils' + +/** + * 默认配置 + */ +const defaultWindowConfig: MajsoulPlus.UserWindowConfig = { + OSTheme: 'light', + gameWindowSize: '', + zoomFactor: 1, + renderingMultiple: 100, + isKioskModeOn: false, + isNoBorder: false, + isManagerHide: false +} + +const defaultUpdateConfig: MajsoulPlus.UserUpdateConfig = { + prerelease: false +} + +const defaultChromiumConfig: MajsoulPlus.UserChromiumConfig = { + isHardwareAccelerationDisable: false, + isInProcessGpuOn: true, + isIgnoreGpuBlacklist: false, + proxyUrl: '' +} + +const defaultUserDataConfig: MajsoulPlus.UserDataConfig = { + useHttpServer: false, + serverToPlay: 0 +} + +const defaultLocalStorageConfig: MajsoulPlus.UserLocalStorageConfig = { + zh: [], + jp: [], + en: [] +} + +const defaultConfig: MajsoulPlus.UserConfig = { + chromium: defaultChromiumConfig, + localStorage: defaultLocalStorageConfig, + update: defaultUpdateConfig, + userData: defaultUserDataConfig, + window: defaultWindowConfig +} + +/** + * 冻结对象使其不可更改 + */ +Object.freeze(defaultWindowConfig) +Object.freeze(defaultUpdateConfig) +Object.freeze(defaultChromiumConfig) +Object.freeze(defaultUserDataConfig) +Object.freeze(defaultLocalStorageConfig) +Object.freeze(defaultConfig) + +/** + * 加载配置文件 json + */ +export function LoadConfigJson(): MajsoulPlus.UserConfig { + let config: MajsoulPlus.UserConfig + if (!fs.existsSync(Global.UserConfigPath)) SaveConfigJson(defaultConfig) + try { + config = JSON.parse( + fs.readFileSync(Global.UserConfigPath, { + encoding: 'utf-8' + }) + ) + } catch (e) { + config = {} as MajsoulPlus.UserConfig + } + config = fillObject(config, defaultConfig) as MajsoulPlus.UserConfig + SaveConfigJson(config) + return config +} + +export function SaveConfigJson(config: MajsoulPlus.UserConfig) { + fs.writeFileSync(Global.UserConfigPath, JSON.stringify(config, null, 2), { + encoding: 'utf-8' + }) +} + +// tslint:disable-next-line +export const UserConfigs: MajsoulPlus.UserConfig = LoadConfigJson() diff --git a/src/extension/extension.ts b/src/extension/extension.ts new file mode 100644 index 0000000..0fd02d0 --- /dev/null +++ b/src/extension/extension.ts @@ -0,0 +1,31 @@ +import { ipcMain } from 'electron' +import { Global } from '../global' +import { getFoldersSync } from '../utils' +import manager from './manager' + +// tslint:disable-next-line +export let ExtensionManager: manager + +export function LoadExtension() { + // 初始化 manager + ExtensionManager = new manager(Global.ExtensionConfigPath) + + function load() { + // 加载配置 + ExtensionManager.loadEnabled() + + // 扫描目录 + const extension: string[] = getFoldersSync(Global.ExtensionFolderPath) + extension.forEach(extension => ExtensionManager.load(extension)) + ExtensionManager.enableFromConfig() + ExtensionManager.save() + } + + load() + + ipcMain.on('refresh-extension', (event: Electron.Event) => { + ExtensionManager.clear() + load() + event.returnValue = ExtensionManager.getDetails() + }) +} diff --git a/src/extension/manager.ts b/src/extension/manager.ts new file mode 100644 index 0000000..158f786 --- /dev/null +++ b/src/extension/manager.ts @@ -0,0 +1,194 @@ +import * as fs from 'fs' +import * as Koa from 'koa' +import * as Router from 'koa-router' +import * as path from 'path' +import BaseManager from '../BaseManager' +import { UserConfigs } from '../config' +import { appDataDir, GlobalPath, RemoteDomains } from '../global' +import { MajsoulPlus } from '../majsoul_plus' +import { fetchAnySite, getRemoteOrCachedFile } from '../utils' +import * as schema from './schema.json' +import { ResourcePackManager } from '../resourcepack/resourcepack' + +const defaultExtension: MajsoulPlus.Extension = { + id: 'majsoul_plus', + version: '2.0.0', + name: '未命名', + author: '未知作者', + description: '无描述', + preview: 'preview.png', + dependencies: {}, + + entry: 'script.js', + loadBeforeGame: false, + applyServer: [0, 1, 2], + resourcepack: [] +} + +Object.freeze(defaultExtension) + +export default class MajsoulPlusExtensionManager extends BaseManager { + private extensionScripts: Map = new Map() + private codejs = '' + + private useScriptPromises = [] + + constructor(configPath: string) { + super('extension', configPath, defaultExtension, schema) + } + + load(id: string) { + this.use(id, (pack: MajsoulPlus.Extension) => { + this.useScriptPromises.push(this.useScript(pack.id, pack)) + ResourcePackManager.loadExtensionPack(pack) + }) + } + + clear() { + super.clear() + ResourcePackManager.clearExtensionPack() + this.extensionScripts = new Map() + this.codejs = '' + this.useScriptPromises = [] + } + + addScript(id: string, script: string) { + const scripts = this.extensionScripts.get(id) || [] + scripts.push(script) + this.extensionScripts.set(id, scripts) + } + + async useScript(folder: string, extension: MajsoulPlus.Extension) { + if (!Array.isArray(extension.entry)) { + extension.entry = [extension.entry] + } + + const err = false + + const useScript = async (entry: string) => { + if (err) return + + // 加载远程脚本 远程脚本不缓存 + if (entry.match(/^https?:\/\//)) { + const script = await fetchAnySite(entry, 'utf-8') + this.addScript(extension.id, script) + } else { + // 本地脚本 + const p = path.resolve( + appDataDir, + GlobalPath.ExtensionDir, + folder, + entry + ) + if (!fs.existsSync(p)) { + console.error(`extension entry ${entry} not found!`) + return + } + + try { + const script = fs.readFileSync(p, { encoding: 'utf-8' }) + this.addScript(extension.id, script) + } catch (e) { + console.error( + `failed to load extension ${extension.name} from ${p}: ${e}` + ) + this.addScript( + extension.id, + `// failed to load extension ${extension.name} from ${p}: ${e}` + ) + } + } + } + + return Promise.all(extension.entry.map(useScript)) + } + + register(server: Koa, router: Router) { + server.use(async (ctx, next) => { + // 等待所有脚本加载完成 + await Promise.all(this.useScriptPromises) + + // 针对 code.js 进行特殊处理 注入扩展 + const originalUrl = ctx.request.originalUrl.replace(/^\/0\//g, '') + let prefix = '', + postfix = '' + if (path.basename(originalUrl) === 'code.js') { + if (this.codejs === '') { + const code = await getRemoteOrCachedFile( + ctx.request.originalUrl, + false, + data => + UserConfigs.userData.serverToPlay === 0 + ? Buffer.from( + data + .toString('utf-8') + .replace(/\.\.\/region\/region\.txt/g, 'region.txt') + ) + : data + ) + + // 设置 localStorage 供用户登录 + const loginScript = `// 注入登录脚本 +const userLocalStorage = JSON.parse('${JSON.stringify( + UserConfigs.localStorage[ + RemoteDomains[UserConfigs.userData.serverToPlay.toString()].name + ] + )}') +userLocalStorage.forEach(arr => localStorage.setItem(arr[0], arr[1])) +console.log('[Majsoul_Plus] 登录信息注入成功') +` + + Array.from(this.extensionScripts.entries()) + .filter(entry => this.loadedDetails[entry[0]].sequence > 0) + .sort( + (a, b) => + this.loadedDetails[a[0]].sequence - + this.loadedDetails[b[0]].sequence + ) + .forEach(entries => { + const id = entries[0], + scripts = entries[1] + + // 当未加载时跳出 + if (!this.loadedDetails[id].enabled) return + + const extension: MajsoulPlus.Extension = this.loadedDetails[id] + .metadata + if ( + extension.applyServer.includes( + UserConfigs.userData.serverToPlay + ) + ) { + const extCode = `/** + * Extension: ${extension.id} + * Author: ${extension.author} + * Version: ${extension.version} + */ +${scripts.join('\n')}\n\n` + if (extension.loadBeforeGame) { + prefix += extCode + } else { + postfix += extCode + } + } + }) + + this.codejs = + loginScript + + '\n\n\n' + + prefix + + '\n\n\n' + + '// code.js\n' + + code.data.toString('utf-8') + + '\n\n\n' + + postfix + } + + ctx.res.statusCode = 200 + ctx.body = this.codejs + } else { + await next() + } + }) + } +} diff --git a/src/extension/schema.json b/src/extension/schema.json new file mode 100644 index 0000000..f66b4de --- /dev/null +++ b/src/extension/schema.json @@ -0,0 +1,86 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "extension", + "description": "MajsoulPlus Extension describe file schema", + "type": "object", + "properties": { + "id": { + "type": "string", + "pattern": "^[_a-zA-Z0-9]+$" + }, + "version": { + "type": "string" + }, + "name": { + "type": "string" + }, + "author": { + "type": ["string", "array"], + "items": { + "type": "string" + } + }, + "description": { + "type": "string" + }, + "preview": { + "type": "string" + }, + "dependencies": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "string" + } + } + }, + "entry": { + "type": ["string", "array"], + "pattern": "^(.+)\\.js$", + "items": { + "type": "string", + "pattern": "^(.+)\\.js$" + } + }, + "loadBeforeGame": { + "type": "boolean" + }, + "applyServer": { + "type": "array", + "items": { + "type": "number" + } + }, + "resourcepack": { + "type": "array", + "items": { + "oneOf": [ + { "type": "string" }, + { + "type": "object", + "properties": { + "from": { + "oneOf": [ + { "type": "string" }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "to": { + "type": "string" + }, + "all-servers": { + "type": "boolean" + } + } + } + ] + } + } + }, + "required": ["id", "version"] +} diff --git a/src/global.ts b/src/global.ts new file mode 100644 index 0000000..95ae7bf --- /dev/null +++ b/src/global.ts @@ -0,0 +1,150 @@ +import { app } from 'electron' +import * as fs from 'fs' +import * as os from 'os' +import * as path from 'path' +import { ConsoleLogger } from './logger' +import { MajsoulPlus } from './majsoul_plus' + +// tslint:disable-next-line +export const Logger = new ConsoleLogger('Majsoul_Plus') + +/** + * 应用保存数据的路径 + */ +export const appDataDir: string = ((): string => { + const localData = path.resolve( + process.env.NODE_ENV === 'development' + ? path.resolve(__dirname, '..') + : path.resolve(app.getAppPath(), '../..'), + 'data' + ) + const appData = app.getPath('userData') + if (fs.existsSync(localData) && fs.statSync(localData).isDirectory()) { + return localData + } else { + if (!fs.existsSync(appData)) { + fs.mkdirSync(appData) + } + return appData + } +})() + +// 应用图标 +export const appIcon: string = (() => { + switch (os.platform()) { + case 'win32': + return path.join(__dirname, 'bin', 'icons/icon.ico') + case 'darwin': + return path.join(__dirname, 'bin', 'icons/icon.icns') + default: + return path.join(__dirname, 'bin', 'icons/icon.png') + } +})() + +// tslint:disable-next-line +export const GlobalPath: MajsoulPlus.GlobalPath = { + LocalDir: '/static', + ResourcePackDir: 'resourcepack', + ExtensionDir: 'extension', + ToolsDir: 'tool' +} + +// tslint:disable-next-line +export const RemoteDomains = [ + { id: 0, name: 'zh', domain: 'https://majsoul.union-game.com/0/' }, + { id: 1, name: 'jp', domain: 'https://game.mahjongsoul.com/' }, + { id: 2, name: 'en', domain: 'https://mahjongsoul.game.yo-star.com/' } +] + +// tslint:disable-next-line +export const Global: MajsoulPlus.Global = { + version: app.getVersion(), + ServerPort: 8887, + XOR_KEY: 73, + EXTEND_RES_KEYWORD: 'extendRes', + ResourcePackConfigPath: '', + ExtensionConfigPath: '', + ToolConfigPath: '', + UserConfigPath: path.join(appDataDir, 'configs-user.json'), + LocalCachePath: path.join(appDataDir, GlobalPath.LocalDir), + ResourceFolderPath: path.join(appDataDir, GlobalPath.ResourcePackDir), + ExtensionFolderPath: path.join(appDataDir, GlobalPath.ExtensionDir), + ToolFolderPath: path.join(appDataDir, GlobalPath.ToolsDir), + + GameWindowConfig: { + width: 1280 + 16, + height: 720 + 39, + frame: true, + resizable: true, + backgroundColor: '#000000', + webPreferences: { + // webSecurity: false + // nodeIntegration: false + // plugins: true + }, + autoHideMenuBar: true, + // useContentSize: true, + icon: appIcon, + show: true, + enableLargerThanScreen: true + }, + ManagerWindowConfig: { + width: 1280, // + 16, + height: 720, // + 39, + frame: false, + resizable: false, + backgroundColor: '#FFFFFF', + webPreferences: { + webSecurity: false + // allowRunningInsecureContent: true + }, + title: '雀魂Plus', + autoHideMenuBar: true, + icon: appIcon, + maximizable: false, + fullscreenable: false, + show: false + }, + ToolWindowConfig: { + width: 960, // + 16, + height: 540, // + 39, + frame: true, + resizable: false, + backgroundColor: '#FFFFFF', + webPreferences: { + webSecurity: false, + allowRunningInsecureContent: true + }, + autoHideMenuBar: true, + icon: appIcon, + maximizable: false, + fullscreenable: false, + useContentSize: true + }, + HttpGetUserAgent: `Mozilla/5.0 (${os.type()} ${os.release()}; ${os.arch()}) MajsoulPlus/${app.getVersion()} Chrome/${ + process.versions.chrome + }` +} + +export function InitGlobal() { + [ + Global.ResourcePackConfigPath, + Global.ExtensionConfigPath, + Global.ToolConfigPath + ] = [ + GlobalPath.ResourcePackDir, + GlobalPath.ExtensionDir, + GlobalPath.ToolsDir + ].map(dir => { + const folder = path.join(appDataDir, dir) + // 通过 require 避免在 renderer 中引入 utils + // utils 存在只能在主进程调用的方法 + if (!fs.existsSync(folder) && app) { + require('./utils').copyFolderSync( + path.join(__dirname, 'bin', dir), + appDataDir + ) + } + return path.join(folder, 'active.json') + }) +} diff --git a/src/i18n.ts b/src/i18n.ts new file mode 100644 index 0000000..a755fb6 --- /dev/null +++ b/src/i18n.ts @@ -0,0 +1,453 @@ +import * as fs from 'fs' +import * as path from 'path' +import * as CSV from 'comma-separated-values' +import { app, remote } from 'electron' + +/** + * 本地化,单条语句翻译对象 + * @param params 格式化参数,会自动替换文本中的 $1、$2 + */ +declare function Locale( + /** + * 若干个字符串,依次填充到 $1、$2 + */ + ...params: string[] +): string + +interface Locale { + /** + * 格式化该键对应的翻译文本并返回 + */ + ( + /** + * 若干个字符串,依次填充到 $1、$2 + */ + ...params: string[] + ): string + + /** + * 绑定该条翻译到指定DOM元素的 innerText + * @param htmlElement 要绑定的 HTMLElement 元素 + * @param params 格式化参数,会自动替换文本中的 $1、$2 + */ + renderAsText( + /** + * 必须是标准的 HTMLElement DOM 元素 + */ + htmlElement: HTMLElement, + /** + * 若干个字符串,依次填充到 $1、$2 + */ + ...params: string[] + ): void + /** + * 绑定该条翻译到指定DOM元素的 innerHTML + * @param htmlElement 要绑定的 HTMLElement 元素 + * @param params 格式化参数,会自动替换文本中的 $1、$2 + */ + renderAsHTML( + /** + * 必须是标准的 HTMLElement DOM 元素 + */ + htmlElement: HTMLElement, + /** + * 若干个字符串,依次填充到 $1、$2 + */ + ...params: string[] + ): void + + // [key: string]: string; +} + +interface StringPack { + [key: string]: string | StringPack +} + +interface BindElement { + locale: Locale + htmlElement: HTMLElement + type: 'text' | 'html' + args: string[] +} + +interface I18nInitConfig { + /** + * 翻译文件所在的文件夹路径 + */ + directory?: string + /** + * 语言偏好列表,越靠前越优先 + */ + actives?: string[] + /** + * 在找不到翻译文本时的默认语言 + */ + defaultLocale?: string + /** + * 是否监听文件修改,以自动更新翻译 + */ + autoReload?: boolean +} + +/** + * 自动地判断并读取一个js或者是json + * @param filePath Path + */ +function readLangFile(filePath: string): StringPack { + switch (path.extname(filePath)) { + case '.js': + delete require.cache[filePath] + return require(filePath) + case '.json': + return JSON.parse(fs.readFileSync(filePath, { encoding: 'utf-8' })) + case '.csv': + const csv: string[][] = CSV.parse(fs.readFileSync(filePath).toString(), { + cast: false + }) + const localeObj: StringPack = {} + csv.forEach((line: string[]) => { + localeObj[line[0]] = line[2] + }) + return localeObj + default: + return {} + } +} + +/** + * 读取一个文件夹以及内部所有类JSON文件 + * @param dirPath Path + * @returns + * { + * 'filename': { + * 'key': 'value' + * } + * } + */ +function readLangDir(dirPath: string): StringPack { + const lang = {} + const files = fs.readdirSync(dirPath) + const filesPath = files.map(fileName => { + return path.join(dirPath, fileName) + }) + filesPath.forEach((filePath, index) => { + const stat = fs.statSync(filePath) + if (stat.isDirectory()) { + lang[files[index]] = readLangDir(filePath) + } else { + const fileName = files[index] + lang[path.basename(fileName, path.extname(fileName))] = readLangFile( + filePath + ) + } + }) + return lang +} + +export interface I18nConstructor { + directory?: string + actives?: string[] + defaultLocale?: string + autoReload?: boolean +} + +class I18n { + /** + * 获取翻译文本 + */ + get text() { + return this.pText + } + get t() { + return this.text + } + get _() { + return this.text + } + + /** + * 已经加载的翻译文本 + */ + get locals() { + return this.pLocals + } + + /** + * 活动的语言列表的拷贝 + */ + get actives(): string[] { + const copy = this.pActives.concat() + copy.pop() + return copy + } + + set actives(localTags: string[]) { + this.pActives = localTags.concat(this.defaultLocale) + this._updateLocales() + } + + defaultLocale: string + private pActives + private pLocals: StringPack + private pBindElementList: BindElement[] + private pText + + constructor(arg: I18nConstructor) { + const { + directory = path.join(__dirname, 'i18n'), + actives = [], + defaultLocale = 'en-US', + autoReload = false + } = arg + // 如果文件夹参数不是文件夹,报错 + if (!fs.statSync(directory).isDirectory) { + throw new Error('param directory is not a directory') + } + + // 如果文件夹为空,报错 + if (!fs.readdirSync(directory)) { + throw new Error('directory is empty, please make sure there is any files') + } + + // 读取所有翻译文本 + this.pLocals = readLangDir(directory) + // 设置一个绑定列表 + this.pBindElementList = [] + // 当优先语言全部不存在,则加载该默认语言 + this.defaultLocale = defaultLocale + // 设置活动的语言列表 + this.actives = actives + ;(() => { + /** + * 格式化模板字符串 + * @param str + * @param args + */ + const formatString = (str: string, ...args: string[]) => { + for (const index in args) { + if (args[index]) { + str = str.replace(`$${index}`, args[index]) + } + } + return str + } + /** + * 创建一个被包装过的Object + * @param chainsArray 调用链 + */ + const createProxy = (chainsArray: string[]) => { + return new Proxy( + (() => { + const f = (...args: string[]) => { + // TODO: Replace it with for ... of + for (let i = 0; i < this.pActives.length; i++) { + let localeObj = this.locals[this.pActives[i]] + if (!localeObj) { + continue + } + for (let j = 0; j < f._chains.length; j++) { + localeObj = localeObj[f._chains[j]] + if (!localeObj) { + break + } else if (j === f._chains.length - 1) { + return formatString(localeObj as string, ...args) + } + } + } + return 'MissingText' + } + f._chains = chainsArray + f.renderAsText = (htmlElement: HTMLElement, ...args: string[]) => { + this.bindElementText(f, htmlElement, ...args) + } + f.renderAsHTML = (htmlElement: HTMLElement, ...args: string[]) => { + this.bindElementHTML(f, htmlElement, ...args) + } + f.toString = () => f.call(this) + return f + })(), + { + get: (target, key) => { + if (!target[key]) { + target[key] = createProxy(target._chains.concat(key.toString())) + } + return target[key] + } + } + ) + } + this.pText = new Proxy( + {}, + { + get: (target, key) => { + const arr: string[] = [] + return createProxy(arr.concat(key as string)) + } + } + ) + })() + + // 如果设置了自动更新翻译 + if (autoReload) { + const calledList: string[] = [] + const recursiveDir = (filePath, callback) => { + fs.stat(filePath, (error, stat) => { + if (error) { + throw error + } + if (stat.isDirectory()) { + if (!calledList.includes(filePath)) { + callback.call(this, filePath) + calledList.push(filePath) + } + fs.readdir(filePath, (err, files) => { + if (err) { + throw err + } + files.forEach(file => { + recursiveDir(path.join(filePath, file), callback) + }) + }) + } + }) + } + const dirWatcher = (dirPath: string) => { + fs.watch(dirPath, eventType => { + if (eventType === 'change') { + // 重新载入所有翻译文本 + this.pLocals = readLangDir(directory) + // 如果出现新文件夹,自动监听 + recursiveDir(dirPath, dirWatcher) + // 更新绑定的翻译 + this._updateLocales() + } + }) + } + recursiveDir(directory, dirWatcher) + } + } + + /** + * 解绑指定DOM元素的所有绑定 + * @param Element Element + */ + unbindElement(htmlElement: Element) { + // FIXME: 完成该函数 + // htmlElementTest 是假的 + // this._bindElementList = this._bindElementList.filter( + // ({ htmlElementTest }) => { + // return htmlElementTest !== htmlElement; + // } + // ); + } + + /** + * 绑定一条翻译到指定DOM元素的 innerText + * @param locale 一个locale函数对象 + * @param htmlElement HTMLElement + * @param args locale参数 + */ + bindElementText(locale: Locale, htmlElement: HTMLElement, ...args: string[]) { + return this._bindElement(locale, htmlElement, 'text', ...args) + } + + /** + * 绑定一条翻译到指定DOM元素的 innerHTML + * @param locale 一个locale函数对象 + * @param htmlElement HTMLElement + * @param args locale参数 + */ + bindElementHTML(locale: Locale, htmlElement: HTMLElement, ...args: string[]) { + return this._bindElement(locale, htmlElement, 'html', ...args) + } + + /** + * 根据 dataset.i18n 绑定翻译到DOM元素树 Text + * @param htmlElement HTMLElement + */ + parseAllElementsText(htmlElement: HTMLElement) { + return this._parseAllElements(htmlElement, 'text') + } + + /** + * 根据 dataset.i18n 绑定翻译到DOM元素树 HTML + * @param htmlElement HTMLElement + */ + parseAllElementsHTML(htmlElement: HTMLElement) { + return this._parseAllElements(htmlElement, 'html') + } + + /** + * 更新所有绑定翻译的内容 + */ + private _updateLocales() { + this.pBindElementList.forEach(({ locale, htmlElement, type, args }) => { + const text = locale(...args) + if (type === 'text') { + htmlElement.innerText = text + } else { + // 'html' + htmlElement.innerHTML = text + } + }) + } + + /** + * 绑定一条翻译到指定DOM元素 + * @param locale 一个locale函数对象 + * @param htmlElement HTMLElement + * @param type 绑定到的类型 + * @param args locale参数 + */ + private _bindElement( + locale: Locale, + htmlElement: HTMLElement, + type: 'text' | 'html', + ...args: string[] + ) { + this.pBindElementList.push({ + locale, + htmlElement, + type, + args + }) + this._updateLocales() + } + + /** + * 根据 dataset.i18n 绑定翻译到DOM元素树 + * @param htmlElement HTMLElement + * @param type 绑定到的类型 + * @param args locale参数 + */ + private _parseAllElements( + htmlElement: HTMLElement, + type: 'text' | 'html', + ...args: string[] + ) { + /** + * 渲染翻译 + * @param element + */ + const renderElement = (element: HTMLElement) => { + const i18nLocaleKeyChain = element.dataset.i18n.split('.') + const i18nLocaleElement = (() => { + let selectedElement = this.text + i18nLocaleKeyChain.forEach(i18nLocaleKey => { + selectedElement = selectedElement[i18nLocaleKey] + }) + return selectedElement + })() + this._bindElement(i18nLocaleElement, element, type, ...args) + } + if (htmlElement.getAttribute('data-i18n')) { + renderElement(htmlElement) + } + htmlElement.querySelectorAll('[data-i18n]').forEach(renderElement) + } +} + +export default new I18n({ + autoReload: process.env.NODE_ENV === 'development', + actives: [(app || remote.app).getLocale()] +}) diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..7823119 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,147 @@ +import { app, ipcMain } from 'electron' +import * as os from 'os' +import { UserConfigs } from './config' +import { LoadExtension } from './extension/extension' +import { Global, InitGlobal } from './global' +import { LoadResourcePack } from './resourcepack/resourcepack' +import { httpServer, httpsServer, LoadServer } from './server' +import { LoadTool } from './tool/tool' +import bossKey from './utilities/bossKey' +import sandbox from './utilities/sandbox' +import screenshot from './utilities/screenshot' +import { initGameWindow } from './windows/game' +import { initManagerWindow, ManagerWindow } from './windows/manager' +import { initToolManager } from './windows/tool' + +// 初始化全局变量 +InitGlobal() + +// 加载资源包 +LoadResourcePack() + +// 加载扩展 +LoadExtension() + +// 加载工具 +LoadTool() + +// 代理设置 +if (UserConfigs.chromium.proxyUrl !== '') { + app.commandLine.appendSwitch('proxy-server', UserConfigs.chromium.proxyUrl) +} + +// 禁用/启用进程内 GPU 处理 +if (UserConfigs.chromium.isInProcessGpuOn) { + const osplatform = os.platform() + switch (osplatform) { + case 'darwin': + case 'win32': + app.commandLine.appendSwitch('in-process-gpu') + break + case 'aix': + case 'android': + case 'cygwin': + case 'freebsd': + case 'openbsd': + case 'sunos': + default: + break + } +} + +// 忽略 GPU 黑名单 +if (UserConfigs.chromium.isIgnoreGpuBlacklist) { + app.commandLine.appendArgument('ignore-gpu-blacklist') +} + +// 禁用 / 启用 硬件加速 +if (UserConfigs.chromium.isHardwareAccelerationDisable) { + app.disableHardwareAcceleration() +} + +// Disable certificate validation TLS connections +process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0' + +// 忽略证书错误 +// app.commandLine.appendSwitch('ignore-certificate-errors') + +// 允许自动播放音视频 +app.commandLine.appendSwitch('autoplay-policy', 'no-user-gesture-required') + +// 当全部窗口退出后,结束进程 +app.on('window-all-closed', app.quit) + +// 阻止证书验证 +app.on( + 'certificate-error', + (event, webContents, url, error, certificate, callback) => { + if ( + certificate.fingerprint === + // 祖传本地证书 + 'sha256/UMNIGcBbbIcru/0L2e1idl+aQS7PUHqsZDcrETqdMsc=' + ) { + event.preventDefault() + callback(true) + } else { + callback(false) + } + } +) + +app.on('ready', () => { + // 资源管理器通知启动游戏 + ipcMain.on('start-game', () => { + // 加载服务器路由规则 + LoadServer() + + // 初始化本地镜像服务器,当端口被占用时会随机占用另一个端口 + if (UserConfigs.userData.useHttpServer) { + httpServer.listen(Global.ServerPort) + httpServer.on('error', err => { + // TODO: 验证 http 端口冲突时的提示信息是否是下面的内容 + if (err.name === 'EADDRINUSE') { + httpServer.close() + // 随机监听一个空闲端口 + httpServer.listen(0) + } + }) + } else { + httpsServer.listen(Global.ServerPort) + httpsServer.on('error', err => { + if (err.code === 'EADDRINUSE') { + httpsServer.close() + // 随机监听一个空闲端口 + httpsServer.listen(0) + } + }) + } + + // 初始化游戏窗口 + initGameWindow() + + // 根据设置决定销毁 / 隐藏 Manager 窗口 + if (UserConfigs.window.isManagerHide) { + ManagerWindow.hide() + } else { + ManagerWindow.close() + } + }) + + bossKey.register() // 注册老板键功能 + screenshot.register() // 注册截图功能 + sandbox.register() // 注册工具窗口的沙盒功能 + + // 初始化扩展资源管理器窗口 + initManagerWindow() + initToolManager() +}) + +// 监听 GPU 进程崩溃事件 +app.on('gpu-process-crashed', (event, killed) => { + console.error(`gpu-process-crashed: ${killed}`) +}) + +// uncaught exception +process.on('uncaughtException', err => { + console.error(err) +}) diff --git a/src/logger.ts b/src/logger.ts new file mode 100644 index 0000000..21f793a --- /dev/null +++ b/src/logger.ts @@ -0,0 +1,71 @@ +/** + * https://github.com/Yesterday17/node-kara-templater/blob/master/src/utils/log.ts + * + * MIT License + * Copyright (c) 2019 Yesterday17 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import chalk from 'chalk' + +abstract class Logger { + protected logMain: string + constructor(name: string) { + this.logMain = name + } + abstract debug(message: string): void + abstract info(message: string): void + abstract warning(message: string): void + abstract error(message: string, exit: boolean): void + abstract success(message: string): void +} + +export class ConsoleLogger extends Logger { + constructor(name: string) { + super(name) + } + + debug(message: string) { + if (process.env.NODE_ENV === 'development') { + console.log(chalk.gray(`[${this.logMain}][DEBUG] ${message}`)) + } + } + + info(message: string) { + console.info(chalk.white(`[${this.logMain}][INFO] ${message}`)) + } + + warning(message: string) { + console.warn(chalk.yellow(`[${this.logMain}][WARN] ${message}`)) + } + + error(message: string, exit = false) { + console.info(chalk.red(`[${this.logMain}][ERROR] ${message}`)) + if (exit) { + process.exit() + } + } + + success(message: string) { + console.log(chalk.green(`[${this.logMain}][SUCCESS] ${message}`)) + } +} + +export default Logger diff --git a/src/majsoul_plus.d.ts b/src/majsoul_plus.d.ts new file mode 100644 index 0000000..048f188 --- /dev/null +++ b/src/majsoul_plus.d.ts @@ -0,0 +1,132 @@ +import { BrowserWindowConstructorOptions } from 'electron' + +declare namespace MajsoulPlus { + /** + * Config + */ + export interface UserWindowConfig { + OSTheme: 'light' | 'dark' + gameWindowSize: string + zoomFactor: number + renderingMultiple: number + isKioskModeOn: boolean + isNoBorder: boolean + isManagerHide: boolean + } + + export interface UserUpdateConfig { + prerelease: boolean + } + + export interface UserChromiumConfig { + isHardwareAccelerationDisable: boolean + isInProcessGpuOn: boolean + isIgnoreGpuBlacklist: boolean + proxyUrl: string + } + + export interface UserDataConfig { + useHttpServer: boolean + serverToPlay: number + } + + export interface UserConfig { + window: UserWindowConfig + update: UserUpdateConfig + chromium: UserChromiumConfig + userData: UserDataConfig + localStorage: UserLocalStorageConfig + } + + export interface UserLocalStorageConfig { + zh: string[][] + jp: string[][] + en: string[][] + } + + /** + * Global + */ + export interface Global { + version: string + ServerPort: number + XOR_KEY: number + EXTEND_RES_KEYWORD: string + ResourcePackConfigPath: string + ExtensionConfigPath: string + ToolConfigPath: string + UserConfigPath: string + LocalCachePath: string + ResourceFolderPath: string + ExtensionFolderPath: string + ToolFolderPath: string + + GameWindowConfig: BrowserWindowConstructorOptions + ManagerWindowConfig: BrowserWindowConstructorOptions + ToolWindowConfig: BrowserWindowConstructorOptions + HttpGetUserAgent: string + } + + export interface WindowWebPreferenceConfig { + webSecurity: boolean + allowRunningInsecureContent?: boolean + nodeIntegration?: boolean + plugins?: boolean + } + + export interface GlobalPath { + LocalDir: string + ResourcePackDir: string + ExtensionDir: string + ToolsDir: string + } + + /** + * Common Metadata + */ + export interface Metadata { + id: string + version: string + name?: string + author?: string | string[] + description?: string + preview?: string + dependencies?: { [key: string]: string } + } + + /** + * 资源包(Resource Pack) + */ + export interface ResourcePack extends Metadata { + replace: Array + } + + export interface ResourcePackReplaceEntry { + from: string | string[] + to: string + 'all-servers': boolean + } + + /** + * 扩展(Extension) + */ + export interface Extension extends Metadata { + entry?: string | string[] + loadBeforeGame?: boolean + applyServer?: number[] + resourcepack?: Array + } + + /** + * 工具(Tools) + */ + export interface ToolConfig extends Metadata { + index?: string + windowOptions: BrowserWindowConstructorOptions + } + + export interface WindowStatus { + visible: boolean + muted: boolean + } +} diff --git a/src/manager/extra/darkMode/main.ts b/src/manager/extra/darkMode/main.ts new file mode 100644 index 0000000..4106296 --- /dev/null +++ b/src/manager/extra/darkMode/main.ts @@ -0,0 +1,26 @@ +import { remote } from 'electron' +import { MajsoulPlus } from '../../../majsoul_plus' + +function changeTheme(mode: string) { + const extraCss = document.querySelector('#extraCss') + if (mode === 'dark') { + extraCss['href'] = './extra/darkMode/style.css' + } +} + +export default function darkMode(userConfig: MajsoulPlus.UserConfig) { + if (process.platform === 'darwin') { + const { systemPreferences } = remote + + const setOSTheme = () => { + changeTheme(systemPreferences.isDarkMode() ? 'dark' : 'light') + } + + systemPreferences.subscribeLocalNotification( + 'AppleInterfaceThemeChangeNotification', + setOSTheme + ) + } else { + changeTheme(userConfig.window.OSTheme) + } +} diff --git a/src/manager/extra/springFestivalTheme/main.ts b/src/manager/extra/springFestivalTheme/main.ts new file mode 100644 index 0000000..a8b6bad --- /dev/null +++ b/src/manager/extra/springFestivalTheme/main.ts @@ -0,0 +1,15 @@ +function isSpringFestival() { + const start = new Date('2019-02-03 00:00:00') + const end = new Date('2019-02-13 00:00:00') + const now = new Date() + return now < end && now > start +} + +export default function springFestivalExtend() { + const extraCss = document.querySelector('#extraCss') + setTimeout(() => { + if (isSpringFestival()) { + extraCss['href'] = './extra/springFestivalTheme/style.css' + } + }, 0) +} diff --git a/src/manager/global.ts b/src/manager/global.ts new file mode 100644 index 0000000..d4dea75 --- /dev/null +++ b/src/manager/global.ts @@ -0,0 +1,19 @@ +import * as path from 'path' +import { ipcRenderer } from 'electron' + +export default { + appDataDir: ipcRenderer.sendSync('sandbox-appdata-request'), + UserConfigPath: path.join( + ipcRenderer.sendSync('sandbox-appdata-request'), + 'configs-user.json' + ), + ResourcePackDir: path.join( + ipcRenderer.sendSync('sandbox-appdata-request'), + 'resourcepack' + ), + ExtensionDir: path.join( + ipcRenderer.sendSync('sandbox-appdata-request'), + 'extension' + ), + ToolsDir: path.join(ipcRenderer.sendSync('sandbox-appdata-request'), 'tool') +} diff --git a/src/manager/main.ts b/src/manager/main.ts new file mode 100644 index 0000000..f730914 --- /dev/null +++ b/src/manager/main.ts @@ -0,0 +1,197 @@ +import * as path from 'path' +import * as os from 'os' +import Ping from './utils/Ping' +import i18n from '../i18n' +import Global from './global' + +import Update from './ui/Update' +import LeftPanel from './ui/Panel' +import ResourcePacks from './pages/ResourcePacks' +import Extensions from './pages/Extensions' +import Tools from './pages/Tools' +import Setting from './pages/Setting' +import About from './pages/About' + +import darkModeTheme from './extra/darkMode/main' +import springFestivalTheme from './extra/springFestivalTheme/main' +import { ipcRenderer, remote } from 'electron' + +class ResourceManager { + private static userConfig = Setting.userConfig + private static readonly extends: Function[] = [] + + private static readonly resourcepackRootDir = path.join( + Global.appDataDir, + Global.ResourcePackDir + ) + private static readonly extensionRootDir = path.join( + Global.appDataDir, + Global.ExtensionDir + ) + private static readonly toolRootDir = path.join( + Global.appDataDir, + Global.ToolsDir + ) + + // 增加扩展样式 + static extend(theme: Function) { + ResourceManager.extends.push(theme) + return ResourceManager + } + + static init() { + Update.setUsePrerelease( + ResourceManager.userConfig.update.prerelease + ).checkUpdate() + + LeftPanel.init() + Setting.init() + ResourceManager.initRPC() + ResourceManager.loadCards() + ResourceManager.addEventListener() + ResourceManager.runExtends() + About.render() + i18n.parseAllElementsText(document.documentElement) + Ping.setServer(ResourceManager.userConfig.userData.serverToPlay).init() + } + + // 注册与主进程通讯的内容 + private static initRPC() { + ipcRenderer.on( + 'change-config-game-window-size', + (event: Electron.Event, gameWindowSize: string) => { + ResourceManager.userConfig.window.gameWindowSize = gameWindowSize + } + ) + + ipcRenderer.on('save-config', () => { + ResourceManager.saveSettings() + ipcRenderer.send('close-manager') + }) + } + + // 加载 Card 资源 + private static loadCards() { + ResourcePacks.load() + Extensions.load() + Tools.load() + } + + private static refreshCard(type: string) { + return () => + [ResourcePacks, Extensions, Tools] + .filter(t => t.name === type)[0] + .refresh() + } + + private static addEventListener() { + [ResourcePacks, Extensions, Tools].forEach(ext => { + // 导入 + const importMSP = document.querySelector(`#install${ext.name}`) + importMSP.addEventListener('click', ResourceManager.importMSP(ext.name)) + + // 修改 + const changeEditable = document.querySelector(`#edit${ext.name}`) + changeEditable.addEventListener( + 'click', + ResourceManager.changeEditable(ext.name) + ) + + // 刷新 + const refresh = document.querySelector(`#refresh${ext.name}`) + refresh.addEventListener('click', ResourceManager.refreshCard(ext.name)) + }) + + window.addEventListener('blur', () => document.body.classList.add('blur')) + window.addEventListener('focus', () => + document.body.classList.remove('blur') + ) + + // 启动游戏 + const launch = document.querySelector('#launch') + launch.addEventListener('click', ResourceManager.gameStart) + + // 关闭 Manager + const closeBtn = document.querySelector('#closeBtn') + if (os.platform() === 'darwin') { + closeBtn.className = 'close-btn darwin' + // hack close bar + const body = document.querySelector('body') + body.classList.add('darwin') + const closeButton = document.querySelector('body > .close-btn.darwin') + body.removeChild(closeButton) + } + closeBtn.addEventListener('click', window.close) + } + + // 加载扩展 Manager 主题 + private static runExtends() { + ResourceManager.extends.forEach(theme => theme(ResourceManager.userConfig)) + } + + // 游戏启动 + private static gameStart() { + ResourceManager.saveSettings() + ipcRenderer.send('start-game') + } + + // 保存设置 + private static saveSettings() { + Setting.save() + ResourcePacks.save() + Extensions.save() + Tools.save() + } + + // 从 MSP* 导入资源包 / 扩展 / 工具 + private static importMSP(type: string) { + return () => { + remote.dialog.showOpenDialog( + { + title: i18n.text.manager.installFrom(), + filters: [ + { + name: i18n.text.manager.fileTypeMSPM(), + extensions: ['mspm'] + }, + { + name: i18n.text.manager.fileTypeMSPE(), + extensions: ['mspe'] + }, + { + name: i18n.text.manager.fileTypeMSPT(), + extensions: ['mspt'] + } + ].filter( + ext => + ext.extensions[0] === + { + ResourcePack: 'mspm', + Extension: 'mspe', + Tool: 'mspt' + }[type] + ), + properties: ['openFile', 'multiSelections'] + }, + files => { + (files || []).forEach(file => { + ipcRenderer.sendSync(`import-${type.toLowerCase()}`, file) + }) + ResourceManager.refreshCard(type)() + } + ) + } + } + + // 修改 Editable + private static changeEditable(type: string) { + return () => + [ResourcePacks, Extensions, Tools] + .filter(t => t.name === type)[0] + .changeEditable() + } +} + +ResourceManager.extend(darkModeTheme) + .extend(springFestivalTheme) + .init() diff --git a/src/manager/majsoul_plus_manager.d.ts b/src/manager/majsoul_plus_manager.d.ts new file mode 100644 index 0000000..f7227b3 --- /dev/null +++ b/src/manager/majsoul_plus_manager.d.ts @@ -0,0 +1,61 @@ +declare namespace MajsoulPlus_Manager { + export interface GetDetailMetadataResponse { + [id: string]: CardMetadataWithEnable + } + + export interface CardMetadata { + type: string + id: string + version: string + name?: string + author?: string | string[] + description?: string + preview?: string + } + + export interface CardMetadataWithEnable { + enabled: boolean + sequence: number + errors: Array + metadata: CardMetadata + } + + // 导出包的信息 + export interface ExportInfo { + extend: string + typeText: string + } + + /** + * Majsoul JSON + */ + export interface VersionJson { + code: string + version: string + } + + export interface ResVersionJson { + [key: string]: { + prefix: string + } + } + + export interface ConfigJson { + ip: ConfigJsonItem[] + goods_sheleve_id: string + } + + export interface ConfigJsonItem { + name: string + region_urls: RegionUrls + } + + export interface RegionUrls { + ['mainland']: string + ['hk']: string + } + + export interface ServerListJson { + servers: string[] + } +} diff --git a/src/manager/pages/About.ts b/src/manager/pages/About.ts new file mode 100644 index 0000000..2349e46 --- /dev/null +++ b/src/manager/pages/About.ts @@ -0,0 +1,78 @@ +import { ipcRenderer, remote, shell } from 'electron' +import i18n from '../../i18n' +const { app } = remote + +class AboutPage { + render = () => { + const aboutInner = document.querySelector('#aboutInner') + aboutInner.innerHTML = '' + this.addToUsers() + this.addGitHubLink() + } + + private addBlock = ({ title, value }) => { + const aboutInner = document.querySelector('#aboutInner') + const h3 = document.createElement('h3') + const info = document.createElement('p') + if (typeof value === 'string') { + h3.innerText = title + info.innerText = value + aboutInner.append(h3) + aboutInner.append(info) + } else { + h3.innerText = title + aboutInner.append(h3) + aboutInner.append(value) + } + } + + private addToUsers = () => { + const title = '致用户' + const value = + '  感谢您正在阅读这段文字,我是《雀魂 Plus》开发者之一:Handle。首先,感谢您信赖并使用《雀魂 Plus》,这是我第一个破 10 Star 的项目,同时也是我倾注了大量心血的作品,对于其意外登上一些论坛的置顶,我感到兴奋,但同时更多的是震惊。\n\n' + + '  相信您和我一样是喜欢着《雀魂》这款游戏才能让您读到这段文字,同样,也相信您了解一款游戏的生存无非能否长期稳定地盈利,《雀魂 Plus》提供的功能最初只是为了方便修改桌布和音乐,但目前的发展情况,但很明显,《雀魂 Plus》的传播已经明显超出了可控范围。试想,如果您是《雀魂》的付费用户,在得知免费玩家可以享受到付费体验,心中会有什么想法?还会继续为《雀魂》付费么?如果大家都在使用修改实现的装扮而不为《雀魂》付费,那么这款游戏的未来会怎样?会继续盈利下去么?相信您您的内心现在已经想到了未来可能发生的事,我们都不希望那样的未来。\n\n' + + '  作为“始作俑者”,我不希望《雀魂 Plus》被滥用,我希望的是《雀魂 Plus》可以为《雀魂》提供一个PC稳定的游戏环境和体验,在这基础上体验一些《雀魂》尚未实现的、或是其他游戏中存在的优秀功能,并非为了让使用者白嫖《雀魂》,这是一个不健康的发展路径,无论你我,当然不希望《雀魂》会走上《雀龙门》的老路,成为一款冷门游戏,或是成为下一个《X海战记》。《雀魂》当前的付费点主要就是装扮,还望各位手下留情,使用魔改的同时别忘为游戏付费,一款好的游戏值得去为其体验埋单。\n\n' + + '  《雀魂 Plus》现在的更新重点是作为一个游戏浏览器体验的优化上,对于目前已有的扩展功能将仅做维护,感谢您的理解。相信您在思考后,也会在《雀魂》中“补票”吧。' + this.addBlock({ title, value }) + } + + private addGitHubLink = () => { + const title = i18n.text.main.programName() + const value = this.getGitHubHTML() + this.addBlock({ title, value }) + } + + private getGitHubHTML = () => { + const info = document.createElement('p') + info.innerHTML = `在 PC 上跨平台的雀魂麻将第三方浏览器,提供资源替换和代码注入功能,并对直播环境进行了一定优化 +
+ + Github Stars +
+ +
+ ${i18n.text.manager.localVersion()} ${app.getVersion()}` + const alinks = info.querySelectorAll('a') + this.bindAlink(alinks) + info + .querySelector('input[type="button"]') + .addEventListener('click', evt => { + evt.preventDefault() + ipcRenderer.sendSync('clear-cache') + alert(i18n.text.manager.clearCacheSucceeded()) + }) + return info + } + + private bindAlink = (alinks: NodeListOf) => { + const links = Array.from(alinks || []) + links.forEach(alink => { + alink.addEventListener('click', (event: Event) => { + event.preventDefault() + shell.openExternal(alink.href) + }) + }) + } +} + +export default new AboutPage() diff --git a/src/manager/pages/Extensions.ts b/src/manager/pages/Extensions.ts new file mode 100644 index 0000000..662552d --- /dev/null +++ b/src/manager/pages/Extensions.ts @@ -0,0 +1,13 @@ +import i18n from '../../i18n' +import CardList from '../ui/CardList' + +class Extension extends CardList { + protected getExportInfo() { + return { + extend: 'mspe', + typeText: i18n.text.manager.fileTypeMSPE() + } + } +} + +export default new Extension() diff --git a/src/manager/pages/ResourcePacks.ts b/src/manager/pages/ResourcePacks.ts new file mode 100644 index 0000000..249d930 --- /dev/null +++ b/src/manager/pages/ResourcePacks.ts @@ -0,0 +1,13 @@ +import i18n from '../../i18n' +import CardList from '../ui/CardList' + +class ResourcePack extends CardList { + protected getExportInfo() { + return { + extend: 'mspr', + typeText: i18n.text.manager.fileTypeMSPM() + } + } +} + +export default new ResourcePack() diff --git a/src/manager/pages/Setting.ts b/src/manager/pages/Setting.ts new file mode 100644 index 0000000..67efe50 --- /dev/null +++ b/src/manager/pages/Setting.ts @@ -0,0 +1,162 @@ +import { ipcRenderer } from 'electron' +import Global from '../global' +import i18n from '../../i18n' +import { MajsoulPlus } from '../../majsoul_plus' +import Ping from '../utils/Ping' + +class Setting { + userConfig: MajsoulPlus.UserConfig = require(Global.UserConfigPath) + + init() { + this.addSaveListener() + this.render() + } + + private render = () => { + const settingInner = document.querySelector('#settingInner') + settingInner.innerHTML = '' + Object.entries(this.userConfig) + .filter(([section]) => { + // 设置不渲染的 section + return !['localStorage'].includes(section) + }) + .forEach(([section, data]) => { + this.renderSection(settingInner, section, data) + }) + } + + private renderSection = (settingInner: Element, section: string, data) => { + const header = document.createElement('h3') + i18n.text.manager[section].renderAsText(header) + + settingInner.append(header) + Object.entries(data).forEach(([item, data], index) => { + this.renderSectionItem({ + settingInner, + section, + item, + data, + index + }) + }) + } + + private renderSectionItem = ({ + settingInner, + section, + item, + data, + index + }) => { + const processes = { + boolean: () => + this.renderCheckBoxSectionItem({ + settingInner, + section, + item, + data, + index + }), + number: () => + this.renderNumberSectionItem({ + settingInner, + section, + item, + data, + index + }), + string: () => { + if (item === 'proxyUrl') { + this.renderTextSectionItem({ + settingInner, + section, + item, + data, + index + }) + } + } + } + if (processes[typeof data]) { + processes[typeof data].call(data) + } + } + + private renderCheckBoxSectionItem = ({ + settingInner, + section, + item, + data, + index + }) => { + const checkBox = document.createElement('input') + checkBox.type = 'checkbox' + checkBox.id = `config${section}${item}${index}` + const label = document.createElement('label') + label.setAttribute('for', checkBox.id) + i18n.text.manager[item].renderAsText(label) + checkBox.checked = data + checkBox.addEventListener('change', () => { + this.userConfig[section][item] = checkBox.checked + }) + settingInner.append(checkBox) + settingInner.append(label) + } + + private renderNumberSectionItem = ({ + settingInner, + section, + item, + data, + index + }) => { + const input = document.createElement('input') + input.type = 'number' + input.id = `config${section}${item}${index}` + input.value = data + const label = document.createElement('label') + label.setAttribute('for', input.id) + i18n.text.manager[item].renderAsText(label) + input.addEventListener('change', () => { + this.userConfig[section][item] = Number(input.value) + }) + const br = document.createElement('br') + settingInner.append(input) + settingInner.append(label) + settingInner.append(br) + } + + private renderTextSectionItem({ settingInner, section, item, data, index }) { + const input = document.createElement('input') + input.type = 'text' + input.id = `config${section}${item}${index}` + input.value = data + const label = document.createElement('label') + label.setAttribute('for', input.id) + i18n.text.manager[item].renderAsText(label) + input.addEventListener('change', () => { + this.userConfig[section][item] = input.value + }) + const br = document.createElement('br') + settingInner.append(input) + settingInner.append(label) + settingInner.append(br) + } + + private handleSaveConfigClick = () => { + this.save() + alert(i18n.text.manager.saveSucceeded()) + Ping.setServer(this.userConfig.userData.serverToPlay) + } + + private addSaveListener = () => { + const saveBtn = document.querySelector('#saveConfigs') + saveBtn.addEventListener('click', this.handleSaveConfigClick) + } + + save = () => { + ipcRenderer.send('update-user-config', this.userConfig) + } +} + +export default new Setting() diff --git a/src/manager/pages/Tools.ts b/src/manager/pages/Tools.ts new file mode 100644 index 0000000..3aa3385 --- /dev/null +++ b/src/manager/pages/Tools.ts @@ -0,0 +1,35 @@ +import { ipcRenderer } from 'electron' +import i18n from '../../i18n' +import ButtonCard from '../ui/ButtonCard' +import CardList from '../ui/CardList' + +class Tool extends CardList { + handleCardClick(id: string) { + const cardItem = this.cardListItemMap.get(id) + ipcRenderer.send('start-tool', cardItem.card.options.id) + } + + generateCardFromMetadata = ( + info: MajsoulPlus_Manager.CardMetadataWithEnable + ) => { + const card = new ButtonCard(info.metadata) + const id = info.metadata.id + this.cardListItemMap.set(id, { ...info, id, card }) + + card.on('change', () => this.handleCheckedChange(id)) + card.on('export', () => this.handleExport(id)) + card.on('remove', () => this.handleRemove(id)) + card.on('click', () => this.handleCardClick(id)) + } + + getExportInfo() { + return { + extend: 'mspt', + typeText: i18n.text.manager.fileTypeMSPT() + } + } + + save() {} +} + +export default new Tool() diff --git a/src/manager/ui/ButtonCard.ts b/src/manager/ui/ButtonCard.ts new file mode 100644 index 0000000..5c08700 --- /dev/null +++ b/src/manager/ui/ButtonCard.ts @@ -0,0 +1,18 @@ +import Card from './Card' + +export default class ButtonCard extends Card { + protected createInputElements() { + const input = document.createElement('input') + const label = document.createElement('label') + input.type = 'button' + input.addEventListener('click', event => { + this.listener.emit('click', event) + }) + input.id = this.getRandomId() + label.setAttribute('for', input.id) + return { + input, + label + } + } +} diff --git a/src/manager/ui/Card.ts b/src/manager/ui/Card.ts new file mode 100644 index 0000000..7e44514 --- /dev/null +++ b/src/manager/ui/Card.ts @@ -0,0 +1,160 @@ +import * as path from 'path' +import Listener from './Listener' +import Global from '../global' + +interface InputElement { + input?: HTMLElement + label?: HTMLElement +} + +export default class Card { + options: MajsoulPlus_Manager.CardMetadata + protected listener: Listener = new Listener() + protected dom: HTMLElement + protected editable = false + + constructor(options: MajsoulPlus_Manager.CardMetadata) { + this.options = options + this.dom = this.createDOM() + } + + protected getPreviewPath(): string { + return path.join( + Global.appDataDir, + this.options.type.toLowerCase(), + this.options.id, + this.options.preview + ) + } + + protected getRandomId(): string { + const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( + '' + ) + const uuid = new Array(36) + let rnd = 0 + let r: number + for (let i = 0; i < 36; i++) { + if (i === 8 || i === 13 || i === 18 || i === 23) { + uuid[i] = '-' + } else if (i === 14) { + uuid[i] = '4' + } else { + if (rnd <= 0x02) { + rnd = (0x2000000 + Math.random() * 0x1000000) | 0 + } + r = rnd & 0xf + rnd = rnd >> 4 + uuid[i] = chars[i === 19 ? (r & 0x3) | 0x8 : r] + } + } + return `${uuid + .join('') + .replace(/-/gm, '') + .toLowerCase()}` + } + + protected createInputElements(): InputElement { + return {} + } + + protected createNameElement() { + const h3 = document.createElement('h3') + h3.innerText = this.options.name + return h3 + } + + protected createAuthorElement() { + const address = document.createElement('address') + address.innerText = this.options.author.toString() + return address + } + + protected createPreviewElement() { + const preview = document.createElement('img') + preview.src = this.getPreviewPath() + preview.addEventListener('error', function errFun(event) { + event.preventDefault() + preview.src = path.join(__dirname, '../', 'defaultPreview.jpg') + preview.removeEventListener('error', errFun) + }) + preview.addEventListener('dragstart', evt => evt.preventDefault()) + return preview + } + + protected createDescriptionElement() { + const p = document.createElement('p') + p.innerText = this.options.description + return p + } + + protected createExportButton() { + const exportButton = document.createElement('button') + exportButton.className = 'export-btn' + exportButton.addEventListener('click', evt => { + this.listener.emit('export', evt) + }) + return exportButton + } + + protected createRemoveButton() { + const removeButton = document.createElement('button') + removeButton.className = 'remove-btn' + removeButton.addEventListener('click', evt => { + this.listener.emit('remove', evt) + }) + return removeButton + } + + protected createDOM(): HTMLElement { + const article = document.createElement('article') + const preview = this.createPreviewElement() + if (preview) article.appendChild(preview) + + const h3 = this.createNameElement() + if (h3) article.appendChild(h3) + + const address = this.createAuthorElement() + if (address) article.appendChild(address) + + const p = this.createDescriptionElement() + if (p) article.appendChild(p) + + const exportButton = this.createExportButton() + if (exportButton) article.appendChild(exportButton) + + const removeButton = this.createRemoveButton() + if (removeButton) article.appendChild(removeButton) + + const { input, label } = this.createInputElements() + if (input) article.appendChild(input) + if (label) article.appendChild(label) + + return article + } + + get DOM() { + return this.dom + } + + isEditable = () => { + return this.editable + } + + setEditable = (value: boolean) => { + this.editable = value + this.dom.className = value ? 'edit' : '' + } + + on(event: string, handle: Function) { + this.listener.on(event, handle) + } + + off(event: string, handle?: Function) { + this.listener.off(event, handle) + } + + emit(event: string) { + this.listener.emit(event) + } +} diff --git a/src/manager/ui/CardList.ts b/src/manager/ui/CardList.ts new file mode 100644 index 0000000..7aa90fb --- /dev/null +++ b/src/manager/ui/CardList.ts @@ -0,0 +1,159 @@ +import { ipcRenderer, remote } from 'electron' +import i18n from '../../i18n' +import Card from './Card' +import CheckedboxCard from './CheckedboxCard' + +const dialog = remote.dialog + +interface CardListItem extends MajsoulPlus_Manager.CardMetadataWithEnable { + id: string + card: Card | CheckedboxCard +} + +export default class CardList { + name: string + cardListItemMap: Map = new Map() + + constructor() { + this.name = this.constructor.name + } + + protected getCardDetails = (): Promise< + MajsoulPlus_Manager.GetDetailMetadataResponse + > => { + ipcRenderer.send(`get-${this.name.toLowerCase()}-details`) + return new Promise(resolve => { + ipcRenderer.on( + `get-${this.name.toLowerCase()}-details-response`, + ( + event: Electron.Event, + detail: MajsoulPlus_Manager.GetDetailMetadataResponse + ) => { + resolve(detail) + } + ) + }) + } + + protected generateCardsFromDetails = ( + details: MajsoulPlus_Manager.GetDetailMetadataResponse + ) => { + for (const id of Object.keys(details)) { + details[id].metadata.type = this.name + this.generateCardFromMetadata(details[id]) + } + } + + protected renderCards = () => { + const target = document.querySelector(`#${this.name}Infos`) + target.innerHTML = '' + this.cardListItemMap.forEach(({ card }) => { + const { DOM } = card + target.appendChild(DOM) + }) + } + + protected generateCardFromMetadata = ( + info: MajsoulPlus_Manager.CardMetadataWithEnable + ) => { + const card = new CheckedboxCard(info.metadata, info.enabled, info.sequence) + const id = info.metadata.id + this.cardListItemMap.set(id, { ...info, id, card }) + + card.on('change', () => this.handleCheckedChange(id)) + card.on('export', () => this.handleExport(id)) + card.on('remove', () => this.handleRemove(id)) + } + + protected handleCheckedChange = (id: string) => { + const cardItem = this.cardListItemMap.get(id) + if (cardItem.card['checked'] !== undefined) { + const details: MajsoulPlus_Manager.GetDetailMetadataResponse = ipcRenderer.sendSync( + `change-${this.name.toLowerCase()}-enability`, + id, + cardItem.card['checked'] + ) + this.load(Promise.resolve(details)) + + if (details[id].errors.length > 0) { + const err = details[id].errors[0] + switch (err[0]) { + case 'dependencyVersionMismatch': + alert(i18n.text.manager[err[0]](err[1], err[2], err[3])) + break + case 'dependencyNotFound': + case 'dependencyNotEnabled': + alert(i18n.text.manager[err[0]](err[1])) + break + default: + break + } + } + } + } + + protected handleExport(id: string) { + const { extend, typeText } = this.getExportInfo() + + const pathToSave = dialog.showSaveDialog({ + title: i18n.text.manager.exportTo(), + filters: [ + { + name: typeText, + extensions: [extend] + } + ] + }) + + if (pathToSave) { + // 向主进程请求打包 + const resp: { err: string | undefined } = ipcRenderer.sendSync( + `export-${this.name.toLowerCase()}`, + id, + pathToSave + ) + if (resp.err) { + alert( + i18n.text.manager.exportExtendResourcesFailed(resp.err.toString()) + ) + } else { + alert(i18n.text.manager.exportExtendResourcesSucceeded()) + } + } + } + + protected handleRemove = (id: string) => { + const cardItem = this.cardListItemMap.get(id) + cardItem.card.DOM.remove() + ipcRenderer.sendSync(`remove-${this.name.toLowerCase()}`, id) + this.refresh() + } + + protected getExportInfo(): MajsoulPlus_Manager.ExportInfo { + return undefined + } + + load(details = this.getCardDetails()) { + this.cardListItemMap.clear() + details.then(details => { + console.log(this.name, details) + this.generateCardsFromDetails(details) + this.renderCards() + }) + } + + refresh() { + const details = ipcRenderer.sendSync(`refresh-${this.name.toLowerCase()}`) + this.load(Promise.resolve(details)) + } + + save() { + ipcRenderer.sendSync(`save-${this.name.toLowerCase()}-enabled`) + } + + changeEditable() { + this.cardListItemMap.forEach(cardItem => { + cardItem.card.setEditable(!cardItem.card.isEditable()) + }) + } +} diff --git a/src/manager/ui/CheckedboxCard.ts b/src/manager/ui/CheckedboxCard.ts new file mode 100644 index 0000000..e010fe1 --- /dev/null +++ b/src/manager/ui/CheckedboxCard.ts @@ -0,0 +1,37 @@ +import Card from './Card' + +export default class CheckedboxCard extends Card { + checked: boolean + // TODO: 渲染加载顺序 + private sequence: number + constructor( + options: MajsoulPlus_Manager.CardMetadata, + checked = false, + sequence = 0 + ) { + super(options) + this.checked = checked + this.sequence = sequence + } + + protected createInputElements() { + const input = document.createElement('input') + const label = document.createElement('label') + input.type = 'checkbox' + input.id = this.getRandomId() + input.addEventListener('change', event => { + this.listener.emit('change', event) + }) + Object.defineProperty(this, 'checked', { + get: () => input.checked, + set: value => { + input.checked = value + } + }) + label.setAttribute('for', input.id) + return { + input, + label + } + } +} diff --git a/src/manager/ui/Listener.ts b/src/manager/ui/Listener.ts new file mode 100644 index 0000000..145256f --- /dev/null +++ b/src/manager/ui/Listener.ts @@ -0,0 +1,40 @@ +interface HandlerItem { + event: string + handle: Function +} + +export default class Listener { + private handles: HandlerItem[] = [] + + on(event: string, handle: Function) { + for (const element of this.handles) { + if (element.event === event && element.handle === handle) { + return + } + } + this.handles.push({ + event, + handle + }) + } + + off(event: string, handle?: Function) { + if (handle) { + this.handles.forEach((element, index) => { + if (element.event === event && element.handle === handle) { + this.handles.splice(index, 1) + } + }) + } else { + this.handles = this.handles.filter(item => item.event !== event) + } + } + + emit(event: string, ...args) { + for (const element of this.handles) { + if (element.event === event) { + element.handle(...args) + } + } + } +} diff --git a/manager/Panel.js b/src/manager/ui/Panel.ts similarity index 58% rename from manager/Panel.js rename to src/manager/ui/Panel.ts index 617c1f5..7bc761c 100644 --- a/manager/Panel.js +++ b/src/manager/ui/Panel.ts @@ -1,39 +1,33 @@ class Panel { - constructor () { - this.activeIndex = 0 - this.panels = [] - } + private activeIndex = 0 + private panels: HTMLElement[] = [] - _handleClick (index) { + private handleClick(index: number) { this.activeIndex = index this.render() } - init () { - this.panels = Array.from(document.querySelectorAll('#leftPanel ul li')) - this.panels.forEach((panel, index) => { - panel.addEventListener('click', () => this._handleClick(index)) - }) - this.render() - } - - render () { - if (this.panels.length) { + private render() { + if (this.panels.length > 0) { const currentPanel = this.panels[this.activeIndex] const sections = Array.from(document.getElementsByTagName('section')) const activeSection = sections.find( section => section.dataset.name === currentPanel.dataset.target ) - sections.forEach(section => { - section.className = '' - }) + sections.forEach(section => (section.className = '')) activeSection.className = 'show' - this.panels.forEach(panel => { - panel.className = '' - }) + this.panels.forEach(panel => (panel.className = '')) currentPanel.className = 'active' } } + + init() { + this.panels = Array.from(document.querySelectorAll('#leftPanel ul li')) + this.panels.forEach((panel, index) => { + panel.addEventListener('click', () => this.handleClick(index)) + }) + this.render() + } } -module.exports = new Panel() +export default new Panel() diff --git a/src/manager/ui/Update.ts b/src/manager/ui/Update.ts new file mode 100644 index 0000000..53fab31 --- /dev/null +++ b/src/manager/ui/Update.ts @@ -0,0 +1,77 @@ +import Network from '../utils/Network' +import { remote, shell } from 'electron' +import { gt } from 'semver' + +class Update { + static readonly release = + 'https://api.github.com/repos/iamapig120/majsoul-plus-client/releases/latest' + static readonly preRelease = + 'https://api.github.com/repos/iamapig120/majsoul-plus-client/releases' + + private usePreRelease: boolean + + setUsePrerelease(prerelease: boolean) { + this.usePreRelease = prerelease + return this + } + + private getLocalVersion() { + return `v${remote.app.getVersion()}` + } + + private async getRemoteVersionInfo() { + const api = this.usePreRelease ? Update.preRelease : Update.release + const res = await Network.getJson(api) + try { + const result = this.usePreRelease ? res[0] : res + return { + remoteVersion: result.tag_name, + body: result.body, + time: result.published_at, + url: result.html_url + } + } catch (e) { + console.error(e) + return {} + } + } + + _openDownloadPage() {} + + _renderUpdateHint({ remoteVersion, localVersion, time, url }) { + const updateCard = document.getElementById('updateCard') + + const updateCardClose = document.getElementById('updateCard_close') + + const updateCardView = document.getElementById('updateCard_view') + + const localVersionDOM = document.getElementById('localVersion') + + const remoteVersionDOM = document.getElementById('remoteVersion') + + const publishTime = document.getElementById('publishTime') + updateCard.classList.add('show') + updateCardClose.addEventListener('click', () => { + updateCard.classList.remove('show') + }) + updateCardView.addEventListener('click', () => { + shell.openExternal(url) + updateCard.classList.remove('show') + }) + localVersionDOM.innerText = localVersion + remoteVersionDOM.innerText = remoteVersion + publishTime.innerText = new Date(time).toLocaleString() + } + + async checkUpdate() { + const localVersion = await this.getLocalVersion() + const remoteVersionInfo = await this.getRemoteVersionInfo() + const { remoteVersion, time, url } = remoteVersionInfo + if (gt(remoteVersion, localVersion)) { + this._renderUpdateHint({ remoteVersion, localVersion, time, url }) + } + // TODO: 在线更新 + } +} + +export default new Update() diff --git a/manager/Network.js b/src/manager/utils/Network.ts similarity index 54% rename from manager/Network.js rename to src/manager/utils/Network.ts index 02055b4..27bb391 100644 --- a/manager/Network.js +++ b/src/manager/utils/Network.ts @@ -1,13 +1,14 @@ -const i18n = require('../i18nInstance') -class NetWork { - getJson (input, params) { +import i18n from '../../i18n' + +export default class Network { + static getJson(input: RequestInfo, init?: RequestInit) { return new Promise((resolve, reject) => { - (function timeout () { + (function timeout() { setTimeout(() => { reject(new Error('network request timeout')) }, 30 * 1000) })() - fetch(input, params) + fetch(input, init) .then(_checkStatus) .then(_processJson) .then(resolve) @@ -16,15 +17,13 @@ class NetWork { } } -function _checkStatus (response) { +function _checkStatus(response: Response) { if (response.ok && response.status >= 200 && response.status < 400) { return response } - throw new Error(i18n.t.manager.XMLHttpRequestFailed(response.status)) + throw new Error(i18n.text.manager.XMLHttpRequestFailed(response.status)) } -function _processJson (response) { +function _processJson(response: Response) { return response.json() } - -module.exports = new NetWork() diff --git a/src/manager/utils/Ping.ts b/src/manager/utils/Ping.ts new file mode 100644 index 0000000..68bff91 --- /dev/null +++ b/src/manager/utils/Ping.ts @@ -0,0 +1,192 @@ +import Network from './Network' +import * as tcpPing from 'tcp-ping' +import i18n from '../../i18n' + +export const remoteDomains = [ + { id: 0, name: 'zh', domain: 'https://majsoul.union-game.com/0' }, + { id: 1, name: 'jp', domain: 'https://game.mahjongsoul.com' }, + { id: 2, name: 'en', domain: 'https://mahjongsoul.game.yo-star.com' } +] + +class Ping { + private server: number + private services: MajsoulPlus_Manager.RegionUrls + private currentService = null + private serviceList = [] + private interval = null + + setServer(server: number) { + this.server = server + + const serverInfoTitleDom = document.querySelector('#serverInfoTitle') + i18n.text['main'][`server${remoteDomains[this.server].name}`].renderAsText( + serverInfoTitleDom + ) + this.initPing() + return this + } + + initPing = () => { + this.getServices() + .then(this.getService) + .then(this.renderService) + .then(this.getChildService) + .then(this.ping) + .catch(this.renderPingFail) + } + + init() { + const serverInfoDom = document.querySelector('#serverInfo') + serverInfoDom.addEventListener('click', this.changeService) + } + + getServices() { + return this.getVersion() + .then(this.getResVersion) + .then(this.getConfig) + .then(this.saveServices) + } + + private getRandomUrl = (url: string) => { + return `${url}?randv=${Math.random() + .toString() + .substring(2, 17) + .padStart(16, '0')}` + } + + private getVersion = async () => { + const url = this.getRandomUrl( + `${remoteDomains[this.server].domain}/version.json` + ) + const res = (await Network.getJson(url)) as MajsoulPlus_Manager.VersionJson + return res.version + } + + private getResVersion = async (version: string) => { + const originUrl = `${ + remoteDomains[this.server].domain + }/resversion${version}.json` + const url = this.getRandomUrl(originUrl) + const res = (await Network.getJson( + url + )) as MajsoulPlus_Manager.ResVersionJson + return res.res['config.json'].prefix + } + + private getConfig = async (prefix: string) => { + const originUrl = `${ + remoteDomains[this.server].domain + }/${prefix}/config.json` + const url = this.getRandomUrl(originUrl) + const res = (await Network.getJson(url)) as MajsoulPlus_Manager.ConfigJson + return res.ip + } + + private saveServices = (ips: MajsoulPlus_Manager.ConfigJsonItem[]) => { + this.services = ips[0].region_urls + this.serviceList = Object.keys(this.services) + } + + private getService = () => { + if (!this.services) return Promise.reject(new Error('services is null')) + const choseService = window.localStorage.getItem('choseService') + if (choseService) { + this.currentService = + this.serviceList.find(service => service === choseService) || + this.serviceList[0] + } else { + this.currentService = this.serviceList[0] + } + return Promise.resolve() + } + + private getChildService = () => { + return new Promise((resolve, reject) => { + if (this.services) { + const originUrl = `${this.services[this.currentService]}` + const url = `${this.getRandomUrl( + originUrl + )}&service=ws-gateway&protocol=ws&ssl=true` + Network.getJson(url) + .then((res: MajsoulPlus_Manager.ServerListJson) => { + resolve(res.servers[0]) + }) + .catch(reject) + } else { + reject(new Error('services is not null')) + } + }) + } + + private renderService = () => { + const serverTextDom = document.querySelector('#serverText') + const pingInfoDom = document.querySelector('#pingInfo') + const pingTextDom = document.querySelector('#pingText') + pingInfoDom.className = 'offline' + pingTextDom.textContent = '--' + i18n.unbindElement(serverTextDom) + i18n.text.servers[this.currentService].renderAsText(serverTextDom) + return Promise.resolve() + } + + renderPing = (time: number) => { + const pingTextDom = document.querySelector('#pingText') + const pingInfoDom = document.querySelector('#pingInfo') + pingTextDom.textContent = String(time >> 0) + pingInfoDom.className = time < 150 ? 'green' : time < 500 ? 'orange' : 'red' + } + + renderPingFail = () => { + const serverTextDom = document.querySelector('#serverText') + i18n.unbindElement(serverTextDom) + i18n.text.manager.loadFailed.renderAsText(serverTextDom) + } + + iPing = (service: string) => { + return new Promise((resolve, reject) => { + const address = service.split(':')[0] + const port = Number(service.split(':')[1]) + tcpPing.ping( + { + address, + port, + attempts: 3 + }, + (err, data) => { + if (err) { + console.error(err) + reject(new Error('tcp-ping error')) + } + resolve(data.avg) + } + ) + }) + } + + getNextService = () => { + let index = this.serviceList.indexOf(this.currentService) + index = index + 1 >= this.serviceList.length ? 0 : index + 1 + this.currentService = this.serviceList[index] + localStorage.setItem('choseService', this.currentService) + return Promise.resolve() + } + + changeService = () => { + if (this.serviceList.length > 1) { + this.getNextService() + .then(this.renderService) + .then(this.getChildService) + .then(this.iPing) + .catch(this.renderPingFail) + } + } + + ping = (service: string) => { + clearInterval(this.interval) + this.interval = setInterval(() => { + this.iPing(service).then(this.renderPing) + }, 10000) + } +} + +export default new Ping() diff --git a/src/resourcepack/manager.ts b/src/resourcepack/manager.ts new file mode 100644 index 0000000..bfabacd --- /dev/null +++ b/src/resourcepack/manager.ts @@ -0,0 +1,224 @@ +import * as Koa from 'koa' +import * as Router from 'koa-router' +import * as path from 'path' +import BaseManager from '../BaseManager' +import { appDataDir, GlobalPath } from '../global' +import { MajsoulPlus } from '../majsoul_plus' +import { getRemoteSource, isEncryptRes, readFile, XOR } from '../utils' +import * as schema from './schema.json' + +const defaultResourcePack: MajsoulPlus.ResourcePack = { + id: 'majsoul_plus', + version: '2.0.0', + name: 'Majsoul Plus', + author: 'Majsoul Plus Team', + description: 'No description provided.', + preview: 'preview.png', + dependencies: {}, + + replace: [] +} + +Object.freeze(defaultResourcePack) + +export default class ResourcePackManager extends BaseManager { + private extensionMap: Map = new Map() + + constructor(configPath: string) { + super('resourcepack', configPath, defaultResourcePack, schema) + } + + load(id: string) { + this.use(id, (pack: MajsoulPlus.ResourcePack) => + this.preprocessReplaceString(pack) + ) + } + + loadExtensionPack(ext: MajsoulPlus.Extension) { + if (ext.resourcepack && ext.resourcepack.length > 0) { + const res = { + ...ext, + replace: ext.resourcepack + } + this.preprocessReplaceString(res) + this.extensionMap.set(res.id, res) + } + } + + clearExtensionPack() { + this.extensionMap.clear() + } + + preprocessReplaceString(pack: MajsoulPlus.ResourcePack) { + pack.replace.forEach((rep, index) => { + if (typeof rep === 'string') { + pack.replace[index] = { + from: [rep, 'jp/' + rep, 'en/' + rep], + to: rep, + 'all-servers': true + } + } else if (rep['all-servers']) { + const all = [] + if (typeof rep.from === 'string') { + rep.from = [rep.from] + } + rep.from.forEach(key => { + all.push(key, 'jp/' + key, 'en/' + key) + }) + rep.from = all + } + }) + } + + register(server: Koa, router: Router) { + // 获取资源包基本信息 + router.get(`/majsoul_plus/resourcepack/:id`, async (ctx, next) => { + ctx.response.status = this.loadedMap.has(ctx.params.id) ? 200 : 404 + ctx.body = this.loadedMap.has(ctx.params.id) + ? JSON.stringify(this.loadedMap.get(ctx.params.id), null, 2) + : 'Not Found' + }) + + // 为每一个资源包分配一个路径 + this.loadedMap.forEach((pack: MajsoulPlus.ResourcePack, id) => { + router.get(`/majsoul_plus/resourcepack/${id}/*`, async (ctx, next) => { + let queryPath = ctx.path.substr( + `/majsoul_plus/resourcepack/${id}/`.length + ) + const encrypted = isEncryptRes(queryPath) + + // 检测 from 中是否存在 queryPath + // 有则重定向到对应的 to + for (let rep of pack.replace) { + rep = rep as MajsoulPlus.ResourcePackReplaceEntry + if ((rep.from as string[]).includes(queryPath)) { + queryPath = rep.to + break + } + } + + try { + const content = await readFile( + path.resolve( + appDataDir, + GlobalPath.ResourcePackDir, + id, + 'assets', + queryPath + ) + ) + ctx.response.status = 200 + ctx.body = encrypted ? XOR(content as Buffer) : content + } catch (e) { + ctx.response.status = 404 + ctx.body = undefined + } + }) + }) + + // 为每一个扩展分配一个路径 + this.extensionMap.forEach((pack: MajsoulPlus.ResourcePack, id) => { + router.get(`/majsoul_plus/extension/${id}/*`, async (ctx, next) => { + let queryPath = ctx.path.substr(`/majsoul_plus/extension/${id}/`.length) + const encrypted = isEncryptRes(queryPath) + + // 检测 from 中是否存在 queryPath + // 有则重定向到对应的 to + for (let rep of pack.replace) { + rep = rep as MajsoulPlus.ResourcePackReplaceEntry + if ((rep.from as string[]).includes(queryPath)) { + queryPath = rep.to + break + } + } + + try { + const content = await readFile( + path.resolve( + appDataDir, + GlobalPath.ExtensionDir, + id, + 'assets', + queryPath + ) + ) + ctx.response.status = 200 + ctx.body = encrypted ? XOR(content as Buffer) : content + } catch (e) { + ctx.response.status = 404 + ctx.body = undefined + } + }) + }) + + // 修改资源映射表 + router.get(`/resversion([^w]+)w.json`, async (ctx, next) => { + ctx.response.type = 'application/json' + const remote = await getRemoteSource(ctx.path, false) + + if (remote.code !== 200) { + ctx.res.statusCode = remote.code + ctx.body = { + code: remote.code, + message: remote.data + } + } else { + ctx.res.statusCode = remote.code + const resMap = JSON.parse(remote.data.toString('utf-8')) + + // 先加载扩展的资源 + this.extensionMap.forEach((pack: MajsoulPlus.ResourcePack) => { + if ( + pack.id !== 'majsoul_plus' && + this.loadedDetails[pack.id].enabled + ) { + pack.replace.forEach( + (rep: MajsoulPlus.ResourcePackReplaceEntry) => { + const repo = rep as MajsoulPlus.ResourcePackReplaceEntry + const from = + typeof repo.from === 'string' ? [repo.from] : repo.from + + from.forEach(rep => { + if (resMap.res[rep] !== undefined) { + resMap.res[rep].prefix = `majsoul_plus/extension/${pack.id}` + } + }) + } + ) + } + }) + + // 后加载资源包的资源,资源包可覆盖扩展的替换 + // 资源包的资源替换顺序即为加载顺序 + Object.values(this.loadedDetails) + .filter(detail => detail.sequence > 0) + .sort((a, b) => a.sequence - b.sequence) + .forEach(detail => { + const pack = detail.metadata as MajsoulPlus.ResourcePack + if ( + pack.id !== 'majsoul_plus' && + this.loadedDetails[pack.id].enabled + ) { + pack.replace.forEach( + (rep: MajsoulPlus.ResourcePackReplaceEntry) => { + const repo = rep as MajsoulPlus.ResourcePackReplaceEntry + const from = + typeof repo.from === 'string' ? [repo.from] : repo.from + + from.forEach(rep => { + if (resMap.res[rep] !== undefined) { + resMap.res[rep].prefix = `majsoul_plus/resourcepack/${ + pack.id + }` + } + }) + } + ) + } + }) + + ctx.body = JSON.stringify(resMap, null, 2) + } + }) + } +} diff --git a/src/resourcepack/resourcepack.ts b/src/resourcepack/resourcepack.ts new file mode 100644 index 0000000..b713378 --- /dev/null +++ b/src/resourcepack/resourcepack.ts @@ -0,0 +1,33 @@ +import { ipcMain } from 'electron' +import { Global } from '../global' +import { getFoldersSync } from '../utils' +import manager from './manager' + +// tslint:disable-next-line +export let ResourcePackManager: manager + +export function LoadResourcePack() { + // 初始化 manager + ResourcePackManager = new manager(Global.ResourcePackConfigPath) + + function load() { + // 加载配置 + ResourcePackManager.loadEnabled() + + // 扫描目录 + const resourcepacks: string[] = getFoldersSync(Global.ResourceFolderPath) + resourcepacks.forEach(resourcepack => + ResourcePackManager.load(resourcepack) + ) + ResourcePackManager.enableFromConfig() + ResourcePackManager.save() + } + + load() + + ipcMain.on('refresh-resourcepack', (event: Electron.Event) => { + ResourcePackManager.clear() + load() + event.returnValue = ResourcePackManager.getDetails() + }) +} diff --git a/src/resourcepack/schema.json b/src/resourcepack/schema.json new file mode 100644 index 0000000..a71b626 --- /dev/null +++ b/src/resourcepack/schema.json @@ -0,0 +1,69 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "resourcepack", + "description": "MajsoulPlus Resource Pack describe file schema", + "type": "object", + "properties": { + "id": { + "type": "string", + "pattern": "^[_a-zA-Z0-9]+$" + }, + "version": { + "type": "string" + }, + "name": { + "type": "string" + }, + "author": { + "type": ["string", "array"], + "items": { + "type": "string" + } + }, + "description": { + "type": "string" + }, + "preview": { + "type": "string" + }, + "dependencies": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "string" + } + } + }, + "replace": { + "type": "array", + "items": { + "oneOf": [ + { "type": "string" }, + { + "type": "object", + "properties": { + "from": { + "oneOf": [ + { "type": "string" }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "to": { + "type": "string" + }, + "all-servers": { + "type": "boolean" + } + } + } + ] + } + } + }, + "required": ["id", "version"] +} diff --git a/src/server.ts b/src/server.ts new file mode 100644 index 0000000..0e8b5d2 --- /dev/null +++ b/src/server.ts @@ -0,0 +1,56 @@ +import * as fs from 'fs' +import * as http from 'http' +import * as https from 'https' +import { ServerOptions } from 'https' +import * as Koa from 'koa' +import * as Router from 'koa-router' +import * as path from 'path' +import { UserConfigs } from './config' +import { ExtensionManager } from './extension/extension' +import { ResourcePackManager } from './resourcepack/resourcepack' +import { getRemoteOrCachedFile, isPath } from './utils' + +const serverOptions: ServerOptions = { + key: fs.readFileSync(path.join(__dirname, 'certificate/key.pem')), + cert: fs.readFileSync(path.join(__dirname, 'certificate/cert.crt')) +} + +Object.freeze(serverOptions) + +const router = new Router() +const server = new Koa() + +export function LoadServer() { + // 注册资源包路由 + ResourcePackManager.register(server, router) + + // 注册扩展路由 + ExtensionManager.register(server, router) + + // 使用 koa-router 的路由 + server.use(router.routes()) + + // 处理国服的 region/region.txt + server.use(async (ctx, next) => { + if ( + UserConfigs.userData.serverToPlay === 0 && + ctx.request.originalUrl === '/region.txt' + ) { + ctx.res.statusCode = 200 + ctx.body = 'mainland' + } else { + await next() + } + }) + + // 默认从远端获取文件 + server.use(async ctx => { + const isRoutePath = isPath(ctx.request.originalUrl) + const resp = await getRemoteOrCachedFile(ctx.request.originalUrl) + ctx.res.statusCode = resp.code + ctx.body = isRoutePath ? resp.data.toString('utf-8') : resp.data + }) +} + +export const httpServer = http.createServer(server.callback()) +export const httpsServer = https.createServer(serverOptions, server.callback()) diff --git a/src/tool/manager.ts b/src/tool/manager.ts new file mode 100644 index 0000000..1cd782f --- /dev/null +++ b/src/tool/manager.ts @@ -0,0 +1,32 @@ +import BaseManager from '../BaseManager' +import { MajsoulPlus } from '../majsoul_plus' +import * as schema from './schema.json' + +const defaultTool: MajsoulPlus.ToolConfig = { + id: 'default', + version: '1.0.0', + name: '未命名', + author: '未知作者', + description: '无描述', + preview: 'preview.png', + dependencies: {}, + + index: 'index.html', + windowOptions: {} +} + +export default class ToolManager extends BaseManager { + constructor(configPath: string) { + super('tool', configPath, defaultTool, schema) + } + + // 重载使下列函数失效 + loadEnabled() { + return [] + } + enableFromConfig() {} + disable(id: string) {} + disableAll() {} + enable(id: string) {} + save() {} +} diff --git a/src/tool/schema.json b/src/tool/schema.json new file mode 100644 index 0000000..b41ca22 --- /dev/null +++ b/src/tool/schema.json @@ -0,0 +1,45 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "extension", + "description": "MajsoulPlus Extension describe file schema", + "type": "object", + "properties": { + "id": { + "type": "string", + "pattern": "^[_a-zA-Z0-9]+$" + }, + "version": { + "type": "string" + }, + "name": { + "type": "string" + }, + "author": { + "type": ["string", "array"], + "items": { + "type": "string" + } + }, + "description": { + "type": "string" + }, + "preview": { + "type": "string" + }, + "dependencies": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "string" + } + } + }, + "index": { + "type": "string" + }, + "windowOptions": { + "type": "object" + } + }, + "required": ["id", "version"] +} diff --git a/src/tool/tool.ts b/src/tool/tool.ts new file mode 100644 index 0000000..add98b3 --- /dev/null +++ b/src/tool/tool.ts @@ -0,0 +1,26 @@ +import { ipcMain } from 'electron' +import { Global } from '../global' +import { getFoldersSync } from '../utils' +import manager from './manager' + +// tslint:disable-next-line +export let ToolManager: manager + +export function LoadTool() { + // 初始化 manager + ToolManager = new manager(Global.ToolConfigPath) + + function load() { + const tools: string[] = getFoldersSync(Global.ToolFolderPath) + tools.forEach(tool => ToolManager.use(tool)) + ToolManager.enableAll() + } + + load() + + ipcMain.on('refresh-tool', (event: Electron.Event) => { + ToolManager.clear() + load() + event.returnValue = ToolManager.getDetails() + }) +} diff --git a/src/utilities/bossKey.ts b/src/utilities/bossKey.ts new file mode 100644 index 0000000..b774bfe --- /dev/null +++ b/src/utilities/bossKey.ts @@ -0,0 +1,48 @@ +import Utility from './utility' +import { BrowserWindow, globalShortcut } from 'electron' +import { MajsoulPlus } from '../majsoul_plus' +import { GameWindowStatus, GameWindow } from '../windows/game' +import { ManagerWindow, ManagerWindowStatus } from '../windows/manager' + +function hideWindow(window: BrowserWindow, option: MajsoulPlus.WindowStatus) { + if (window) { + option.visible = window.isVisible() + option.muted = ManagerWindow.webContents.isAudioMuted() + window.hide() + window.webContents.setAudioMuted(true) + } +} + +function showWindow(window: BrowserWindow, option: MajsoulPlus.WindowStatus) { + if (window) { + if (option.visible) { + window.show() + } + window.webContents.setAudioMuted(option.muted) + } +} + +class BossKey extends Utility { + private isActive = false + + constructor() { + super() + this.name = 'BossKey' + } + + protected execute() { + globalShortcut.register('Alt+X', () => { + if (this.isActive) { + // 备份窗口信息 & 隐藏窗口 + hideWindow(ManagerWindow, ManagerWindowStatus) + hideWindow(GameWindow, GameWindowStatus) + } else { + // 重新显示窗口 + showWindow(ManagerWindow, ManagerWindowStatus) + showWindow(GameWindow, GameWindowStatus) + } + }) + } +} + +export default new BossKey() diff --git a/src/utilities/sandbox.ts b/src/utilities/sandbox.ts new file mode 100644 index 0000000..8cc3c01 --- /dev/null +++ b/src/utilities/sandbox.ts @@ -0,0 +1,22 @@ +import Utility from './utility' +import { ipcMain } from 'electron' +import * as path from 'path' +import { appDataDir } from '../global' + +class SandBox extends Utility { + constructor() { + super() + this.name = 'SandBox' + } + + protected execute() { + ipcMain.on('sandbox-dirname-request', (event: Electron.Event) => { + event.returnValue = path.resolve(__dirname, '..') + }) + ipcMain.on('sandbox-appdata-request', (event: Electron.Event) => { + event.returnValue = appDataDir + }) + } +} + +export default new SandBox() diff --git a/src/utilities/screenshot.ts b/src/utilities/screenshot.ts new file mode 100644 index 0000000..46b725a --- /dev/null +++ b/src/utilities/screenshot.ts @@ -0,0 +1,34 @@ +import Utility from './utility' +import { ipcMain, app, clipboard, nativeImage } from 'electron' +import * as path from 'path' +import { writeFile } from '../utils' +import { GameWindow } from '../windows/game' + +class ScreenShot extends Utility { + constructor() { + super() + this.name = 'ScreenShot' + } + + protected execute() { + ipcMain.on('take-screenshot', (buf: Buffer) => { + // 接收到的截图 Buffer + const buffer: Buffer = buf + // 由主进程进行保存 + const filePath = path.join( + app.getPath('pictures'), + app.getName(), + Date.now() + '.png' + ) + // 写入文件 + writeFile(filePath, buffer).then(() => { + // 通知渲染进程(游戏宿主窗口)截图已保存,并由渲染进程弹窗 + GameWindow.webContents.send('screenshot-saved', filePath) + }) + // 写入图像到剪切板 + clipboard.writeImage(nativeImage.createFromBuffer(buffer)) + }) + } +} + +export default new ScreenShot() diff --git a/src/utilities/utility.ts b/src/utilities/utility.ts new file mode 100644 index 0000000..88cfe84 --- /dev/null +++ b/src/utilities/utility.ts @@ -0,0 +1,15 @@ +class Utility { + protected name: string + + protected execute() {} + + register() { + try { + this.execute() + } catch (e) { + console.error(`Failed to register utility: ${this.name}`) + } + } +} + +export default Utility diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..b16ca84 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,381 @@ +import * as AdmZip from 'adm-zip' +import * as childProcess from 'child_process' +import fetch from 'electron-fetch' +import * as fs from 'fs' +import * as path from 'path' +import { UserConfigs } from './config' +import { appDataDir, Global, GlobalPath, RemoteDomains } from './global' + +/** + * 以 latest 对象中的内容更新 toUpdate 对象 + * 若不存在则创建 + * @param toUpdate + * @param latest + */ +export function updateObject(toUpdate: {}, latest: {}): {} { + for (const key in toUpdate) { + if (typeof toUpdate[key] === 'object' && typeof latest[key] === 'object') { + updateObject(toUpdate[key], latest[key]) + } else if (latest[key] === undefined) { + delete toUpdate[key] + } + } + for (const key in latest) { + if (toUpdate[key] === undefined && typeof latest[key] === 'object') { + // 此处对对象作深拷贝 + toUpdate[key] = {} + fillObject(toUpdate[key], latest[key]) + } else { + toUpdate[key] = latest[key] + } + } + return toUpdate +} + +/** + * 以 latest 对象的内容填充 toFill 对象中不存在的部分 + * 对存在的部分不作任何修改 + * @param toFill + * @param latest + */ +export function fillObject(toFill: {}, latest: {}): {} { + for (const key in latest) { + if (typeof toFill[key] === 'object' && typeof latest[key] === 'object') { + // 不对数组作填充处理 + if (!Array.isArray(toFill[key])) { + fillObject(toFill[key], latest[key]) + } + } else if (toFill[key] === undefined) { + if (typeof latest[key] === 'object') { + if (Array.isArray(latest[key])) { + // FIXME: Array 的深拷贝 + toFill[key] = [...latest[key]] + } else { + toFill[key] = {} + updateObject(toFill[key], latest[key]) + } + } else { + toFill[key] = latest[key] + } + } + } + return toFill +} + +/** + * 清理 toClean 对象中存在 但 sample 对象中不存在的键值 + * 对二者中都存在但类型不同的数据不予处理 + * @param toClean + * @param sample + */ +export function cleanObject(toClean: {}, sample: {}): {} { + for (const key in toClean) { + if (sample[key] === undefined) { + delete toClean[key] + } else if ( + typeof sample[key] === 'object' && + typeof toClean[key] === 'object' + ) { + cleanObject(toClean[key], sample[key]) + } + } + return toClean +} + +// 加密或者解密文件 +export function XOR(buffer: Buffer): Buffer { + const array = [] + for (let index = 0; index < buffer.length; index++) { + const byte = buffer.readUInt8(index) + array.push(Global.XOR_KEY ^ byte) + } + return Buffer.from(array) +} + +// 判断请求资源是否是加密资源 +export function isEncryptRes(originalUrl: string): boolean { + return originalUrl.includes(Global.EXTEND_RES_KEYWORD) +} + +// 判断请求是否为路由路径 +export function isPath(originalUrl: string): boolean { + return ( + originalUrl.endsWith('\\') || + originalUrl.endsWith('/') || + originalUrl.includes('?') + ) +} + +/** + * 读取远程的官方资源数据 + * @param url 原始请求的相对路径 + * @param encrypt 是否是加密数据 + */ +export async function getRemoteSource( + url: string, + encrypt = false +): Promise<{ code: number; data: Buffer }> { + const remoteUrl = getRemoteUrl(url) + const resp = await fetch(remoteUrl, { + headers: { + 'User-Agent': Global.HttpGetUserAgent + } + }) + + const statusCode = resp.status + const fileData = await resp.buffer() + if (statusCode === 302 || statusCode === 301) { + return getRemoteSource(resp.headers['location'], encrypt) + } else { + if (statusCode < 200 || statusCode >= 400) { + console.warn( + `从远端服务器请求 ${remoteUrl} 失败, statusCode = ${statusCode}` + ) + } + return { + code: resp.status, + data: encrypt ? XOR(fileData) : fileData + } + } +} + +// fs.mkdir 的 Promise 形式 +export function mkdirPromise(dirname: string) { + return new Promise((resolve, reject) => { + fs.mkdir(dirname, err => { + if (err) { + reject(err) + } + resolve() + }) + }) +} + +// fs.stst 的 Promise 形式 +export function statPromise(dirname: string): Promise { + return new Promise((resolve, reject) => { + fs.stat(dirname, (err, stats) => { + if (err) { + reject(err) + } + resolve(stats) + }) + }) +} + +// 递归创建目录,异步方法 +export async function mkdirs(dirname: string): Promise { + try { + await statPromise(dirname) + } catch (e) { + await mkdirs(path.dirname(dirname)) + await mkdirPromise(dirname).catch(() => {}) + } +} + +// 递归创建目录,同步方法 +export function mkdirsSync(dirname: string) { + try { + fs.statSync(dirname) + } catch (error) { + mkdirsSync(path.dirname(dirname)) + fs.mkdirSync(dirname) + } +} + +// 将 path 转换为远程 URL +export function getRemoteUrl(originalUrl: string): string { + return ( + RemoteDomains[UserConfigs.userData.serverToPlay].domain + + originalUrl.replace(/^\/(0\/)?/g, '') + ) +} + +// 从远程 URI 转成本地存储路径 +export function getLocalURI(originalUrl: string): string { + const dirBase = path.join(appDataDir, GlobalPath.LocalDir) + return path.join( + dirBase, + UserConfigs.userData.serverToPlay.toString(), + /^([^?]+)(\?.*)?$/.exec(originalUrl)[1] + ) +} + +// 获取资源,当本地存在时优先使用本地缓存 +export async function getRemoteOrCachedFile( + url: string, + encode = true, + callback: (data: Buffer) => Buffer = data => data +): Promise<{ code: number; data: Buffer | string }> { + const originalUrl = url.replace(/^\/0\//g, '') + const isEncrypted = isEncryptRes(originalUrl) + const isRoutePath = isPath(originalUrl) + const localPath = getLocalURI(originalUrl) + const ret: { code: number; data: Buffer } = { + code: 0, + data: undefined + } + + let originData: Buffer + + if (!isRoutePath && fs.existsSync(localPath)) { + try { + originData = await readFile(localPath) + } catch (e) { + console.error(e) + } + } + + // 当上述 readFile 出现异常时或上述 if 条件不符合时向远端服务器请求 + if (originData === undefined) { + try { + const remoteSource = await getRemoteSource( + originalUrl, + isEncrypted && !isRoutePath + ) + ret.code = remoteSource.code + let data = remoteSource.data + if (!isRoutePath && remoteSource.code.toString()[0] !== '4') { + data = callback(remoteSource.data) + writeFile(localPath, data) + } + originData = data + } catch (e) { + return { code: 403, data: e } + } + } + let responseData: Buffer + if (encode) { + responseData = encodeData(originData) + if (isEncrypted) { + responseData = XOR(responseData as Buffer) + } + } else { + responseData = originData + } + ret.data = responseData + return ret +} + +// 主进程获取资源 +export async function fetchAnySite(url: string, encoding = 'binary') { + const resp = await fetch(url, { + headers: { + 'User-Agent': Global.HttpGetUserAgent + } + }) + return (await resp.buffer()).toString(encoding) +} + +// 写入本地文件 +export async function writeFile( + to: string, + data: Buffer | string, + encoding = 'binary' +): Promise { + await mkdirs(path.dirname(to)) + return new Promise((resolve, reject) => { + fs.writeFile(to, data, encoding, err => { + if (err) { + reject(err) + } + resolve() + }) + }) +} + +// 读取本地文件 +export function readFile(filepath: string): Promise { + return new Promise((resolve, reject) => { + fs.readFile(filepath, (err, data) => { + if (err) { + reject(err) + } + resolve(data) + }) + }) +} + +export function encodeData( + data: Buffer | string, + encoding: BufferEncoding = 'binary' +) { + if (typeof data === 'string') { + return Buffer.from(data as string, encoding) + } else { + return Buffer.from(data as Buffer) + } +} + +// 同步删除文件夹 +export function removeDirSync(dir: string) { + let command = '' + if (process.platform === 'win32') { + command = `rmdir /s/q "${dir}"` + } else { + command = `rm -rf "${dir}"` + } + childProcess.execSync(command) +} + +// 压缩目录至 to +export function zipDir(from: string, to: string) { + const zip = new AdmZip() + zip.addLocalFolder(from, path.basename(from)) + zip.writeZip(to) + return to +} + +// 解压压缩文件至 to +export function unzipDir(file: string, to: string) { + const zip = new AdmZip(file) + zip.extractAllTo(to) + return to +} + +// https://stackoverflow.com/a/26038979 +export function copyFileSync(source: string, target: string) { + let targetFile = target + + //if target is a directory a new file with the same name will be created + if (fs.existsSync(target)) { + if (fs.lstatSync(target).isDirectory()) { + targetFile = path.join(target, path.basename(source)) + } + } + + fs.writeFileSync(targetFile, fs.readFileSync(source)) +} + +export function copyFolderSync(source: string, target: string) { + let files = [] + + // check if folder needs to be created or integrated + const targetFolder = path.join(target, path.basename(source)) + if (!fs.existsSync(targetFolder)) { + fs.mkdirSync(targetFolder) + } + + // copy + if (fs.lstatSync(source).isDirectory()) { + files = fs.readdirSync(source) + files.forEach(file => { + const curSource = path.join(source, file) + if (fs.lstatSync(curSource).isDirectory()) { + copyFolderSync(curSource, targetFolder) + } else { + copyFileSync(curSource, targetFolder) + } + }) + } +} + +export function getFoldersSync(folder: string): string[] { + const folders = [] + fs.readdirSync(folder).forEach(file => { + if (fs.statSync(path.join(folder, file)).isDirectory()) { + folders.push(file) + } + }) + return folders +} diff --git a/src/windows/audioPlayer.ts b/src/windows/audioPlayer.ts new file mode 100644 index 0000000..daff789 --- /dev/null +++ b/src/windows/audioPlayer.ts @@ -0,0 +1,23 @@ +import { BrowserWindow } from 'electron' +import * as path from 'path' + +// tslint:disable-next-line +export let AudioPlayer: BrowserWindow; + +/** + * 初始化音频播放器 + */ +export function initPlayer() { + AudioPlayer = new BrowserWindow({ + show: false + }) + AudioPlayer.loadURL( + 'file://' + path.join(__dirname, 'bin/audio/player.html') + ) +} +/** + * 退出播放器窗口 + */ +export function shutoffPlayer() { + AudioPlayer.close() +} diff --git a/src/windows/game.ts b/src/windows/game.ts new file mode 100644 index 0000000..299304b --- /dev/null +++ b/src/windows/game.ts @@ -0,0 +1,300 @@ +import { + BrowserWindow, + BrowserWindowConstructorOptions, + ipcMain, + Menu, + MenuItem, + WebContents +} from 'electron' +import { AddressInfo } from 'net' +import * as path from 'path' +import { UserConfigs, SaveConfigJson } from '../config' +import { Global, RemoteDomains } from '../global' +import i18n from '../i18n' +import { MajsoulPlus } from '../majsoul_plus' +import { httpServer, httpsServer } from '../server' +import { AudioPlayer, initPlayer, shutoffPlayer } from './audioPlayer' +import { ManagerWindow } from './manager' + +// tslint:disable-next-line +export let GameWindow: BrowserWindow +// tslint:disable-next-line +export const GameWindowStatus: MajsoulPlus.WindowStatus = { + visible: false, + muted: false +} + +export function initGameWindow() { + const config: BrowserWindowConstructorOptions = { + ...Global.GameWindowConfig, + title: getGameWindowTitle(), + frame: !UserConfigs.window.isNoBorder + } + + if (UserConfigs.window.gameWindowSize !== '') { + const windowSize: number[] = UserConfigs.window.gameWindowSize + .split(',') + .map((value: string) => Number(value)) + config.width = windowSize[0] + config.height = windowSize[1] + } + + GameWindow = new BrowserWindow(config) + + // 阻止标题更改 + GameWindow.on('page-title-updated', event => event.preventDefault()) + + // 监听到崩溃事件,输出 console + GameWindow.webContents.on('crashed', () => + console.warn(i18n.text.main.webContentsCrashed()) + ) + + // 监听尺寸更改事件,用于正确得到截图所需要的窗口尺寸 + GameWindow.on('resize', () => { + UserConfigs.window.gameWindowSize = GameWindow.getSize().toString() + if (!ManagerWindow.isDestroyed()) { + ManagerWindow.webContents.send( + 'change-config-game-window-size', + UserConfigs.window.gameWindowSize + ) + } + // 将窗口尺寸信息发送给渲染进程用于截图 + GameWindow.webContents.send('window-resize', GameWindow.getBounds()) + }) + // 监听移动事件,用途同上 + GameWindow.on('move', () => { + GameWindow.webContents.send('window-resize', GameWindow.getBounds()) + }) + GameWindow.on('moved', () => { + GameWindow.webContents.send('window-resize', GameWindow.getBounds()) + }) + + GameWindow.on('closed', () => { + // 关闭后台音频播放器 + shutoffPlayer() + // 关闭本地镜像服务器 + UserConfigs.userData.useHttpServer + ? httpServer.close() + : httpsServer.close() + // 依据用户设置显示被隐藏的管理器窗口 + if (UserConfigs.window.isManagerHide) { + if (ManagerWindow) { + ManagerWindow.show() + } + } + }) + + initPlayer() + Menu.setApplicationMenu(GameWindowMenu) + + ipcMain.on('main-loader-ready', () => { + // 加载本地服务器地址 + const http = UserConfigs.userData.useHttpServer + const port = (UserConfigs.userData.useHttpServer + ? (httpServer.address() as AddressInfo) + : (httpsServer.address() as AddressInfo) + ).port + const url = `http${ + UserConfigs.userData.useHttpServer ? '' : 's' + }://localhost:${port}/` + GameWindow.webContents.send('load-url', url, port, http) + }) + + GameWindow.on('minimize', () => { + GameWindow.webContents.send('get-local-storage') + }) + GameWindow.on('maximize', () => { + GameWindow.webContents.send('get-local-storage') + }) + ipcMain.on( + 'save-local-storage', + (event: Electron.Event, localStorage: string[][]) => { + UserConfigs.localStorage[ + RemoteDomains[UserConfigs.userData.serverToPlay.toString()].name + ] = localStorage.filter(arr => arr[1] !== '' && arr[1] !== 'FKU!!!') + SaveConfigJson(UserConfigs) + } + ) + + GameWindow.once('ready-to-show', () => { + // 设置页面缩放比例为 1 来防止缩放比例异常 + // 但这样会造成截图提示悬浮窗尺寸不合适 + GameWindow.webContents.setZoomFactor(1) + GameWindow.show() + // 窗口展示后,通知渲染窗口实际尺寸以便截图 + GameWindow.webContents.send('window-resize', GameWindow.getBounds()) + }) + + // 载入本地启动器 + GameWindow.loadURL('file://' + path.join(__dirname, '../bin/main/index.html')) + + // Detect environment variable to open developer tools + // 在 debug 启动环境下打开开发者工具 + if (process.env.NODE_ENV === 'development') { + GameWindow.webContents.openDevTools({ + mode: 'detach' + }) + } +} + +// tslint:disable-next-line +export const GameWindowMenu: Menu = new Menu() + +GameWindowMenu.append( + new MenuItem({ + label: '游戏', + role: 'services', + submenu: [ + { + label: '截图', + accelerator: 'F12', + click: (menuItem, browserWindow) => { + takeScreenshot(browserWindow.webContents) + } + }, + { + label: '截图', + accelerator: 'CmdOrCtrl+P', + enabled: true, + visible: false, + click: (menuItem, browserWindow) => { + takeScreenshot(browserWindow.webContents) + } + }, + { + label: '重新载入', + accelerator: 'CmdOrCtrl+R', + click: (menuItem, browserWindow) => { + browserWindow.reload() + } + }, + { + label: '退出游戏', + accelerator: 'Alt+F4', + click: (menuItem, browserWindow) => { + browserWindow.close() + } + } + ] + }) +) + +GameWindowMenu.append( + new MenuItem({ + label: '窗口', + role: 'window', + submenu: [ + { + label: '置顶', + accelerator: 'CmdOrCtrl+T', + click: (menuItem, browserWindow) => { + browserWindow.setAlwaysOnTop(!browserWindow.isAlwaysOnTop()) + } + }, + { + label: '全屏', + accelerator: 'F11', + click: (menuItem, browserWindow) => { + if (!UserConfigs.window.isKioskModeOn) { + browserWindow.setFullScreen(!browserWindow.isFullScreen()) + } else { + browserWindow.setKiosk(!browserWindow.isKiosk()) + } + } + }, + { + label: '全屏', + accelerator: 'F5', + enabled: true, + visible: false, + click: (menuItem, browserWindow) => { + if (!UserConfigs.window.isKioskModeOn) { + browserWindow.setFullScreen(!browserWindow.isFullScreen()) + } else { + browserWindow.setKiosk(!browserWindow.isKiosk()) + } + } + }, + { + label: '退出全屏', + accelerator: 'Esc', + click: (menuItem, browserWindow) => { + if (browserWindow.isFullScreen()) { + browserWindow.setFullScreen(false) + return + } + if (browserWindow.isKiosk()) { + browserWindow.setKiosk(false) + } + } + } + ] + }) +) + +GameWindowMenu.append( + new MenuItem({ + label: '编辑', + role: 'editMenu' + }) +) + +GameWindowMenu.append( + new MenuItem({ + label: '更多', + submenu: [ + { + label: '开发者工具', + accelerator: 'CmdOrCtrl+I', + click: (menuItem, browserWindow) => { + browserWindow.webContents.openDevTools({ mode: 'detach' }) + browserWindow.webContents.send('open-devtools') + } + } + ] + }) +) + +// 获取窗口标题,有 0.5% 概率显示为喵喵喵 +function getGameWindowTitle(): string { + // 彩蛋标题 + const titles = [ + { + text: i18n.text.main.programName(), + weight: 200 + }, + { + text: i18n.text.main.nya(), + weight: 1 + } + ] + const sumWeight = titles.reduce((last, value) => last + value.weight, 0) + let randomResult = Math.random() * sumWeight + + const index = titles.reduce((last: number | null, value, i) => { + if (typeof last === 'number' && Number.isInteger(last)) { + return last + } + + randomResult -= value.weight + if (randomResult <= 0) { + return i + } + + return null + }, null) + + return titles[index].text +} + +/** + * 截取屏幕画面 + * @param webContents + */ +export function takeScreenshot(webContents: WebContents) { + AudioPlayer.webContents.send( + 'audio-play', + path.join(__dirname, 'bin/audio/screenshot.mp3') + ) + webContents.send('take-screenshot') +} diff --git a/src/windows/manager.ts b/src/windows/manager.ts new file mode 100644 index 0000000..33e6e91 --- /dev/null +++ b/src/windows/manager.ts @@ -0,0 +1,92 @@ +import { + BrowserWindow, + BrowserWindowConstructorOptions, + ipcMain, + Menu +} from 'electron' +import * as path from 'path' +import { SaveConfigJson, UserConfigs } from '../config' +import { Global } from '../global' +import { MajsoulPlus } from '../majsoul_plus' +import { removeDirSync, updateObject } from '../utils' + +// tslint:disable-next-line +export let ManagerWindow: BrowserWindow +// tslint:disable-next-line +export const ManagerWindowStatus: MajsoulPlus.WindowStatus = { + visible: false, + muted: false +} + +export function initManagerWindow() { + // 清空菜单 + Menu.setApplicationMenu(null) + + const config: BrowserWindowConstructorOptions = { + ...Global.ManagerWindowConfig + } + // macOS 专有设置,设置背景为透明色 + if (process.platform === 'darwin') { + config.frame = false + config.titleBarStyle = 'hidden' + if (Number(process.versions.electron.split('.')[0]) > 2) { + config.vibrancy = 'light' + config.backgroundColor = 'rgba(0,0,0,0)' + } + } + + // 计算资源管理器缩放宽高 + config.width *= UserConfigs.window.zoomFactor + config.height *= UserConfigs.window.zoomFactor + + ManagerWindow = new BrowserWindow(config) + + ManagerWindow.once('ready-to-show', () => { + // 根据资源管理器设置的缩放宽高进行缩放操作 + ManagerWindow.webContents.setZoomFactor(UserConfigs.window.zoomFactor) + ManagerWindow.show() + }) + + // 阻止页面 title 更改 + ManagerWindow.on('page-title-updated', event => event.preventDefault()) + + // 隐藏窗口,发送消息提示储存设置,待返回消息后再真正关闭窗口 + ManagerWindow.once('close', event => { + event.preventDefault() + ManagerWindow.hide() + event.sender.send('save-config') + }) + + ipcMain.on('close-manager', () => { + ManagerWindow.close() + }) + + // 载入本地页面,对于 Linux 系统 file:// 不能省略 + ManagerWindow.loadURL( + 'file://' + path.join(__dirname, '../manager/index.html') + ) + + // 在 debug 环境下启动会打开开发者工具 + if (process.env.NODE_ENV === 'development') { + ManagerWindow.webContents.openDevTools({ mode: 'detach' }) + } + + ipcMain.on('clear-cache', (event: Electron.Event) => { + removeDirSync(Global.LocalCachePath) + event.returnValue = 0 + }) + + ipcMain.on( + 'update-user-config', + (event: Electron.Event, config: MajsoulPlus.UserConfig) => { + updateObject(UserConfigs, config) + SaveConfigJson(config) + + ManagerWindow.setContentSize( + Global.ManagerWindowConfig.width * UserConfigs.window.zoomFactor, + Global.ManagerWindowConfig.height * UserConfigs.window.zoomFactor + ) + ManagerWindow.webContents.setZoomFactor(UserConfigs.window.zoomFactor) + } + ) +} diff --git a/src/windows/sandbox-preload.ts b/src/windows/sandbox-preload.ts new file mode 100644 index 0000000..50f00e3 --- /dev/null +++ b/src/windows/sandbox-preload.ts @@ -0,0 +1,86 @@ +import * as fs from 'fs' +import * as electron from 'electron' +const path = electron.remote.require('path') + +// tslint:disable-next-line +const __dirname = electron.ipcRenderer.sendSync('sandbox-dirname-request') + +// tslint:disable-next-line +const __appdata = electron.ipcRenderer.sendSync('sandbox-appdata-request') + +// tslint:disable-next-line +const MajsoulPlus: any = {} + +function isSubFolder(parent: string, dir: string): boolean { + const relative = path.relative(parent, dir) + return relative && !relative.startsWith('..') && !path.isAbsolute(relative) +} + +function isMajsoulPlusSubFolder(dir: string) { + return ( + isSubFolder(MajsoulPlus.__dirname, dir) || + isSubFolder(MajsoulPlus.__appdata, dir) + ) +} + +// Global Path +MajsoulPlus.__dirname = __dirname +MajsoulPlus.__appdata = __appdata +MajsoulPlus.globalPath = { + LocalDir: '/static', + ResourcePackDir: 'resourcepack', + ExtensionDir: 'extension', + ToolsDir: 'tool' +} + +// fs +MajsoulPlus.fs = {} +MajsoulPlus.fs.readFileSync = (dir: string) => { + if (!isMajsoulPlusSubFolder(path.resolve(dir))) { + console.error(`invalid dir: ${dir}`) + throw new Error(`invalid dir: ${dir}`) + } + return fs.readFileSync(dir, { encoding: 'utf-8' }) +} + +MajsoulPlus.fs.writeFile = (dir: string, data, callback) => { + if (!isMajsoulPlusSubFolder(path.resolve(dir))) { + console.error(`invalid dir: ${dir}`) + callback(new Error(`invalid dir: ${dir}`)) + return + } + fs.writeFile(dir, data, callback) +} + +MajsoulPlus.fs.writeFileSync = (dir: string, data, options) => { + if (!isMajsoulPlusSubFolder(path.resolve(dir))) { + console.error(`invalid dir: ${dir}`) + return + } + fs.writeFileSync(dir, data, options) +} + +MajsoulPlus.fs.mkdirSync = (dir: string) => { + if (!isMajsoulPlusSubFolder(path.resolve(dir))) { + console.error(`invalid dir: ${dir}`) + throw new Error(`invalid dir: ${dir}`) + return + } + fs.mkdirSync(dir) +} + +MajsoulPlus.fs.statSync = (dir: string) => { + if (!isMajsoulPlusSubFolder(path.resolve(dir))) { + console.error(`invalid dir: ${dir}`) + throw new Error(`invalid dir: ${dir}`) + } + return fs.statSync(dir) +} + +// path +MajsoulPlus.path = path + +// export +Object.freeze(MajsoulPlus) +window['MajsoulPlus'] = MajsoulPlus +window['Buffer'] = Buffer diff --git a/src/windows/tool.ts b/src/windows/tool.ts new file mode 100644 index 0000000..cb918e8 --- /dev/null +++ b/src/windows/tool.ts @@ -0,0 +1,83 @@ +import { BrowserWindow, ipcMain } from 'electron' +import * as path from 'path' +import { Global } from '../global' +import { MajsoulPlus } from '../majsoul_plus' +import { ToolManager } from '../tool/tool' +import { ManagerWindow } from './manager' + +class ToolWindow { + private window: BrowserWindow + + constructor(id: string) { + const localConfig = ToolManager.getDetail(id) as MajsoulPlus.ToolConfig + const toolWindowConfig = { + ...Global.ToolWindowConfig, + ...localConfig.windowOptions, + ...{ + show: false, + parent: ManagerWindow, + webPreferences: { + sandbox: true, + preload: path.join(__dirname, 'sandbox-preload.js') + } + } + } + + this.window = new BrowserWindow(toolWindowConfig) + + if (process.env.NODE_ENV === 'development') { + this.window.webContents.openDevTools({ + mode: 'detach' + }) + } + + this.window.loadURL( + 'file://' + + path.join(Global.ToolFolderPath, id, localConfig.index || 'index.html') + ) + + this.window.on('close', event => { + event.preventDefault() + this.hide() + }) + } + + show() { + this.window.show() + } + + hide() { + this.window.hide() + } + + openDevTools() { + this.window.webContents.openDevTools({ mode: 'detach' }) + } +} + +class ToolMapManager { + private toolWindows: Map = new Map() + + private load(id: string) { + const toolWindow = new ToolWindow(id) + this.toolWindows.set(id, toolWindow) + if (process.env.NODE_ENV === 'development') { + toolWindow.openDevTools() + } + } + + start(id: string) { + if (!this.toolWindows.has(id)) { + this.load(id) + } + this.toolWindows.get(id).show() + } +} + +export function initToolManager() { + const manager = new ToolMapManager() + + ipcMain.on('start-tool', (event: Electron.Event, id: string) => { + manager.start(id) + }) +} diff --git a/tool/desktopCreator/index.html b/tool/desktopCreator/index.html index 7c8249b..f8e10e3 100644 --- a/tool/desktopCreator/index.html +++ b/tool/desktopCreator/index.html @@ -9,7 +9,8 @@
@@ -25,8 +26,8 @@ max="100" />
-
-
+
+


diff --git a/tool/desktopCreator/script.js b/tool/desktopCreator/script.js index 4a94a3c..b6e5aae 100644 --- a/tool/desktopCreator/script.js +++ b/tool/desktopCreator/script.js @@ -1,6 +1,3 @@ -/** - * @type {HTMLCanvasElement} - */ const canvas = document.getElementById('canvas') const context = canvas.getContext('2d') const darknessRange = document.getElementById('darknessRange') @@ -13,7 +10,7 @@ const contextPreview = canvasPreview.getContext('2d') const drawView = event => { const file = selectImg.files[0] - if (typeof file == 'undefined' || file.size <= 0) { + if (typeof file === 'undefined' || file.size <= 0) { return } const fileReader = new FileReader() @@ -91,20 +88,34 @@ darknessRange.addEventListener('change', event => { selectImg.addEventListener('change', drawView) saveAndInstall.addEventListener('click', event => { - const fs = require('fs') - const config = require('../../configs') - const path = require('path') - const dirName = document.getElementById('dirName').value + const fs = MajsoulPlus.fs + const path = MajsoulPlus.path + const id = document.getElementById('dirName').value const name = document.getElementById('name').value const author = document.getElementById('author').value const description = document.getElementById('description').value - const dirPath = path.join(__dirname, '../../', config.MODS_DIR, dirName) - if (dirName.length < 4) { - alert('文件夹名长度过短') + const resDir = path.join( + MajsoulPlus.__appdata, + MajsoulPlus.globalPath.ResourcePackDir + ) + const stat_dir = (() => { + try { + return fs.statSync(resDir) + } catch (e) { + return null + } + })() + if (!stat_dir) { + fs.mkdirSync(resDir) + } + + const dirPath = path.join(resDir, id) + if (!id.match(/^[_a-zA-Z0-9]+$/)) { + alert('资源包 ID 格式只能含有大小写字母、数字和下划线!') return } if (name.length === 0) { - alert('Mod名称不能为空') + alert('资源包名称不能为空') return } const stat = (() => { @@ -119,26 +130,33 @@ saveAndInstall.addEventListener('click', event => { return } fs.mkdirSync(dirPath) - fs.mkdirSync(path.join(dirPath, '/files')) - const modInfo = { + fs.mkdirSync(path.join(dirPath, '/assets')) + const respInfo = { + id: id, + version: '1.0.0', name, author, description, - dir: '/files', - preview: '/files/preview.jpg', + preview: 'assets/preview.jpg', + replace: [ { from: - '/0/[^/]+/scene/Assets/Resource/tablecloth/tablecloth_default/Table_Dif.jpg', - to: '/Table_Dif.jpg' + 'scene/Assets/Resource/tablecloth/tablecloth_default/Table_Dif.jpg', + to: 'Table_Dif.jpg', + 'all-servers': true }, { - from: '/0/[^/]+/myres2/tablecloth/tablecloth_default/preview.jpg', - to: '/preview.jpg' + from: 'myres2/tablecloth/tablecloth_default/preview.jpg', + to: 'preview.jpg', + 'all-servers': true } ] } - fs.writeFileSync(path.join(dirPath, 'mod.json'), JSON.stringify(modInfo)) + fs.writeFileSync( + path.join(dirPath, 'resourcepack.json'), + JSON.stringify(respInfo) + ) const desktopData = canvas .toDataURL('image/jpeg', 1) .replace(/^data:image\/\w+;base64,/, '') @@ -148,7 +166,7 @@ saveAndInstall.addEventListener('click', event => { Promise.all([ new Promise(resolve => fs.writeFile( - path.join(dirPath, '/files', 'Table_Dif.jpg'), + path.join(dirPath, '/assets', 'Table_Dif.jpg'), Buffer.from(desktopData, 'base64'), err => { if (err) { @@ -161,7 +179,7 @@ saveAndInstall.addEventListener('click', event => { ), new Promise(resolve => fs.writeFile( - path.join(dirPath, '/files', 'preview.jpg'), + path.join(dirPath, 'assets', 'preview.jpg'), Buffer.from(previewData, 'base64'), err => { if (err) { @@ -173,6 +191,6 @@ saveAndInstall.addEventListener('click', event => { ) ) ]).then(() => { - alert('已保存!\n请刷新模组后启用') + alert('已保存!\n请刷新资源包列表后启用') }) }) diff --git a/tool/desktopCreator/style.css b/tool/desktopCreator/style.css index 046ef10..26cfc09 100644 --- a/tool/desktopCreator/style.css +++ b/tool/desktopCreator/style.css @@ -24,12 +24,12 @@ @font-face { font-family: '思源黑体 CN'; - src: url('../../manager/SourceHanSansCN-Light.otf') format('opentype'); + src: url('./SourceHanSansCN-Light.otf') format('opentype'); font-weight: 300; } @font-face { font-family: '思源黑体 CN'; - src: url('../../manager/SourceHanSansCN-Normal.otf') format('opentype'); + src: url('./SourceHanSansCN-Normal.otf') format('opentype'); font-weight: 400; } @@ -45,6 +45,7 @@ body { height: 360px; width: 640px; + padding: 12px; overflow: hidden; background-color: var(--section-color); } diff --git a/tool/desktopCreator/tool.json b/tool/desktopCreator/tool.json index 0a238a5..ee85a44 100644 --- a/tool/desktopCreator/tool.json +++ b/tool/desktopCreator/tool.json @@ -1,8 +1,10 @@ { + "id": "desktopCreator", "name": "桌布制作工具", "author": "Handle", - "description": "简单几步生成桌布Mod,桌布随心换", + "description": "简单几步生成桌布资源包,桌布随心换", "index": "index.html", + "preview": "preview.jpg", "windowOptions": { "width": 640, "height": 360 diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..b98dd99 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "es2016", + "module": "commonjs", + "noImplicitAny": false, + "noImplicitReturns": true, + "removeComments": true, + "preserveConstEnums": true, + "outDir": "./dist", + "sourceMap": true, + "pretty": true, + "resolveJsonModule": true + // "strict": true + }, + "include": ["src/*.ts", "src/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..e5605a8 --- /dev/null +++ b/tslint.json @@ -0,0 +1,19 @@ +{ + "extends": "gts/tslint.json", + "rules": { + "quotemark": { + "options": "single", + "severity": "error" + }, + "semicolon": { + "options": "never", + "severity": "error" + }, + "variable-name": { + "severity": "warn" + }, + "no-default-export": { + "severity": "off" + } + } +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..48f6d04 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3367 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"7zip-bin@~4.1.0": + version "4.1.0" + resolved "http://registry.npm.taobao.org/7zip-bin/download/7zip-bin-4.1.0.tgz#33eff662a5c39c0c2061170cc003c5120743fff0" + integrity sha1-M+/2YqXDnAwgYRcMwAPFEgdD//A= + +"@types/accepts@*": + version "1.3.5" + resolved "http://registry.npm.taobao.org/@types/accepts/download/@types/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" + integrity sha1-w0vsEVz8dG4E/loFnfTOfns5FXU= + dependencies: + "@types/node" "*" + +"@types/adm-zip@^0.4.13": + version "0.4.32" + resolved "http://registry.npm.taobao.org/@types/adm-zip/download/@types/adm-zip-0.4.32.tgz#6de01309af60677065d2e52b417a023303220931" + integrity sha1-beATCa9gZ3Bl0uUrQXoCMwMiCTE= + dependencies: + "@types/node" "*" + +"@types/body-parser@*": + version "1.17.0" + resolved "http://registry.npm.taobao.org/@types/body-parser/download/@types/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" + integrity sha1-n1ydm9BLtUvjLV65/A2Ml05s9Yw= + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.32" + resolved "http://registry.npm.taobao.org/@types/connect/download/@types/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" + integrity sha1-qg6WFrlDXMrQK8UrW0VP/Cxwuig= + dependencies: + "@types/node" "*" + +"@types/cookies@*": + version "0.7.1" + resolved "http://registry.npm.taobao.org/@types/cookies/download/@types/cookies-0.7.1.tgz#f9f204bd6767d389eea3b87609e30c090c77a540" + integrity sha1-+fIEvWdn04nuo7h2CeMMCQx3pUA= + dependencies: + "@types/connect" "*" + "@types/express" "*" + "@types/keygrip" "*" + "@types/node" "*" + +"@types/express-serve-static-core@*": + version "4.16.2" + resolved "http://registry.npm.taobao.org/@types/express-serve-static-core/download/@types/express-serve-static-core-4.16.2.tgz#5ee8a22e602005be6767df6b2cba9879df3f75aa" + integrity sha1-XuiiLmAgBb5nZ99rLLqYed8/dao= + dependencies: + "@types/node" "*" + "@types/range-parser" "*" + +"@types/express@*": + version "4.16.1" + resolved "http://registry.npm.taobao.org/@types/express/download/@types/express-4.16.1.tgz#d756bd1a85c34d87eaf44c888bad27ba8a4b7cf0" + integrity sha1-11a9GoXDTYfq9EyIi60nuopLfPA= + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/serve-static" "*" + +"@types/http-assert@*": + version "1.4.0" + resolved "http://registry.npm.taobao.org/@types/http-assert/download/@types/http-assert-1.4.0.tgz#41d173466e396e99a14d75f7160cc997f2f9ed8b" + integrity sha1-QdFzRm45bpmhTXX3FgzJl/L57Ys= + +"@types/keygrip@*": + version "1.0.1" + resolved "http://registry.npm.taobao.org/@types/keygrip/download/@types/keygrip-1.0.1.tgz#ff540462d2fb4d0a88441ceaf27d287b01c3d878" + integrity sha1-/1QEYtL7TQqIRBzq8n0oewHD2Hg= + +"@types/koa-compose@*": + version "3.2.3" + resolved "http://registry.npm.taobao.org/@types/koa-compose/download/@types/koa-compose-3.2.3.tgz#4e2981f7bc4ce0f4797219516a91bf6ff3a70fa1" + integrity sha1-TimB97xM4PR5chlRapG/b/OnD6E= + dependencies: + "@types/koa" "*" + +"@types/koa-router@^7.0.42": + version "7.0.42" + resolved "https://registry.yarnpkg.com/@types/koa-router/-/koa-router-7.0.42.tgz#0e5c01d4d0a2873d402d432114f08372d7c50eb1" + integrity sha512-mggrNY7Ywwjt7QjaMAlbb1ixE+v7AFskOeyKdmZT/NvPVEAo48gYUxIcF8ILlMc3eg1bo6SxNoUcbxhTv7edrA== + dependencies: + "@types/koa" "*" + +"@types/koa@*", "@types/koa@^2.0.48": + version "2.0.48" + resolved "http://registry.npm.taobao.org/@types/koa/download/@types/koa-2.0.48.tgz#29162783029d3e5df8b58c55f6bf0d35f78fc39f" + integrity sha1-KRYngwKdPl34tYxV9r8NNfePw58= + dependencies: + "@types/accepts" "*" + "@types/cookies" "*" + "@types/http-assert" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/mime@*": + version "2.0.1" + resolved "http://registry.npm.taobao.org/@types/mime/download/@types/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" + integrity sha1-3EiIQjEqfwdRSTEpBbXjwLBUx50= + +"@types/ncp@^2.0.1": + version "2.0.1" + resolved "https://registry.npm.taobao.org/@types/ncp/download/@types/ncp-2.0.1.tgz#749432511f6ad747d04e98837b18cca9045567fb" + integrity sha1-dJQyUR9q10fQTpiDexjMqQRVZ/s= + dependencies: + "@types/node" "*" + +"@types/node@*": + version "11.13.0" + resolved "http://registry.npm.taobao.org/@types/node/download/@types/node-11.13.0.tgz#b0df8d6ef9b5001b2be3a94d909ce3c29a80f9e1" + integrity sha1-sN+Nbvm1ABsr46lNkJzjwpqA+eE= + +"@types/node@^8.0.24": + version "8.10.45" + resolved "http://registry.npm.taobao.org/@types/node/download/@types/node-8.10.45.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-8.10.45.tgz#4c49ba34106bc7dced77ff6bae8eb6543cde8351" + integrity sha1-TEm6NBBrx9ztd/9rro62VDzeg1E= + +"@types/range-parser@*": + version "1.2.3" + resolved "http://registry.npm.taobao.org/@types/range-parser/download/@types/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" + integrity sha1-fuMwunyq+5gJC+zoal7kQRWQTCw= + +"@types/semver@^6.0.0": + version "6.0.0" + resolved "http://registry.npm.taobao.org/@types/semver/download/@types/semver-6.0.0.tgz#86ba89f02a414e39c68d02b351872e4ed31bd773" + integrity sha1-hrqJ8CpBTjnGjQKzUYcuTtMb13M= + +"@types/serve-static@*": + version "1.13.2" + resolved "http://registry.npm.taobao.org/@types/serve-static/download/@types/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" + integrity sha1-9axNemQgqZpqRa9HGfTc2M2Qekg= + dependencies: + "@types/express-serve-static-core" "*" + "@types/mime" "*" + +"@types/tcp-ping@^0.1.0": + version "0.1.0" + resolved "https://registry.npm.taobao.org/@types/tcp-ping/download/@types/tcp-ping-0.1.0.tgz#f8e02d8cfc16f511d1364889e39408896b02a99a" + integrity sha1-+OAtjPwW9RHRNkiJ45QIiWsCqZo= + +abbrev@1: + version "1.1.1" + resolved "http://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fabbrev%2Fdownload%2Fabbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg= + +accepts@^1.3.5: + version "1.3.5" + resolved "http://registry.npm.taobao.org/accepts/download/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + +"adm-zip@git+https://github.com/cthackers/adm-zip.git": + version "0.4.12" + resolved "git+https://github.com/cthackers/adm-zip.git#ff17ae85000b62b9d159e2520564902724d26c17" + +ajv-keywords@^3.4.0: + version "3.4.0" + resolved "http://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" + integrity sha1-S4Mee1MUFafMUYzUBOc/YZPGNJ0= + +ajv@^6.10.0, ajv@^6.5.5, ajv@^6.9.2: + version "6.10.0" + resolved "http://registry.npm.taobao.org/ajv/download/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + integrity sha1-kNDVRDnaWHzX6EO/twRfUL0ivfE= + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "http://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + +ansi-align@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/ansi-align/download/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc= + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= + dependencies: + color-convert "^1.9.0" + +any-promise@^1.1.0: + version "1.3.0" + resolved "http://registry.npm.taobao.org/any-promise/download/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + +app-builder-bin@2.6.6: + version "2.6.6" + resolved "https://registry.npm.taobao.org/app-builder-bin/download/app-builder-bin-2.6.6.tgz#904b0576a510047d03f63c8a02c38eef47871180" + integrity sha1-kEsFdqUQBH0D9jyKAsOO70eHEYA= + +app-builder-lib@20.40.2, app-builder-lib@~20.40.0: + version "20.40.2" + resolved "https://registry.npm.taobao.org/app-builder-lib/download/app-builder-lib-20.40.2.tgz#b0f0c82ed6a59bf660d861531b063a99d3e2b442" + integrity sha1-sPDILtalm/Zg2GFTGwY6mdPitEI= + dependencies: + "7zip-bin" "~4.1.0" + app-builder-bin "2.6.6" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.7" + builder-util "9.7.1" + builder-util-runtime "8.2.1" + chromium-pickle-js "^0.2.0" + debug "^4.1.1" + ejs "^2.6.1" + electron-osx-sign "0.4.11" + electron-publish "20.40.0" + fs-extra-p "^7.0.1" + hosted-git-info "^2.7.1" + is-ci "^2.0.0" + isbinaryfile "^4.0.0" + js-yaml "^3.13.0" + lazy-val "^1.0.4" + minimatch "^3.0.4" + normalize-package-data "^2.5.0" + plist "^3.0.1" + read-config-file "3.2.2" + sanitize-filename "^1.6.1" + semver "^6.0.0" + temp-file "^3.3.2" + +aproba@^1.0.3: + version "1.2.0" + resolved "http://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha1-aALmJk79GMeQobDVF/DyYnvyyUo= + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "http://registry.npm.taobao.org/are-we-there-yet/download/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha1-SzXClE8GKov82mZBB2A1D+nd/CE= + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "http://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE= + dependencies: + sprintf-js "~1.0.2" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "http://registry.npm.taobao.org/array-find-index/download/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +arrify@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/arrify/download/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asn1@~0.2.3: + version "0.2.4" + resolved "http://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha1-jSR136tVO7M+d7VOWeiAu4ziMTY= + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +async-exit-hook@^2.0.1: + version "2.0.1" + resolved "http://registry.npm.taobao.org/async-exit-hook/download/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" + integrity sha1-i9iwJLDsmxwBzMua+dspvXF9+vM= + +async-foreach@^0.1.3: + version "0.1.3" + resolved "http://registry.npm.taobao.org/async-foreach/download/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= + +async@^1.5.2: + version "1.5.2" + resolved "http://registry.npm.taobao.org/async/download/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + +asynckit@^0.4.0: + version "0.4.0" + resolved "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.8.0" + resolved "http://registry.npm.taobao.org/aws4/download/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8= + +babel-code-frame@^6.22.0: + version "6.26.0" + resolved "http://registry.npm.taobao.org/babel-code-frame/download/babel-code-frame-6.26.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-code-frame%2Fdownload%2Fbabel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.2.3: + version "1.3.0" + resolved "http://registry.npm.taobao.org/base64-js/download/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha1-yrHmEY8FEJXli1KBrqjBzSK/wOM= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +block-stream@*: + version "0.0.9" + resolved "http://registry.npm.taobao.org/block-stream/download/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + dependencies: + inherits "~2.0.0" + +bluebird-lst@^1.0.6, bluebird-lst@^1.0.7: + version "1.0.7" + resolved "http://registry.npm.taobao.org/bluebird-lst/download/bluebird-lst-1.0.7.tgz#f0babade9ef1dce3989b603f3796ff3b16b90d50" + integrity sha1-8Lq63p7x3OOYm2A/N5b/Oxa5DVA= + dependencies: + bluebird "^3.5.3" + +bluebird@^3.5.0, bluebird@^3.5.3: + version "3.5.3" + resolved "http://registry.npm.taobao.org/bluebird/download/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" + integrity sha1-fQHG+WFsmlGrD4xUmnnf5uwz76c= + +boxen@^1.2.1: + version "1.3.0" + resolved "http://registry.npm.taobao.org/boxen/download/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha1-VcbDmouljZxhrSLNh3Uy3rZlogs= + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0= + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/buffer-alloc-unsafe/download/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha1-vX3CauKXLQ7aJTvgYdupkjScGfA= + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "http://registry.npm.taobao.org/buffer-alloc/download/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha1-iQ3ZDZI6hz4I4Q5f1RpX5bfM4Ow= + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/buffer-fill/download/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "http://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8= + +builder-util-runtime@8.2.1, builder-util-runtime@^8.2.1: + version "8.2.1" + resolved "https://registry.npm.taobao.org/builder-util-runtime/download/builder-util-runtime-8.2.1.tgz#2d16be6cb040b3654d84b76487256158e60b6e3b" + integrity sha1-LRa+bLBAs2VNhLdkhyVhWOYLbjs= + dependencies: + bluebird-lst "^1.0.7" + debug "^4.1.1" + fs-extra-p "^7.0.1" + sax "^1.2.4" + +builder-util@9.7.1, builder-util@~9.7.1: + version "9.7.1" + resolved "https://registry.npm.taobao.org/builder-util/download/builder-util-9.7.1.tgz#31234b48ac574eb1cd4b4eaa982c0480571eae7a" + integrity sha1-MSNLSKxXTrHNS06qmCwEgFcerno= + dependencies: + "7zip-bin" "~4.1.0" + app-builder-bin "2.6.6" + bluebird-lst "^1.0.7" + builder-util-runtime "^8.2.1" + chalk "^2.4.2" + debug "^4.1.1" + fs-extra-p "^7.0.1" + is-ci "^2.0.0" + js-yaml "^3.13.0" + source-map-support "^0.5.11" + stat-mode "^0.3.0" + temp-file "^3.3.2" + +builtin-modules@^1.1.1: + version "1.1.1" + resolved "http://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + +cache-content-type@^1.0.0: + version "1.0.1" + resolved "http://registry.npm.taobao.org/cache-content-type/download/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" + integrity sha1-A1zeKwjuISn0qDFeqPAKANuhRTw= + dependencies: + mime-types "^2.1.18" + ylru "^1.2.0" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/camelcase-keys/download/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase-keys@^4.0.0: + version "4.2.0" + resolved "http://registry.npm.taobao.org/camelcase-keys/download/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" + integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= + dependencies: + camelcase "^4.1.0" + map-obj "^2.0.0" + quick-lru "^1.0.0" + +camelcase@^2.0.0: + version "2.1.1" + resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + +camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" + resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-4.1.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +camelcase@^5.0.0: + version "5.3.0" + resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-5.3.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-5.3.0.tgz#0a110882cbeba41f72f99fcf918f4a0a92a13ebf" + integrity sha1-ChEIgsvrpB9y+Z/PkY9KCpKhPr8= + +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "http://registry.npm.taobao.org/capture-stack-trace/download/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha1-psC74fOPOqC5Ijjstv9Cw0TUE10= + +caseless@~0.12.0: + version "0.12.0" + resolved "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "http://registry.npm.taobao.org/chardet/download/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha1-kAlISfCTfy7twkJdDSip5fDLrZ4= + +chromium-pickle-js@^0.2.0: + version "0.2.0" + resolved "http://registry.npm.taobao.org/chromium-pickle-js/download/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" + integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU= + +ci-info@^1.5.0: + version "1.6.0" + resolved "http://registry.npm.taobao.org/ci-info/download/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc= + +ci-info@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/ci-info/download/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha1-Z6npZL4xpR4V5QENWObxKDQAL0Y= + +clang-format@1.2.3: + version "1.2.3" + resolved "http://registry.npm.taobao.org/clang-format/download/clang-format-1.2.3.tgz#2763561aa7449c43737480f8df3a2b5b66e6cf37" + integrity sha1-J2NWGqdEnENzdID43zorW2bmzzc= + dependencies: + async "^1.5.2" + glob "^7.0.0" + resolve "^1.1.6" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/cli-boxes/download/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "http://registry.npm.taobao.org/cli-width/download/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cliui@^3.2.0: + version "3.2.0" + resolved "http://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^4.0.0: + version "4.1.0" + resolved "http://registry.npm.taobao.org/cliui/download/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha1-NIQi2+gtgAswIu709qwQvy5NG0k= + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "http://registry.npm.taobao.org/co/download/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +code-point-at@^1.0.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +color-convert@^1.9.0: + version "1.9.3" + resolved "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= + dependencies: + color-name "1.1.3" + +color-convert@~0.5.0: + version "0.5.3" + resolved "http://registry.npm.taobao.org/color-convert/download/color-convert-0.5.3.tgz#bdb6c69ce660fadffe0b0007cc447e1b9f7282bd" + integrity sha1-vbbGnOZg+t/+CwAHzER+G59ygr0= + +color-name@1.1.3: + version "1.1.3" + resolved "http://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.7" + resolved "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" + integrity sha1-LR0kMXr7ir6V1tLAsHtXgTU52Cg= + dependencies: + delayed-stream "~1.0.0" + +comma-separated-values@^3.6.4: + version "3.6.4" + resolved "http://registry.npm.taobao.org/comma-separated-values/download/comma-separated-values-3.6.4.tgz#c309ec7024f74b7ae19223372054242617e35bd2" + integrity sha1-wwnscCT3S3rhkiM3IFQkJhfjW9I= + +commander@^2.12.1: + version "2.20.0" + resolved "http://registry.npm.taobao.org/commander/download/commander-2.20.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha1-1YuytcHuj4ew00ACfp6U4iLFpCI= + +compare-version@^0.1.2: + version "0.1.2" + resolved "http://registry.npm.taobao.org/compare-version/download/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" + integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA= + +concat-map@0.0.1: + version "0.0.1" + resolved "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@1.6.2: + version "1.6.2" + resolved "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ= + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +configstore@^3.0.0: + version "3.1.2" + resolved "http://registry.npm.taobao.org/configstore/download/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha1-xvJd767vJt8S3TNBSwAf6BpUP48= + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/console-control-strings/download/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +content-disposition@~0.5.2: + version "0.5.3" + resolved "http://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70= + dependencies: + safe-buffer "5.1.2" + +content-type@^1.0.4: + version "1.0.4" + resolved "http://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha1-4TjMdeBAxyexlm/l5fjJruJW/js= + +cookies@~0.7.1: + version "0.7.3" + resolved "http://registry.npm.taobao.org/cookies/download/cookies-0.7.3.tgz#7912ce21fbf2e8c2da70cf1c3f351aecf59dadfa" + integrity sha1-eRLOIfvy6MLacM8cPzUa7PWdrfo= + dependencies: + depd "~1.1.2" + keygrip "~1.0.3" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +create-error-class@^3.0.0: + version "3.0.2" + resolved "http://registry.npm.taobao.org/create-error-class/download/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + +cross-env@^5.2.0: + version "5.2.0" + resolved "http://registry.npm.taobao.org/cross-env/download/cross-env-5.2.0.tgz#6ecd4c015d5773e614039ee529076669b9d126f2" + integrity sha1-bs1MAV1Xc+YUA57lKQdmabnRJvI= + dependencies: + cross-spawn "^6.0.5" + is-windows "^1.0.0" + +cross-spawn@^3.0.0: + version "3.0.1" + resolved "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q= + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/crypto-random-string/download/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "http://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +dashdash@^1.12.0: + version "1.14.1" + resolved "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.6.8: + version "2.6.9" + resolved "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8= + dependencies: + ms "2.0.0" + +debug@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.1: + version "4.1.1" + resolved "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E= + dependencies: + ms "^2.1.1" + +debug@~3.1.0: + version "3.1.0" + resolved "http://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE= + dependencies: + ms "2.0.0" + +decamelize-keys@^1.0.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/decamelize-keys/download/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: + version "1.2.0" + resolved "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +deep-equal@~1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/deep-equal/download/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "http://registry.npm.taobao.org/deep-extend/download/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw= + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/delegates/download/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@^1.1.2, depd@~1.1.2: + version "1.1.2" + resolved "http://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@^1.0.4: + version "1.0.4" + resolved "http://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +diff@^3.2.0, diff@^3.5.0: + version "3.5.0" + resolved "http://registry.npm.taobao.org/diff/download/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI= + +dmg-builder@6.6.1: + version "6.6.1" + resolved "https://registry.npm.taobao.org/dmg-builder/download/dmg-builder-6.6.1.tgz#d1761e36e624ebe3f6c57a8c4d728b95b51fb255" + integrity sha1-0XYeNuYk6+P2xXqMTXKLlbUfslU= + dependencies: + app-builder-lib "~20.40.0" + bluebird-lst "^1.0.7" + builder-util "~9.7.1" + fs-extra-p "^7.0.1" + iconv-lite "^0.4.24" + js-yaml "^3.13.0" + parse-color "^1.0.0" + sanitize-filename "^1.6.1" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "http://registry.npm.taobao.org/dot-prop/download/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc= + dependencies: + is-obj "^1.0.0" + +dotenv-expand@^4.2.0: + version "4.2.0" + resolved "http://registry.npm.taobao.org/dotenv-expand/download/dotenv-expand-4.2.0.tgz#def1f1ca5d6059d24a766e587942c21106ce1275" + integrity sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU= + +dotenv@^6.2.0: + version "6.2.0" + resolved "http://registry.npm.taobao.org/dotenv/download/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" + integrity sha1-lBwEEFNdlCyL7PKNPzV9vZ1HYGQ= + +duplexer3@^0.1.4: + version "0.1.4" + resolved "http://registry.npm.taobao.org/duplexer3/download/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1: + version "2.6.1" + resolved "http://registry.npm.taobao.org/ejs/download/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" + integrity sha1-SY7A1JVlWrxvI81hho2SZGQHGqA= + +electron-builder@^20.40.2: + version "20.40.2" + resolved "https://registry.npm.taobao.org/electron-builder/download/electron-builder-20.40.2.tgz#434751bbb57be17513eb501848a52d2573a307bb" + integrity sha1-Q0dRu7V74XUT61AYSKUtJXOjB7s= + dependencies: + app-builder-lib "20.40.2" + bluebird-lst "^1.0.7" + builder-util "9.7.1" + builder-util-runtime "8.2.1" + chalk "^2.4.2" + dmg-builder "6.6.1" + fs-extra-p "^7.0.1" + is-ci "^2.0.0" + lazy-val "^1.0.4" + read-config-file "3.2.2" + sanitize-filename "^1.6.1" + update-notifier "^2.5.0" + yargs "^13.2.2" + +electron-download@^3.0.1: + version "3.3.0" + resolved "http://registry.npm.taobao.org/electron-download/download/electron-download-3.3.0.tgz#2cfd54d6966c019c4d49ad65fbe65cc9cdef68c8" + integrity sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg= + dependencies: + debug "^2.2.0" + fs-extra "^0.30.0" + home-path "^1.0.1" + minimist "^1.2.0" + nugget "^2.0.0" + path-exists "^2.1.0" + rc "^1.1.2" + semver "^5.3.0" + sumchecker "^1.2.0" + +electron-fetch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.3.0.tgz#00d9bb1fe7a66ddc3fea538910e01b26fee9abb5" + integrity sha512-WzHnWZqKdiCKHqqHu+GphezoWRSUVH6BQ/f13vu16VwYKJRZNt2dUrx40eZJcyZcDGn6RJDTAHS6jVoHoglgNw== + dependencies: + encoding "^0.1.12" + +electron-osx-sign@0.4.11: + version "0.4.11" + resolved "http://registry.npm.taobao.org/electron-osx-sign/download/electron-osx-sign-0.4.11.tgz#8377732fe7b207969f264b67582ee47029ce092f" + integrity sha1-g3dzL+eyB5afJktnWC7kcCnOCS8= + dependencies: + bluebird "^3.5.0" + compare-version "^0.1.2" + debug "^2.6.8" + isbinaryfile "^3.0.2" + minimist "^1.2.0" + plist "^3.0.1" + +electron-publish@20.40.0: + version "20.40.0" + resolved "https://registry.npm.taobao.org/electron-publish/download/electron-publish-20.40.0.tgz#156eacd9b8bab563a3f8723e9b45214915a9681d" + integrity sha1-FW6s2bi6tWOj+HI+m0UhSRWpaB0= + dependencies: + bluebird-lst "^1.0.7" + builder-util "~9.7.1" + builder-util-runtime "^8.2.1" + chalk "^2.4.2" + fs-extra-p "^7.0.1" + lazy-val "^1.0.4" + mime "^2.4.1" + +electron@^2.0.13: + version "2.0.18" + resolved "https://registry.yarnpkg.com/electron/-/electron-2.0.18.tgz#52f1b248c3cc013b5a870094de3b6ba5de313a0f" + integrity sha512-PQRHtFvLxHdJzMMIwTddUtkS+Te/fZIs+PHO+zPmTUTBE76V3Od3WRGzMQwiJHxN679licmCKhJpMyxZfDEVWQ== + dependencies: + "@types/node" "^8.0.24" + electron-download "^3.0.1" + extract-zip "^1.0.3" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "http://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY= + +encoding@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@^1.1.0: + version "1.4.1" + resolved "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha1-7SljTRm6ukY7bOa4CjchPqtx7EM= + dependencies: + once "^1.4.0" + +entities@^1.1.1: + version "1.1.2" + resolved "http://registry.npm.taobao.org/entities/download/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha1-vfpzUplmTfr9NFKe1PhSKidf6lY= + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha1-tKxAZIEH/c3PriQvQovqihTU8b8= + dependencies: + is-arrayish "^0.2.1" + +error-inject@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/error-inject/download/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" + integrity sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc= + +es6-promise@^4.0.5: + version "4.2.6" + resolved "http://registry.npm.taobao.org/es6-promise/download/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f" + integrity sha1-toXt2CWIhjZepitX0w3ij63Nl08= + +escape-html@^1.0.3: + version "1.0.3" + resolved "http://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +esprima@^4.0.0: + version "4.0.1" + resolved "http://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha1-E7BM2z5sXRnfkatph6hpVhmwqnE= + +esutils@^2.0.2: + version "2.0.2" + resolved "http://registry.npm.taobao.org/esutils/download/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= + +execa@^0.7.0: + version "0.7.0" + resolved "http://registry.npm.taobao.org/execa/download/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/execa/download/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg= + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +extend@~3.0.2: + version "3.0.2" + resolved "http://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fextend%2Fdownload%2Fextend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo= + +external-editor@^3.0.3: + version "3.0.3" + resolved "http://registry.npm.taobao.org/external-editor/download/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + integrity sha1-WGbbKal4Jtvkvzr9JAcOrZ6kOic= + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extract-zip@^1.0.3: + version "1.6.7" + resolved "http://registry.npm.taobao.org/extract-zip/download/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" + integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= + dependencies: + concat-stream "1.6.2" + debug "2.6.9" + mkdirp "0.5.1" + yauzl "2.4.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + +fd-slicer@~1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/fd-slicer/download/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU= + dependencies: + pend "~1.2.0" + +figures@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/figures/download/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +find-up@^1.0.0: + version "1.1.2" + resolved "http://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha1-SRafHXmTQwZG2mHsxa41XCHJe3M= + dependencies: + locate-path "^3.0.0" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "http://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha1-3M5SwF9kTymManq5Nr1yTO/786Y= + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fresh@~0.5.2: + version "0.5.2" + resolved "http://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-extra-p@^7.0.0, fs-extra-p@^7.0.1: + version "7.0.1" + resolved "http://registry.npm.taobao.org/fs-extra-p/download/fs-extra-p-7.0.1.tgz#4eec0b6dfa150fa90f6ddd773b4fb1d55cad54e3" + integrity sha1-TuwLbfoVD6kPbd13O0+x1VytVOM= + dependencies: + bluebird-lst "^1.0.7" + fs-extra "^7.0.1" + +fs-extra@^0.30.0: + version "0.30.0" + resolved "http://registry.npm.taobao.org/fs-extra/download/fs-extra-0.30.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Ffs-extra%2Fdownload%2Ffs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "http://registry.npm.taobao.org/fs-extra/download/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha1-TxicRKoSO4lfcigE9V6iPq3DSOk= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fstream@^1.0.0, fstream@^1.0.2: + version "1.0.11" + resolved "http://registry.npm.taobao.org/fstream/download/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +gauge@~2.7.3: + version "2.7.4" + resolved "http://registry.npm.taobao.org/gauge/download/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^1.0.0: + version "1.1.3" + resolved "http://registry.npm.taobao.org/gaze/download/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha1-xEFzPhO5J6yMD/C0w7Az8ogSkko= + dependencies: + globule "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "http://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o= + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "http://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha1-T5RBKoLbMvNuOwuXQfipf+sDH34= + +get-stdin@^4.0.1: + version "4.0.1" + resolved "http://registry.npm.taobao.org/get-stdin/download/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-stream@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0: + version "4.1.0" + resolved "http://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha1-wbJVV189wh1Zv8ec09K0axw6VLU= + dependencies: + pump "^3.0.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: + version "7.1.3" + resolved "http://registry.npm.taobao.org/glob/download/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE= + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^0.1.0: + version "0.1.1" + resolved "http://registry.npm.taobao.org/global-dirs/download/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +globule@^1.0.0: + version "1.2.1" + resolved "http://registry.npm.taobao.org/globule/download/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + integrity sha1-Xf+xsZHyLSB5epNptJ6rTpg5aW0= + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + +got@^6.7.1: + version "6.7.1" + resolved "http://registry.npm.taobao.org/got/download/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.15" + resolved "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha1-/7cD4QZuig7qpMi4C6klPu77+wA= + +gts@^0.9.0: + version "0.9.0" + resolved "http://registry.npm.taobao.org/gts/download/gts-0.9.0.tgz#b29277aa626abe8041180b9e39bb8f3daefe6486" + integrity sha1-spJ3qmJqvoBBGAueObuPPa7+ZIY= + dependencies: + chalk "^2.4.1" + clang-format "1.2.3" + diff "^3.5.0" + entities "^1.1.1" + inquirer "^6.0.0" + meow "^5.0.0" + pify "^4.0.0" + rimraf "^2.6.2" + tslint "^5.9.1" + update-notifier "^2.5.0" + write-file-atomic "^2.3.0" + +har-schema@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0: + version "5.1.3" + resolved "http://registry.npm.taobao.org/har-validator/download/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha1-HvievT5JllV2de7ZiTEQ3DUPoIA= + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fhas-flag%2Fdownload%2Fhas-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-unicode@^2.0.0: + version "2.0.1" + resolved "http://registry.npm.taobao.org/has-unicode/download/has-unicode-2.0.1.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fhas-unicode%2Fdownload%2Fhas-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +home-path@^1.0.1: + version "1.0.6" + resolved "http://registry.npm.taobao.org/home-path/download/home-path-1.0.6.tgz#d549dc2465388a7f8667242c5b31588d29af29fc" + integrity sha1-1UncJGU4in+GZyQsWzFYjSmvKfw= + +hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: + version "2.7.1" + resolved "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha1-l/I2l3vW4SVAiTD/bePuxigewEc= + +http-assert@^1.3.0: + version "1.4.0" + resolved "http://registry.npm.taobao.org/http-assert/download/http-assert-1.4.0.tgz#0e550b4fca6adf121bbeed83248c17e62f593a9a" + integrity sha1-DlULT8pq3xIbvu2DJIwX5i9ZOpo= + dependencies: + deep-equal "~1.0.1" + http-errors "~1.7.1" + +http-errors@^1.3.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@^1.6.3, http-errors@~1.7.1: + version "1.7.2" + resolved "http://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@^0.4.24, iconv-lite@~0.4.13: + version "0.4.24" + resolved "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs= + dependencies: + safer-buffer ">= 2.1.2 < 3" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/import-lazy/download/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "http://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +in-publish@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/in-publish/download/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= + +indent-string@^2.1.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/indent-string/download/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indent-string@^3.0.0: + version "3.2.0" + resolved "http://registry.npm.taobao.org/indent-string/download/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +inflight@^1.0.4: + version "1.0.6" + resolved "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Finflight%2Fdownload%2Finflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.4, ini@~1.3.0: + version "1.3.5" + resolved "http://registry.npm.taobao.org/ini/download/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc= + +inquirer@^6.0.0: + version "6.2.2" + resolved "http://registry.npm.taobao.org/inquirer/download/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" + integrity sha1-RpQRdvZcnrIIBGJxSbdDohjyVAY= + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.11" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.0.0" + through "^2.3.6" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +invert-kv@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/invert-kv/download/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha1-c5P1r6Weyf9fZ6J2INEcIm4+7AI= + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-ci@^1.0.10: + version "1.2.1" + resolved "http://registry.npm.taobao.org/is-ci/download/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw= + dependencies: + ci-info "^1.5.0" + +is-ci@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/is-ci/download/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha1-a8YzQYGBDgS1wis9WJ/cpVAmQEw= + dependencies: + ci-info "^2.0.0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "http://registry.npm.taobao.org/is-finite/download/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-generator-function@^1.0.7: + version "1.0.7" + resolved "http://registry.npm.taobao.org/is-generator-function/download/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" + integrity sha1-0hMuUpuwAAp/gHlNS99c1eWBNSI= + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "http://registry.npm.taobao.org/is-installed-globally/download/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/is-npm/download/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + +is-obj@^1.0.0: + version "1.0.1" + resolved "http://registry.npm.taobao.org/is-obj/download/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "http://registry.npm.taobao.org/is-path-inside/download/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-promise@^2.1.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/is-promise/download/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-redirect@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/is-redirect/download/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/is-retry-allowed/download/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fis-stream%2Fdownload%2Fis-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-utf8@^0.2.0: + version "0.2.1" + resolved "http://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-windows@^1.0.0: + version "1.0.2" + resolved "http://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0= + +isarray@0.0.1: + version "0.0.1" + resolved "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@~1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isbinaryfile@^3.0.2: + version "3.0.3" + resolved "http://registry.npm.taobao.org/isbinaryfile/download/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha1-XW3vPt6/boyoyunDAYOoBLX4voA= + dependencies: + buffer-alloc "^1.2.0" + +isbinaryfile@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/isbinaryfile/download/isbinaryfile-4.0.0.tgz#07d1061c21598b41292b0f5c68add5eab601ad8e" + integrity sha1-B9EGHCFZi0EpKw9caK3V6rYBrY4= + +isexe@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isstream@~0.1.2: + version "0.1.2" + resolved "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +js-base64@^2.1.8: + version "2.5.1" + resolved "http://registry.npm.taobao.org/js-base64/download/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" + integrity sha1-Hvo57yxfeYC7F4St5KivLeMpESE= + +js-tokens@^3.0.2: + version "3.0.2" + resolved "http://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@^3.12.1, js-yaml@^3.13.0: + version "3.13.0" + resolved "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.13.0.tgz#38ee7178ac0eea2c97ff6d96fff4b18c7d8cf98e" + integrity sha1-OO5xeKwO6iyX/22W//SxjH2M+Y4= + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "http://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha1-afaofZUTq4u4/mO9sJecRI5oRmA= + +json-schema@0.2.3: + version "0.2.3" + resolved "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^2.1.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/json5/download/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha1-56DGLEgoXGKNIKELhcibuAfDKFA= + dependencies: + minimist "^1.2.0" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "http://registry.npm.taobao.org/jsonfile/download/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.1" + resolved "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +keygrip@~1.0.3: + version "1.0.3" + resolved "http://registry.npm.taobao.org/keygrip/download/keygrip-1.0.3.tgz#399d709f0aed2bab0a059e0cdd3a5023a053e1dc" + integrity sha1-OZ1wnwrtK6sKBZ4M3TpQI6BT4dw= + +klaw@^1.0.0: + version "1.3.1" + resolved "http://registry.npm.taobao.org/klaw/download/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + optionalDependencies: + graceful-fs "^4.1.9" + +koa-compose@^3.0.0: + version "3.2.1" + resolved "http://registry.npm.taobao.org/koa-compose/download/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" + integrity sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec= + dependencies: + any-promise "^1.1.0" + +koa-compose@^4.1.0: + version "4.1.0" + resolved "http://registry.npm.taobao.org/koa-compose/download/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" + integrity sha1-UHMGuTcZAdtBEhyBLpI9DWfT6Hc= + +koa-convert@^1.2.0: + version "1.2.0" + resolved "http://registry.npm.taobao.org/koa-convert/download/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0" + integrity sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA= + dependencies: + co "^4.6.0" + koa-compose "^3.0.0" + +koa-is-json@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/koa-is-json/download/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14" + integrity sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ= + +koa-router@^7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/koa-router/-/koa-router-7.4.0.tgz#aee1f7adc02d5cb31d7d67465c9eacc825e8c5e0" + integrity sha512-IWhaDXeAnfDBEpWS6hkGdZ1ablgr6Q6pGdXCyK38RbzuH4LkUOpPqPw+3f8l8aTDrQmBQ7xJc0bs2yV4dzcO+g== + dependencies: + debug "^3.1.0" + http-errors "^1.3.1" + koa-compose "^3.0.0" + methods "^1.0.1" + path-to-regexp "^1.1.1" + urijs "^1.19.0" + +koa@^2.7.0: + version "2.7.0" + resolved "http://registry.npm.taobao.org/koa/download/koa-2.7.0.tgz#7e00843506942b9d82c6cc33749f657c6e5e7adf" + integrity sha1-fgCENQaUK52CxswzdJ9lfG5eet8= + dependencies: + accepts "^1.3.5" + cache-content-type "^1.0.0" + content-disposition "~0.5.2" + content-type "^1.0.4" + cookies "~0.7.1" + debug "~3.1.0" + delegates "^1.0.0" + depd "^1.1.2" + destroy "^1.0.4" + error-inject "^1.0.0" + escape-html "^1.0.3" + fresh "~0.5.2" + http-assert "^1.3.0" + http-errors "^1.6.3" + is-generator-function "^1.0.7" + koa-compose "^4.1.0" + koa-convert "^1.2.0" + koa-is-json "^1.0.0" + on-finished "^2.3.0" + only "~0.0.2" + parseurl "^1.3.2" + statuses "^1.5.0" + type-is "^1.6.16" + vary "^1.1.2" + +latest-version@^3.0.0: + version "3.1.0" + resolved "http://registry.npm.taobao.org/latest-version/download/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= + dependencies: + package-json "^4.0.0" + +lazy-val@^1.0.4: + version "1.0.4" + resolved "http://registry.npm.taobao.org/lazy-val/download/lazy-val-1.0.4.tgz#882636a7245c2cfe6e0a4e3ba6c5d68a137e5c65" + integrity sha1-iCY2pyRcLP5uCk47psXWihN+XGU= + +lcid@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +lcid@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/lcid/download/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha1-bvXS32DlL4LrIopMNz6NHzlyU88= + dependencies: + invert-kv "^2.0.0" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/load-json-file/download/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4= + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash@^4.0.0, lodash@^4.17.11, lodash@~4.17.10: + version "4.17.11" + resolved "http://registry.npm.taobao.org/lodash/download/lodash-4.17.11.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha1-s56mIp72B+zYniyN8SU2iRysm40= + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "http://registry.npm.taobao.org/loud-rejection/download/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "http://registry.npm.taobao.org/lowercase-keys/download/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha1-b54wtHCE2XGnyCD/FabFFnt0wm8= + +lru-cache@^4.0.1: + version "4.1.5" + resolved "http://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80= + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-dir@^1.0.0: + version "1.3.0" + resolved "http://registry.npm.taobao.org/make-dir/download/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha1-ecEDO4BRW9bSTsmTPoYMp17ifww= + dependencies: + pify "^3.0.0" + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "http://registry.npm.taobao.org/map-age-cleaner/download/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha1-fVg6cwZDTAVf5HSw9FB45uG0uSo= + dependencies: + p-defer "^1.0.0" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/map-obj/download/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/map-obj/download/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= + +media-typer@0.3.0: + version "0.3.0" + resolved "http://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^4.0.0: + version "4.3.0" + resolved "http://registry.npm.taobao.org/mem/download/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha1-Rhr0l7xK4JYIzbLmDu+2m/90QXg= + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +meow@^3.1.0, meow@^3.7.0: + version "3.7.0" + resolved "http://registry.npm.taobao.org/meow/download/meow-3.7.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fmeow%2Fdownload%2Fmeow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +meow@^5.0.0: + version "5.0.0" + resolved "http://registry.npm.taobao.org/meow/download/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" + integrity sha1-38c9Y6mvxxSl43F2DrXIi5EHiqQ= + dependencies: + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" + loud-rejection "^1.0.0" + minimist-options "^3.0.1" + normalize-package-data "^2.3.4" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + yargs-parser "^10.0.0" + +methods@^1.0.1: + version "1.1.2" + resolved "http://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fmethods%2Fdownload%2Fmethods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +mime-db@~1.38.0: + version "1.38.0" + resolved "http://registry.npm.taobao.org/mime-db/download/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" + integrity sha1-GiqrFtqesWe0nG5N8tnGjWPY4q0= + +mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.18, mime-types@~2.1.19: + version "2.1.22" + resolved "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" + integrity sha1-/ms1WhkJJqt2mMmgVWoRGZshmb0= + dependencies: + mime-db "~1.38.0" + +mime@^2.4.1: + version "2.4.2" + resolved "https://registry.npm.taobao.org/mime/download/mime-2.4.2.tgz#ce5229a5e99ffc313abac806b482c10e7ba6ac78" + integrity sha1-zlIppemf/DE6usgGtILBDnumrHg= + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI= + +mimic-fn@^2.0.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs= + +minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fminimatch%2Fdownload%2Fminimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM= + dependencies: + brace-expansion "^1.1.7" + +minimist-options@^3.0.1: + version "3.0.2" + resolved "http://registry.npm.taobao.org/minimist-options/download/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + integrity sha1-+6TIGRM54T7PTWG+sD8HAQPz2VQ= + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + +minimist@0.0.8: + version "0.0.8" + resolved "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fminimist%2Fdownload%2Fminimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fminimist%2Fdownload%2Fminimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +ms@2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.1" + resolved "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo= + +mute-stream@0.0.7: + version "0.0.7" + resolved "http://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +nan@^2.13.2: + version "2.13.2" + resolved "https://registry.npm.taobao.org/nan/download/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" + integrity sha1-9R3Hrma6fV1V4ebU2AkugCya7+c= + +ncp@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/ncp/download/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" + integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= + +negotiator@0.6.1: + version "0.6.1" + resolved "http://registry.npm.taobao.org/negotiator/download/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= + +nice-try@^1.0.4: + version "1.0.5" + resolved "http://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y= + +node-gyp@^3.8.0: + version "3.8.0" + resolved "http://registry.npm.taobao.org/node-gyp/download/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha1-VAMEJhwzDoDQ1e3OJTpoyzlkIYw= + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-sass@^4.12.0: + version "4.12.0" + resolved "https://registry.npm.taobao.org/node-sass/download/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017" + integrity sha1-CRT1MZMjgBFKMMxfpPpjIzol8Bc= + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash "^4.17.11" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.13.2" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "^2.88.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +"nopt@2 || 3": + version "3.0.6" + resolved "http://registry.npm.taobao.org/nopt/download/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fnormalize-package-data%2Fdownload%2Fnormalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg= + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "http://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: + version "4.1.2" + resolved "http://registry.npm.taobao.org/npmlog/download/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha1-CKfyqL9zRgR3mp76StXMcXq7lUs= + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nugget@^2.0.0: + version "2.0.1" + resolved "http://registry.npm.taobao.org/nugget/download/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0" + integrity sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA= + dependencies: + debug "^2.1.3" + minimist "^1.1.0" + pretty-bytes "^1.0.2" + progress-stream "^1.1.0" + request "^2.45.0" + single-line-log "^1.1.2" + throttleit "0.0.2" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "http://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU= + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-keys@~0.4.0: + version "0.4.0" + resolved "http://registry.npm.taobao.org/object-keys/download/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= + +on-finished@^2.3.0: + version "2.3.0" + resolved "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fonce%2Fdownload%2Fonce-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "http://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +only@~0.0.2: + version "0.0.2" + resolved "http://registry.npm.taobao.org/only/download/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" + integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= + +os-homedir@^1.0.0: + version "1.0.2" + resolved "http://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^1.4.0: + version "1.4.0" + resolved "http://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + +os-locale@^3.1.0: + version "3.1.0" + resolved "http://registry.npm.taobao.org/os-locale/download/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha1-qAKm7hfyTBBIOrmTVxnO9O0Wvxo= + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@0: + version "0.1.5" + resolved "http://registry.npm.taobao.org/osenv/download/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha1-hc36+uso6Gd/QW4odZK18/SepBA= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-defer@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/p-defer/download/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-finally@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/p-is-promise/download/p-is-promise-2.0.0.tgz#7554e3d572109a87e1f3f53f6a7d85d1b194f4c5" + integrity sha1-dVTj1XIQmofh8/U/an2F0bGU9MU= + +p-limit@^1.1.0: + version "1.3.0" + resolved "http://registry.npm.taobao.org/p-limit/download/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg= + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.2.0" + resolved "http://registry.npm.taobao.org/p-limit/download/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" + integrity sha1-QXyZQeYCepq8ulCS3SkE4lW1+8I= + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ= + dependencies: + p-limit "^2.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "http://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha1-yyhoVA4xPWHeWPr741zpAE1VQOY= + +package-json@^4.0.0: + version "4.0.1" + resolved "http://registry.npm.taobao.org/package-json/download/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +parse-color@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/parse-color/download/parse-color-1.0.0.tgz#7b748b95a83f03f16a94f535e52d7f3d94658619" + integrity sha1-e3SLlag/A/FqlPU15S1/PZRlhhk= + dependencies: + color-convert "~0.5.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "http://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parseurl@^1.3.2: + version "1.3.2" + resolved "http://registry.npm.taobao.org/parseurl/download/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= + +path-exists@^2.0.0, path-exists@^2.1.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fpath-exists%2Fdownload%2Fpath-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fpath-exists%2Fdownload%2Fpath-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "http://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "http://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.6" + resolved "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha1-1i27VnlAXXLEc37FhgDp3c8G0kw= + +path-to-regexp@^1.1.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= + dependencies: + isarray "0.0.1" + +path-type@^1.0.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/path-type/download/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha1-zvMdyOCho7sNEFwM2Xzzv0f0428= + dependencies: + pify "^3.0.0" + +pend@~1.2.0: + version "1.2.0" + resolved "http://registry.npm.taobao.org/pend/download/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +performance-now@^2.1.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +pify@^2.0.0: + version "2.3.0" + resolved "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.0: + version "4.0.1" + resolved "http://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE= + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "http://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fpinkie-promise%2Fdownload%2Fpinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "http://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +plist@^3.0.1: + version "3.0.1" + resolved "http://registry.npm.taobao.org/plist/download/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c" + integrity sha1-qbkx0XwwTokS7wujvdYYK68uH4w= + dependencies: + base64-js "^1.2.3" + xmlbuilder "^9.0.7" + xmldom "0.1.x" + +prepend-http@^1.0.1: + version "1.0.4" + resolved "http://registry.npm.taobao.org/prepend-http/download/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +pretty-bytes@^1.0.2: + version "1.0.4" + resolved "http://registry.npm.taobao.org/pretty-bytes/download/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84" + integrity sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ= + dependencies: + get-stdin "^4.0.1" + meow "^3.1.0" + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o= + +progress-stream@^1.1.0: + version "1.2.0" + resolved "http://registry.npm.taobao.org/progress-stream/download/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77" + integrity sha1-LNPP6jO6OonJwSHsM0er6asSX3c= + dependencies: + speedometer "~0.1.2" + through2 "~0.2.3" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "http://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.24: + version "1.1.31" + resolved "http://registry.npm.taobao.org/psl/download/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha1-6aqG0BAbWxBcvpOsa3hM1UcnYYQ= + +pump@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ= + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^1.4.1: + version "1.4.1" + resolved "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "http://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha1-tYsBCsQMIsVldhbI0sLALHv0eew= + +qs@~6.5.2: + version "6.5.2" + resolved "http://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha1-yzroBuh0BERYTvFUzo7pjUA/PjY= + +quick-lru@^1.0.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/quick-lru/download/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" + integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= + +rc@^1.0.1, rc@^1.1.2, rc@^1.1.6: + version "1.2.8" + resolved "http://registry.npm.taobao.org/rc/download/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0= + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-config-file@3.2.2: + version "3.2.2" + resolved "http://registry.npm.taobao.org/read-config-file/download/read-config-file-3.2.2.tgz#57bbff7dd97caf237d0d625bd541c6d0efb4d067" + integrity sha1-V7v/fdl8ryN9DWJb1UHG0O+00Gc= + dependencies: + ajv "^6.9.2" + ajv-keywords "^3.4.0" + bluebird-lst "^1.0.7" + dotenv "^6.2.0" + dotenv-expand "^4.2.0" + fs-extra-p "^7.0.1" + js-yaml "^3.12.1" + json5 "^2.1.0" + lazy-val "^1.0.4" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fread-pkg-up%2Fdownload%2Fread-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/read-pkg/download/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.2.2: + version "2.3.6" + resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@~1.1.9: + version "1.1.14" + resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.1.14.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +redent@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/redent/download/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +redent@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/redent/download/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" + integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= + dependencies: + indent-string "^3.0.0" + strip-indent "^2.0.0" + +registry-auth-token@^3.0.1: + version "3.4.0" + resolved "http://registry.npm.taobao.org/registry-auth-token/download/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" + integrity sha1-10RoFUM/XV7WQxzV3KIQSPZrOX4= + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "http://registry.npm.taobao.org/registry-url/download/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + +repeating@^2.0.0: + version "2.0.1" + resolved "http://registry.npm.taobao.org/repeating/download/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +request@^2.45.0, request@^2.87.0, request@^2.88.0: + version "2.88.0" + resolved "http://registry.npm.taobao.org/request/download/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha1-nC/KT301tZLv5Xx/ClXoEFIST+8= + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "http://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs= + +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2: + version "1.10.0" + resolved "http://registry.npm.taobao.org/resolve/download/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" + integrity sha1-O9qur0XMB/N1ZW39LlTtCBCxAbo= + dependencies: + path-parse "^1.0.6" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.6.2: + version "2.6.3" + resolved "http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha1-stEE/g2Psnz54KHNqCYt04M8bKs= + dependencies: + glob "^7.1.3" + +run-async@^2.2.0: + version "2.3.0" + resolved "http://registry.npm.taobao.org/run-async/download/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +rxjs@^6.4.0: + version "6.4.0" + resolved "http://registry.npm.taobao.org/rxjs/download/rxjs-6.4.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Frxjs%2Fdownload%2Frxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" + integrity sha1-87sP572n+2nerAwW8XtQsLh5BQQ= + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0= + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= + +sanitize-filename@^1.6.1: + version "1.6.1" + resolved "http://registry.npm.taobao.org/sanitize-filename/download/sanitize-filename-1.6.1.tgz#612da1c96473fa02dccda92dcd5b4ab164a6772a" + integrity sha1-YS2hyWRz+gLczaktzVtKsWSmdyo= + dependencies: + truncate-utf8-bytes "^1.0.0" + +sass-graph@^2.2.4: + version "2.2.4" + resolved "http://registry.npm.taobao.org/sass-graph/download/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +sax@^1.2.4: + version "1.2.4" + resolved "http://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha1-KBYjTiN4vdxOU1T6tcqold9xANk= + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "http://registry.npm.taobao.org/scss-tokenizer/download/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/semver-diff/download/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + dependencies: + semver "^5.0.3" + +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0: + version "5.7.0" + resolved "http://registry.npm.taobao.org/semver/download/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha1-eQp89v6lRZuslhELKbYEEtyP+Ws= + +semver@^6.0.0: + version "6.0.0" + resolved "http://registry.npm.taobao.org/semver/download/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" + integrity sha1-BeNZ7lceWtftZBpu7B5Ue6Ut6mU= + +semver@~5.3.0: + version "5.3.0" + resolved "http://registry.npm.taobao.org/semver/download/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +setprototypeof@1.1.1: + version "1.1.1" + resolved "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM= + +shebang-command@^1.2.0: + version "1.2.0" + resolved "http://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +single-line-log@^1.1.2: + version "1.1.2" + resolved "http://registry.npm.taobao.org/single-line-log/download/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364" + integrity sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q= + dependencies: + string-width "^1.0.1" + +source-map-support@^0.5.11: + version "0.5.12" + resolved "https://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" + integrity sha1-tPOxDVGFelrwE4086AA7IBYT1Zk= + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.4.2: + version "0.4.4" + resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= + dependencies: + amdefine ">=0.0.4" + +source-map@^0.6.0: + version "0.6.1" + resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha1-dHIq8y6WFOnCh6jQu95IteLxomM= + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ= + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "http://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc= + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha1-meEZt6XaAOBUkcn6M4t5BII7QdA= + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.3" + resolved "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.3.tgz#81c0ce8f21474756148bbb5f3bfc0f36bf15d76e" + integrity sha1-gcDOjyFHR1YUi7tfO/wPNr8V124= + +speedometer@~0.1.2: + version "0.1.4" + resolved "http://registry.npm.taobao.org/speedometer/download/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d" + integrity sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0= + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "http://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "http://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha1-+2YcC+8ps520B2nuOfpwCT1vaHc= + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +stat-mode@^0.3.0: + version "0.3.0" + resolved "https://registry.npm.taobao.org/stat-mode/download/stat-mode-0.3.0.tgz#69283b081f851582b328d2a4ace5f591ce52f54b" + integrity sha1-aSg7CB+FFYKzKNKkrOX1kc5S9Us= + +"statuses@>= 1.5.0 < 2", statuses@^1.5.0: + version "1.5.0" + resolved "http://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stdout-stream@^1.4.0: + version "1.4.1" + resolved "http://registry.npm.taobao.org/stdout-stream/download/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha1-WsF0zdXNcmEEqgwLK9g4FdjVNd4= + dependencies: + readable-stream "^2.0.1" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4= + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0: + version "3.1.0" + resolved "http://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha1-InZ74htirxCBV0MG9prFG2IgOWE= + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha1-nPFhG6YmhdcDCunkujQUnDrwP8g= + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0: + version "5.2.0" + resolved "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4= + dependencies: + ansi-regex "^4.1.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/strip-eof/download/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-indent@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/strip-indent/download/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +strip-indent@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/strip-indent/download/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "http://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +sumchecker@^1.2.0: + version "1.3.1" + resolved "http://registry.npm.taobao.org/sumchecker/download/sumchecker-1.3.1.tgz#79bb3b4456dd04f18ebdbc0d703a1d1daec5105d" + integrity sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0= + dependencies: + debug "^2.2.0" + es6-promise "^4.0.5" + +supports-color@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "http://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha1-4uaaRKyHcveKHsCzW2id9lMO/I8= + dependencies: + has-flag "^3.0.0" + +tar@^2.0.0: + version "2.2.1" + resolved "http://registry.npm.taobao.org/tar/download/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +tcp-ping@^0.1.1: + version "0.1.1" + resolved "http://registry.npm.taobao.org/tcp-ping/download/tcp-ping-0.1.1.tgz#02dd7f42b5bf7d7cb78d5b7aacefa155fd8f7c0c" + integrity sha1-At1/QrW/fXy3jVt6rO+hVf2PfAw= + +temp-file@^3.3.2: + version "3.3.2" + resolved "http://registry.npm.taobao.org/temp-file/download/temp-file-3.3.2.tgz#69b6daf1bbe23231d0a5d03844e3d96f3f531aaa" + integrity sha1-abba8bviMjHQpdA4ROPZbz9TGqo= + dependencies: + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.6" + fs-extra-p "^7.0.0" + +term-size@^1.2.0: + version "1.2.0" + resolved "http://registry.npm.taobao.org/term-size/download/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + +throttleit@0.0.2: + version "0.0.2" + resolved "http://registry.npm.taobao.org/throttleit/download/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" + integrity sha1-z+34jmDADdlpe2H90qg0OptoDq8= + +through2@~0.2.3: + version "0.2.3" + resolved "http://registry.npm.taobao.org/through2/download/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f" + integrity sha1-6zKE2k6jEbbMis42U3SKUqvyWj8= + dependencies: + readable-stream "~1.1.9" + xtend "~2.1.1" + +through@^2.3.6: + version "2.3.8" + resolved "http://registry.npm.taobao.org/through/download/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +timed-out@^4.0.0: + version "4.0.1" + resolved "http://registry.npm.taobao.org/timed-out/download/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +tmp@^0.0.33: + version "0.0.33" + resolved "http://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha1-bTQzWIl2jSGyvNoKonfO07G/rfk= + dependencies: + os-tmpdir "~1.0.2" + +toidentifier@1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM= + +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" + integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha1-U/Nto/R3g7CSWvoG/587FlKA94E= + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/trim-newlines/download/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +trim-newlines@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/trim-newlines/download/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" + integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= + +"true-case-path@^1.0.2": + version "1.0.3" + resolved "http://registry.npm.taobao.org/true-case-path/download/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + integrity sha1-+BO1qMhrQNpZYGcisUTjIleZ9H0= + dependencies: + glob "^7.1.2" + +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "http://registry.npm.taobao.org/truncate-utf8-bytes/download/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys= + dependencies: + utf8-byte-length "^1.0.1" + +tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: + version "1.9.3" + resolved "http://registry.npm.taobao.org/tslib/download/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha1-1+TdeSRdhUKMTX5IIqeZF5VMooY= + +tslint@^5.15.0, tslint@^5.9.1: + version "5.15.0" + resolved "http://registry.npm.taobao.org/tslint/download/tslint-5.15.0.tgz#6ffb180986d63afa1e531feb2a134dbf961e27d3" + integrity sha1-b/sYCYbWOvoeUx/rKhNNv5YeJ9M= + dependencies: + babel-code-frame "^6.22.0" + builtin-modules "^1.1.1" + chalk "^2.3.0" + commander "^2.12.1" + diff "^3.2.0" + glob "^7.1.1" + js-yaml "^3.13.0" + minimatch "^3.0.4" + mkdirp "^0.5.1" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.8.0" + tsutils "^2.29.0" + +tsutils@^2.29.0: + version "2.29.0" + resolved "http://registry.npm.taobao.org/tsutils/download/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + integrity sha1-MrSIUBRnrL7dS4VJhnOggSrKC5k= + dependencies: + tslib "^1.8.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-is@^1.6.16: + version "1.6.16" + resolved "http://registry.npm.taobao.org/type-is/download/type-is-1.6.16.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Ftype-is%2Fdownload%2Ftype-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + integrity sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ= + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + +typedarray@^0.0.6: + version "0.0.6" + resolved "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@^3.4.1: + version "3.4.1" + resolved "http://registry.npm.taobao.org/typescript/download/typescript-3.4.1.tgz#b6691be11a881ffa9a05765a205cb7383f3b63c6" + integrity sha1-tmkb4RqIH/qaBXZaIFy3OD87Y8Y= + +unique-string@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/unique-string/download/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "http://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY= + +unzip-response@^2.0.1: + version "2.0.1" + resolved "http://registry.npm.taobao.org/unzip-response/download/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + +update-notifier@^2.5.0: + version "2.5.0" + resolved "http://registry.npm.taobao.org/update-notifier/download/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha1-0HRFk+E/Fh5AassdlAi3LK0Ir/Y= + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +uri-js@^4.2.2: + version "4.2.2" + resolved "http://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha1-lMVA4f93KVbiKZUHwBCupsiDjrA= + dependencies: + punycode "^2.1.0" + +urijs@^1.19.0: + version "1.19.1" + resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.1.tgz#5b0ff530c0cbde8386f6342235ba5ca6e995d25a" + integrity sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg== + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/url-parse-lax/download/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "http://registry.npm.taobao.org/utf8-byte-length/download/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +uuid@^3.3.2: + version "3.3.2" + resolved "http://registry.npm.taobao.org/uuid/download/uuid-3.3.2.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fuuid%2Fdownload%2Fuuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE= + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fvalidate-npm-package-license%2Fdownload%2Fvalidate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha1-/JH2uce6FchX9MssXe/uw51PQQo= + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@^1.1.2: + version "1.1.2" + resolved "http://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +verror@1.10.0: + version "1.10.0" + resolved "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +which-module@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/which-module/download/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + +which-module@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@1, which@^1.2.9: + version "1.3.1" + resolved "http://registry.npm.taobao.org/which/download/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo= + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "http://registry.npm.taobao.org/wide-align/download/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha1-rgdOa9wMFKQx6ATmJFScYzsABFc= + dependencies: + string-width "^1.0.2 || 2" + +widest-line@^2.0.0: + version "2.0.1" + resolved "http://registry.npm.taobao.org/widest-line/download/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha1-dDh2RzDsfvQ4HOTfgvuYpTFCo/w= + dependencies: + string-width "^2.1.1" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^2.0.0, write-file-atomic@^2.3.0: + version "2.4.2" + resolved "http://registry.npm.taobao.org/write-file-atomic/download/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9" + integrity sha1-pxgXBt+6F4VdIhFAqcBuFfzdh7k= + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/xdg-basedir/download/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + +xmlbuilder@^9.0.7: + version "9.0.7" + resolved "http://registry.npm.taobao.org/xmlbuilder/download/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + +xmldom@0.1.x: + version "0.1.27" + resolved "http://registry.npm.taobao.org/xmldom/download/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" + integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= + +xtend@~2.1.1: + version "2.1.2" + resolved "http://registry.npm.taobao.org/xtend/download/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= + dependencies: + object-keys "~0.4.0" + +y18n@^3.2.1: + version "3.2.1" + resolved "http://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +y18n@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/y18n/download/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha1-le+U+F7MgdAHwmThkKEg8KPIVms= + +yallist@^2.1.2: + version "2.1.2" + resolved "http://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yargs-parser@^10.0.0: + version "10.1.0" + resolved "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha1-cgImW4n36eny5XZeD+c1qQXtuqg= + dependencies: + camelcase "^4.1.0" + +yargs-parser@^13.0.0: + version "13.0.0" + resolved "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b" + integrity sha1-P8RPPnaovbHMNgLoYBCGAuXM3os= + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= + dependencies: + camelcase "^3.0.0" + +yargs@^13.2.2: + version "13.2.2" + resolved "https://registry.npm.taobao.org/yargs/download/yargs-13.2.2.tgz#0c101f580ae95cea7f39d927e7770e3fdc97f993" + integrity sha1-DBAfWArpXOp/Odkn53cOP9yX+ZM= + dependencies: + cliui "^4.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.0.0" + +yargs@^7.0.0: + version "7.1.0" + resolved "http://registry.npm.taobao.org/yargs/download/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yarn@^1.15.2: + version "1.15.2" + resolved "https://registry.npm.taobao.org/yarn/download/yarn-1.15.2.tgz#7a064ca81ca34235f16376ad2f796ed432f9e285" + integrity sha1-egZMqByjQjXxY3atL3lu1DL54oU= + +yauzl@2.4.1: + version "2.4.1" + resolved "http://registry.npm.taobao.org/yauzl/download/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= + dependencies: + fd-slicer "~1.0.1" + +ylru@^1.2.0: + version "1.2.1" + resolved "http://registry.npm.taobao.org/ylru/download/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f" + integrity sha1-9Xa2M0FUeYnB3nuiiHYJI7J/6E8=