From b9fc4f0f1360fac4a78c4897120c8b02e1f4d259 Mon Sep 17 00:00:00 2001 From: leo <907600065@qq.com> Date: Sat, 16 Mar 2019 12:01:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=B5=81=E7=A8=8B=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A6=86=E7=9B=96=E5=AE=89=E8=A3=85=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=BD=93=E5=89=8D=E9=AB=98=E7=89=88=E6=9C=AC=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E4=BC=9A=E6=8A=8A=E4=BD=8E=E7=89=88=E6=9C=AC=E7=9A=84?= =?UTF-8?q?=E7=83=AD=E6=9B=B4=E6=96=B0=E6=96=87=E4=BB=B6=E6=B8=85=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HotUpdateDemo/.gitignore | 2 +- HotUpdateDemo/README.md | 19 +- HotUpdateDemo/assets/Scene/helloworld.fire | 5 +- HotUpdateDemo/assets/Script/HotUpdate.js | 71 +- .../assets/Script/Uint8ArrayMD5.js.meta | 9 + HotUpdateDemo/assets/project.manifest | 2 +- HotUpdateDemo/assets/version.manifest | 2 +- .../build-templates/jsb-binary/main.js | 53 +- .../cocos2d-x/cocos/platform/CCImage.cpp | 2005 ++++++ .../cocos2d-x/cocos/platform/CCImage.h | 223 + .../{ => build-templates/jsb-default}/main.js | 53 +- .../build-templates/jsb-link/main.js | 265 + HotUpdateDemo/package-lock.json | 6025 +++++++++++++++++ HotUpdateDemo/package.json | 30 + HotUpdateDemo/tools/version_generator.bat | 2 + .../{ => tools}/version_generator.js | 127 +- HotUpdateDemo/version_generator.bat | 2 - 17 files changed, 8766 insertions(+), 129 deletions(-) create mode 100644 HotUpdateDemo/assets/Script/Uint8ArrayMD5.js.meta create mode 100644 HotUpdateDemo/build-templates/jsb-default/frameworks/cocos2d-x/cocos/platform/CCImage.cpp create mode 100644 HotUpdateDemo/build-templates/jsb-default/frameworks/cocos2d-x/cocos/platform/CCImage.h rename HotUpdateDemo/{ => build-templates/jsb-default}/main.js (85%) create mode 100644 HotUpdateDemo/build-templates/jsb-link/main.js create mode 100644 HotUpdateDemo/package-lock.json create mode 100644 HotUpdateDemo/package.json create mode 100644 HotUpdateDemo/tools/version_generator.bat rename HotUpdateDemo/{ => tools}/version_generator.js (70%) delete mode 100644 HotUpdateDemo/version_generator.bat diff --git a/HotUpdateDemo/.gitignore b/HotUpdateDemo/.gitignore index 640d65b..f0fac15 100644 --- a/HotUpdateDemo/.gitignore +++ b/HotUpdateDemo/.gitignore @@ -6,7 +6,7 @@ library/ temp/ local/ build/ - +node_modules #///////////////////////////////////////////////////////////////////////////// # Logs and databases #///////////////////////////////////////////////////////////////////////////// diff --git a/HotUpdateDemo/README.md b/HotUpdateDemo/README.md index ff8c853..dd1b83a 100644 --- a/HotUpdateDemo/README.md +++ b/HotUpdateDemo/README.md @@ -1,2 +1,19 @@ # 热更新Demo -如果喜欢上[简书](https://www.jianshu.com/u/33b882c6c780)关注我吧。我会不定时更新Cocos Creator教程与上传demo到github +> 如果喜欢上[简书](https://www.jianshu.com/u/33b882c6c780)关注我吧。我会不定时更新Cocos Creator教程与上传demo到github + +### 准备 +* 操作系统:window +* 安装Node https://nodejs.org/zh-cn/ +* 以下操作都是基于android 打包 且模式为[link](https://docs.cocos.com/creator/manual/zh/publish/publish-native.html?h=link)。 +### 操作 +* 打开命令行输入: +~~~ +npm install +~~~ +安装Node的库 + +* 构建Android 工程 选择link模式 +![link](https://upload-images.jianshu.io/upload_images/2315803-f28aec8ccdff1858.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) +* 生成热更新文件 +进入tools,点击version_generator.bat + diff --git a/HotUpdateDemo/assets/Scene/helloworld.fire b/HotUpdateDemo/assets/Scene/helloworld.fire index 5300359..424efea 100644 --- a/HotUpdateDemo/assets/Scene/helloworld.fire +++ b/HotUpdateDemo/assets/Scene/helloworld.fire @@ -404,7 +404,7 @@ "text": "Hello, World" }, { - "__type__": "ca6fbSYPa9P2JPPqQFdB0OQ", + "__type__": "997e3R7o2NKiaTO+698vLEd", "_name": "", "_objFlags": 0, "node": { @@ -414,6 +414,7 @@ "manifestUrl": { "__uuid__": "2857653b-09b5-4724-a067-615f6905fbc2" }, - "_hotUpdateName": "game-remote-asset" + "_hotUpdateName": "game-remote-asset", + "_nowVersion": "" } ] \ No newline at end of file diff --git a/HotUpdateDemo/assets/Script/HotUpdate.js b/HotUpdateDemo/assets/Script/HotUpdate.js index 097704b..8581f39 100644 --- a/HotUpdateDemo/assets/Script/HotUpdate.js +++ b/HotUpdateDemo/assets/Script/HotUpdate.js @@ -5,12 +5,20 @@ const ErrCode = cc.Enum({ laodManifestFailed: 0, //下载manifest失败 updateFailed: 1, //更新失败, + downloadPackage: -10, //下载新包 }); + const MD5 = require("Uint8ArrayMD5"); + cc.Class({ extends: cc.Component, properties: { + // 2.x 修改成cc.asset + // manifestUrl: { + // type: cc.Asset, + // default: null + // }, manifestUrl: cc.RawAsset, _hotUpdateName: 'game-remote-asset', _nowVersion: '' @@ -24,24 +32,26 @@ cc.Class({ this.nextFn = nextFn; this.progressFn = progressFn; this.failedFn = failedFn; - // this.loadManifest(); - // console.log('os=', cc.sys.os); if (cc.sys.isBrowser) { - console.log('is not OS_ANDROID or OS_IOS'); this.nextFn && nextFn(this._nowVersion); return; } let self = this; this._storagePath = ((jsb.fileUtils ? jsb.fileUtils.getWritablePath() : '/') + this._hotUpdateName); - cc.log('Storage path for remote asset : ' + this._storagePath); this.versionCompareHandle = function (versionA, versionB) { console.log('versionLocal=' + versionA + ' versionRemote=' + versionB); self._nowVersion = versionA; var vA = versionA.split('.'); var vB = versionB.split('.'); + //第一位不同时,为整包更新 + this.isDownloadPackage = false; for (var i = 0; i < vA.length; ++i) { var a = parseInt(vA[i]); var b = parseInt(vB[i] || 0); + if (i == 0) { + this.isDownloadPackage = (a - b) < 0 ? true : false; + // console.log('isDownloadPackage=', this.isDownloadPackage); + } if (a === b) { continue; } else { @@ -55,13 +65,13 @@ cc.Class({ } }; - this._am = new jsb.AssetsManager('', this._storagePath, this.versionCompareHandle); + this._am = new jsb.AssetsManager('', this._storagePath, this.versionCompareHandle.bind(this)); if (!cc.sys.ENABLE_GC_FOR_NATIVE_OBJECTS) { + //2.x要去this._am.retain(); this._am.retain(); } this._am.setVerifyCallback(function (path, asset) { - console.log('path', path, 'setVerifyCallback' + JSON.stringify(asset)); var compressed = asset.compressed; /** * 计算md5 @@ -75,7 +85,6 @@ cc.Class({ return true; } else { var resMD5 = calMD5OfFile(path); - console.log('resMD%=', resMD5, 'asset md5=', asset.md5); if (asset.md5 == resMD5) { return true; } @@ -112,7 +121,6 @@ cc.Class({ }, loadManifest() { - // console.log('this.manifestUrl=', this.manifestUrl); // 手动设置路径 this.manifestUrl = 'res/raw-assets/project.manifest'; }, @@ -120,8 +128,8 @@ cc.Class({ //热更新完成 or 不需要热更新 进入游戏 onEnterGame: function () { console.log('热更新完成,', this._nowVersion); + cc.sys.localStorage.setItem('gameVersion', '' + this._nowVersion); this.nextFn && this.nextFn(this._nowVersion); - }, /** @@ -139,7 +147,7 @@ cc.Class({ * @param {*} err */ onFailure(type) { - console.log('type=', type); + // console.log('type=', type); if (this.failedFn) this.failedFn(type); }, @@ -147,8 +155,13 @@ cc.Class({ * 检查更新 */ checkUpdate: function () { - console.log('start checkUpdate'); if (this._am.getState() === jsb.AssetsManager.State.UNINITED) { + // 2.x修改成以下代码 + // var url = this.manifestUrl.nativeUrl; + // if (cc.loader.md5Pipe) { + // url = cc.loader.md5Pipe.transformURL(url); + // } + // this._am.loadLocalManifest(url); this._am.loadLocalManifest(this.manifestUrl); } if (!this._am.getLocalManifest() || !this._am.getLocalManifest().isLoaded()) { @@ -156,9 +169,11 @@ cc.Class({ this.onFailure(ErrCode.laodManifestFailed); return; } + //2.0修改成以下代码 + // this._am.setEventCallback(this.checkCb.bind(this)); this._checkListener = new jsb.EventListenerAssetsManager(this._am, this.checkCb.bind(this)); cc.eventManager.addListener(this._checkListener, 1); - + /**------------------------------------------------------- */ this._am.checkUpdate(); }, @@ -166,12 +181,19 @@ cc.Class({ * 执行热更新逻辑 */ hotUpdate: function () { - console.log('start hotUpdate'); if (this._am && !this._updating) { + //2.x修改成以下代码 + // this._am.setEventCallback(this.updateCb.bind(this)); this._updateListener = new jsb.EventListenerAssetsManager(this._am, this.updateCb.bind(this)); cc.eventManager.addListener(this._updateListener, 1); - + /**----------------------------------------------------- */ if (this._am.getState() === jsb.AssetsManager.State.UNINITED) { + //2.x修改成以下代码 + // var url = this.manifestUrl.nativeUrl; + // if (cc.loader.md5Pipe) { + // url = cc.loader.md5Pipe.transformURL(url); + // } + // this._am.loadLocalManifest(url); this._am.loadLocalManifest(this.manifestUrl); } @@ -202,10 +224,17 @@ cc.Class({ console.log('ALREADY_UP_TO_DATE'); break; case jsb.EventAssetsManager.NEW_VERSION_FOUND: + console.log('NEW_VERSION_FOUND', this.isDownloadPackage); /*4发现新的更新*/ - isNewVersion = true; cc.eventManager.removeListener(this._checkListener); this._checkListener = null; + if (this.isDownloadPackage) { + console.log('load new package'); + this.clearHotupdateCache(); + this.onFailure(ErrCode.downloadPackage); + return; + } + isNewVersion = true; console.log('have new version'); //开始更新版本 this.hotUpdate(); @@ -246,7 +275,7 @@ cc.Class({ failed = true; break; case jsb.EventAssetsManager.UPDATE_FINISHED: - console.log('UPDATE_FINISHED'); + // console.log('UPDATE_FINISHED'); // this.panel.info.string = 'Update finished. ' + event.getMessage(); needRestart = true; break; @@ -267,7 +296,7 @@ cc.Class({ //下载失败 if (failed) { - console.log('Hotupdate failure'); + // console.log('Hotupdate failure'); this.onFailure(ErrCode.updateFailed); cc.eventManager.removeListener(this._updateListener); this._updateListener = null; @@ -275,7 +304,7 @@ cc.Class({ } if (needRestart) { - console.log('Hotupdate success'); + // console.log('Hotupdate success'); cc.eventManager.removeListener(this._updateListener); this._updateListener = null; var searchPaths = jsb.fileUtils.getSearchPaths(); @@ -288,6 +317,12 @@ cc.Class({ } }, + // + clearHotupdateCache() { + let storagePath = ((jsb.fileUtils ? jsb.fileUtils.getWritablePath() : '/') + this._hotUpdateName); + jsb.fileUtils.removeDirectory(storagePath); + }, + // update (dt) {}, onDestroy() { diff --git a/HotUpdateDemo/assets/Script/Uint8ArrayMD5.js.meta b/HotUpdateDemo/assets/Script/Uint8ArrayMD5.js.meta new file mode 100644 index 0000000..f57e485 --- /dev/null +++ b/HotUpdateDemo/assets/Script/Uint8ArrayMD5.js.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.0.5", + "uuid": "b723dc8e-07ac-4a35-b0d9-663f49b82e42", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/HotUpdateDemo/assets/project.manifest b/HotUpdateDemo/assets/project.manifest index 9abe7af..0e8e3cf 100644 --- a/HotUpdateDemo/assets/project.manifest +++ b/HotUpdateDemo/assets/project.manifest @@ -1 +1 @@ -{"packageUrl":"http://192.168.0.124/remote-assets/","remoteManifestUrl":"http://192.168.0.124/remote-assets/project.manifest","remoteVersionUrl":"http://192.168.0.124/remote-assets/version.manifest","version":"4.0.1","assets":{"src/jsb_polyfill.jsc":{"size":135144,"md5":"3f348214c1482242272fab714ebfec83"},"src/project.jsc":{"size":1728,"md5":"96e447834b9217371706fa0936c57bd3"},"src/settings.jsc":{"size":504,"md5":"48ef15f17e1a385d4d286d9dd8a59ef5"},"res/import/05/05dd1dc0e.json":{"size":2204,"md5":"7d6949ebd65b71a220913e70e713aa7c"},"res/raw-assets/project.manifest":{"size":839,"md5":"7ee1a687b8c9e864ccf639e79a6d09d3"},"res/raw-assets/Texture/HelloWorld.png":{"size":37864,"md5":"a69a0b857f7462f4dd0d00bb5231a721"},"res/raw-assets/Texture/singleColor.png":{"size":17197,"md5":"5825642f69b6fed137482bf89f8f1fd5"}},"searchPaths":[]} \ No newline at end of file +{"packageUrl":"http://localhost/hotUpdate/","remoteManifestUrl":"http://localhost/hotUpdate/project.manifest","remoteVersionUrl":"http://localhost/hotUpdate/version.manifest","version":"1.0.0","assets":{"src/jsb_polyfill.jsc":{"size":135144,"md5":"809df571102bcfda4ef8894516cf8f03"},"src/project.jsc":{"size":3792,"md5":"260475b293c07f1fe13ce362589f52e1"},"src/settings.jsc":{"size":460,"md5":"49f64cb5418c6c156ff11ac17ab4cca6"},"res/import/05/05dd1dc0e.json":{"size":2152,"md5":"d27a54680b96dbf0b88694bbd8a1e8e2"},"res/raw-assets/Texture/HelloWorld.png":{"size":37864,"md5":"55ea4e952bf080f300379ec26723598b"},"res/raw-assets/Texture/singleColor.png":{"size":17197,"md5":"e5136c625f53acd0366396e2b9d534ca"}},"searchPaths":[]} \ No newline at end of file diff --git a/HotUpdateDemo/assets/version.manifest b/HotUpdateDemo/assets/version.manifest index d5c7066..c65f497 100644 --- a/HotUpdateDemo/assets/version.manifest +++ b/HotUpdateDemo/assets/version.manifest @@ -1 +1 @@ -{"packageUrl":"http://192.168.0.124/remote-assets/","remoteManifestUrl":"http://192.168.0.124/remote-assets/project.manifest","remoteVersionUrl":"http://192.168.0.124/remote-assets/version.manifest","version":"4.0.1"} \ No newline at end of file +{"packageUrl":"http://localhost/hotUpdate/","remoteManifestUrl":"http://localhost/hotUpdate/project.manifest","remoteVersionUrl":"http://localhost/hotUpdate/version.manifest","version":"1.0.0"} \ No newline at end of file diff --git a/HotUpdateDemo/build-templates/jsb-binary/main.js b/HotUpdateDemo/build-templates/jsb-binary/main.js index 9f5c977..08004b6 100644 --- a/HotUpdateDemo/build-templates/jsb-binary/main.js +++ b/HotUpdateDemo/build-templates/jsb-binary/main.js @@ -1,17 +1,42 @@ (function () { - if (window.cc && cc.sys.isNative) { - var hotUpdateSearchPaths = cc.sys.localStorage.getItem('HotUpdateSearchPaths'); - if (hotUpdateSearchPaths) { - jsb.fileUtils.setSearchPaths(JSON.parse(hotUpdateSearchPaths)); + var version = "1.0.0"; + let curVersion = cc.sys.localStorage.getItem("gameVersion") || "1.0.0"; + var hotUpdateSearchPaths = cc.sys.localStorage.getItem('HotUpdateSearchPaths'); + + function versionCompareHandle(versionA, versionB) { + var vA = versionA.split('.'); + var vB = versionB.split('.'); + for (var i = 0; i < vA.length; ++i) { + var a = parseInt(vA[i]); + var b = parseInt(vB[i] || 0); + if (a === b) { + continue; + } else { + return a - b; + } + } + if (vB.length > vA.length) { + return -1; + } else { + return 0; } } - function boot () { + //版本比最近版本等于or大于。需要清理热更新cache; + if (versionCompareHandle(version, curVersion) >= 0) { + hotUpdateSearchPaths && jsb.fileUtils.removeDirectory(hotUpdateSearchPaths); + } + //设置搜索路径 + if (window.cc && cc.sys.isNative) { + hotUpdateSearchPaths && jsb.fileUtils.setSearchPaths(JSON.parse(hotUpdateSearchPaths)); + } + + function boot() { var settings = window._CCSettings; window._CCSettings = undefined; - if ( !settings.debug ) { + if (!settings.debug) { var uuids = settings.uuids; var rawAssets = settings.rawAssets; @@ -68,7 +93,7 @@ initAdapter(); } - function setLoadingDisplay () { + function setLoadingDisplay() { // Loading splash scene var splash = document.getElementById('splash'); var progressBar = splash.querySelector('.progress-bar span'); @@ -101,8 +126,7 @@ if (cc.sys.isMobile) { if (settings.orientation === 'landscape') { cc.view.setOrientation(cc.macro.ORIENTATION_LANDSCAPE); - } - else if (settings.orientation === 'portrait') { + } else if (settings.orientation === 'portrait') { cc.view.setOrientation(cc.macro.ORIENTATION_PORTRAIT); } cc.view.enableAutoFullScreen([ @@ -158,24 +182,21 @@ if (false) { BK.Script.loadlib(); - } - else - { + } else { var bundledScript = settings.debug ? 'src/project.dev.js' : 'src/project.js'; if (jsList) { jsList = jsList.map(function (x) { return 'src/' + x; }); jsList.push(bundledScript); - } - else { + } else { jsList = [bundledScript]; } } // anysdk scripts if (cc.sys.isNative && cc.sys.isMobile) { -// jsList = jsList.concat(['src/anysdk/jsb_anysdk.js', 'src/anysdk/jsb_anysdk_constants.js']); + // jsList = jsList.concat(['src/anysdk/jsb_anysdk.js', 'src/anysdk/jsb_anysdk_constants.js']); } var option = { @@ -241,4 +262,4 @@ document.body.appendChild(cocos2d); } -})(); +})(); \ No newline at end of file diff --git a/HotUpdateDemo/build-templates/jsb-default/frameworks/cocos2d-x/cocos/platform/CCImage.cpp b/HotUpdateDemo/build-templates/jsb-default/frameworks/cocos2d-x/cocos/platform/CCImage.cpp new file mode 100644 index 0000000..906fc8a --- /dev/null +++ b/HotUpdateDemo/build-templates/jsb-default/frameworks/cocos2d-x/cocos/platform/CCImage.cpp @@ -0,0 +1,2005 @@ +/**************************************************************************** +Copyright (c) 2010-2012 cocos2d-x.org +Copyright (c) 2013-2016 Chukong Technologies Inc. + +http://www.cocos2d-x.org + +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. +****************************************************************************/ + + +#include "platform/CCImage.h" + +#include +#include + +#include "base/CCData.h" +#include "base/ccConfig.h" // CC_USE_JPEG, CC_USE_TIFF, CC_USE_WEBP + +extern "C" +{ + // To resolve link error when building 32bits with Xcode 6. + // More information please refer to the discussion in https://github.com/cocos2d/cocos2d-x/pull/6986 +#if defined (__unix) || (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) +#ifndef __ENABLE_COMPATIBILITY_WITH_UNIX_2003__ +#define __ENABLE_COMPATIBILITY_WITH_UNIX_2003__ +#include + FILE *fopen$UNIX2003( const char *filename, const char *mode ) + { + return fopen(filename, mode); + } + size_t fwrite$UNIX2003( const void *a, size_t b, size_t c, FILE *d ) + { + return fwrite(a, b, c, d); + } + char *strerror$UNIX2003( int errnum ) + { + return strerror(errnum); + } +#endif +#endif + +#if CC_USE_PNG +#include "png/png.h" +#endif //CC_USE_PNG + +#if CC_USE_TIFF +#include "tiff/tiffio.h" +#endif //CC_USE_TIFF + +#if CC_USE_JPEG +#include "jpeg/jpeglib.h" +#endif // CC_USE_JPEG + +#include "base/etc1.h" + +} + +#if CC_USE_WEBP +#include "webp/decode.h" +#endif // CC_USE_WEBP + +#include "base/pvr.h" +#include "base/TGAlib.h" + +#include "base/ccMacros.h" +#include "platform/CCCommon.h" +#include "platform/CCStdC.h" +#include "platform/CCFileUtils.h" +#include "base/CCConfiguration.h" +#include "base/ccUtils.h" +#include "base/ZipUtils.h" +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) +#include "platform/android/CCFileUtils-android.h" +#endif + +#define CC_GL_ATC_RGB_AMD 0x8C92 +#define CC_GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 +#define CC_GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE + +NS_CC_BEGIN + +////////////////////////////////////////////////////////////////////////// +//struct and data for pvr structure + +namespace +{ + static const int PVR_TEXTURE_FLAG_TYPE_MASK = 0xff; + + static bool _PVRHaveAlphaPremultiplied = false; + + // Values taken from PVRTexture.h from http://www.imgtec.com + enum class PVR2TextureFlag + { + Mipmap = (1<<8), // has mip map levels + Twiddle = (1<<9), // is twiddled + Bumpmap = (1<<10), // has normals encoded for a bump map + Tiling = (1<<11), // is bordered for tiled pvr + Cubemap = (1<<12), // is a cubemap/skybox + FalseMipCol = (1<<13), // are there false colored MIP levels + Volume = (1<<14), // is this a volume texture + Alpha = (1<<15), // v2.1 is there transparency info in the texture + VerticalFlip = (1<<16), // v2.1 is the texture vertically flipped + }; + + enum class PVR3TextureFlag + { + PremultipliedAlpha = (1<<1) // has premultiplied alpha + }; + + static const char gPVRTexIdentifier[5] = "PVR!"; + + // v2 + enum class PVR2TexturePixelFormat : unsigned char + { + RGBA4444 = 0x10, + RGBA5551, + RGBA8888, + RGB565, + RGB555, // unsupported + RGB888, + I8, + AI88, + PVRTC2BPP_RGBA, + PVRTC4BPP_RGBA, + BGRA8888, + A8, + }; + + // v3 + enum class PVR3TexturePixelFormat : uint64_t + { + PVRTC2BPP_RGB = 0ULL, + PVRTC2BPP_RGBA = 1ULL, + PVRTC4BPP_RGB = 2ULL, + PVRTC4BPP_RGBA = 3ULL, + PVRTC2_2BPP_RGBA = 4ULL, + PVRTC2_4BPP_RGBA = 5ULL, + ETC1 = 6ULL, + DXT1 = 7ULL, + DXT2 = 8ULL, + DXT3 = 9ULL, + DXT4 = 10ULL, + DXT5 = 11ULL, + BC1 = 7ULL, + BC2 = 9ULL, + BC3 = 11ULL, + BC4 = 12ULL, + BC5 = 13ULL, + BC6 = 14ULL, + BC7 = 15ULL, + UYVY = 16ULL, + YUY2 = 17ULL, + BW1bpp = 18ULL, + R9G9B9E5 = 19ULL, + RGBG8888 = 20ULL, + GRGB8888 = 21ULL, + ETC2_RGB = 22ULL, + ETC2_RGBA = 23ULL, + ETC2_RGBA1 = 24ULL, + EAC_R11_Unsigned = 25ULL, + EAC_R11_Signed = 26ULL, + EAC_RG11_Unsigned = 27ULL, + EAC_RG11_Signed = 28ULL, + + BGRA8888 = 0x0808080861726762ULL, + RGBA8888 = 0x0808080861626772ULL, + RGBA4444 = 0x0404040461626772ULL, + RGBA5551 = 0x0105050561626772ULL, + RGB565 = 0x0005060500626772ULL, + RGB888 = 0x0008080800626772ULL, + A8 = 0x0000000800000061ULL, + L8 = 0x000000080000006cULL, + LA88 = 0x000008080000616cULL, + }; + + + // v2 + typedef const std::map _pixel2_formathash; + + static const _pixel2_formathash::value_type v2_pixel_formathash_value[] = + { + _pixel2_formathash::value_type(PVR2TexturePixelFormat::BGRA8888, Texture2D::PixelFormat::BGRA8888), + _pixel2_formathash::value_type(PVR2TexturePixelFormat::RGBA8888, Texture2D::PixelFormat::RGBA8888), + _pixel2_formathash::value_type(PVR2TexturePixelFormat::RGBA4444, Texture2D::PixelFormat::RGBA4444), + _pixel2_formathash::value_type(PVR2TexturePixelFormat::RGBA5551, Texture2D::PixelFormat::RGB5A1), + _pixel2_formathash::value_type(PVR2TexturePixelFormat::RGB565, Texture2D::PixelFormat::RGB565), + _pixel2_formathash::value_type(PVR2TexturePixelFormat::RGB888, Texture2D::PixelFormat::RGB888), + _pixel2_formathash::value_type(PVR2TexturePixelFormat::A8, Texture2D::PixelFormat::A8), + _pixel2_formathash::value_type(PVR2TexturePixelFormat::I8, Texture2D::PixelFormat::I8), + _pixel2_formathash::value_type(PVR2TexturePixelFormat::AI88, Texture2D::PixelFormat::AI88), + + _pixel2_formathash::value_type(PVR2TexturePixelFormat::PVRTC2BPP_RGBA, Texture2D::PixelFormat::PVRTC2A), + _pixel2_formathash::value_type(PVR2TexturePixelFormat::PVRTC4BPP_RGBA, Texture2D::PixelFormat::PVRTC4A), + }; + + static const int PVR2_MAX_TABLE_ELEMENTS = sizeof(v2_pixel_formathash_value) / sizeof(v2_pixel_formathash_value[0]); + static const _pixel2_formathash v2_pixel_formathash(v2_pixel_formathash_value, v2_pixel_formathash_value + PVR2_MAX_TABLE_ELEMENTS); + + // v3 + typedef const std::map _pixel3_formathash; + static _pixel3_formathash::value_type v3_pixel_formathash_value[] = + { + _pixel3_formathash::value_type(PVR3TexturePixelFormat::BGRA8888, Texture2D::PixelFormat::BGRA8888), + _pixel3_formathash::value_type(PVR3TexturePixelFormat::RGBA8888, Texture2D::PixelFormat::RGBA8888), + _pixel3_formathash::value_type(PVR3TexturePixelFormat::RGBA4444, Texture2D::PixelFormat::RGBA4444), + _pixel3_formathash::value_type(PVR3TexturePixelFormat::RGBA5551, Texture2D::PixelFormat::RGB5A1), + _pixel3_formathash::value_type(PVR3TexturePixelFormat::RGB565, Texture2D::PixelFormat::RGB565), + _pixel3_formathash::value_type(PVR3TexturePixelFormat::RGB888, Texture2D::PixelFormat::RGB888), + _pixel3_formathash::value_type(PVR3TexturePixelFormat::A8, Texture2D::PixelFormat::A8), + _pixel3_formathash::value_type(PVR3TexturePixelFormat::L8, Texture2D::PixelFormat::I8), + _pixel3_formathash::value_type(PVR3TexturePixelFormat::LA88, Texture2D::PixelFormat::AI88), + + _pixel3_formathash::value_type(PVR3TexturePixelFormat::PVRTC2BPP_RGB, Texture2D::PixelFormat::PVRTC2), + _pixel3_formathash::value_type(PVR3TexturePixelFormat::PVRTC2BPP_RGBA, Texture2D::PixelFormat::PVRTC2A), + _pixel3_formathash::value_type(PVR3TexturePixelFormat::PVRTC4BPP_RGB, Texture2D::PixelFormat::PVRTC4), + _pixel3_formathash::value_type(PVR3TexturePixelFormat::PVRTC4BPP_RGBA, Texture2D::PixelFormat::PVRTC4A), + + _pixel3_formathash::value_type(PVR3TexturePixelFormat::ETC1, Texture2D::PixelFormat::ETC), + }; + + static const int PVR3_MAX_TABLE_ELEMENTS = sizeof(v3_pixel_formathash_value) / sizeof(v3_pixel_formathash_value[0]); + + static const _pixel3_formathash v3_pixel_formathash(v3_pixel_formathash_value, v3_pixel_formathash_value + PVR3_MAX_TABLE_ELEMENTS); + + typedef struct _PVRTexHeader + { + unsigned int headerLength; + unsigned int height; + unsigned int width; + unsigned int numMipmaps; + unsigned int flags; + unsigned int dataLength; + unsigned int bpp; + unsigned int bitmaskRed; + unsigned int bitmaskGreen; + unsigned int bitmaskBlue; + unsigned int bitmaskAlpha; + unsigned int pvrTag; + unsigned int numSurfs; + } PVRv2TexHeader; + +#ifdef _MSC_VER +#pragma pack(push,1) +#endif + typedef struct + { + uint32_t version; + uint32_t flags; + uint64_t pixelFormat; + uint32_t colorSpace; + uint32_t channelType; + uint32_t height; + uint32_t width; + uint32_t depth; + uint32_t numberOfSurfaces; + uint32_t numberOfFaces; + uint32_t numberOfMipmaps; + uint32_t metadataLength; +#ifdef _MSC_VER + } PVRv3TexHeader; +#pragma pack(pop) +#else + } __attribute__((packed)) PVRv3TexHeader; +#endif +} +//pvr structure end + +namespace +{ + typedef struct + { + const unsigned char * data; + ssize_t size; + int offset; + }tImageSource; + +#ifdef CC_USE_PNG + static void pngReadCallback(png_structp png_ptr, png_bytep data, png_size_t length) + { + tImageSource* isource = (tImageSource*)png_get_io_ptr(png_ptr); + + if((int)(isource->offset + length) <= isource->size) + { + memcpy(data, isource->data+isource->offset, length); + isource->offset += length; + } + else + { + png_error(png_ptr, "pngReaderCallback failed"); + } + } +#endif //CC_USE_PNG +} + +Texture2D::PixelFormat getDevicePixelFormat(Texture2D::PixelFormat format) +{ + switch (format) { + case Texture2D::PixelFormat::PVRTC4: + case Texture2D::PixelFormat::PVRTC4A: + case Texture2D::PixelFormat::PVRTC2: + case Texture2D::PixelFormat::PVRTC2A: + if(Configuration::getInstance()->supportsPVRTC()) + return format; + else + return Texture2D::PixelFormat::RGBA8888; + case Texture2D::PixelFormat::ETC: + if(Configuration::getInstance()->supportsETC()) + return format; + else + return Texture2D::PixelFormat::RGB888; + default: + return format; + } +} + +////////////////////////////////////////////////////////////////////////// +// Implement Image +////////////////////////////////////////////////////////////////////////// +bool Image::PNG_PREMULTIPLIED_ALPHA_ENABLED = true; + +Image::Image() +: _data(nullptr) +, _dataLen(0) +, _width(0) +, _height(0) +, _unpack(false) +, _fileType(Format::UNKNOWN) +, _renderFormat(Texture2D::PixelFormat::NONE) +, _numberOfMipmaps(0) +, _hasPremultipliedAlpha(true) +{ + +} + +Image::~Image() +{ + if(_unpack) + { + for (int i = 0; i < _numberOfMipmaps; ++i) + CC_SAFE_DELETE_ARRAY(_mipmaps[i].address); + } + else + CC_SAFE_FREE(_data); +} + +bool Image::initWithImageFile(const std::string& path) +{ + bool ret = false; + _filePath = FileUtils::getInstance()->fullPathForFilename(path); + + Data data = FileUtils::getInstance()->getDataFromFile(_filePath); + + if (!data.isNull()) + { + auto bin = data.getBytes(); + auto size = data.getSize(); + + unsigned char have_encrypt_first_flag = *(bin+(size-2)); + unsigned char have_encrypt_second_flag = *(bin + (size-3)); + unsigned char have_encrypt_third_flag = *(bin + (size-4)); + unsigned char encrypt_key = 0; + unsigned int encrypt_head_flag_lengh = 3; + unsigned int encrypt_head_lengh = 4; + + if (have_encrypt_first_flag == 0x24 + && have_encrypt_second_flag == 0x63 + && have_encrypt_third_flag == 0x92) + { + encrypt_key = *(bin + ((size-1))); + auto *cur = bin; + auto count = size - encrypt_head_lengh; + while (count) + { + *cur ^= encrypt_key; + ++cur; + --count; + } + + ret = initWithImageData(data.getBytes(), data.getSize()-encrypt_head_lengh); + } + else + { + ret = initWithImageData(data.getBytes(), data.getSize()); + } + } + + return ret; +} + +bool Image::initWithImageData(const unsigned char * data, ssize_t dataLen) +{ + bool ret = false; + + do + { + CC_BREAK_IF(! data || dataLen <= 0); + unsigned char* decodeData = nullptr; + unsigned char* unpackedData = nullptr; + ssize_t unpackedLen = 0; + + dataLen = imageCompress(data, dataLen, &decodeData); + if(decodeData) + { + data = decodeData; + } + + //detect and unzip the compress file + if (ZipUtils::isCCZBuffer(data, dataLen)) + { + unpackedLen = ZipUtils::inflateCCZBuffer(data, dataLen, &unpackedData); + } + else if (ZipUtils::isGZipBuffer(data, dataLen)) + { + unpackedLen = ZipUtils::inflateMemory(const_cast(data), dataLen, &unpackedData); + } + else + { + unpackedData = const_cast(data); + unpackedLen = dataLen; + } + + _fileType = detectFormat(unpackedData, unpackedLen); + + switch (_fileType) + { + case Format::PNG: + ret = initWithPngData(unpackedData, unpackedLen); + break; + case Format::JPG: + ret = initWithJpgData(unpackedData, unpackedLen); + break; + case Format::TIFF: + ret = initWithTiffData(unpackedData, unpackedLen); + break; + case Format::WEBP: + ret = initWithWebpData(unpackedData, unpackedLen); + break; + case Format::PVR: + ret = initWithPVRData(unpackedData, unpackedLen); + break; + case Format::ETC: + ret = initWithETCData(unpackedData, unpackedLen); + break; + default: + { + // load and detect image format + tImageTGA* tgaData = tgaLoadBuffer(unpackedData, unpackedLen); + + if (tgaData != nullptr && tgaData->status == TGA_OK) + { + ret = initWithTGAData(tgaData); + } + else + { + CCLOG("cocos2d: unsupported image format!"); + } + + free(tgaData); + break; + } + } + if(decodeData) + { + free(decodeData); + } + + if(unpackedData != data) + { + free(unpackedData); + } + } while (0); + + return ret; +} + +bool Image::isPng(const unsigned char * data, ssize_t dataLen) +{ + if (dataLen <= 8) + { + return false; + } + + static const unsigned char PNG_SIGNATURE[] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a}; + + return memcmp(PNG_SIGNATURE, data, sizeof(PNG_SIGNATURE)) == 0; +} + +bool Image::isEtc(const unsigned char * data, ssize_t dataLen) +{ + return etc1_pkm_is_valid((etc1_byte*)data) ? true : false; +} + +bool Image::isJpg(const unsigned char * data, ssize_t dataLen) +{ + if (dataLen <= 4) + { + return false; + } + + static const unsigned char JPG_SOI[] = {0xFF, 0xD8}; + + return memcmp(data, JPG_SOI, 2) == 0; +} + +bool Image::isTiff(const unsigned char * data, ssize_t dataLen) +{ + if (dataLen <= 4) + { + return false; + } + + static const char* TIFF_II = "II"; + static const char* TIFF_MM = "MM"; + + return (memcmp(data, TIFF_II, 2) == 0 && *(static_cast(data) + 2) == 42 && *(static_cast(data) + 3) == 0) || + (memcmp(data, TIFF_MM, 2) == 0 && *(static_cast(data) + 2) == 0 && *(static_cast(data) + 3) == 42); +} + +bool Image::isWebp(const unsigned char * data, ssize_t dataLen) +{ + if (dataLen <= 12) + { + return false; + } + + static const char* WEBP_RIFF = "RIFF"; + static const char* WEBP_WEBP = "WEBP"; + + return memcmp(data, WEBP_RIFF, 4) == 0 + && memcmp(static_cast(data) + 8, WEBP_WEBP, 4) == 0; +} + +bool Image::isPvr(const unsigned char * data, ssize_t dataLen) +{ + if (static_cast(dataLen) < sizeof(PVRv2TexHeader) || static_cast(dataLen) < sizeof(PVRv3TexHeader)) + { + return false; + } + + const PVRv2TexHeader* headerv2 = static_cast(static_cast(data)); + const PVRv3TexHeader* headerv3 = static_cast(static_cast(data)); + + return memcmp(&headerv2->pvrTag, gPVRTexIdentifier, strlen(gPVRTexIdentifier)) == 0 || CC_SWAP_INT32_BIG_TO_HOST(headerv3->version) == 0x50565203; +} + +Image::Format Image::detectFormat(const unsigned char * data, ssize_t dataLen) +{ + if (isPng(data, dataLen)) + { + return Format::PNG; + } + else if (isJpg(data, dataLen)) + { + return Format::JPG; + } + else if (isTiff(data, dataLen)) + { + return Format::TIFF; + } + else if (isWebp(data, dataLen)) + { + return Format::WEBP; + } + else if (isPvr(data, dataLen)) + { + return Format::PVR; + } + else if (isEtc(data, dataLen)) + { + return Format::ETC; + } + else + { + return Format::UNKNOWN; + } +} + +int Image::getBitPerPixel() +{ + return Texture2D::getPixelFormatInfoMap().at(_renderFormat).bpp; +} + +bool Image::hasAlpha() +{ + return Texture2D::getPixelFormatInfoMap().at(_renderFormat).alpha; +} + +bool Image::isCompressed() +{ + return Texture2D::getPixelFormatInfoMap().at(_renderFormat).compressed; +} + +namespace +{ + /* + * ERROR HANDLING: + * + * The JPEG library's standard error handler (jerror.c) is divided into + * several "methods" which you can override individually. This lets you + * adjust the behavior without duplicating a lot of code, which you might + * have to update with each future release. + * + * We override the "error_exit" method so that control is returned to the + * library's caller when a fatal error occurs, rather than calling exit() + * as the standard error_exit method does. + * + * We use C's setjmp/longjmp facility to return control. This means that the + * routine which calls the JPEG library must first execute a setjmp() call to + * establish the return point. We want the replacement error_exit to do a + * longjmp(). But we need to make the setjmp buffer accessible to the + * error_exit routine. To do this, we make a private extension of the + * standard JPEG error handler object. (If we were using C++, we'd say we + * were making a subclass of the regular error handler.) + * + * Here's the extended error handler struct: + */ +#if CC_USE_JPEG + struct MyErrorMgr + { + struct jpeg_error_mgr pub; /* "public" fields */ + jmp_buf setjmp_buffer; /* for return to caller */ + }; + + typedef struct MyErrorMgr * MyErrorPtr; + + /* + * Here's the routine that will replace the standard error_exit method: + */ + + METHODDEF(void) + myErrorExit(j_common_ptr cinfo) + { + /* cinfo->err really points to a MyErrorMgr struct, so coerce pointer */ + MyErrorPtr myerr = (MyErrorPtr) cinfo->err; + + /* Always display the message. */ + /* We could postpone this until after returning, if we chose. */ + /* internal message function can't show error message in some platforms, so we rewrite it here. + * edit it if has version conflict. + */ + //(*cinfo->err->output_message) (cinfo); + char buffer[JMSG_LENGTH_MAX]; + (*cinfo->err->format_message) (cinfo, buffer); + CCLOG("jpeg error: %s", buffer); + + /* Return control to the setjmp point */ + longjmp(myerr->setjmp_buffer, 1); + } +#endif // CC_USE_JPEG +} + +bool Image::initWithJpgData(const unsigned char * data, ssize_t dataLen) +{ +#if CC_USE_WIC + return decodeWithWIC(data, dataLen); +#elif CC_USE_JPEG + /* these are standard libjpeg structures for reading(decompression) */ + struct jpeg_decompress_struct cinfo; + /* We use our private extension JPEG error handler. + * Note that this struct must live as long as the main JPEG parameter + * struct, to avoid dangling-pointer problems. + */ + struct MyErrorMgr jerr; + /* libjpeg data structure for storing one row, that is, scanline of an image */ + JSAMPROW row_pointer[1] = {0}; + unsigned long location = 0; + + bool ret = false; + do + { + /* We set up the normal JPEG error routines, then override error_exit. */ + cinfo.err = jpeg_std_error(&jerr.pub); + jerr.pub.error_exit = myErrorExit; + /* Establish the setjmp return context for MyErrorExit to use. */ + if (setjmp(jerr.setjmp_buffer)) + { + /* If we get here, the JPEG code has signaled an error. + * We need to clean up the JPEG object, close the input file, and return. + */ + jpeg_destroy_decompress(&cinfo); + break; + } + + /* setup decompression process and source, then read JPEG header */ + jpeg_create_decompress( &cinfo ); + +#ifndef CC_TARGET_QT5 + jpeg_mem_src(&cinfo, const_cast(data), dataLen); +#endif /* CC_TARGET_QT5 */ + + /* reading the image header which contains image information */ +#if (JPEG_LIB_VERSION >= 90) + // libjpeg 0.9 adds stricter types. + jpeg_read_header(&cinfo, TRUE); +#else + jpeg_read_header(&cinfo, TRUE); +#endif + + // we only support RGB or grayscale + if (cinfo.jpeg_color_space == JCS_GRAYSCALE) + { + _renderFormat = Texture2D::PixelFormat::I8; + }else + { + cinfo.out_color_space = JCS_RGB; + _renderFormat = Texture2D::PixelFormat::RGB888; + } + + /* Start decompression jpeg here */ + jpeg_start_decompress( &cinfo ); + + /* init image info */ + _width = cinfo.output_width; + _height = cinfo.output_height; + _hasPremultipliedAlpha = false; + + _dataLen = cinfo.output_width*cinfo.output_height*cinfo.output_components; + _data = static_cast(malloc(_dataLen * sizeof(unsigned char))); + CC_BREAK_IF(! _data); + + /* now actually read the jpeg into the raw buffer */ + /* read one scan line at a time */ + while (cinfo.output_scanline < cinfo.output_height) + { + row_pointer[0] = _data + location; + location += cinfo.output_width*cinfo.output_components; + jpeg_read_scanlines(&cinfo, row_pointer, 1); + } + + /* When read image file with broken data, jpeg_finish_decompress() may cause error. + * Besides, jpeg_destroy_decompress() shall deallocate and release all memory associated + * with the decompression object. + * So it doesn't need to call jpeg_finish_decompress(). + */ + //jpeg_finish_decompress( &cinfo ); + jpeg_destroy_decompress( &cinfo ); + /* wrap up decompression, destroy objects, free pointers and close open files */ + ret = true; + } while (0); + + return ret; +#else + CCLOG("jpeg is not enabled, please enable it in ccConfig.h"); + return false; +#endif // CC_USE_JPEG +} + +bool Image::initWithPngData(const unsigned char * data, ssize_t dataLen) +{ +#if CC_USE_WIC + return decodeWithWIC(data, dataLen); +#elif CC_USE_PNG + // length of bytes to check if it is a valid png file +#define PNGSIGSIZE 8 + bool ret = false; + png_byte header[PNGSIGSIZE] = {0}; + png_structp png_ptr = 0; + png_infop info_ptr = 0; + + do + { + // png header len is 8 bytes + CC_BREAK_IF(dataLen < PNGSIGSIZE); + + // check the data is png or not + memcpy(header, data, PNGSIGSIZE); + CC_BREAK_IF(png_sig_cmp(header, 0, PNGSIGSIZE)); + + // init png_struct + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0); + CC_BREAK_IF(! png_ptr); + + // init png_info + info_ptr = png_create_info_struct(png_ptr); + CC_BREAK_IF(!info_ptr); + +#if (CC_TARGET_PLATFORM != CC_PLATFORM_BADA && CC_TARGET_PLATFORM != CC_PLATFORM_NACL) + CC_BREAK_IF(setjmp(png_jmpbuf(png_ptr))); +#endif + + // set the read call back function + tImageSource imageSource; + imageSource.data = (unsigned char*)data; + imageSource.size = dataLen; + imageSource.offset = 0; + png_set_read_fn(png_ptr, &imageSource, pngReadCallback); + + // read png header info + + // read png file info + png_read_info(png_ptr, info_ptr); + + _width = png_get_image_width(png_ptr, info_ptr); + _height = png_get_image_height(png_ptr, info_ptr); + png_byte bit_depth = png_get_bit_depth(png_ptr, info_ptr); + png_uint_32 color_type = png_get_color_type(png_ptr, info_ptr); + + //CCLOG("color type %u", color_type); + + // force palette images to be expanded to 24-bit RGB + // it may include alpha channel + if (color_type == PNG_COLOR_TYPE_PALETTE) + { + png_set_palette_to_rgb(png_ptr); + } + // low-bit-depth grayscale images are to be expanded to 8 bits + if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) + { + bit_depth = 8; + png_set_expand_gray_1_2_4_to_8(png_ptr); + } + // expand any tRNS chunk data into a full alpha channel + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) + { + png_set_tRNS_to_alpha(png_ptr); + } + // reduce images with 16-bit samples to 8 bits + if (bit_depth == 16) + { + png_set_strip_16(png_ptr); + } + + // Expanded earlier for grayscale, now take care of palette and rgb + if (bit_depth < 8) + { + png_set_packing(png_ptr); + } + // update info + png_read_update_info(png_ptr, info_ptr); + bit_depth = png_get_bit_depth(png_ptr, info_ptr); + color_type = png_get_color_type(png_ptr, info_ptr); + + switch (color_type) + { + case PNG_COLOR_TYPE_GRAY: + _renderFormat = Texture2D::PixelFormat::I8; + break; + case PNG_COLOR_TYPE_GRAY_ALPHA: + _renderFormat = Texture2D::PixelFormat::AI88; + break; + case PNG_COLOR_TYPE_RGB: + _renderFormat = Texture2D::PixelFormat::RGB888; + break; + case PNG_COLOR_TYPE_RGB_ALPHA: + _renderFormat = Texture2D::PixelFormat::RGBA8888; + break; + default: + break; + } + + // read png data + png_size_t rowbytes; + png_bytep* row_pointers = (png_bytep*)malloc( sizeof(png_bytep) * _height ); + + rowbytes = png_get_rowbytes(png_ptr, info_ptr); + + _dataLen = rowbytes * _height; + _data = static_cast(malloc(_dataLen * sizeof(unsigned char))); + if (!_data) + { + if (row_pointers != nullptr) + { + free(row_pointers); + } + break; + } + + for (unsigned short i = 0; i < _height; ++i) + { + row_pointers[i] = _data + i*rowbytes; + } + png_read_image(png_ptr, row_pointers); + + png_read_end(png_ptr, nullptr); + + // premultiplied alpha for RGBA8888 + if (PNG_PREMULTIPLIED_ALPHA_ENABLED && color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + premultipliedAlpha(); + } + else + { + _hasPremultipliedAlpha = false; + } + + if (row_pointers != nullptr) + { + free(row_pointers); + } + + ret = true; + } while (0); + + if (png_ptr) + { + png_destroy_read_struct(&png_ptr, (info_ptr) ? &info_ptr : 0, 0); + } + return ret; +#else + CCLOG("png is not enabled, please enable it in ccConfig.h"); + return false; +#endif //CC_USE_PNG +} + +#if CC_USE_TIFF +namespace +{ + static tmsize_t tiffReadProc(thandle_t fd, void* buf, tmsize_t size) + { + tImageSource* isource = (tImageSource*)fd; + uint8* ma; + uint64 mb; + unsigned long n; + unsigned long o; + tmsize_t p; + ma=(uint8*)buf; + mb=size; + p=0; + while (mb>0) + { + n=0x80000000UL; + if ((uint64)n>mb) + n=(unsigned long)mb; + + + if ((int)(isource->offset + n) <= isource->size) + { + memcpy(ma, isource->data+isource->offset, n); + isource->offset += n; + o = n; + } + else + { + return 0; + } + + ma+=o; + mb-=o; + p+=o; + if (o!=n) + { + break; + } + } + return p; + } + + static tmsize_t tiffWriteProc(thandle_t fd, void* buf, tmsize_t size) + { + CC_UNUSED_PARAM(fd); + CC_UNUSED_PARAM(buf); + CC_UNUSED_PARAM(size); + return 0; + } + + + static uint64 tiffSeekProc(thandle_t fd, uint64 off, int whence) + { + tImageSource* isource = (tImageSource*)fd; + uint64 ret = -1; + do + { + if (whence == SEEK_SET) + { + CC_BREAK_IF(off >= (uint64)isource->size); + ret = isource->offset = (uint32)off; + } + else if (whence == SEEK_CUR) + { + CC_BREAK_IF(isource->offset + off >= (uint64)isource->size); + ret = isource->offset += (uint32)off; + } + else if (whence == SEEK_END) + { + CC_BREAK_IF(off >= (uint64)isource->size); + ret = isource->offset = (uint32)(isource->size-1 - off); + } + else + { + CC_BREAK_IF(off >= (uint64)isource->size); + ret = isource->offset = (uint32)off; + } + } while (0); + + return ret; + } + + static uint64 tiffSizeProc(thandle_t fd) + { + tImageSource* imageSrc = (tImageSource*)fd; + return imageSrc->size; + } + + static int tiffCloseProc(thandle_t fd) + { + CC_UNUSED_PARAM(fd); + return 0; + } + + static int tiffMapProc(thandle_t fd, void** base, toff_t* size) + { + CC_UNUSED_PARAM(fd); + CC_UNUSED_PARAM(base); + CC_UNUSED_PARAM(size); + return 0; + } + + static void tiffUnmapProc(thandle_t fd, void* base, toff_t size) + { + CC_UNUSED_PARAM(fd); + CC_UNUSED_PARAM(base); + CC_UNUSED_PARAM(size); + } +} +#endif // CC_USE_TIFF + +bool Image::initWithTiffData(const unsigned char * data, ssize_t dataLen) +{ +#if CC_USE_WIC + return decodeWithWIC(data, dataLen); +#elif CC_USE_TIFF + bool ret = false; + do + { + // set the read call back function + tImageSource imageSource; + imageSource.data = data; + imageSource.size = dataLen; + imageSource.offset = 0; + + TIFF* tif = TIFFClientOpen("file.tif", "r", (thandle_t)&imageSource, + tiffReadProc, tiffWriteProc, + tiffSeekProc, tiffCloseProc, tiffSizeProc, + tiffMapProc, + tiffUnmapProc); + + CC_BREAK_IF(nullptr == tif); + + uint32 w = 0, h = 0; + uint16 bitsPerSample = 0, samplePerPixel = 0, planarConfig = 0; + size_t npixels = 0; + + TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w); + TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h); + TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &bitsPerSample); + TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &samplePerPixel); + TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &planarConfig); + + npixels = w * h; + + _renderFormat = Texture2D::PixelFormat::RGBA8888; + _width = w; + _height = h; + + _dataLen = npixels * sizeof (uint32); + _data = static_cast(malloc(_dataLen * sizeof(unsigned char))); + + uint32* raster = (uint32*) _TIFFmalloc(npixels * sizeof (uint32)); + if (raster != nullptr) + { + if (TIFFReadRGBAImageOriented(tif, w, h, raster, ORIENTATION_TOPLEFT, 0)) + { + /* the raster data is pre-multiplied by the alpha component + after invoking TIFFReadRGBAImageOriented*/ + _hasPremultipliedAlpha = true; + + memcpy(_data, raster, npixels*sizeof (uint32)); + } + + _TIFFfree(raster); + } + + + TIFFClose(tif); + + ret = true; + } while (0); + return ret; +#else + CCLOG("tiff is not enabled, please enable it in ccConfig.h"); + return false; +#endif //CC_USE_TIFF +} + + +namespace +{ + bool testFormatForPvr2TCSupport(PVR2TexturePixelFormat format) + { + return true; + } + + bool testFormatForPvr3TCSupport(PVR3TexturePixelFormat format) + { + switch (format) { + case PVR3TexturePixelFormat::BGRA8888: + return Configuration::getInstance()->supportsBGRA8888(); + + case PVR3TexturePixelFormat::PVRTC2BPP_RGB: + case PVR3TexturePixelFormat::PVRTC2BPP_RGBA: + case PVR3TexturePixelFormat::PVRTC4BPP_RGB: + case PVR3TexturePixelFormat::PVRTC4BPP_RGBA: + case PVR3TexturePixelFormat::ETC1: + case PVR3TexturePixelFormat::RGBA8888: + case PVR3TexturePixelFormat::RGBA4444: + case PVR3TexturePixelFormat::RGBA5551: + case PVR3TexturePixelFormat::RGB565: + case PVR3TexturePixelFormat::RGB888: + case PVR3TexturePixelFormat::A8: + case PVR3TexturePixelFormat::L8: + case PVR3TexturePixelFormat::LA88: + return true; + + default: + return false; + } + } +} + +bool Image::initWithPVRv2Data(const unsigned char * data, ssize_t dataLen) +{ + int dataLength = 0, dataOffset = 0, dataSize = 0; + int blockSize = 0, widthBlocks = 0, heightBlocks = 0; + int width = 0, height = 0; + + //Cast first sizeof(PVRTexHeader) bytes of data stream as PVRTexHeader + const PVRv2TexHeader *header = static_cast(static_cast(data)); + + //Make sure that tag is in correct formatting + if (memcmp(&header->pvrTag, gPVRTexIdentifier, strlen(gPVRTexIdentifier)) != 0) + { + return false; + } + + Configuration *configuration = Configuration::getInstance(); + + //can not detect the premultiplied alpha from pvr file, use _PVRHaveAlphaPremultiplied instead. + _hasPremultipliedAlpha = _PVRHaveAlphaPremultiplied; + + unsigned int flags = CC_SWAP_INT32_LITTLE_TO_HOST(header->flags); + PVR2TexturePixelFormat formatFlags = static_cast(flags & PVR_TEXTURE_FLAG_TYPE_MASK); + bool flipped = (flags & (unsigned int)PVR2TextureFlag::VerticalFlip) ? true : false; + if (flipped) + { + CCLOG("cocos2d: WARNING: Image is flipped. Regenerate it using PVRTexTool"); + } + + if (! configuration->supportsNPOT() && + (static_cast(header->width) != ccNextPOT(header->width) + || static_cast(header->height) != ccNextPOT(header->height))) + { + CCLOG("cocos2d: ERROR: Loading an NPOT texture (%dx%d) but is not supported on this device", header->width, header->height); + return false; + } + + if (!testFormatForPvr2TCSupport(formatFlags)) + { + CCLOG("cocos2d: WARNING: Unsupported PVR Pixel Format: 0x%02X. Re-encode it with a OpenGL pixel format variant", (int)formatFlags); + return false; + } + + if (v2_pixel_formathash.find(formatFlags) == v2_pixel_formathash.end()) + { + CCLOG("cocos2d: WARNING: Unsupported PVR Pixel Format: 0x%02X. Re-encode it with a OpenGL pixel format variant", (int)formatFlags); + return false; + } + + auto it = Texture2D::getPixelFormatInfoMap().find(getDevicePixelFormat(v2_pixel_formathash.at(formatFlags))); + + if (it == Texture2D::getPixelFormatInfoMap().end()) + { + CCLOG("cocos2d: WARNING: Unsupported PVR Pixel Format: 0x%02X. Re-encode it with a OpenGL pixel format variant", (int)formatFlags); + return false; + } + + _renderFormat = it->first; + int bpp = it->second.bpp; + + //Reset num of mipmaps + _numberOfMipmaps = 0; + + //Get size of mipmap + _width = width = CC_SWAP_INT32_LITTLE_TO_HOST(header->width); + _height = height = CC_SWAP_INT32_LITTLE_TO_HOST(header->height); + + //Get ptr to where data starts.. + dataLength = CC_SWAP_INT32_LITTLE_TO_HOST(header->dataLength); + + //Move by size of header + _dataLen = dataLen - sizeof(PVRv2TexHeader); + _data = static_cast(malloc(_dataLen * sizeof(unsigned char))); + memcpy(_data, (unsigned char*)data + sizeof(PVRv2TexHeader), _dataLen); + + // Calculate the data size for each texture level and respect the minimum number of blocks + while (dataOffset < dataLength) + { + switch (formatFlags) { + case PVR2TexturePixelFormat::PVRTC2BPP_RGBA: + if (!Configuration::getInstance()->supportsPVRTC()) + { + CCLOG("cocos2d: Hardware PVR decoder not present. Using software decoder"); + _unpack = true; + _mipmaps[_numberOfMipmaps].len = width*height*4; + _mipmaps[_numberOfMipmaps].address = new (std::nothrow) unsigned char[width*height*4]; + PVRTDecompressPVRTC(_data+dataOffset,width,height,_mipmaps[_numberOfMipmaps].address, true); + bpp = 2; + } + blockSize = 8 * 4; // Pixel by pixel block size for 2bpp + widthBlocks = width / 8; + heightBlocks = height / 4; + break; + case PVR2TexturePixelFormat::PVRTC4BPP_RGBA: + if (!Configuration::getInstance()->supportsPVRTC()) + { + CCLOG("cocos2d: Hardware PVR decoder not present. Using software decoder"); + _unpack = true; + _mipmaps[_numberOfMipmaps].len = width*height*4; + _mipmaps[_numberOfMipmaps].address = new (std::nothrow) unsigned char[width*height*4]; + PVRTDecompressPVRTC(_data+dataOffset,width,height,_mipmaps[_numberOfMipmaps].address, false); + bpp = 4; + } + blockSize = 4 * 4; // Pixel by pixel block size for 4bpp + widthBlocks = width / 4; + heightBlocks = height / 4; + break; + case PVR2TexturePixelFormat::BGRA8888: + if (Configuration::getInstance()->supportsBGRA8888() == false) + { + CCLOG("cocos2d: Image. BGRA8888 not supported on this device"); + return false; + } + default: + blockSize = 1; + widthBlocks = width; + heightBlocks = height; + break; + } + + // Clamp to minimum number of blocks + if (widthBlocks < 2) + { + widthBlocks = 2; + } + if (heightBlocks < 2) + { + heightBlocks = 2; + } + + dataSize = widthBlocks * heightBlocks * ((blockSize * bpp) / 8); + int packetLength = (dataLength - dataOffset); + packetLength = packetLength > dataSize ? dataSize : packetLength; + + //Make record to the mipmaps array and increment counter + if(!_unpack) + { + _mipmaps[_numberOfMipmaps].address = _data + dataOffset; + _mipmaps[_numberOfMipmaps].len = packetLength; + } + _numberOfMipmaps++; + + dataOffset += packetLength; + + //Update width and height to the next lower power of two + width = MAX(width >> 1, 1); + height = MAX(height >> 1, 1); + } + + if(_unpack) + { + _data = _mipmaps[0].address; + _dataLen = _mipmaps[0].len; + } + + return true; +} + +bool Image::initWithPVRv3Data(const unsigned char * data, ssize_t dataLen) +{ + if (static_cast(dataLen) < sizeof(PVRv3TexHeader)) + { + return false; + } + + const PVRv3TexHeader *header = static_cast(static_cast(data)); + + // validate version + if (CC_SWAP_INT32_BIG_TO_HOST(header->version) != 0x50565203) + { + CCLOG("cocos2d: WARNING: pvr file version mismatch"); + return false; + } + + // parse pixel format + PVR3TexturePixelFormat pixelFormat = static_cast(header->pixelFormat); + + if (!testFormatForPvr3TCSupport(pixelFormat)) + { + CCLOG("cocos2d: WARNING: Unsupported PVR Pixel Format: 0x%016llX. Re-encode it with a OpenGL pixel format variant", + static_cast(pixelFormat)); + return false; + } + + + if (v3_pixel_formathash.find(pixelFormat) == v3_pixel_formathash.end()) + { + CCLOG("cocos2d: WARNING: Unsupported PVR Pixel Format: 0x%016llX. Re-encode it with a OpenGL pixel format variant", + static_cast(pixelFormat)); + return false; + } + + auto it = Texture2D::getPixelFormatInfoMap().find(getDevicePixelFormat(v3_pixel_formathash.at(pixelFormat))); + + if (it == Texture2D::getPixelFormatInfoMap().end()) + { + CCLOG("cocos2d: WARNING: Unsupported PVR Pixel Format: 0x%016llX. Re-encode it with a OpenGL pixel format variant", + static_cast(pixelFormat)); + return false; + } + + _renderFormat = it->first; + int bpp = it->second.bpp; + + // flags + int flags = CC_SWAP_INT32_LITTLE_TO_HOST(header->flags); + + // PVRv3 specifies premultiply alpha in a flag -- should always respect this in PVRv3 files + if (flags & (unsigned int)PVR3TextureFlag::PremultipliedAlpha) + { + _hasPremultipliedAlpha = true; + } + else + { + _hasPremultipliedAlpha = false; + } + + // sizing + int width = CC_SWAP_INT32_LITTLE_TO_HOST(header->width); + int height = CC_SWAP_INT32_LITTLE_TO_HOST(header->height); + _width = width; + _height = height; + int dataOffset = 0, dataSize = 0; + int blockSize = 0, widthBlocks = 0, heightBlocks = 0; + + _dataLen = dataLen - (sizeof(PVRv3TexHeader) + header->metadataLength); + _data = static_cast(malloc(_dataLen * sizeof(unsigned char))); + memcpy(_data, static_cast(data) + sizeof(PVRv3TexHeader) + header->metadataLength, _dataLen); + + _numberOfMipmaps = header->numberOfMipmaps; + CCASSERT(_numberOfMipmaps < MIPMAP_MAX, "Image: Maximum number of mimpaps reached. Increase the CC_MIPMAP_MAX value"); + + for (int i = 0; i < _numberOfMipmaps; i++) + { + switch ((PVR3TexturePixelFormat)pixelFormat) + { + case PVR3TexturePixelFormat::PVRTC2BPP_RGB : + case PVR3TexturePixelFormat::PVRTC2BPP_RGBA : + if (!Configuration::getInstance()->supportsPVRTC()) + { + CCLOG("cocos2d: Hardware PVR decoder not present. Using software decoder"); + _unpack = true; + _mipmaps[i].len = width*height*4; + _mipmaps[i].address = new (std::nothrow) unsigned char[width*height*4]; + PVRTDecompressPVRTC(_data+dataOffset,width,height,_mipmaps[i].address, true); + bpp = 2; + } + blockSize = 8 * 4; // Pixel by pixel block size for 2bpp + widthBlocks = width / 8; + heightBlocks = height / 4; + break; + case PVR3TexturePixelFormat::PVRTC4BPP_RGB : + case PVR3TexturePixelFormat::PVRTC4BPP_RGBA : + if (!Configuration::getInstance()->supportsPVRTC()) + { + CCLOG("cocos2d: Hardware PVR decoder not present. Using software decoder"); + _unpack = true; + _mipmaps[i].len = width*height*4; + _mipmaps[i].address = new (std::nothrow) unsigned char[width*height*4]; + PVRTDecompressPVRTC(_data+dataOffset,width,height,_mipmaps[i].address, false); + bpp = 4; + } + blockSize = 4 * 4; // Pixel by pixel block size for 4bpp + widthBlocks = width / 4; + heightBlocks = height / 4; + break; + case PVR3TexturePixelFormat::ETC1: + if (!Configuration::getInstance()->supportsETC()) + { + CCLOG("cocos2d: Hardware ETC1 decoder not present. Using software decoder"); + int bytePerPixel = 3; + unsigned int stride = width * bytePerPixel; + _unpack = true; + _mipmaps[i].len = width*height*bytePerPixel; + _mipmaps[i].address = new (std::nothrow) unsigned char[width*height*bytePerPixel]; + if (etc1_decode_image(static_cast(_data+dataOffset), static_cast(_mipmaps[i].address), width, height, bytePerPixel, stride) != 0) + { + return false; + } + } + blockSize = 4 * 4; // Pixel by pixel block size for 4bpp + widthBlocks = width / 4; + heightBlocks = height / 4; + break; + case PVR3TexturePixelFormat::BGRA8888: + if (! Configuration::getInstance()->supportsBGRA8888()) + { + CCLOG("cocos2d: Image. BGRA8888 not supported on this device"); + return false; + } + default: + blockSize = 1; + widthBlocks = width; + heightBlocks = height; + break; + } + + // Clamp to minimum number of blocks + if (widthBlocks < 2) + { + widthBlocks = 2; + } + if (heightBlocks < 2) + { + heightBlocks = 2; + } + + dataSize = widthBlocks * heightBlocks * ((blockSize * bpp) / 8); + auto packetLength = _dataLen - dataOffset; + packetLength = packetLength > dataSize ? dataSize : packetLength; + + if(!_unpack) + { + _mipmaps[i].address = _data + dataOffset; + _mipmaps[i].len = static_cast(packetLength); + } + + dataOffset += packetLength; + CCASSERT(dataOffset <= _dataLen, "Image: Invalid length"); + + + width = MAX(width >> 1, 1); + height = MAX(height >> 1, 1); + } + + if (_unpack) + { + _data = _mipmaps[0].address; + _dataLen = _mipmaps[0].len; + } + + return true; +} + +bool Image::initWithETCData(const unsigned char * data, ssize_t dataLen) +{ + const etc1_byte* header = static_cast(data); + + //check the data + if (! etc1_pkm_is_valid(header)) + { + return false; + } + + _width = etc1_pkm_get_width(header); + _height = etc1_pkm_get_height(header); + + if (0 == _width || 0 == _height) + { + return false; + } + + if (Configuration::getInstance()->supportsETC()) + { + //old opengl version has no define for GL_ETC1_RGB8_OES, add macro to make compiler happy. +#ifdef GL_ETC1_RGB8_OES + _renderFormat = Texture2D::PixelFormat::ETC; + _dataLen = dataLen - ETC_PKM_HEADER_SIZE; + _data = static_cast(malloc(_dataLen * sizeof(unsigned char))); + memcpy(_data, static_cast(data) + ETC_PKM_HEADER_SIZE, _dataLen); + return true; +#endif + } + else + { + CCLOG("cocos2d: Hardware ETC1 decoder not present. Using software decoder"); + + //if it is not gles or device do not support ETC, decode texture by software + int bytePerPixel = 3; + unsigned int stride = _width * bytePerPixel; + _renderFormat = Texture2D::PixelFormat::RGB888; + + _dataLen = _width * _height * bytePerPixel; + _data = static_cast(malloc(_dataLen * sizeof(unsigned char))); + + if (etc1_decode_image(static_cast(data) + ETC_PKM_HEADER_SIZE, static_cast(_data), _width, _height, bytePerPixel, stride) != 0) + { + _dataLen = 0; + if (_data != nullptr) + { + free(_data); + } + return false; + } + + return true; + } + return false; +} + +bool Image::initWithTGAData(tImageTGA* tgaData) +{ + bool ret = false; + + do + { + CC_BREAK_IF(tgaData == nullptr); + + // tgaLoadBuffer only support type 2, 3, 10 + if (2 == tgaData->type || 10 == tgaData->type) + { + // true color + // unsupported RGB555 + if (tgaData->pixelDepth == 16) + { + _renderFormat = Texture2D::PixelFormat::RGB5A1; + } + else if(tgaData->pixelDepth == 24) + { + _renderFormat = Texture2D::PixelFormat::RGB888; + } + else if(tgaData->pixelDepth == 32) + { + _renderFormat = Texture2D::PixelFormat::RGBA8888; + } + else + { + CCLOG("Image WARNING: unsupported true color tga data pixel format. FILE: %s", _filePath.c_str()); + break; + } + } + else if(3 == tgaData->type) + { + // gray + if (8 == tgaData->pixelDepth) + { + _renderFormat = Texture2D::PixelFormat::I8; + } + else + { + // actually this won't happen, if it happens, maybe the image file is not a tga + CCLOG("Image WARNING: unsupported gray tga data pixel format. FILE: %s", _filePath.c_str()); + break; + } + } + + _width = tgaData->width; + _height = tgaData->height; + _data = tgaData->imageData; + _dataLen = _width * _height * tgaData->pixelDepth / 8; + _fileType = Format::TGA; + + _hasPremultipliedAlpha = false; + ret = true; + + }while(false); + + if (ret) + { + if (FileUtils::getInstance()->getFileExtension(_filePath) != ".tga") + { + CCLOG("Image WARNING: the image file suffix is not tga, but parsed as a tga image file. FILE: %s", _filePath.c_str()); + } + } + else + { + if (tgaData && tgaData->imageData != nullptr) + { + free(tgaData->imageData); + _data = nullptr; + } + } + + return ret; +} + +bool Image::initWithPVRData(const unsigned char * data, ssize_t dataLen) +{ + return initWithPVRv2Data(data, dataLen) || initWithPVRv3Data(data, dataLen); +} + +bool Image::initWithWebpData(const unsigned char * data, ssize_t dataLen) +{ +#if CC_USE_WEBP + bool ret = false; + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) + CCLOG("WEBP image format not supported on WinRT or WP8"); +#else + do + { + WebPDecoderConfig config; + if (WebPInitDecoderConfig(&config) == 0) break; + if (WebPGetFeatures(static_cast(data), dataLen, &config.input) != VP8_STATUS_OK) break; + if (config.input.width == 0 || config.input.height == 0) break; + + config.output.colorspace = config.input.has_alpha?MODE_rgbA:MODE_RGB; + _renderFormat = config.input.has_alpha?Texture2D::PixelFormat::RGBA8888:Texture2D::PixelFormat::RGB888; + _width = config.input.width; + _height = config.input.height; + + //we ask webp to give data with premultiplied alpha + _hasPremultipliedAlpha = (config.input.has_alpha != 0); + + _dataLen = _width * _height * (config.input.has_alpha?4:3); + _data = static_cast(malloc(_dataLen * sizeof(unsigned char))); + + config.output.u.RGBA.rgba = static_cast(_data); + config.output.u.RGBA.stride = _width * (config.input.has_alpha?4:3); + config.output.u.RGBA.size = _dataLen; + config.output.is_external_memory = 1; + + if (WebPDecode(static_cast(data), dataLen, &config) != VP8_STATUS_OK) + { + free(_data); + _data = nullptr; + break; + } + + ret = true; + } while (0); +#endif // (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) + return ret; +#else + CCLOG("webp is not enabled, please enable it in ccConfig.h"); + return false; +#endif // CC_USE_WEBP +} + +bool Image::initWithRawData(const unsigned char * data, ssize_t dataLen, int width, int height, int bitsPerComponent, bool preMulti) +{ + bool ret = false; + do + { + CC_BREAK_IF(0 == width || 0 == height); + + _height = height; + _width = width; + _hasPremultipliedAlpha = preMulti; + _renderFormat = Texture2D::PixelFormat::RGBA8888; + + // only RGBA8888 supported + int bytesPerComponent = 4; + _dataLen = height * width * bytesPerComponent; + _data = static_cast(malloc(_dataLen * sizeof(unsigned char))); + CC_BREAK_IF(! _data); + memcpy(_data, data, _dataLen); + + ret = true; + } while (0); + + return ret; +} + + +#if (CC_TARGET_PLATFORM != CC_PLATFORM_IOS) +bool Image::saveToFile(const std::string& filename, bool isToRGB) +{ + //only support for Texture2D::PixelFormat::RGB888 or Texture2D::PixelFormat::RGBA8888 uncompressed data + if (isCompressed() || (_renderFormat != Texture2D::PixelFormat::RGB888 && _renderFormat != Texture2D::PixelFormat::RGBA8888)) + { + CCLOG("cocos2d: Image: saveToFile is only support for Texture2D::PixelFormat::RGB888 or Texture2D::PixelFormat::RGBA8888 uncompressed data for now"); + return false; + } + + std::string fileExtension = FileUtils::getInstance()->getFileExtension(filename); + + if (fileExtension == ".png") + { + return saveImageToPNG(filename, isToRGB); + } + else if (fileExtension == ".jpg") + { + return saveImageToJPG(filename); + } + else + { + CCLOG("cocos2d: Image: saveToFile no support file extension(only .png or .jpg) for file: %s", filename.c_str()); + return false; + } +} +#endif // (CC_TARGET_PLATFORM != CC_PLATFORM_IOS) + +bool Image::saveImageToPNG(const std::string& filePath, bool isToRGB) +{ +#if CC_USE_WIC + return encodeWithWIC(filePath, isToRGB, GUID_ContainerFormatPng); +#elif CC_USE_PNG + bool ret = false; + do + { + FILE *fp; + png_structp png_ptr; + png_infop info_ptr; + png_colorp palette; + png_bytep *row_pointers; + + fp = fopen(FileUtils::getInstance()->getSuitableFOpen(filePath).c_str(), "wb"); + CC_BREAK_IF(nullptr == fp); + + png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); + + if (nullptr == png_ptr) + { + fclose(fp); + break; + } + + info_ptr = png_create_info_struct(png_ptr); + if (nullptr == info_ptr) + { + fclose(fp); + png_destroy_write_struct(&png_ptr, nullptr); + break; + } +#if (CC_TARGET_PLATFORM != CC_PLATFORM_BADA && CC_TARGET_PLATFORM != CC_PLATFORM_NACL) + if (setjmp(png_jmpbuf(png_ptr))) + { + fclose(fp); + png_destroy_write_struct(&png_ptr, &info_ptr); + break; + } +#endif + png_init_io(png_ptr, fp); + + if (!isToRGB && hasAlpha()) + { + png_set_IHDR(png_ptr, info_ptr, _width, _height, 8, PNG_COLOR_TYPE_RGB_ALPHA, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + } + else + { + png_set_IHDR(png_ptr, info_ptr, _width, _height, 8, PNG_COLOR_TYPE_RGB, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + } + + palette = (png_colorp)png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH * sizeof (png_color)); + png_set_PLTE(png_ptr, info_ptr, palette, PNG_MAX_PALETTE_LENGTH); + + png_write_info(png_ptr, info_ptr); + + png_set_packing(png_ptr); + + row_pointers = (png_bytep *)malloc(_height * sizeof(png_bytep)); + if(row_pointers == nullptr) + { + fclose(fp); + png_destroy_write_struct(&png_ptr, &info_ptr); + break; + } + + if (!hasAlpha()) + { + for (int i = 0; i < (int)_height; i++) + { + row_pointers[i] = (png_bytep)_data + i * _width * 3; + } + + png_write_image(png_ptr, row_pointers); + + free(row_pointers); + row_pointers = nullptr; + } + else + { + if (isToRGB) + { + unsigned char *tempData = static_cast(malloc(_width * _height * 3 * sizeof(unsigned char))); + if (nullptr == tempData) + { + fclose(fp); + png_destroy_write_struct(&png_ptr, &info_ptr); + + free(row_pointers); + row_pointers = nullptr; + break; + } + + for (int i = 0; i < _height; ++i) + { + for (int j = 0; j < _width; ++j) + { + tempData[(i * _width + j) * 3] = _data[(i * _width + j) * 4]; + tempData[(i * _width + j) * 3 + 1] = _data[(i * _width + j) * 4 + 1]; + tempData[(i * _width + j) * 3 + 2] = _data[(i * _width + j) * 4 + 2]; + } + } + + for (int i = 0; i < (int)_height; i++) + { + row_pointers[i] = (png_bytep)tempData + i * _width * 3; + } + + png_write_image(png_ptr, row_pointers); + + free(row_pointers); + row_pointers = nullptr; + + if (tempData != nullptr) + { + free(tempData); + } + } + else + { + for (int i = 0; i < (int)_height; i++) + { + row_pointers[i] = (png_bytep)_data + i * _width * 4; + } + + png_write_image(png_ptr, row_pointers); + + free(row_pointers); + row_pointers = nullptr; + } + } + + png_write_end(png_ptr, info_ptr); + + png_free(png_ptr, palette); + palette = nullptr; + + png_destroy_write_struct(&png_ptr, &info_ptr); + + fclose(fp); + + ret = true; + } while (0); + return ret; +#else + CCLOG("png is not enabled, please enable it in ccConfig.h"); + return false; +#endif // CC_USE_PNG +} + +bool Image::saveImageToJPG(const std::string& filePath) +{ +#if CC_USE_WIC + return encodeWithWIC(filePath, false, GUID_ContainerFormatJpeg); +#elif CC_USE_JPEG + bool ret = false; + do + { + struct jpeg_compress_struct cinfo; + struct jpeg_error_mgr jerr; + FILE * outfile; /* target file */ + JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */ + int row_stride; /* physical row width in image buffer */ + + cinfo.err = jpeg_std_error(&jerr); + /* Now we can initialize the JPEG compression object. */ + jpeg_create_compress(&cinfo); + + CC_BREAK_IF((outfile = fopen(FileUtils::getInstance()->getSuitableFOpen(filePath).c_str(), "wb")) == nullptr); + + jpeg_stdio_dest(&cinfo, outfile); + + cinfo.image_width = _width; /* image width and height, in pixels */ + cinfo.image_height = _height; + cinfo.input_components = 3; /* # of color components per pixel */ + cinfo.in_color_space = JCS_RGB; /* colorspace of input image */ + + jpeg_set_defaults(&cinfo); + jpeg_set_quality(&cinfo, 90, TRUE); + + jpeg_start_compress(&cinfo, TRUE); + + row_stride = _width * 3; /* JSAMPLEs per row in image_buffer */ + + if (hasAlpha()) + { + unsigned char *tempData = static_cast(malloc(_width * _height * 3 * sizeof(unsigned char))); + if (nullptr == tempData) + { + jpeg_finish_compress(&cinfo); + jpeg_destroy_compress(&cinfo); + fclose(outfile); + break; + } + + for (int i = 0; i < _height; ++i) + { + for (int j = 0; j < _width; ++j) + + { + tempData[(i * _width + j) * 3] = _data[(i * _width + j) * 4]; + tempData[(i * _width + j) * 3 + 1] = _data[(i * _width + j) * 4 + 1]; + tempData[(i * _width + j) * 3 + 2] = _data[(i * _width + j) * 4 + 2]; + } + } + + while (cinfo.next_scanline < cinfo.image_height) + { + row_pointer[0] = & tempData[cinfo.next_scanline * row_stride]; + (void) jpeg_write_scanlines(&cinfo, row_pointer, 1); + } + + if (tempData != nullptr) + { + free(tempData); + } + } + else + { + while (cinfo.next_scanline < cinfo.image_height) { + row_pointer[0] = & _data[cinfo.next_scanline * row_stride]; + (void) jpeg_write_scanlines(&cinfo, row_pointer, 1); + } + } + + jpeg_finish_compress(&cinfo); + fclose(outfile); + jpeg_destroy_compress(&cinfo); + + ret = true; + } while (0); + return ret; +#else + CCLOG("jpeg is not enabled, please enable it in ccConfig.h"); + return false; +#endif // CC_USE_JPEG +} + +ssize_t Image::imageCompress(const unsigned char * data, ssize_t dataLen, unsigned char ** outBuffer) +{ + std::string sign="Image"; + int signLen=4; + unsigned char first_flag = 0x24; + unsigned char second_flag = 0x63; + unsigned char third_flag = 0x90; + + //是否加密的标记 + if(dataLen<=signLen) + { + } + return dataLen; + unsigned char sign1=data[dataLen-2]; + unsigned char sign2=data[dataLen-3]; + unsigned char sign3=data[dataLen-4]; + //是否加密的标记 + if(sign1!=first_flag||sign1!=second_flag||sign1!=third_flag){ + return dataLen; + } + ssize_t len = dataLen-signLen; + *outBuffer = (unsigned char*)malloc( len ); + unsigned char key = first_flag; + for(ssize_t i=0;i> 8) | \ + ((unsigned)((unsigned char)(vg) * ((unsigned char)(va) + 1) >> 8) << 8) | \ + ((unsigned)((unsigned char)(vb) * ((unsigned char)(va) + 1) >> 8) << 16) | \ + ((unsigned)(unsigned char)(va) << 24)) + +NS_CC_BEGIN + +/** + * @addtogroup platform + * @{ + */ + +/** + @brief Structure which can tell where mipmap begins and how long is it + */ +typedef struct _MipmapInfo +{ + unsigned char* address; + int len; + _MipmapInfo():address(NULL),len(0){} +}MipmapInfo; + +class CC_DLL Image : public Ref +{ +public: + /** + * @js ctor + */ + Image(); + + /** Supported formats for Image */ + enum class Format + { + //! JPEG + JPG, + //! PNG + PNG, + //! TIFF + TIFF, + //! WebP + WEBP, + //! PVR + PVR, + //! ETC + ETC, + //! S3TC +// S3TC, + //! ATITC +// ATITC, + //! TGA + TGA, + //! Raw Data + RAW_DATA, + //! Unknown format + UNKNOWN + }; + + /** + * Enables or disables premultiplied alpha for PNG files. + * + * @param enabled (default: true) + */ + static void setPNGPremultipliedAlphaEnabled(bool enabled) { PNG_PREMULTIPLIED_ALPHA_ENABLED = enabled; } + + /** treats (or not) PVR files as if they have alpha premultiplied. + Since it is impossible to know at runtime if the PVR images have the alpha channel premultiplied, it is + possible load them as if they have (or not) the alpha channel premultiplied. + + By default it is disabled. + */ + static void setPVRImagesHavePremultipliedAlpha(bool haveAlphaPremultiplied); + + /** + @brief Load the image from the specified path. + @param path the absolute file path. + @return true if loaded correctly. + */ + bool initWithImageFile(const std::string& path); + + /** + @brief Load image from stream buffer. + @param data stream buffer which holds the image data. + @param dataLen data length expressed in (number of) bytes. + @return true if loaded correctly. + * @js NA + * @lua NA + */ + bool initWithImageData(const unsigned char * data, ssize_t dataLen); + + // @warning kFmtRawData only support RGBA8888 + bool initWithRawData(const unsigned char * data, ssize_t dataLen, int width, int height, int bitsPerComponent, bool preMulti = false); + + // Getters + inline unsigned char * getData() { return _data; } + inline ssize_t getDataLen() { return _dataLen; } + inline Format getFileType() {return _fileType; } + inline Texture2D::PixelFormat getRenderFormat() { return _renderFormat; } + inline int getWidth() { return _width; } + inline int getHeight() { return _height; } + inline int getNumberOfMipmaps() { return _numberOfMipmaps; } + inline MipmapInfo* getMipmaps() { return _mipmaps; } + inline bool hasPremultipliedAlpha() { return _hasPremultipliedAlpha; } + inline std::string getFilePath() const { return _filePath; } + + int getBitPerPixel(); + bool hasAlpha(); + bool isCompressed(); + + /** + @brief Save Image data to the specified file, with specified format. + @param filePath the file's absolute path, including file suffix. + @param isToRGB whether the image is saved as RGB format. + */ + bool saveToFile(const std::string &filename, bool isToRGB = true); + + ssize_t imageCompress(const unsigned char * data, ssize_t dataLen, unsigned char ** outBuffer); +protected: + bool initWithJpgData(const unsigned char * data, ssize_t dataLen); + bool initWithPngData(const unsigned char * data, ssize_t dataLen); + bool initWithTiffData(const unsigned char * data, ssize_t dataLen); + bool initWithWebpData(const unsigned char * data, ssize_t dataLen); + bool initWithPVRData(const unsigned char * data, ssize_t dataLen); + bool initWithPVRv2Data(const unsigned char * data, ssize_t dataLen); + bool initWithPVRv3Data(const unsigned char * data, ssize_t dataLen); + bool initWithETCData(const unsigned char * data, ssize_t dataLen); + + typedef struct sImageTGA tImageTGA; + bool initWithTGAData(tImageTGA* tgaData); + + bool saveImageToPNG(const std::string& filePath, bool isToRGB = true); + bool saveImageToJPG(const std::string& filePath); + + void premultipliedAlpha(); + +protected: + /** + @brief Determine how many mipmaps can we have. + It's same as define but it respects namespaces + */ + static const int MIPMAP_MAX = 16; + /** + @brief Determine whether we premultiply alpha for png files. + */ + static bool PNG_PREMULTIPLIED_ALPHA_ENABLED; + unsigned char *_data; + ssize_t _dataLen; + int _width; + int _height; + bool _unpack; + Format _fileType; + Texture2D::PixelFormat _renderFormat; + MipmapInfo _mipmaps[MIPMAP_MAX]; // pointer to mipmap images + int _numberOfMipmaps; + // false if we can't auto detect the image is premultiplied or not. + bool _hasPremultipliedAlpha; + std::string _filePath; + +protected: + // noncopyable + Image(const Image&) = delete; + Image& operator=(const Image&) = delete; + + // nonmoveable + Image(Image&&) = delete; + Image& operator=(Image&&) = delete; + + /** + * @js NA + * @lua NA + */ + virtual ~Image(); + + Format detectFormat(const unsigned char * data, ssize_t dataLen); + bool isPng(const unsigned char * data, ssize_t dataLen); + bool isJpg(const unsigned char * data, ssize_t dataLen); + bool isTiff(const unsigned char * data, ssize_t dataLen); + bool isWebp(const unsigned char * data, ssize_t dataLen); + bool isPvr(const unsigned char * data, ssize_t dataLen); + bool isEtc(const unsigned char * data, ssize_t dataLen); +}; + +// end of platform group +/// @} + +NS_CC_END + +/// @endcond +#endif // __CC_IMAGE_H__ diff --git a/HotUpdateDemo/main.js b/HotUpdateDemo/build-templates/jsb-default/main.js similarity index 85% rename from HotUpdateDemo/main.js rename to HotUpdateDemo/build-templates/jsb-default/main.js index 9f5c977..08004b6 100644 --- a/HotUpdateDemo/main.js +++ b/HotUpdateDemo/build-templates/jsb-default/main.js @@ -1,17 +1,42 @@ (function () { - if (window.cc && cc.sys.isNative) { - var hotUpdateSearchPaths = cc.sys.localStorage.getItem('HotUpdateSearchPaths'); - if (hotUpdateSearchPaths) { - jsb.fileUtils.setSearchPaths(JSON.parse(hotUpdateSearchPaths)); + var version = "1.0.0"; + let curVersion = cc.sys.localStorage.getItem("gameVersion") || "1.0.0"; + var hotUpdateSearchPaths = cc.sys.localStorage.getItem('HotUpdateSearchPaths'); + + function versionCompareHandle(versionA, versionB) { + var vA = versionA.split('.'); + var vB = versionB.split('.'); + for (var i = 0; i < vA.length; ++i) { + var a = parseInt(vA[i]); + var b = parseInt(vB[i] || 0); + if (a === b) { + continue; + } else { + return a - b; + } + } + if (vB.length > vA.length) { + return -1; + } else { + return 0; } } - function boot () { + //版本比最近版本等于or大于。需要清理热更新cache; + if (versionCompareHandle(version, curVersion) >= 0) { + hotUpdateSearchPaths && jsb.fileUtils.removeDirectory(hotUpdateSearchPaths); + } + //设置搜索路径 + if (window.cc && cc.sys.isNative) { + hotUpdateSearchPaths && jsb.fileUtils.setSearchPaths(JSON.parse(hotUpdateSearchPaths)); + } + + function boot() { var settings = window._CCSettings; window._CCSettings = undefined; - if ( !settings.debug ) { + if (!settings.debug) { var uuids = settings.uuids; var rawAssets = settings.rawAssets; @@ -68,7 +93,7 @@ initAdapter(); } - function setLoadingDisplay () { + function setLoadingDisplay() { // Loading splash scene var splash = document.getElementById('splash'); var progressBar = splash.querySelector('.progress-bar span'); @@ -101,8 +126,7 @@ if (cc.sys.isMobile) { if (settings.orientation === 'landscape') { cc.view.setOrientation(cc.macro.ORIENTATION_LANDSCAPE); - } - else if (settings.orientation === 'portrait') { + } else if (settings.orientation === 'portrait') { cc.view.setOrientation(cc.macro.ORIENTATION_PORTRAIT); } cc.view.enableAutoFullScreen([ @@ -158,24 +182,21 @@ if (false) { BK.Script.loadlib(); - } - else - { + } else { var bundledScript = settings.debug ? 'src/project.dev.js' : 'src/project.js'; if (jsList) { jsList = jsList.map(function (x) { return 'src/' + x; }); jsList.push(bundledScript); - } - else { + } else { jsList = [bundledScript]; } } // anysdk scripts if (cc.sys.isNative && cc.sys.isMobile) { -// jsList = jsList.concat(['src/anysdk/jsb_anysdk.js', 'src/anysdk/jsb_anysdk_constants.js']); + // jsList = jsList.concat(['src/anysdk/jsb_anysdk.js', 'src/anysdk/jsb_anysdk_constants.js']); } var option = { @@ -241,4 +262,4 @@ document.body.appendChild(cocos2d); } -})(); +})(); \ No newline at end of file diff --git a/HotUpdateDemo/build-templates/jsb-link/main.js b/HotUpdateDemo/build-templates/jsb-link/main.js new file mode 100644 index 0000000..08004b6 --- /dev/null +++ b/HotUpdateDemo/build-templates/jsb-link/main.js @@ -0,0 +1,265 @@ +(function () { + + var version = "1.0.0"; + let curVersion = cc.sys.localStorage.getItem("gameVersion") || "1.0.0"; + var hotUpdateSearchPaths = cc.sys.localStorage.getItem('HotUpdateSearchPaths'); + + function versionCompareHandle(versionA, versionB) { + var vA = versionA.split('.'); + var vB = versionB.split('.'); + for (var i = 0; i < vA.length; ++i) { + var a = parseInt(vA[i]); + var b = parseInt(vB[i] || 0); + if (a === b) { + continue; + } else { + return a - b; + } + } + if (vB.length > vA.length) { + return -1; + } else { + return 0; + } + } + //版本比最近版本等于or大于。需要清理热更新cache; + if (versionCompareHandle(version, curVersion) >= 0) { + hotUpdateSearchPaths && jsb.fileUtils.removeDirectory(hotUpdateSearchPaths); + } + //设置搜索路径 + if (window.cc && cc.sys.isNative) { + hotUpdateSearchPaths && jsb.fileUtils.setSearchPaths(JSON.parse(hotUpdateSearchPaths)); + } + + function boot() { + + var settings = window._CCSettings; + window._CCSettings = undefined; + + if (!settings.debug) { + var uuids = settings.uuids; + + var rawAssets = settings.rawAssets; + var assetTypes = settings.assetTypes; + var realRawAssets = settings.rawAssets = {}; + for (var mount in rawAssets) { + var entries = rawAssets[mount]; + var realEntries = realRawAssets[mount] = {}; + for (var id in entries) { + var entry = entries[id]; + var type = entry[1]; + // retrieve minified raw asset + if (typeof type === 'number') { + entry[1] = assetTypes[type]; + } + // retrieve uuid + realEntries[uuids[id] || id] = entry; + } + } + + var scenes = settings.scenes; + for (var i = 0; i < scenes.length; ++i) { + var scene = scenes[i]; + if (typeof scene.uuid === 'number') { + scene.uuid = uuids[scene.uuid]; + } + } + + var packedAssets = settings.packedAssets; + for (var packId in packedAssets) { + var packedIds = packedAssets[packId]; + for (var j = 0; j < packedIds.length; ++j) { + if (typeof packedIds[j] === 'number') { + packedIds[j] = uuids[packedIds[j]]; + } + } + } + } + + // init engine + var canvas; + + if (cc.sys.isBrowser) { + canvas = document.getElementById('GameCanvas'); + } + + if (false) { + var ORIENTATIONS = { + 'portrait': 1, + 'landscape left': 2, + 'landscape right': 3 + }; + BK.Director.screenMode = ORIENTATIONS[settings.orientation]; + initAdapter(); + } + + function setLoadingDisplay() { + // Loading splash scene + var splash = document.getElementById('splash'); + var progressBar = splash.querySelector('.progress-bar span'); + cc.loader.onProgress = function (completedCount, totalCount, item) { + var percent = 100 * completedCount / totalCount; + if (progressBar) { + progressBar.style.width = percent.toFixed(2) + '%'; + } + }; + splash.style.display = 'block'; + progressBar.style.width = '0%'; + + cc.director.once(cc.Director.EVENT_AFTER_SCENE_LAUNCH, function () { + splash.style.display = 'none'; + }); + } + + var onStart = function () { + cc.view.resizeWithBrowserSize(true); + + if (!false && !false) { + // UC browser on many android devices have performance issue with retina display + if (cc.sys.os !== cc.sys.OS_ANDROID || cc.sys.browserType !== cc.sys.BROWSER_TYPE_UC) { + cc.view.enableRetina(true); + } + if (cc.sys.isBrowser) { + setLoadingDisplay(); + } + + if (cc.sys.isMobile) { + if (settings.orientation === 'landscape') { + cc.view.setOrientation(cc.macro.ORIENTATION_LANDSCAPE); + } else if (settings.orientation === 'portrait') { + cc.view.setOrientation(cc.macro.ORIENTATION_PORTRAIT); + } + cc.view.enableAutoFullScreen([ + cc.sys.BROWSER_TYPE_BAIDU, + cc.sys.BROWSER_TYPE_WECHAT, + cc.sys.BROWSER_TYPE_MOBILE_QQ, + cc.sys.BROWSER_TYPE_MIUI, + ].indexOf(cc.sys.browserType) < 0); + } + + // Limit downloading max concurrent task to 2, + // more tasks simultaneously may cause performance draw back on some android system / brwosers. + // You can adjust the number based on your own test result, you have to set it before any loading process to take effect. + if (cc.sys.isBrowser && cc.sys.os === cc.sys.OS_ANDROID) { + cc.macro.DOWNLOAD_MAX_CONCURRENT = 2; + } + } + + // init assets + cc.AssetLibrary.init({ + libraryPath: 'res/import', + rawAssetsBase: 'res/raw-', + rawAssets: settings.rawAssets, + packedAssets: settings.packedAssets, + md5AssetsMap: settings.md5AssetsMap + }); + + if (false) { + cc.Pipeline.Downloader.PackDownloader._doPreload("WECHAT_SUBDOMAIN", settings.WECHAT_SUBDOMAIN_DATA); + } + + var launchScene = settings.launchScene; + + // load scene + cc.director.loadScene(launchScene, null, + function () { + if (cc.sys.isBrowser) { + // show canvas + canvas.style.visibility = ''; + var div = document.getElementById('GameDiv'); + if (div) { + div.style.backgroundImage = ''; + } + } + cc.loader.onProgress = null; + console.log('Success to load scene: ' + launchScene); + } + ); + }; + + // jsList + var jsList = settings.jsList; + + if (false) { + BK.Script.loadlib(); + } else { + var bundledScript = settings.debug ? 'src/project.dev.js' : 'src/project.js'; + if (jsList) { + jsList = jsList.map(function (x) { + return 'src/' + x; + }); + jsList.push(bundledScript); + } else { + jsList = [bundledScript]; + } + } + + // anysdk scripts + if (cc.sys.isNative && cc.sys.isMobile) { + // jsList = jsList.concat(['src/anysdk/jsb_anysdk.js', 'src/anysdk/jsb_anysdk_constants.js']); + } + + var option = { + //width: width, + //height: height, + id: 'GameCanvas', + scenes: settings.scenes, + debugMode: settings.debug ? cc.DebugMode.INFO : cc.DebugMode.ERROR, + showFPS: (!false && !false) && settings.debug, + frameRate: 60, + jsList: jsList, + groupList: settings.groupList, + collisionMatrix: settings.collisionMatrix, + renderMode: 0 + } + + cc.game.run(option, onStart); + } + + if (false) { + BK.Script.loadlib('GameRes://libs/qqplay-adapter.js'); + BK.Script.loadlib('GameRes://src/settings.js'); + BK.Script.loadlib(); + BK.Script.loadlib('GameRes://libs/qqplay-downloader.js'); + qqPlayDownloader.REMOTE_SERVER_ROOT = ""; + var prevPipe = cc.loader.md5Pipe || cc.loader.assetLoader; + cc.loader.insertPipeAfter(prevPipe, qqPlayDownloader); + // + boot(); + return; + } + + if (false) { + require(window._CCSettings.debug ? 'cocos2d-js.js' : 'cocos2d-js-min.js'); + var prevPipe = cc.loader.md5Pipe || cc.loader.assetLoader; + cc.loader.insertPipeAfter(prevPipe, wxDownloader); + boot(); + return; + } + + if (window.jsb) { + require('src/settings.js'); + require('src/jsb_polyfill.js'); + boot(); + return; + } + + if (window.document) { + var splash = document.getElementById('splash'); + splash.style.display = 'block'; + + var cocos2d = document.createElement('script'); + cocos2d.async = true; + cocos2d.src = window._CCSettings.debug ? 'cocos2d-js.js' : 'cocos2d-js-min.js'; + + var engineLoaded = function () { + document.body.removeChild(cocos2d); + cocos2d.removeEventListener('load', engineLoaded, false); + window.eruda && eruda.init() && eruda.get('console').config.set('displayUnenumerable', false); + boot(); + }; + cocos2d.addEventListener('load', engineLoaded, false); + document.body.appendChild(cocos2d); + } + +})(); \ No newline at end of file diff --git a/HotUpdateDemo/package-lock.json b/HotUpdateDemo/package-lock.json new file mode 100644 index 0000000..f37947d --- /dev/null +++ b/HotUpdateDemo/package-lock.json @@ -0,0 +1,6025 @@ +{ + "name": "JiangShiTest", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "acorn": { + "version": "5.2.1", + "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-5.2.1.tgz", + "integrity": "sha1-MXrHghgmwixwLWYYmrg1lnXxNdc=", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "5.5.1", + "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-5.5.1.tgz", + "integrity": "sha1-s4u4h22ehr7plJVqBOch6IskjrI=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "http://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "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-escapes": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-3.0.0.tgz", + "integrity": "sha1-7D6LTp+AZPwCw6ybZfHCdb2o75I=", + "dev": true + }, + "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": "2.2.1", + "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "archive-type": { + "version": "3.2.0", + "resolved": "http://registry.npm.taobao.org/archive-type/download/archive-type-3.2.0.tgz", + "integrity": "sha1-nNnABpV+vpX62tW9YJiUKoE3N/Y=", + "dev": true, + "requires": { + "file-type": "3.9.0" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "http://registry.npm.taobao.org/file-type/download/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "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 + }, + "argparse": { + "version": "1.0.9", + "resolved": "http://registry.npm.taobao.org/argparse/download/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/arr-diff/download/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "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 + }, + "array-differ": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/array-differ/download/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "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-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-union": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/array-union/download/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/array-uniq/download/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "http://registry.npm.taobao.org/array-unique/download/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/arrify/download/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "async-each-series": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/async-each-series/download/async-each-series-1.1.0.tgz", + "integrity": "sha1-9C/YFV048hpbjqB8KOBj7RcAsTg=", + "dev": true, + "optional": 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": { + "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" + } + }, + "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" + } + } + } + }, + "babel-polyfill": { + "version": "6.23.0", + "resolved": "http://registry.npm.taobao.org/babel-polyfill/download/babel-polyfill-6.23.0.tgz", + "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "core-js": "2.5.2", + "regenerator-runtime": "0.10.5" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "http://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.2", + "regenerator-runtime": "0.11.1" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz", + "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=", + "dev": true + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "beeper": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/beeper/download/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "bin-build": { + "version": "2.2.0", + "resolved": "http://registry.npm.taobao.org/bin-build/download/bin-build-2.2.0.tgz", + "integrity": "sha1-EfjdYfcP/Por3KpbRvXo/t1CIcw=", + "dev": true, + "optional": true, + "requires": { + "archive-type": "3.2.0", + "decompress": "3.0.0", + "download": "4.4.3", + "exec-series": "1.0.3", + "rimraf": "2.6.2", + "tempfile": "1.1.1", + "url-regex": "3.2.0" + }, + "dependencies": { + "tempfile": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/tempfile/download/tempfile-1.1.1.tgz", + "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", + "dev": true, + "optional": true, + "requires": { + "os-tmpdir": "1.0.2", + "uuid": "2.0.3" + } + }, + "uuid": { + "version": "2.0.3", + "resolved": "http://registry.npm.taobao.org/uuid/download/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true, + "optional": true + } + } + }, + "bin-check": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/bin-check/download/bin-check-2.0.0.tgz", + "integrity": "sha1-hvjm9CU4k99g3DFpV/WvAqywWTA=", + "dev": true, + "optional": true, + "requires": { + "executable": "1.1.0" + } + }, + "bin-version": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/bin-version/download/bin-version-1.0.4.tgz", + "integrity": "sha1-nrSY7m/Xb3q5p8FgQ2+JV5Q1144=", + "dev": true, + "optional": true, + "requires": { + "find-versions": "1.2.1" + } + }, + "bin-version-check": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/bin-version-check/download/bin-version-check-2.1.0.tgz", + "integrity": "sha1-5OXfKQuQaffRETJAMe/BP90RpbA=", + "dev": true, + "optional": true, + "requires": { + "bin-version": "1.0.4", + "minimist": "1.2.0", + "semver": "4.3.6", + "semver-truncate": "1.1.2" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + }, + "semver": { + "version": "4.3.6", + "resolved": "http://registry.npm.taobao.org/semver/download/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true, + "optional": true + } + } + }, + "bin-wrapper": { + "version": "3.0.2", + "resolved": "http://registry.npm.taobao.org/bin-wrapper/download/bin-wrapper-3.0.2.tgz", + "integrity": "sha1-Z9MwYmLksaXy+I7iNGT2plVneus=", + "dev": true, + "optional": true, + "requires": { + "bin-check": "2.0.0", + "bin-version-check": "2.1.0", + "download": "4.4.3", + "each-async": "1.1.1", + "lazy-req": "1.1.0", + "os-filter-obj": "1.0.3" + } + }, + "binaryextensions": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/binaryextensions/download/binaryextensions-1.0.1.tgz", + "integrity": "sha1-HmN0iLNbWL2l9HdL+WpSEqjJB1U=", + "dev": true + }, + "bl": { + "version": "1.2.1", + "resolved": "http://registry.npm.taobao.org/bl/download/bl-1.2.1.tgz", + "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/braces/download/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "http://registry.npm.taobao.org/buffer-crc32/download/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-to-vinyl": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/buffer-to-vinyl/download/buffer-to-vinyl-1.1.0.tgz", + "integrity": "sha1-APFfruOreh3aLN5tkSG//dB7ImI=", + "dev": true, + "requires": { + "file-type": "3.9.0", + "readable-stream": "2.3.3", + "uuid": "2.0.3", + "vinyl": "1.2.0" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "http://registry.npm.taobao.org/file-type/download/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "dev": true + }, + "uuid": { + "version": "2.0.3", + "resolved": "http://registry.npm.taobao.org/uuid/download/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true + }, + "vinyl": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "bufferstreams": { + "version": "1.1.3", + "resolved": "http://registry.npm.taobao.org/bufferstreams/download/bufferstreams-1.1.3.tgz", + "integrity": "sha1-qFFawCT6kOj6fVjBGxPeofKKvnI=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + } + }, + "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 + }, + "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" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/callsites/download/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "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" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/capture-stack-trace/download/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "caw": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/caw/download/caw-1.2.0.tgz", + "integrity": "sha1-/7Im/n78VHKI3GLuPpcHPCEtEDQ=", + "dev": true, + "requires": { + "get-proxy": "1.1.0", + "is-obj": "1.0.1", + "object-assign": "3.0.0", + "tunnel-agent": "0.4.3" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + } + } + }, + "center-align": { + "version": "0.1.3", + "resolved": "http://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz", + "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.0.tgz", + "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "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" + } + } + } + }, + "chance": { + "version": "1.0.12", + "resolved": "http://registry.npm.taobao.org/chance/download/chance-1.0.12.tgz", + "integrity": "sha1-Z2TJy3tPNIVvt4DQfw4XpmAcbAg=", + "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 + }, + "charenc": { + "version": "0.0.2", + "resolved": "http://registry.npm.taobao.org/charenc/download/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "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 + }, + "clap": { + "version": "1.2.3", + "resolved": "http://registry.npm.taobao.org/clap/download/clap-1.2.3.tgz", + "integrity": "sha1-TzZ0WzIAhJJVf0ZBLWbVDLmbzlE=", + "dev": true, + "optional": true, + "requires": { + "chalk": "1.1.3" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "optional": 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" + } + }, + "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, + "optional": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "class-validator": { + "version": "0.7.3", + "resolved": "http://registry.npm.taobao.org/class-validator/download/class-validator-0.7.3.tgz", + "integrity": "sha1-PCghuM81/Y1fT8uAY7xX+1AEnn4=", + "dev": true, + "requires": { + "validator": "7.2.0" + } + }, + "clean-css": { + "version": "3.4.28", + "resolved": "http://registry.npm.taobao.org/clean-css/download/clean-css-3.4.28.tgz", + "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", + "dev": true, + "requires": { + "commander": "2.8.1", + "source-map": "0.4.4" + } + }, + "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": "2.1.0", + "resolved": "http://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + } + } + }, + "clone": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/clone/download/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", + "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": "0.0.1", + "resolved": "http://registry.npm.taobao.org/clone-stats/download/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/cloneable-readable/download/cloneable-readable-1.0.0.tgz", + "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "process-nextick-args": "1.0.7", + "through2": "2.0.3" + } + }, + "co": { + "version": "4.6.0", + "resolved": "http://registry.npm.taobao.org/co/download/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/coa/download/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "dev": true, + "optional": true, + "requires": { + "q": "1.5.1" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.1.tgz", + "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=", + "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 + }, + "colors": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/colors/download/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true, + "optional": true + }, + "commander": { + "version": "2.8.1", + "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "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=" + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "console-stream": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/console-stream/download/console-stream-0.1.1.tgz", + "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=", + "dev": true, + "optional": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "http://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "core-js": { + "version": "2.5.2", + "resolved": "http://registry.npm.taobao.org/core-js/download/core-js-2.5.2.tgz", + "integrity": "sha1-vEZIZW59ydyA19PHu8Fy2W50TmM=", + "dev": true + }, + "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.0" + } + }, + "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.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "http://registry.npm.taobao.org/crypt/download/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "dev": true + }, + "csso": { + "version": "2.3.2", + "resolved": "http://registry.npm.taobao.org/csso/download/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "dev": true, + "optional": true, + "requires": { + "clap": "1.2.3", + "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, + "optional": 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" + } + }, + "dateformat": { + "version": "2.2.0", + "resolved": "http://registry.npm.taobao.org/dateformat/download/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decompress": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/decompress/download/decompress-3.0.0.tgz", + "integrity": "sha1-rx3VDQbjv8QyRh033hGzjA2ZG+0=", + "dev": true, + "requires": { + "buffer-to-vinyl": "1.1.0", + "concat-stream": "1.6.0", + "decompress-tar": "3.1.0", + "decompress-tarbz2": "3.1.0", + "decompress-targz": "3.1.0", + "decompress-unzip": "3.4.0", + "stream-combiner2": "1.1.1", + "vinyl-assign": "1.2.1", + "vinyl-fs": "2.4.4" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "http://registry.npm.taobao.org/glob/download/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "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" + } + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "http://registry.npm.taobao.org/glob-stream/download/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, + "requires": { + "extend": "3.0.1", + "glob": "5.0.15", + "glob-parent": "3.1.0", + "micromatch": "2.3.11", + "ordered-read-streams": "0.3.0", + "through2": "0.6.5", + "to-absolute-glob": "0.1.1", + "unique-stream": "2.2.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "http://registry.npm.taobao.org/through2/download/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "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-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" + } + }, + "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 + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "http://registry.npm.taobao.org/ordered-read-streams/download/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, + "requires": { + "is-stream": "1.1.0", + "readable-stream": "2.3.3" + } + }, + "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-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" + } + }, + "unique-stream": { + "version": "2.2.1", + "resolved": "http://registry.npm.taobao.org/unique-stream/download/unique-stream-2.2.1.tgz", + "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true, + "requires": { + "json-stable-stringify": "1.0.1", + "through2-filter": "2.0.0" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-fs": { + "version": "2.4.4", + "resolved": "http://registry.npm.taobao.org/vinyl-fs/download/vinyl-fs-2.4.4.tgz", + "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "dev": true, + "requires": { + "duplexify": "3.5.1", + "glob-stream": "5.3.5", + "graceful-fs": "4.1.11", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "0.3.0", + "lazystream": "1.0.0", + "lodash.isequal": "4.5.0", + "merge-stream": "1.0.1", + "mkdirp": "0.5.1", + "object-assign": "4.1.1", + "readable-stream": "2.3.3", + "strip-bom": "2.0.0", + "strip-bom-stream": "1.0.0", + "through2": "2.0.3", + "through2-filter": "2.0.0", + "vali-date": "1.0.0", + "vinyl": "1.2.0" + } + } + } + }, + "decompress-tar": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/decompress-tar/download/decompress-tar-3.1.0.tgz", + "integrity": "sha1-IXx4n5uURQ76rcXF5TeXj8MzxGY=", + "dev": true, + "requires": { + "is-tar": "1.0.0", + "object-assign": "2.1.1", + "strip-dirs": "1.1.1", + "tar-stream": "1.5.5", + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/clone/download/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "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 + }, + "object-assign": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "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 + }, + "through2": { + "version": "0.6.5", + "resolved": "http://registry.npm.taobao.org/through2/download/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "decompress-tarbz2": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/decompress-tarbz2/download/decompress-tarbz2-3.1.0.tgz", + "integrity": "sha1-iyOTVoE1X58YnYclag+L3ZbZZm0=", + "dev": true, + "requires": { + "is-bzip2": "1.0.0", + "object-assign": "2.1.1", + "seek-bzip": "1.0.5", + "strip-dirs": "1.1.1", + "tar-stream": "1.5.5", + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/clone/download/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "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 + }, + "object-assign": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "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 + }, + "through2": { + "version": "0.6.5", + "resolved": "http://registry.npm.taobao.org/through2/download/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "decompress-targz": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/decompress-targz/download/decompress-targz-3.1.0.tgz", + "integrity": "sha1-ssE9+YFmJomRtxXWRH9kLpaW9aA=", + "dev": true, + "requires": { + "is-gzip": "1.0.0", + "object-assign": "2.1.1", + "strip-dirs": "1.1.1", + "tar-stream": "1.5.5", + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/clone/download/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "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 + }, + "object-assign": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "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 + }, + "through2": { + "version": "0.6.5", + "resolved": "http://registry.npm.taobao.org/through2/download/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "decompress-unzip": { + "version": "3.4.0", + "resolved": "http://registry.npm.taobao.org/decompress-unzip/download/decompress-unzip-3.4.0.tgz", + "integrity": "sha1-YUdbQVIGa74/7hL51inRX+ZHjus=", + "dev": true, + "requires": { + "is-zip": "1.0.0", + "read-all-stream": "3.1.0", + "stat-mode": "0.2.2", + "strip-dirs": "1.1.1", + "through2": "2.0.3", + "vinyl": "1.2.0", + "yauzl": "2.9.1" + }, + "dependencies": { + "vinyl": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "http://registry.npm.taobao.org/deep-extend/download/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "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 + }, + "defaults": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/defaults/download/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "1.0.3" + } + }, + "del": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/del/download/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "p-map": "1.2.0", + "pify": "3.0.0", + "rimraf": "2.6.2" + } + }, + "deprecated": { + "version": "0.0.1", + "resolved": "http://registry.npm.taobao.org/deprecated/download/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true + }, + "detect-file": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/detect-file/download/detect-file-0.1.0.tgz", + "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", + "dev": true, + "requires": { + "fs-exists-sync": "0.1.0" + } + }, + "doctrine": { + "version": "2.0.2", + "resolved": "http://registry.npm.taobao.org/doctrine/download/doctrine-2.0.2.tgz", + "integrity": "sha1-aPls6O/FbMQmUfH6rbTxdSc7AHU=", + "dev": true, + "requires": { + "esutils": "2.0.2" + } + }, + "download": { + "version": "4.4.3", + "resolved": "http://registry.npm.taobao.org/download/download/download-4.4.3.tgz", + "integrity": "sha1-qlX9rTktldS2jowr4D4MKqIbqaw=", + "dev": true, + "requires": { + "caw": "1.2.0", + "concat-stream": "1.6.0", + "each-async": "1.1.1", + "filenamify": "1.2.1", + "got": "5.7.1", + "gulp-decompress": "1.2.0", + "gulp-rename": "1.2.2", + "is-url": "1.2.2", + "object-assign": "4.1.1", + "read-all-stream": "3.1.0", + "readable-stream": "2.3.3", + "stream-combiner2": "1.1.1", + "vinyl": "1.2.0", + "vinyl-fs": "2.4.4", + "ware": "1.3.0" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "http://registry.npm.taobao.org/glob/download/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "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" + } + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "http://registry.npm.taobao.org/glob-stream/download/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, + "requires": { + "extend": "3.0.1", + "glob": "5.0.15", + "glob-parent": "3.1.0", + "micromatch": "2.3.11", + "ordered-read-streams": "0.3.0", + "through2": "0.6.5", + "to-absolute-glob": "0.1.1", + "unique-stream": "2.2.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "http://registry.npm.taobao.org/through2/download/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "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-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" + } + }, + "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 + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "http://registry.npm.taobao.org/ordered-read-streams/download/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, + "requires": { + "is-stream": "1.1.0", + "readable-stream": "2.3.3" + } + }, + "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-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" + } + }, + "unique-stream": { + "version": "2.2.1", + "resolved": "http://registry.npm.taobao.org/unique-stream/download/unique-stream-2.2.1.tgz", + "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true, + "requires": { + "json-stable-stringify": "1.0.1", + "through2-filter": "2.0.0" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-fs": { + "version": "2.4.4", + "resolved": "http://registry.npm.taobao.org/vinyl-fs/download/vinyl-fs-2.4.4.tgz", + "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "dev": true, + "requires": { + "duplexify": "3.5.1", + "glob-stream": "5.3.5", + "graceful-fs": "4.1.11", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "0.3.0", + "lazystream": "1.0.0", + "lodash.isequal": "4.5.0", + "merge-stream": "1.0.1", + "mkdirp": "0.5.1", + "object-assign": "4.1.1", + "readable-stream": "2.3.3", + "strip-bom": "2.0.0", + "strip-bom-stream": "1.0.0", + "through2": "2.0.3", + "through2-filter": "2.0.0", + "vali-date": "1.0.0", + "vinyl": "1.2.0" + } + } + } + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "http://registry.npm.taobao.org/duplexer2/download/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "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 + }, + "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" + } + }, + "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 + } + } + }, + "duplexify": { + "version": "3.5.1", + "resolved": "http://registry.npm.taobao.org/duplexify/download/duplexify-3.5.1.tgz", + "integrity": "sha1-ThUWvmiDi8kKSZlPCzmm5ZYL780=", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "stream-shift": "1.0.0" + }, + "dependencies": { + "end-of-stream": { + "version": "1.4.0", + "resolved": "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.0.tgz", + "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", + "dev": true, + "requires": { + "once": "1.4.0" + } + } + } + }, + "each-async": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/each-async/download/each-async-1.1.1.tgz", + "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=", + "dev": true, + "requires": { + "onetime": "1.1.0", + "set-immediate-shim": "1.0.1" + }, + "dependencies": { + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/onetime/download/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + } + } + }, + "encoding": { + "version": "0.1.12", + "resolved": "http://registry.npm.taobao.org/encoding/download/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "0.4.19" + } + }, + "end-of-stream": { + "version": "0.1.5", + "resolved": "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "dev": true, + "requires": { + "once": "1.3.3" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "http://registry.npm.taobao.org/once/download/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + } + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "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 + }, + "escodegen-wallaby": { + "version": "1.6.15", + "resolved": "http://registry.npm.taobao.org/escodegen-wallaby/download/escodegen-wallaby-1.6.15.tgz", + "integrity": "sha1-nV72fdTYx8iliv8eTt1jUSVmup8=", + "dev": true, + "requires": { + "esprima": "2.7.3", + "estraverse": "1.9.3", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.2.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "resolved": "http://registry.npm.taobao.org/estraverse/download/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "source-map": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "escope": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/escope/download/escope-1.0.3.tgz", + "integrity": "sha1-dZ3OhJbEJI/sLQyq9BCLzz8af10=", + "dev": true, + "requires": { + "estraverse": "2.0.0" + }, + "dependencies": { + "estraverse": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/estraverse/download/estraverse-2.0.0.tgz", + "integrity": "sha1-WuRpYyQ2ACBmdMyySgnhZnT83KE=", + "dev": true + } + } + }, + "eslint": { + "version": "4.13.0", + "resolved": "http://registry.npm.taobao.org/eslint/download/eslint-4.13.0.tgz", + "integrity": "sha1-GZGqNZWGr4OHe95Z3p1B9T4ggm0=", + "dev": true, + "requires": { + "ajv": "5.5.1", + "babel-code-frame": "6.26.0", + "chalk": "2.3.0", + "concat-stream": "1.6.0", + "cross-spawn": "5.1.0", + "debug": "3.1.0", + "doctrine": "2.0.2", + "eslint-scope": "3.7.1", + "espree": "3.5.2", + "esquery": "1.0.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "11.1.0", + "ignore": "3.3.7", + "imurmurhash": "0.1.4", + "inquirer": "3.3.0", + "is-resolvable": "1.0.0", + "js-yaml": "3.10.0", + "json-stable-stringify-without-jsonify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "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.0", + "require-uncached": "1.0.3", + "semver": "5.4.1", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", + "table": "4.0.2", + "text-table": "0.2.0" + } + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "http://registry.npm.taobao.org/eslint-scope/download/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "esmangle": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/esmangle/download/esmangle-1.0.1.tgz", + "integrity": "sha1-2bs3uPjq+/Tm1O1reqKVarvTxMI=", + "dev": true, + "requires": { + "escodegen": "1.3.3", + "escope": "1.0.3", + "esprima": "1.1.1", + "esshorten": "1.1.1", + "estraverse": "1.5.1", + "esutils": "1.0.0", + "optionator": "0.3.0", + "source-map": "0.1.43" + }, + "dependencies": { + "escodegen": { + "version": "1.3.3", + "resolved": "http://registry.npm.taobao.org/escodegen/download/escodegen-1.3.3.tgz", + "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=", + "dev": true, + "requires": { + "esprima": "1.1.1", + "estraverse": "1.5.1", + "esutils": "1.0.0", + "source-map": "0.1.43" + } + }, + "esprima": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-1.1.1.tgz", + "integrity": "sha1-W28VR/TRAuZw4UDFCb5ncdautUk=", + "dev": true + }, + "estraverse": { + "version": "1.5.1", + "resolved": "http://registry.npm.taobao.org/estraverse/download/estraverse-1.5.1.tgz", + "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=", + "dev": true + }, + "esutils": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/esutils/download/esutils-1.0.0.tgz", + "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=", + "dev": true + }, + "fast-levenshtein": { + "version": "1.0.7", + "resolved": "http://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-1.0.7.tgz", + "integrity": "sha1-AXjc3uAjuSkFGTrwlZ6KdjnP3Lk=", + "dev": true + }, + "levn": { + "version": "0.2.5", + "resolved": "http://registry.npm.taobao.org/levn/download/levn-0.2.5.tgz", + "integrity": "sha1-uo0znQykphDjo/FFucr0iAcVUFQ=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "optionator": { + "version": "0.3.0", + "resolved": "http://registry.npm.taobao.org/optionator/download/optionator-0.3.0.tgz", + "integrity": "sha1-lxWotfXnWGz/BsgkngOc1zZNP1Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "1.0.7", + "levn": "0.2.5", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "0.0.3" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "espree": { + "version": "3.5.2", + "resolved": "http://registry.npm.taobao.org/espree/download/espree-3.5.2.tgz", + "integrity": "sha1-dWrai5eenc/NswqtjRqTBKkF4co=", + "dev": true, + "requires": { + "acorn": "5.2.1", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-4.0.0.tgz", + "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=", + "dev": true + }, + "esquery": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/esquery/download/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "http://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "esshorten": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/esshorten/download/esshorten-1.1.1.tgz", + "integrity": "sha1-F0+Wt8wmfkaHLYFOfbfCkL3/Yak=", + "dev": true, + "requires": { + "escope": "1.0.3", + "estraverse": "4.1.1", + "esutils": "2.0.2" + }, + "dependencies": { + "estraverse": { + "version": "4.1.1", + "resolved": "http://registry.npm.taobao.org/estraverse/download/estraverse-4.1.1.tgz", + "integrity": "sha1-9srKcokzqFDvkGYdDheYK6RxEaI=", + "dev": true + } + } + }, + "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 + }, + "exec-buffer": { + "version": "3.2.0", + "resolved": "http://registry.npm.taobao.org/exec-buffer/download/exec-buffer-3.2.0.tgz", + "integrity": "sha1-sWhtvZBMfPmC5lLB9aebHlVzCCs=", + "dev": true, + "optional": true, + "requires": { + "execa": "0.7.0", + "p-finally": "1.0.0", + "pify": "3.0.0", + "rimraf": "2.6.2", + "tempfile": "2.0.0" + } + }, + "exec-series": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/exec-series/download/exec-series-1.0.3.tgz", + "integrity": "sha1-bSV6m+rEgqhyx3g7yGFYOfx3FDo=", + "dev": true, + "optional": true, + "requires": { + "async-each-series": "1.1.0", + "object-assign": "4.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "http://registry.npm.taobao.org/execa/download/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "optional": 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" + } + }, + "executable": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/executable/download/executable-1.1.0.tgz", + "integrity": "sha1-h3mA6REvM5EGbaNyZd562ENKtNk=", + "dev": true, + "optional": true, + "requires": { + "meow": "3.7.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "http://registry.npm.taobao.org/expand-range/download/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "http://registry.npm.taobao.org/expand-tilde/download/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/extend/download/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "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" + } + }, + "external-editor": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/external-editor/download/external-editor-2.1.0.tgz", + "integrity": "sha1-PQJqIbf5W1cmOH1CAKwWDTcsO0g=", + "dev": true, + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "http://registry.npm.taobao.org/extglob/download/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "fancy-log": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/fancy-log/download/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "time-stamp": "1.1.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + } + } + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "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.0", + "object-assign": "4.1.1" + } + }, + "file-type": { + "version": "4.4.0", + "resolved": "http://registry.npm.taobao.org/file-type/download/file-type-4.4.0.tgz", + "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", + "dev": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/filename-regex/download/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "filename-reserved-regex": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/filename-reserved-regex/download/filename-reserved-regex-1.0.0.tgz", + "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=", + "dev": true + }, + "filenamify": { + "version": "1.2.1", + "resolved": "http://registry.npm.taobao.org/filenamify/download/filenamify-1.2.1.tgz", + "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", + "dev": true, + "requires": { + "filename-reserved-regex": "1.0.0", + "strip-outer": "1.0.0", + "trim-repeated": "1.0.0" + } + }, + "fill-range": { + "version": "2.2.3", + "resolved": "http://registry.npm.taobao.org/fill-range/download/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-index": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/find-index/download/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "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" + } + }, + "find-versions": { + "version": "1.2.1", + "resolved": "http://registry.npm.taobao.org/find-versions/download/find-versions-1.2.1.tgz", + "integrity": "sha1-y96fEuOFdaCvG+G5osXV/Y8Ya2I=", + "dev": true, + "optional": true, + "requires": { + "array-uniq": "1.0.3", + "get-stdin": "4.0.1", + "meow": "3.7.0", + "semver-regex": "1.0.0" + } + }, + "findup-sync": { + "version": "0.4.3", + "resolved": "http://registry.npm.taobao.org/findup-sync/download/findup-sync-0.4.3.tgz", + "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", + "dev": true, + "requires": { + "detect-file": "0.1.0", + "is-glob": "2.0.1", + "micromatch": "2.3.11", + "resolve-dir": "0.1.1" + } + }, + "fined": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/fined/download/fined-1.1.0.tgz", + "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "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.1" + }, + "dependencies": { + "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.1" + } + } + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/first-chunk-stream/download/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "flagged-respawn": { + "version": "0.3.2", + "resolved": "http://registry.npm.taobao.org/flagged-respawn/download/flagged-respawn-0.3.2.tgz", + "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=", + "dev": true + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/flat-cache/download/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + }, + "dependencies": { + "del": { + "version": "2.2.2", + "resolved": "http://registry.npm.taobao.org/del/download/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "http://registry.npm.taobao.org/globby/download/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "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": "0.1.5", + "resolved": "http://registry.npm.taobao.org/for-own/download/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/fs-exists-sync/download/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "dev": true + }, + "fs-jetpack": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-2.2.2.tgz", + "integrity": "sha512-USJrUxck7SIXSvYPzU5fuR5iqLHRDSzb0kHvCJlQhUGEVai3P9yZDu/2b+bAzprbWLCc2YcslxBLBUInDmYkYA==", + "requires": { + "minimatch": "3.0.4", + "rimraf": "2.6.3" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "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" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "7.1.3" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "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 + }, + "gaze": { + "version": "0.5.2", + "resolved": "http://registry.npm.taobao.org/gaze/download/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "0.1.0" + } + }, + "get-proxy": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/get-proxy/download/get-proxy-1.1.0.tgz", + "integrity": "sha1-iUhUSRvFkbDxR9euVw9cZ4tyVus=", + "dev": true, + "requires": { + "rc": "1.2.2" + } + }, + "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, + "optional": true + }, + "gifsicle": { + "version": "3.0.4", + "resolved": "http://registry.npm.taobao.org/gifsicle/download/gifsicle-3.0.4.tgz", + "integrity": "sha1-9Fy17RAWW2ZdySng6TKLbIId+js=", + "dev": true, + "optional": true, + "requires": { + "bin-build": "2.2.0", + "bin-wrapper": "3.0.2", + "logalot": "2.1.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "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-base": { + "version": "0.3.0", + "resolved": "http://registry.npm.taobao.org/glob-base/download/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/glob-parent/download/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "http://registry.npm.taobao.org/glob-stream/download/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "dev": true, + "requires": { + "glob": "4.5.3", + "glob2base": "0.0.12", + "minimatch": "2.0.10", + "ordered-read-streams": "0.1.0", + "through2": "0.6.5", + "unique-stream": "1.0.0" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "http://registry.npm.taobao.org/glob/download/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "2.0.10", + "once": "1.4.0" + } + }, + "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 + }, + "minimatch": { + "version": "2.0.10", + "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "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 + }, + "through2": { + "version": "0.6.5", + "resolved": "http://registry.npm.taobao.org/through2/download/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "http://registry.npm.taobao.org/glob-watcher/download/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "dev": true, + "requires": { + "gaze": "0.5.2" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "http://registry.npm.taobao.org/glob2base/download/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "0.1.1" + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "http://registry.npm.taobao.org/global-modules/download/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "dev": true, + "requires": { + "global-prefix": "0.1.5", + "is-windows": "0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "http://registry.npm.taobao.org/global-prefix/download/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1", + "ini": "1.3.5", + "is-windows": "0.2.0", + "which": "1.3.0" + } + }, + "globals": { + "version": "11.1.0", + "resolved": "http://registry.npm.taobao.org/globals/download/globals-11.1.0.tgz", + "integrity": "sha1-YyZERX9fDjrnEYBxg3AOvy5GM+Q=", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "http://registry.npm.taobao.org/globby/download/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "globule": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/globule/download/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "3.1.21", + "lodash": "1.0.2", + "minimatch": "0.2.14" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "http://registry.npm.taobao.org/glob/download/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + }, + "lodash": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/lodash/download/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "http://registry.npm.taobao.org/lru-cache/download/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + } + } + }, + "glogg": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/glogg/download/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + } + }, + "got": { + "version": "5.7.1", + "resolved": "http://registry.npm.taobao.org/got/download/got-5.7.1.tgz", + "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer2": "0.1.4", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "node-status-codes": "1.0.0", + "object-assign": "4.1.1", + "parse-json": "2.2.0", + "pinkie-promise": "2.0.1", + "read-all-stream": "3.1.0", + "readable-stream": "2.3.3", + "timed-out": "3.1.3", + "unzip-response": "1.0.2", + "url-parse-lax": "1.0.0" + }, + "dependencies": { + "duplexer2": { + "version": "0.1.4", + "resolved": "http://registry.npm.taobao.org/duplexer2/download/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + } + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/graceful-readlink/download/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "gulp": { + "version": "3.9.1", + "resolved": "http://registry.npm.taobao.org/gulp/download/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "dev": true, + "requires": { + "archy": "1.0.0", + "chalk": "1.1.3", + "deprecated": "0.0.1", + "gulp-util": "3.0.8", + "interpret": "1.1.0", + "liftoff": "2.3.0", + "minimist": "1.2.0", + "orchestrator": "0.3.8", + "pretty-hrtime": "1.0.3", + "semver": "4.3.6", + "tildify": "1.2.0", + "v8flags": "2.1.1", + "vinyl-fs": "0.3.14" + }, + "dependencies": { + "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" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "semver": { + "version": "4.3.6", + "resolved": "http://registry.npm.taobao.org/semver/download/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "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" + } + } + } + }, + "gulp-decompress": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/gulp-decompress/download/gulp-decompress-1.2.0.tgz", + "integrity": "sha1-jutlpeAV+O2FMsr+KEVJYGJvDcc=", + "dev": true, + "requires": { + "archive-type": "3.2.0", + "decompress": "3.0.0", + "gulp-util": "3.0.8", + "readable-stream": "2.3.3" + } + }, + "gulp-file-inline": { + "version": "1.3.7", + "resolved": "http://registry.npm.taobao.org/gulp-file-inline/download/gulp-file-inline-1.3.7.tgz", + "integrity": "sha1-c6Mo2nDUdVnTG43abaDuYHAX5l0=", + "dev": true, + "requires": { + "clean-css": "3.4.28", + "gulp-util": "3.0.8", + "through2": "2.0.3", + "uglify-js": "2.8.29" + } + }, + "gulp-htmlmin": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/gulp-htmlmin/download/gulp-htmlmin-3.0.0.tgz", + "integrity": "sha1-GeqAAtEjHWsfGKEtIPKmand3D7M=", + "dev": true, + "requires": { + "bufferstreams": "1.1.3", + "gulp-util": "3.0.8", + "html-minifier": "3.5.7", + "object-assign": "4.1.1", + "readable-stream": "2.3.3", + "tryit": "1.0.3" + } + }, + "gulp-imagemin": { + "version": "3.4.0", + "resolved": "http://registry.npm.taobao.org/gulp-imagemin/download/gulp-imagemin-3.4.0.tgz", + "integrity": "sha1-I6jUxRM/UKKnCKyofKSy1ut8RAM=", + "dev": true, + "requires": { + "chalk": "2.3.0", + "gulp-util": "3.0.8", + "imagemin": "5.3.1", + "imagemin-gifsicle": "5.2.0", + "imagemin-jpegtran": "5.0.2", + "imagemin-optipng": "5.2.1", + "imagemin-svgo": "5.2.4", + "plur": "2.1.2", + "pretty-bytes": "4.0.2", + "through2-concurrent": "1.1.1" + } + }, + "gulp-javascript-obfuscator": { + "version": "1.1.4", + "resolved": "http://registry.npm.taobao.org/gulp-javascript-obfuscator/download/gulp-javascript-obfuscator-1.1.4.tgz", + "integrity": "sha1-6tsgqA8bznrvJFaFXvl33eHygrI=", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "javascript-obfuscator": "0.12.5", + "through2": "2.0.3" + } + }, + "gulp-rename": { + "version": "1.2.2", + "resolved": "http://registry.npm.taobao.org/gulp-rename/download/gulp-rename-1.2.2.tgz", + "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=", + "dev": true + }, + "gulp-replace": { + "version": "0.6.1", + "resolved": "http://registry.npm.taobao.org/gulp-replace/download/gulp-replace-0.6.1.tgz", + "integrity": "sha1-Eb+Mj85TPjPi9qjy9DC5VboL4GY=", + "dev": true, + "requires": { + "istextorbinary": "1.0.2", + "readable-stream": "2.3.3", + "replacestream": "4.0.3" + } + }, + "gulp-rev": { + "version": "8.1.0", + "resolved": "http://registry.npm.taobao.org/gulp-rev/download/gulp-rev-8.1.0.tgz", + "integrity": "sha1-kSP5o/k1AIxmqMdo5x+Lh/sODNc=", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "modify-filename": "1.1.0", + "rev-hash": "2.0.0", + "rev-path": "2.0.0", + "sort-keys": "2.0.0", + "through2": "2.0.3", + "vinyl-file": "3.0.0" + } + }, + "gulp-rev-collector": { + "version": "1.2.3", + "resolved": "http://registry.npm.taobao.org/gulp-rev-collector/download/gulp-rev-collector-1.2.3.tgz", + "integrity": "sha1-U1l7XLgwYc3yDetFAC5AQiiOzfM=", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "through2": "2.0.3", + "underscore": "1.8.3" + } + }, + "gulp-sourcemaps": { + "version": "1.6.0", + "resolved": "http://registry.npm.taobao.org/gulp-sourcemaps/download/gulp-sourcemaps-1.6.0.tgz", + "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "dev": true, + "requires": { + "convert-source-map": "1.5.1", + "graceful-fs": "4.1.11", + "strip-bom": "2.0.0", + "through2": "2.0.3", + "vinyl": "1.2.0" + }, + "dependencies": { + "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" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "http://registry.npm.taobao.org/gulp-util/download/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.2.0", + "fancy-log": "1.3.0", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.3", + "vinyl": "0.5.3" + }, + "dependencies": { + "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" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "object-assign": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "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" + } + } + } + }, + "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.0" + } + }, + "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": "2.0.0", + "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/has-gulplog/download/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + } + }, + "he": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/he/download/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/homedir-polyfill/download/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.5.0.tgz", + "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/html-comment-regex/download/html-comment-regex-1.1.1.tgz", + "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", + "dev": true, + "optional": true + }, + "html-minifier": { + "version": "3.5.7", + "resolved": "http://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.7.tgz", + "integrity": "sha1-UR5pu1qOdnfRAS6+A4GaoCygYgg=", + "dev": true, + "requires": { + "camel-case": "3.0.0", + "clean-css": "4.1.9", + "commander": "2.12.2", + "he": "1.1.1", + "ncname": "1.0.0", + "param-case": "2.1.1", + "relateurl": "0.2.7", + "uglify-js": "3.2.1" + }, + "dependencies": { + "clean-css": { + "version": "4.1.9", + "resolved": "http://registry.npm.taobao.org/clean-css/download/clean-css-4.1.9.tgz", + "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "commander": { + "version": "2.12.2", + "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.12.2.tgz", + "integrity": "sha1-D1lGxCftnsDZGka7ne9T5UZQ5VU=", + "dev": true + }, + "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 + }, + "uglify-js": { + "version": "3.2.1", + "resolved": "http://registry.npm.taobao.org/uglify-js/download/uglify-js-3.2.1.tgz", + "integrity": "sha1-1kJ/1Fol/vxdGWaJwMdyppFeEP4=", + "dev": true, + "requires": { + "commander": "2.12.2", + "source-map": "0.6.1" + }, + "dependencies": { + "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 + } + } + } + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.19.tgz", + "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=", + "dev": true + }, + "ignore": { + "version": "3.3.7", + "resolved": "http://registry.npm.taobao.org/ignore/download/ignore-3.3.7.tgz", + "integrity": "sha1-YSKJv7PCIOGGpYEYYY1b6MG6sCE=", + "dev": true + }, + "imagemin": { + "version": "5.3.1", + "resolved": "http://registry.npm.taobao.org/imagemin/download/imagemin-5.3.1.tgz", + "integrity": "sha1-8Zwu7h5xumxlWMUV+fyWaAGJptQ=", + "dev": true, + "requires": { + "file-type": "4.4.0", + "globby": "6.1.0", + "make-dir": "1.1.0", + "p-pipe": "1.2.0", + "pify": "2.3.0", + "replace-ext": "1.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "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 + } + } + }, + "imagemin-gifsicle": { + "version": "5.2.0", + "resolved": "http://registry.npm.taobao.org/imagemin-gifsicle/download/imagemin-gifsicle-5.2.0.tgz", + "integrity": "sha1-N4FSTEV2Eu8EkWrzQkGitCv8tAo=", + "dev": true, + "optional": true, + "requires": { + "exec-buffer": "3.2.0", + "gifsicle": "3.0.4", + "is-gif": "1.0.0" + } + }, + "imagemin-jpegtran": { + "version": "5.0.2", + "resolved": "http://registry.npm.taobao.org/imagemin-jpegtran/download/imagemin-jpegtran-5.0.2.tgz", + "integrity": "sha1-5ogiY7j3kW/duABkDPddLpcNKtY=", + "dev": true, + "optional": true, + "requires": { + "exec-buffer": "3.2.0", + "is-jpg": "1.0.0", + "jpegtran-bin": "3.2.0" + } + }, + "imagemin-optipng": { + "version": "5.2.1", + "resolved": "http://registry.npm.taobao.org/imagemin-optipng/download/imagemin-optipng-5.2.1.tgz", + "integrity": "sha1-0i2kEsCfX/AKQzmWC5ioix2+hpU=", + "dev": true, + "optional": true, + "requires": { + "exec-buffer": "3.2.0", + "is-png": "1.1.0", + "optipng-bin": "3.1.4" + } + }, + "imagemin-svgo": { + "version": "5.2.4", + "resolved": "http://registry.npm.taobao.org/imagemin-svgo/download/imagemin-svgo-5.2.4.tgz", + "integrity": "sha1-bNXTQsrkvNi0g1lOUxVpXfArnps=", + "dev": true, + "optional": true, + "requires": { + "is-svg": "2.1.0", + "svgo": "0.7.2" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "http://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "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=", + "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": "3.3.0", + "resolved": "http://registry.npm.taobao.org/inquirer/download/inquirer-3.3.0.tgz", + "integrity": "sha1-ndLyrXZdyrH/BEO0kUQqILoifck=", + "dev": true, + "requires": { + "ansi-escapes": "3.0.0", + "chalk": "2.3.0", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.1.0", + "figures": "2.0.0", + "lodash": "4.17.4", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/interpret/download/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "inversify": { + "version": "4.5.2", + "resolved": "http://registry.npm.taobao.org/inversify/download/inversify-4.5.2.tgz", + "integrity": "sha1-8keP0UDzmINrLh/ug583WI8eaps=", + "dev": true + }, + "ip-regex": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/ip-regex/download/ip-regex-1.0.3.tgz", + "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", + "dev": true, + "optional": true + }, + "irregular-plurals": { + "version": "1.4.0", + "resolved": "http://registry.npm.taobao.org/irregular-plurals/download/irregular-plurals-1.4.0.tgz", + "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", + "dev": true + }, + "is-absolute": { + "version": "0.2.6", + "resolved": "http://registry.npm.taobao.org/is-absolute/download/is-absolute-0.2.6.tgz", + "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", + "dev": true, + "requires": { + "is-relative": "0.2.1", + "is-windows": "0.2.0" + } + }, + "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-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-bzip2": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-bzip2/download/is-bzip2-1.0.0.tgz", + "integrity": "sha1-XuWOqlounIDiFAe+3yOuWsCRs/w=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/is-dotfile/download/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "http://registry.npm.taobao.org/is-equal-shallow/download/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "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": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-extglob/download/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "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": "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 + }, + "is-gif": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-gif/download/is-gif-1.0.0.tgz", + "integrity": "sha1-ptKumIkwB7/6l6HYwB1jIFgyCX4=", + "dev": true, + "optional": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-gzip": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-gzip/download/is-gzip-1.0.0.tgz", + "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=", + "dev": true + }, + "is-jpg": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-jpg/download/is-jpg-1.0.0.tgz", + "integrity": "sha1-KVnBfnNDDbOCZNp1uQ3VTy2G2hw=", + "dev": true, + "optional": true + }, + "is-natural-number": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/is-natural-number/download/is-natural-number-2.1.1.tgz", + "integrity": "sha1-fUxXKDd+84bD4ZSpkRv1fG3DNec=", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "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-cwd": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-path-cwd/download/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-path-in-cwd/download/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.1" + } + }, + "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-obj": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-png": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/is-png/download/is-png-1.1.0.tgz", + "integrity": "sha1-1XSxK/J1wDUEVVcLDltXqwYgd84=", + "dev": true, + "optional": true + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/is-posix-bracket/download/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/is-primitive/download/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "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-relative": { + "version": "0.2.1", + "resolved": "http://registry.npm.taobao.org/is-relative/download/is-relative-0.2.1.tgz", + "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", + "dev": true, + "requires": { + "is-unc-path": "0.1.2" + } + }, + "is-resolvable": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-resolvable/download/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true, + "requires": { + "tryit": "1.0.3" + } + }, + "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-svg": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/is-svg/download/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "dev": true, + "optional": true, + "requires": { + "html-comment-regex": "1.1.1" + } + }, + "is-tar": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-tar/download/is-tar-1.0.0.tgz", + "integrity": "sha1-L2suF5LB9bs2UZrKqdZcDSb+hT0=", + "dev": true + }, + "is-unc-path": { + "version": "0.1.2", + "resolved": "http://registry.npm.taobao.org/is-unc-path/download/is-unc-path-0.1.2.tgz", + "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", + "dev": true, + "requires": { + "unc-path-regex": "0.1.2" + } + }, + "is-url": { + "version": "1.2.2", + "resolved": "http://registry.npm.taobao.org/is-url/download/is-url-1.2.2.tgz", + "integrity": "sha1-SYkFpZO/R8wtnn9zg3K792lsfyY=", + "dev": true + }, + "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": "0.3.0", + "resolved": "http://registry.npm.taobao.org/is-valid-glob/download/is-valid-glob-0.3.0.tgz", + "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", + "dev": true + }, + "is-windows": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/is-windows/download/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true + }, + "is-zip": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-zip/download/is-zip-1.0.0.tgz", + "integrity": "sha1-R7Co/004p2QxzP2ZqOFaTIa6IyU=", + "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 + }, + "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": "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" + } + }, + "istextorbinary": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/istextorbinary/download/istextorbinary-1.0.2.tgz", + "integrity": "sha1-rOGTVNGpoBc+/rEITOD4ewrX3s8=", + "dev": true, + "requires": { + "binaryextensions": "1.0.1", + "textextensions": "1.0.2" + } + }, + "javascript-obfuscator": { + "version": "0.12.5", + "resolved": "http://registry.npm.taobao.org/javascript-obfuscator/download/javascript-obfuscator-0.12.5.tgz", + "integrity": "sha1-mcT8U3dpN/+vTt+WXG6Z992tco0=", + "dev": true, + "requires": { + "chalk": "2.3.0", + "chance": "1.0.12", + "class-validator": "0.7.3", + "commander": "2.12.2", + "escodegen-wallaby": "1.6.15", + "esmangle": "1.0.1", + "esprima": "4.0.0", + "estraverse": "4.2.0", + "inversify": "4.5.2", + "md5": "2.2.1", + "mkdirp": "0.5.1", + "opencollective": "1.0.3", + "reflect-metadata": "0.1.10", + "source-map-support": "0.5.0", + "string-template": "1.0.0", + "tslib": "1.8.0" + }, + "dependencies": { + "commander": { + "version": "2.12.2", + "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.12.2.tgz", + "integrity": "sha1-D1lGxCftnsDZGka7ne9T5UZQ5VU=", + "dev": true + } + } + }, + "jpegtran-bin": { + "version": "3.2.0", + "resolved": "http://registry.npm.taobao.org/jpegtran-bin/download/jpegtran-bin-3.2.0.tgz", + "integrity": "sha1-9g7PSumZwL2tLp+83ytvCYHnops=", + "dev": true, + "optional": true, + "requires": { + "bin-build": "2.2.0", + "bin-wrapper": "3.0.2", + "logalot": "2.1.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 + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.10.0.tgz", + "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/json-stable-stringify/download/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "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 + }, + "jsonify": { + "version": "0.0.0", + "resolved": "http://registry.npm.taobao.org/jsonify/download/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "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" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lazy-req": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/lazy-req/download/lazy-req-1.1.0.tgz", + "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=", + "dev": true, + "optional": 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.3" + } + }, + "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.3.0", + "resolved": "http://registry.npm.taobao.org/liftoff/download/liftoff-2.3.0.tgz", + "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", + "dev": true, + "requires": { + "extend": "3.0.1", + "findup-sync": "0.4.3", + "fined": "1.1.0", + "flagged-respawn": "0.3.2", + "lodash.isplainobject": "4.0.6", + "lodash.isstring": "4.0.1", + "lodash.mapvalues": "4.6.0", + "rechoir": "0.6.2", + "resolve": "1.5.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.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "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" + } + } + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "http://registry.npm.taobao.org/lodash/download/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/lodash._basecopy/download/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/lodash._basetostring/download/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/lodash._basevalues/download/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "http://registry.npm.taobao.org/lodash._getnative/download/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "http://registry.npm.taobao.org/lodash._isiterateecall/download/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/lodash._reescape/download/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/lodash._reevaluate/download/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/lodash._reinterpolate/download/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/lodash._root/download/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "http://registry.npm.taobao.org/lodash.escape/download/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "3.0.1" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/lodash.isarguments/download/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "http://registry.npm.taobao.org/lodash.isarray/download/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "http://registry.npm.taobao.org/lodash.isequal/download/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "http://registry.npm.taobao.org/lodash.isplainobject/download/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "http://registry.npm.taobao.org/lodash.isstring/download/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "http://registry.npm.taobao.org/lodash.keys/download/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "http://registry.npm.taobao.org/lodash.mapvalues/download/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "http://registry.npm.taobao.org/lodash.restparam/download/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "http://registry.npm.taobao.org/lodash.template/download/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "http://registry.npm.taobao.org/lodash.templatesettings/download/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } + }, + "logalot": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/logalot/download/logalot-2.1.0.tgz", + "integrity": "sha1-X46MkNME7fElMJUaVVSruMXj9VI=", + "dev": true, + "optional": true, + "requires": { + "figures": "1.7.0", + "squeak": "1.3.0" + }, + "dependencies": { + "figures": { + "version": "1.7.0", + "resolved": "http://registry.npm.taobao.org/figures/download/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "optional": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + } + } + }, + "longest": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "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" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "http://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/lowercase-keys/download/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + }, + "lpad-align": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/lpad-align/download/lpad-align-1.1.2.tgz", + "integrity": "sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=", + "dev": true, + "optional": true, + "requires": { + "get-stdin": "4.0.1", + "indent-string": "2.1.0", + "longest": "1.0.1", + "meow": "3.7.0" + } + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "http://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.1.tgz", + "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/make-dir/download/make-dir-1.1.0.tgz", + "integrity": "sha1-GbQ2n+SMEW9Twq+VrRAsDjnoXVE=", + "dev": true, + "requires": { + "pify": "3.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 + }, + "md5": { + "version": "2.2.1", + "resolved": "http://registry.npm.taobao.org/md5/download/md5-2.2.1.tgz", + "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", + "dev": true, + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "1.1.6" + } + }, + "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" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/merge-stream/download/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "http://registry.npm.taobao.org/micromatch/download/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "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=", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "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" + } + }, + "modify-filename": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/modify-filename/download/modify-filename-1.1.0.tgz", + "integrity": "sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "http://registry.npm.taobao.org/multipipe/download/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "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 + }, + "natives": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/natives/download/natives-1.1.1.tgz", + "integrity": "sha1-ARrM4ffL2H97prMJPWzZOSvhxXQ=", + "dev": true + }, + "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 + }, + "ncname": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/ncname/download/ncname-1.0.0.tgz", + "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "dev": true, + "requires": { + "xml-char-classes": "1.0.0" + } + }, + "no-case": { + "version": "2.3.2", + "resolved": "http://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "dev": true, + "requires": { + "lower-case": "1.1.4" + } + }, + "node-fetch": { + "version": "1.6.3", + "resolved": "http://registry.npm.taobao.org/node-fetch/download/node-fetch-1.6.3.tgz", + "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=", + "dev": true, + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + }, + "node-status-codes": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/node-status-codes/download/node-status-codes-1.0.0.tgz", + "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", + "dev": true + }, + "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.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" + } + }, + "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" + } + }, + "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, + "optional": true, + "requires": { + "path-key": "2.0.1" + } + }, + "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 + }, + "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.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" + }, + "dependencies": { + "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" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/object.omit/download/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "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.1.0" + } + }, + "opencollective": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/opencollective/download/opencollective-1.0.3.tgz", + "integrity": "sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE=", + "dev": true, + "requires": { + "babel-polyfill": "6.23.0", + "chalk": "1.1.3", + "inquirer": "3.0.6", + "minimist": "1.2.0", + "node-fetch": "1.6.3", + "opn": "4.0.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "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" + } + }, + "inquirer": { + "version": "3.0.6", + "resolved": "http://registry.npm.taobao.org/inquirer/download/inquirer-3.0.6.tgz", + "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "chalk": "1.1.3", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.1.0", + "figures": "2.0.0", + "lodash": "4.17.4", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx": "4.1.0", + "string-width": "2.1.1", + "strip-ansi": "3.0.1", + "through": "2.3.8" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "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" + } + } + } + }, + "opn": { + "version": "4.0.2", + "resolved": "http://registry.npm.taobao.org/opn/download/opn-4.0.2.tgz", + "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + } + }, + "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" + } + }, + "optipng-bin": { + "version": "3.1.4", + "resolved": "http://registry.npm.taobao.org/optipng-bin/download/optipng-bin-3.1.4.tgz", + "integrity": "sha1-ldNPLEiHBPb9cGBr/qDGWfHZXYQ=", + "dev": true, + "optional": true, + "requires": { + "bin-build": "2.2.0", + "bin-wrapper": "3.0.2", + "logalot": "2.1.0" + } + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "http://registry.npm.taobao.org/orchestrator/download/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "dev": true, + "requires": { + "end-of-stream": "0.1.5", + "sequencify": "0.0.7", + "stream-consume": "0.1.0" + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/ordered-read-streams/download/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", + "dev": true + }, + "os-filter-obj": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/os-filter-obj/download/os-filter-obj-1.0.3.tgz", + "integrity": "sha1-WRUzDZDs7VV9LZOKMcbdIU2cY60=", + "dev": true, + "optional": true + }, + "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-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 + }, + "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-map": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/p-map/download/p-map-1.2.0.tgz", + "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=", + "dev": true + }, + "p-pipe": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/p-pipe/download/p-pipe-1.2.0.tgz", + "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=", + "dev": true + }, + "param-case": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/param-case/download/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "2.3.2" + } + }, + "parse-filepath": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/parse-filepath/download/parse-filepath-1.0.1.tgz", + "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", + "dev": true, + "requires": { + "is-absolute": "0.2.6", + "map-cache": "0.2.2", + "path-root": "0.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "http://registry.npm.taobao.org/parse-glob/download/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.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.1" + } + }, + "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 + }, + "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": "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" + } + }, + "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=" + }, + "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, + "optional": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "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-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.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "pend": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/pend/download/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "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 + }, + "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" + } + }, + "plur": { + "version": "2.1.2", + "resolved": "http://registry.npm.taobao.org/plur/download/plur-2.1.2.tgz", + "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", + "dev": true, + "requires": { + "irregular-plurals": "1.4.0" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "http://registry.npm.taobao.org/pluralize/download/pluralize-7.0.0.tgz", + "integrity": "sha1-KYuJ34uTsCIdv0Ia0rGx6iP8Z3c=", + "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 + }, + "preserve": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/preserve/download/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-bytes": { + "version": "4.0.2", + "resolved": "http://registry.npm.taobao.org/pretty-bytes/download/pretty-bytes-4.0.2.tgz", + "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", + "dev": true + }, + "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": "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 + }, + "progress": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/progress/download/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "http://registry.npm.taobao.org/q/download/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true, + "optional": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "http://registry.npm.taobao.org/randomatic/download/randomatic-1.1.7.tgz", + "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "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" + } + } + } + }, + "rc": { + "version": "1.2.2", + "resolved": "http://registry.npm.taobao.org/rc/download/rc-1.2.2.tgz", + "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=", + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "read-all-stream": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/read-all-stream/download/read-all-stream-3.1.0.tgz", + "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1", + "readable-stream": "2.3.3" + } + }, + "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": "2.3.3", + "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.3.tgz", + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.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.5.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" + } + }, + "reflect-metadata": { + "version": "0.1.10", + "resolved": "http://registry.npm.taobao.org/reflect-metadata/download/reflect-metadata-0.1.10.tgz", + "integrity": "sha1-tPg3BEFqytiZiMmxVjXUfgO5NEo=", + "dev": true + }, + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "http://registry.npm.taobao.org/regex-cache/download/regex-cache-0.4.4.tgz", + "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "http://registry.npm.taobao.org/relateurl/download/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "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.2", + "resolved": "http://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "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": "0.0.1", + "resolved": "http://registry.npm.taobao.org/replace-ext/download/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "replacestream": { + "version": "4.0.3", + "resolved": "http://registry.npm.taobao.org/replacestream/download/replacestream-4.0.3.tgz", + "integrity": "sha1-PuV5gJK+Nksc2xSEMISSyz3/LzY=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1", + "readable-stream": "2.3.3" + } + }, + "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" + } + }, + "resolve": { + "version": "1.5.0", + "resolved": "http://registry.npm.taobao.org/resolve/download/resolve-1.5.0.tgz", + "integrity": "sha1-HwmsznlsmnYlefMbLBzEw83fnzY=", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/resolve-dir/download/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "dev": true, + "requires": { + "expand-tilde": "1.2.2", + "global-modules": "0.2.3" + } + }, + "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 + }, + "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" + } + }, + "rev-hash": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/rev-hash/download/rev-hash-2.0.0.tgz", + "integrity": "sha1-dyCiNu0MJY3z5kvsA+wEiwW5JMQ=", + "dev": true + }, + "rev-path": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/rev-path/download/rev-path-2.0.0.tgz", + "integrity": "sha1-EMl46CTXbOfdH35m6I9Q9ecaCmo=", + "dev": true, + "requires": { + "modify-filename": "1.1.0" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "http://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.2.tgz", + "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "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" + } + }, + "rx": { + "version": "4.1.0", + "resolved": "http://registry.npm.taobao.org/rx/download/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "http://registry.npm.taobao.org/rx-lite/download/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "http://registry.npm.taobao.org/rx-lite-aggregates/download/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "4.0.8" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.1.tgz", + "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "http://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "dev": true, + "optional": true + }, + "seek-bzip": { + "version": "1.0.5", + "resolved": "http://registry.npm.taobao.org/seek-bzip/download/seek-bzip-1.0.5.tgz", + "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", + "dev": true, + "requires": { + "commander": "2.8.1" + } + }, + "semver": { + "version": "5.4.1", + "resolved": "http://registry.npm.taobao.org/semver/download/semver-5.4.1.tgz", + "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=", + "dev": true + }, + "semver-regex": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/semver-regex/download/semver-regex-1.0.0.tgz", + "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=", + "dev": true, + "optional": true + }, + "semver-truncate": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/semver-truncate/download/semver-truncate-1.1.2.tgz", + "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=", + "dev": true, + "optional": true, + "requires": { + "semver": "5.4.1" + } + }, + "sequencify": { + "version": "0.0.7", + "resolved": "http://registry.npm.taobao.org/sequencify/download/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/set-immediate-shim/download/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "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 + }, + "sigmund": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/sigmund/download/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "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 + }, + "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" + } + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/sort-keys/download/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "1.1.0" + } + }, + "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" + } + }, + "source-map-support": { + "version": "0.5.0", + "resolved": "http://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.0.tgz", + "integrity": "sha1-IBinrSvfj68mkeX92rJr7VorrKs=", + "dev": true, + "requires": { + "source-map": "0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "sparkles": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/sparkles/download/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "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 + }, + "squeak": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/squeak/download/squeak-1.3.0.tgz", + "integrity": "sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=", + "dev": true, + "optional": true, + "requires": { + "chalk": "1.1.3", + "console-stream": "0.1.1", + "lpad-align": "1.1.2" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "optional": 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" + } + }, + "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, + "optional": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "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 + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/stream-combiner2/download/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dev": true, + "requires": { + "duplexer2": "0.1.4", + "readable-stream": "2.3.3" + }, + "dependencies": { + "duplexer2": { + "version": "0.1.4", + "resolved": "http://registry.npm.taobao.org/duplexer2/download/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + } + } + } + }, + "stream-consume": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/stream-consume/download/stream-consume-0.1.0.tgz", + "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=", + "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-template": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/string-template/download/string-template-1.0.0.tgz", + "integrity": "sha1-np8iM9wA8hhxjsN5oopWc+zKi5Y=", + "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" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "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" + }, + "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 + } + } + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "dev": true, + "requires": { + "first-chunk-stream": "1.0.0", + "is-utf8": "0.2.1" + } + }, + "strip-bom-buf": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/strip-bom-buf/download/strip-bom-buf-1.0.0.tgz", + "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-bom-stream": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/strip-bom-stream/download/strip-bom-stream-1.0.0.tgz", + "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", + "dev": true, + "requires": { + "first-chunk-stream": "1.0.0", + "strip-bom": "2.0.0" + }, + "dependencies": { + "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-dirs": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/strip-dirs/download/strip-dirs-1.1.1.tgz", + "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "get-stdin": "4.0.1", + "is-absolute": "0.1.7", + "is-natural-number": "2.1.1", + "minimist": "1.2.0", + "sum-up": "1.0.3" + }, + "dependencies": { + "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" + } + }, + "is-absolute": { + "version": "0.1.7", + "resolved": "http://registry.npm.taobao.org/is-absolute/download/is-absolute-0.1.7.tgz", + "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", + "dev": true, + "requires": { + "is-relative": "0.1.3" + } + }, + "is-relative": { + "version": "0.1.3", + "resolved": "http://registry.npm.taobao.org/is-relative/download/is-relative-0.1.3.tgz", + "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "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-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, + "optional": 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 + }, + "strip-outer": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/strip-outer/download/strip-outer-1.0.0.tgz", + "integrity": "sha1-qsC6YNLpDF1PJ1/Yhp/ZotMQ/7g=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "sum-up": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/sum-up/download/sum-up-1.0.3.tgz", + "integrity": "sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4=", + "dev": true, + "requires": { + "chalk": "1.1.3" + }, + "dependencies": { + "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" + } + }, + "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" + } + } + } + }, + "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 + }, + "svgo": { + "version": "0.7.2", + "resolved": "http://registry.npm.taobao.org/svgo/download/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "dev": true, + "optional": true, + "requires": { + "coa": "1.0.4", + "colors": "1.1.2", + "csso": "2.3.2", + "js-yaml": "3.7.0", + "mkdirp": "0.5.1", + "sax": "1.2.4", + "whet.extend": "0.9.9" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true, + "optional": true + }, + "js-yaml": { + "version": "3.7.0", + "resolved": "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "dev": true, + "optional": true, + "requires": { + "argparse": "1.0.9", + "esprima": "2.7.3" + } + } + } + }, + "table": { + "version": "4.0.2", + "resolved": "http://registry.npm.taobao.org/table/download/table-4.0.2.tgz", + "integrity": "sha1-ozRHN1OR52atNNNIbm4q7chNLjY=", + "dev": true, + "requires": { + "ajv": "5.5.1", + "ajv-keywords": "2.1.1", + "chalk": "2.3.0", + "lodash": "4.17.4", + "slice-ansi": "1.0.0", + "string-width": "2.1.1" + } + }, + "tar-stream": { + "version": "1.5.5", + "resolved": "http://registry.npm.taobao.org/tar-stream/download/tar-stream-1.5.5.tgz", + "integrity": "sha1-XK2Ed59FyDsfJQjZawnYjHIYr1U=", + "dev": true, + "requires": { + "bl": "1.2.1", + "end-of-stream": "1.4.0", + "readable-stream": "2.3.3", + "xtend": "4.0.1" + }, + "dependencies": { + "end-of-stream": { + "version": "1.4.0", + "resolved": "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.0.tgz", + "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", + "dev": true, + "requires": { + "once": "1.4.0" + } + } + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/temp-dir/download/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true, + "optional": true + }, + "tempfile": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/tempfile/download/tempfile-2.0.0.tgz", + "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", + "dev": true, + "optional": true, + "requires": { + "temp-dir": "1.0.0", + "uuid": "3.1.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 + }, + "textextensions": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/textextensions/download/textextensions-1.0.2.tgz", + "integrity": "sha1-ZUhjk+4fK7A5pgy7oFsLaL2VAdI=", + "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": "2.0.3", + "resolved": "http://registry.npm.taobao.org/through2/download/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "through2-concurrent": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/through2-concurrent/download/through2-concurrent-1.1.1.tgz", + "integrity": "sha1-EctOpMnjG8puTB5tukjRxyjDUks=", + "dev": true, + "requires": { + "through2": "2.0.3" + } + }, + "through2-filter": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/through2-filter/download/through2-filter-2.0.0.tgz", + "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "dev": true, + "requires": { + "through2": "2.0.3", + "xtend": "4.0.1" + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/tildify/download/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "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": "3.1.3", + "resolved": "http://registry.npm.taobao.org/timed-out/download/timed-out-3.1.3.tgz", + "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", + "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" + } + }, + "to-absolute-glob": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/to-absolute-glob/download/to-absolute-glob-0.1.1.tgz", + "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1" + } + }, + "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 + }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/trim-repeated/download/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "tryit": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/tryit/download/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "tslib": { + "version": "1.8.0", + "resolved": "http://registry.npm.taobao.org/tslib/download/tslib-1.8.0.tgz", + "integrity": "sha1-3GBOutZLy/aW1hPabJVKoOfqHrY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "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" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "http://registry.npm.taobao.org/uglify-js/download/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "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 + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": 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 + }, + "underscore": { + "version": "1.8.3", + "resolved": "http://registry.npm.taobao.org/underscore/download/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", + "dev": true + }, + "unique-stream": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/unique-stream/download/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "dev": true + }, + "unzip-response": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/unzip-response/download/unzip-response-1.0.2.tgz", + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "http://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "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" + } + }, + "url-regex": { + "version": "3.2.0", + "resolved": "http://registry.npm.taobao.org/url-regex/download/url-regex-3.2.0.tgz", + "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", + "dev": true, + "optional": true, + "requires": { + "ip-regex": "1.0.3" + } + }, + "user-home": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/user-home/download/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "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 + }, + "uuid": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/uuid/download/uuid-3.1.0.tgz", + "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=", + "dev": true, + "optional": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/v8flags/download/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "1.1.1" + } + }, + "vali-date": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/vali-date/download/vali-date-1.0.0.tgz", + "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "validator": { + "version": "7.2.0", + "resolved": "http://registry.npm.taobao.org/validator/download/validator-7.2.0.tgz", + "integrity": "sha1-pj3Lq6UdQ1C/jfIJiODVpU1xF5E=", + "dev": true + }, + "vinyl": { + "version": "0.5.3", + "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-assign": { + "version": "1.2.1", + "resolved": "http://registry.npm.taobao.org/vinyl-assign/download/vinyl-assign-1.2.1.tgz", + "integrity": "sha1-TRmIkbVRWRHXcajNnFSApGoHSkU=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "readable-stream": "2.3.3" + } + }, + "vinyl-file": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/vinyl-file/download/vinyl-file-3.0.0.tgz", + "integrity": "sha1-sQTZ5ECf+jJfqt1SBkLQo7SIs2U=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "strip-bom-buf": "1.0.0", + "strip-bom-stream": "2.0.0", + "vinyl": "2.1.0" + }, + "dependencies": { + "clone": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/clone/download/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "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 + }, + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/first-chunk-stream/download/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "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 + }, + "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-bom-stream": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/strip-bom-stream/download/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "dev": true, + "requires": { + "first-chunk-stream": "2.0.0", + "strip-bom": "2.0.0" + } + }, + "vinyl": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", + "dev": true, + "requires": { + "clone": "2.1.1", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.0.0", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" + } + } + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "http://registry.npm.taobao.org/vinyl-fs/download/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "dev": true, + "requires": { + "defaults": "1.0.3", + "glob-stream": "3.1.18", + "glob-watcher": "0.0.6", + "graceful-fs": "3.0.11", + "mkdirp": "0.5.1", + "strip-bom": "1.0.0", + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/clone/download/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "dev": true, + "requires": { + "natives": "1.1.1" + } + }, + "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 + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "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 + }, + "through2": { + "version": "0.6.5", + "resolved": "http://registry.npm.taobao.org/through2/download/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "ware": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/ware/download/ware-1.3.0.tgz", + "integrity": "sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q=", + "dev": true, + "requires": { + "wrap-fn": "0.1.5" + } + }, + "whet.extend": { + "version": "0.9.9", + "resolved": "http://registry.npm.taobao.org/whet.extend/download/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "dev": true, + "optional": true + }, + "which": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/which/download/which-1.3.0.tgz", + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrap-fn": { + "version": "0.1.5", + "resolved": "http://registry.npm.taobao.org/wrap-fn/download/wrap-fn-0.1.5.tgz", + "integrity": "sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU=", + "dev": true, + "requires": { + "co": "3.1.0" + }, + "dependencies": { + "co": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/co/download/co-3.1.0.tgz", + "integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "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" + } + }, + "xml-char-classes": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/xml-char-classes/download/xml-char-classes-1.0.0.tgz", + "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "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": "3.10.0", + "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + }, + "yauzl": { + "version": "2.9.1", + "resolved": "http://registry.npm.taobao.org/yauzl/download/yauzl-2.9.1.tgz", + "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.13", + "fd-slicer": "1.0.1" + } + } + } +} diff --git a/HotUpdateDemo/package.json b/HotUpdateDemo/package.json new file mode 100644 index 0000000..eb1ee22 --- /dev/null +++ b/HotUpdateDemo/package.json @@ -0,0 +1,30 @@ +{ + "name": "JiangShiTest", + "version": "1.0.0", + "description": "The sample of Cocos Creator for build & optimize & deploy,", + "main": "loading/index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git@git.quickcan.com:gamedev/chalk.git" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "eslint": "^4.3.0", + "gulp": "^3.9.1", + "gulp-file-inline": "^1.3.7", + "gulp-htmlmin": "^3.0.0", + "gulp-imagemin": "^3.3.0", + "gulp-replace": "^0.6.1", + "gulp-rev": "^8.0.0", + "gulp-rev-collector": "^1.2.2", + "del": "^3.0.0", + "gulp-javascript-obfuscator": "^1.1.3" + }, + "dependencies": { + "fs-jetpack": "^2.2.2" + } +} diff --git a/HotUpdateDemo/tools/version_generator.bat b/HotUpdateDemo/tools/version_generator.bat new file mode 100644 index 0000000..7fe224c --- /dev/null +++ b/HotUpdateDemo/tools/version_generator.bat @@ -0,0 +1,2 @@ +node version_generator.js -v 1.0.0 -u http://localhost/hotUpdate/ -s ../build/jsb-link/ -d ../assets/ +pause diff --git a/HotUpdateDemo/version_generator.js b/HotUpdateDemo/tools/version_generator.js similarity index 70% rename from HotUpdateDemo/version_generator.js rename to HotUpdateDemo/tools/version_generator.js index 144b715..3277eef 100644 --- a/HotUpdateDemo/version_generator.js +++ b/HotUpdateDemo/tools/version_generator.js @@ -1,6 +1,7 @@ var fs = require('fs'); var path = require('path'); var crypto = require('crypto'); +const jetpack = require('fs-jetpack'); var manifest = { packageUrl: 'http://localhost/tutorial-hot-update/remote-assets/', @@ -14,6 +15,7 @@ var manifest = { var dest = './remote-assets/'; var src = './jsb/'; var hotDir = null; +var packageRes = null; // Parse arguments var i = 2; while (i < process.argv.length) { @@ -31,20 +33,16 @@ while (i < process.argv.length) { case '--version': case '-v': manifest.version = process.argv[i + 1]; - var versionPath = "./config.json"; - var data = fs.readFileSync(versionPath); - let param = JSON.parse(data.toString()); - if (param) { - manifest.version = param.game_version; - }; console.log('version=', manifest.version); i += 2; break; case '--src': case '-s': src = process.argv[i + 1]; - hotDir = src + 'hotUpdate'; + hotDir = path.join(src, 'hotUpdate'); console.log('hotDir=', hotDir); + packageRes = path.join(src, 'res'); + console.log('hpackageRes', packageRes); i += 2; break; case '--dest': @@ -60,10 +58,12 @@ while (i < process.argv.length) { /** * 读取文件到obj中 + * 过滤渠道json * @param {*} dir * @param {*} obj */ function readDir(dir, obj) { + console.log('readDir = ', dir); var stat = fs.statSync(dir); if (!stat.isDirectory()) { return; @@ -74,6 +74,10 @@ function readDir(dir, obj) { if (subpaths[i][0] === '.') { continue; } + if (subpaths[i] == 'channel.json') { + console.log('---------------channel.json-------------------'); + continue; + } subpath = path.join(dir, subpaths[i]); stat = fs.statSync(subpath); if (stat.isDirectory()) { @@ -81,9 +85,9 @@ function readDir(dir, obj) { } else if (stat.isFile()) { // Size in Bytes size = stat['size']; - console.log('md5 ',subpath); + console.log('md5 ', subpath); // md5 = crypto.createHash('md5').update(fs.readFileSync(subpath, 'binary')).digest('hex');//返回的并非二进制类型,而是String。这会导致非文本文件md5计算错误 - md5 = crypto.createHash('md5').update(fs.readFileSync(subpath)).digest('hex');// + md5 = crypto.createHash('md5').update(fs.readFileSync(subpath)).digest('hex'); // compressed = path.extname(subpath).toLowerCase() === '.zip'; relative = path.relative(src, subpath); @@ -117,79 +121,59 @@ var destManifest = path.join(dest, 'project.manifest'); var destVersion = path.join(dest, 'version.manifest'); var hotManifest = path.join(hotDir, 'project.manifest'); var hotVersion = path.join(hotDir, 'version.manifest'); - +var tmp = path.join(packageRes, 'raw-assets'); +var packageMenifest = path.join(tmp, 'project.manifest'); +console.log('packageMenifest', packageMenifest); mkdirSync(dest); //生成热更新目录 mkdirSync(hotDir); //生成文件manifest到assets -fs.writeFile(destManifest, JSON.stringify(manifest), (err) => { - if (err) throw err; +let isfailed = fs.writeFileSync(destManifest, JSON.stringify(manifest)); +if (!isfailed) { console.log('Manifest successfully generated'); -}); +} //生成文件manifest到hotUpdate -fs.writeFile(hotManifest, JSON.stringify(manifest), (err) => { - if (err) throw err; +isfailed = fs.writeFileSync(hotManifest, JSON.stringify(manifest)); +if (!isfailed) { console.log('hotManifest successfully generated'); -}); +} +//把生成的maifest 同步到build\jsb-xxx\res\raw-assets 而不需要再次构建重新生成 +// fs.writeFile(packageMenifest, JSON.stringify(manifest), (err) => { +// if (err) throw err; +// console.log('packageMenifest successfully generated'); +// }); delete manifest.assets; delete manifest.searchPaths; //生成版本manifest到assets -fs.writeFile(destVersion, JSON.stringify(manifest), (err) => { - if (err) throw err; +isfailed = fs.writeFileSync(destVersion, JSON.stringify(manifest)); +if (!isfailed) { console.log('Version successfully generated'); -}); +} //生成版本manifest到hotUpdate -fs.writeFile(hotVersion, JSON.stringify(manifest), (err) => { - if (err) throw err; +isfailed = fs.writeFileSync(hotVersion, JSON.stringify(manifest)); +if (isfailed) { console.log('hotVersion successfully generated'); -}); - +} /* * 复制目录、子目录,及其中的文件 * @param src {String} 要复制的目录 * @param dist {String} 复制到目标目录 */ -function copyDir(src, dist, callback) { - - fs.access(dist, function (err) { - if (err) { - // 目录不存在时创建目录 - fs.mkdirSync(dist); - } - _copy(null, src, dist); - }); - - function _copy(err, src, dist) { - if (err) { - callback(err); - } else { - fs.readdir(src, function (err, paths) { - if (err) { - callback(err); - } else { - paths.forEach(function (path) { - var _src = src + '/' + path; - var _dist = dist + '/' + path; - fs.stat(_src, function (err, stat) { - if (err) { - callback(err); - } else { - // 判断是文件还是目录 - if (stat.isFile()) { - fs.writeFileSync(_dist, fs.readFileSync(_src)); - } else if (stat.isDirectory()) { - // 当是目录是,递归复制 - copyDir(_src, _dist, callback); - } - } - }); - }); - } +function copyDirSync(path, dest) { + let flist = jetpack.list(path) + for (let i = 0; i < flist.length; i++) { + let absolutePath = `${path}/${flist[i]}` + if (jetpack.exists(absolutePath) == "file") { // 是文件则复制 + jetpack.copy(absolutePath, `${dest}/${flist[i]}`, { + overwrite: true }); } + if (jetpack.exists(absolutePath) == "dir") { // 是目录则递归 + copyDirSync(absolutePath, `${dest}/${flist[i]}`) + } } } @@ -249,25 +233,26 @@ const distResPath = path.join(hotDir, 'res'); //复制src目录前,先删除原有目录 rmdirSync(distSrcPath, (err) => { - console.log('err=', err); + err && console.log('err=', err); console.log('delete success'); }); + //复制res目录前,先删除原有目录 rmdirSync(distResPath, (err) => { - console.log('err=', err); + err && console.log('err=', err); console.log('delete success'); }); //复制src目录 -copyDir(srcPath, distSrcPath, function (err) { - if (err) { - console.log(err); - } -}); +copyDirSync(srcPath, distSrcPath); +console.log('copy finish ', srcPath); //复制res目录 -copyDir(resPath, distResPath, function (err) { - if (err) { - console.log(err); - } -}); \ No newline at end of file +copyDirSync(resPath, distResPath); +console.log('copy finish ', resPath); + +//把生成的maifest 同步到build\jsb-xxx\res\raw-assets 而不需要再次构建重新生成 +fs.writeFileSync(packageMenifest, fs.readFileSync(hotManifest)); +console.log(`copy hotupdate to ${packageMenifest} successful`); + +console.log('build hotupdte finish'); \ No newline at end of file diff --git a/HotUpdateDemo/version_generator.bat b/HotUpdateDemo/version_generator.bat deleted file mode 100644 index f22023c..0000000 --- a/HotUpdateDemo/version_generator.bat +++ /dev/null @@ -1,2 +0,0 @@ -node version_generator.js -v 4.0.1 -u http://192.168.0.124/remote-assets/ -s build/jsb-binary/ -d assets/ -pause