├── .gitignore ├── LICENSE ├── README.md ├── global.js ├── index.js ├── package.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # nyc test coverage 18 | .nyc_output 19 | 20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 21 | .grunt 22 | 23 | # node-waf configuration 24 | .lock-wscript 25 | 26 | # Compiled binary addons (http://nodejs.org/api/addons.html) 27 | build/Release 28 | 29 | # Dependency directories 30 | node_modules 31 | jspm_packages 32 | 33 | # Optional npm cache directory 34 | .npm 35 | 36 | # Optional REPL history 37 | .node_repl_history 38 | 39 | .vscode 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 CaoJun 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # gulp-wxa-copy-npm 2 | 微信小程序gulp插件,解决npm包管理和babel-runtime。可以使用诸如ES7,moment等。 3 | 4 | 在package.json加入"babel-plugin-transform-runtime",在babel配置的plugins加入"transform-runtime"。这样就可以直接使用Promise,Map,Symbol等。 5 | 6 | 如果想要使用async await,甚至是Decorator,具体只要参考babel配置就可以了。 7 | 8 | ## Usage 9 | In gulpfile.js 10 | ```javascript 11 | const gulp = require("gulp"); 12 | const babel = require("gulp-babel"); 13 | const gwcn = require('gulp-wxa-copy-npm'); 14 | const sourcemaps = require('gulp-sourcemaps'); 15 | 16 | gulp.task('babel', () => 17 | let knownOptions = {}; 18 | 19 | let options = minimist(process.argv.slice(2), knownOptions); 20 | //config.babel 21 | gulp.src('src/**/*.js') 22 | .pipe(sourcemaps.init()) 23 | .pipe(log('Babeling')) 24 | .pipe(babel({ 25 | "presets": [ 26 | "es2015", 27 | "stage-0" 28 | ], 29 | "plugins": [ 30 | "transform-export-extensions", 31 | "syntax-export-extensions", 32 | "transform-runtime" 33 | ] 34 | })) 35 | .pipe(gwcn(options)) 36 | .pipe(sourcemaps.write('.')) 37 | .pipe(gulp.dest(config.dest)); 38 | ); 39 | 40 | ``` 41 | 42 | 在代码中: 43 | ```javascript 44 | const moment = require('moment'); //NPM 45 | const util = require('./util'); 46 | ``` 47 | ```javascript 48 | import moment from 'moment' //NPM 49 | 50 | import config from './config' 51 | import {fetch} from '../common' 52 | ``` 53 | 54 | 注意项目中的代码一定要使用```require('./util')```或```require('../common/page')```这种形式。 55 | 56 | ## Installation 57 | ```shell 58 | $ npm install gulp-wxa-copy-npm --save-dev 59 | ``` 60 | 61 | ## Why 62 | 首先感谢[labrador](https://github.com/maichong/labrador)和[wepy](https://github.com/wepyjs/wepy)参考了其中一些代码。这2个库很优秀!但是限制了我们。我们可以自己建gulpfile来使用stylus,imagemin等。可是最大的诉求是想用NPM包管理和ES7,没有这样的一个gulp插件。所以我就做了一个。 63 | 64 | 65 | 但是自由是有代价的,很多东西你需要自己写。 66 | 67 | ## Directory 68 | ``` 69 | |- dist 70 | |- src 71 | |- gulpfile.js 72 | \- package.json 73 | ``` 74 | 75 | ## Options 76 | - ```gwcn-src```默认是```'src'```。表示的是:源目录夹名。 77 | - ```gwcn-dest```默认是```'dist'```。表示的是:输出目录夹名。 78 | - ```node_modules```默认是```'../node_modules'```。表示的是:源目录和node_modules相对路径。 79 | - ```gwcn-log```默认是```false```。表示的是:是否输出log。 80 | - ```plugins```。数组。 81 | 82 | ## Plugin Example 83 | ```javascript 84 | const guglify = through.obj(function(file, enc, callback) { 85 | let code = file._contents.toString(enc); 86 | let result = uglify.minify(code, { 87 | fromString: true 88 | }); 89 | file._contents = new Buffer(result.code); 90 | callback(null, file); 91 | }); 92 | 93 | const task_babel_release = function() { 94 | let knownOptions = {}; 95 | 96 | let options = minimist(process.argv.slice(2), knownOptions); 97 | options.plugins = [(code, destPath, {file, enc, callback}) => uglify.minify(code, { 98 | fromString: true 99 | }).code]; 100 | 101 | //{file, enc, callback} 和through的保持一致 102 | 103 | return gulp.src(config.js) 104 | .pipe(log('Babeling')) 105 | .pipe(babel(config.babel)) 106 | .pipe(guglify) 107 | .pipe(gwcn(options)) 108 | .pipe(gulp.dest(config.dest)); 109 | }; 110 | 111 | ``` 112 | 113 | ## Issues 114 | 目前版本还是0.1.3,没有经过充分测试。欢迎大家提bug和pull request! 115 | -------------------------------------------------------------------------------- /global.js: -------------------------------------------------------------------------------- 1 | const g = { 2 | Array: Array, 3 | Date: Date, 4 | Error: Error, 5 | Function: Function, 6 | Math: Math, 7 | Object: Object, 8 | RegExp: RegExp, 9 | String: String, 10 | TypeError: TypeError, 11 | setTimeout: setTimeout, 12 | clearTimeout: clearTimeout, 13 | setInterval: setInterval, 14 | clearInterval: clearInterval, 15 | }; 16 | 17 | /* eslint no-useless-concat:0 */ 18 | // 将关键字拆分,避免递归require自身 19 | module.exports = g['w' + 'indow'] = g['g' + 'lobal'] = g['s' + 'elf'] = g; 20 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const gutil = require("gulp-util"); 2 | const path = require('path'); 3 | const through = require("through2"); 4 | const fs = require('fs'); 5 | const fse = require('fs-extra'); 6 | const chalk = require("chalk"); 7 | const requireReg = /require\(['"]([\w\d_\-\.\/]+)['"]\)/ig; 8 | const dest_node_modules_dir_name = 'gwcn-modules'; 9 | 10 | let config = { 11 | 'gwcn-src': 'src', 12 | 'gwcn-dest': 'dist', 13 | 'gwcn-node_modules': '../node_modules', 14 | 'gwcn-log': false 15 | }; 16 | 17 | const gwcn = { 18 | cache: { 19 | 20 | }, 21 | gulp: { 22 | 23 | }, 24 | srcToDest: function(source) { 25 | let temp = source.replace(this.currentDir, ''); 26 | temp = temp.replace(config['gwcn-src'], config['gwcn-dest']); 27 | return path.join(this.currentDir, temp); 28 | }, 29 | destToSrc: function(source) { 30 | let temp = source.replace(this.currentDir, ''); 31 | temp = temp.replace(config['gwcn-dest'], config['gwcn-src']); 32 | return path.join(this.currentDir, temp); 33 | }, 34 | isFile(p) { 35 | p = (typeof(p) === 'object') ? path.join(p.dir, p.base) : p; 36 | if (!fs.existsSync(p)) { 37 | return false; 38 | } 39 | return fs.statSync(p).isFile(); 40 | }, 41 | isDir(p) { 42 | if (!fs.existsSync(p)) { 43 | return false; 44 | } 45 | return fs.statSync(p).isDirectory(); 46 | }, 47 | 48 | currentDir: process.cwd(), 49 | destDir: function() { 50 | return path.join(this.currentDir, config['gwcn-dest']); 51 | }, 52 | srcDir: function() { 53 | return path.join(this.currentDir, config['gwcn-src']); 54 | }, 55 | dest_node_modules_dir: function() { 56 | return path.join(this.destDir(), dest_node_modules_dir_name); 57 | }, 58 | src_node_modules_dir: function() { 59 | return path.join(this.srcDir(), config['gwcn-node_modules']); 60 | }, 61 | 62 | fixGlobalAndWindow: function(code) { 63 | if (/global|window/.test(code)) { 64 | code = "var global=window=require('gulp-wxa-copy-npm/global');" + code; 65 | } 66 | return code; 67 | }, 68 | 69 | fixNPM: function(code) { 70 | code = code.replace(/([\w\[\]a-d\.]+)\s*instanceof Function/g, function(matchs, word) { 71 | return ' typeof ' + word + " ==='function' "; 72 | }); 73 | code = code.replace(/'use strict';\n?/g, ''); 74 | 75 | if (/[^\w_]process\.\w/.test(code) && !/typeof process/.test(code)) { 76 | code = `var process={};${code}`; 77 | } 78 | return code; 79 | }, 80 | 81 | npmHack(filename, code) { 82 | switch (filename) { 83 | case 'lodash.js': 84 | case '_global.js': 85 | code = code.replace('Function(\'return this\')()', 'this'); 86 | break; 87 | case '_html.js': 88 | code = 'module.exports = false;'; 89 | break; 90 | case '_microtask.js': 91 | code = code.replace('if(Observer)', 'if(false && Observer)'); 92 | // IOS 1.10.2 Promise BUG 93 | code = code.replace('Promise && Promise.resolve', 'false && Promise && Promise.resolve'); 94 | break; 95 | } 96 | return code; 97 | }, 98 | copyNPMDeps: function(code, destPath, currentNodeSrcDir, isNPM) { 99 | let err = null; 100 | let dest_node_modules_dir = this.dest_node_modules_dir(); 101 | let destDir = path.parse(destPath).dir; 102 | let libs = []; 103 | let matchs = []; 104 | code = this.fixGlobalAndWindow(code); 105 | 106 | code.replace(requireReg, (match, lib) => { 107 | libs.push(lib); 108 | matchs.push(match); 109 | }); 110 | 111 | for (let i = 0; i < libs.length; i++) { 112 | let lib = libs[i]; 113 | let match = matchs[i]; 114 | if (err) { 115 | break; 116 | } 117 | let ext = ''; 118 | 119 | let resolved = lib; 120 | 121 | let dep; 122 | 123 | let relative = ''; 124 | 125 | if (lib[0] === '.') { // require('./something''); 126 | if (!isNPM) { 127 | continue; 128 | } 129 | ext = '.js'; 130 | dep = path.join(currentNodeSrcDir, lib); 131 | relative = ''; 132 | } else if (lib.indexOf('/') === -1 || lib.indexOf('/') === lib.length - 1) { // require('asset'); 133 | let pkg = this.getPkgConfig(lib, this.gulp.enc); 134 | if (!pkg) { 135 | err = new gutil.PluginError('gulp-wxa-copy-npm', 'Package not found:' + lib); 136 | break; 137 | } 138 | ext = pkg.main || 'index.js'; 139 | if (pkg.browser && typeof pkg.browser === 'string') { 140 | ext = pkg.browser; 141 | } 142 | if (ext.indexOf('./') == 0) { 143 | ext = ext.replace('./', ''); 144 | } 145 | ext = path.sep + ext; 146 | dep = path.join(this.src_node_modules_dir(), lib); 147 | relative = path.relative(destDir, dest_node_modules_dir); 148 | } else { // require('babel-runtime/regenerator') 149 | dep = path.join(this.src_node_modules_dir(), lib); 150 | if (this.isDir(dep) && this.isFile(dep + path.sep + 'index.js')) { 151 | ext = path.sep + 'index.js'; 152 | } else if (this.isFile(dep + '.js')) { 153 | ext = '.js'; 154 | } else if (this.isFile(dep)) { 155 | ext = ''; 156 | } else { 157 | err = new gutil.PluginError('gulp-wxa-copy-npm', 'File not found:' + dep); 158 | break; 159 | } 160 | relative = path.relative(destDir, dest_node_modules_dir); 161 | } 162 | resolved = path.join(relative, lib + ext); 163 | 164 | if (lib != resolved) { 165 | config['gwcn-log'] && gutil.log(`Replace file: ${destDir} depences: from(${chalk.cyan(lib)}) to(${chalk.cyan(resolved)})`); 166 | } 167 | 168 | let npmPathString = dep.endsWith(ext) ? dep : dep + ext; 169 | let npmPath = path.parse(npmPathString); 170 | 171 | let outPath = path.join(this.currentDir, config['gwcn-dest'], dest_node_modules_dir_name, npmPathString.replace(this.src_node_modules_dir(), '')); 172 | config['gwcn-log'] && gutil.log(`Copy npm depences: from(${chalk.cyan(npmPathString)}) to(${chalk.cyan(outPath)}) ...`); 173 | 174 | 175 | resolved = resolved.replace(new RegExp('\\' + path.sep, 'g'), '/'); //Fix #1 176 | code = code.replace(match, `require('${resolved}')`); 177 | 178 | if (this.cache[outPath]) { 179 | continue; 180 | } 181 | 182 | let depCode = fs.readFileSync(npmPathString, { 183 | encoding: this.gulp.enc 184 | }); 185 | 186 | err = this.copyNPMDeps(depCode, outPath, npmPath.dir, true).err; 187 | } 188 | 189 | if (isNPM && !this.cache[destPath] && !err) { 190 | code = this.npmHack(path.parse(destPath).base, code); 191 | code = this.fixNPM(code); 192 | code = this.doPlugins(code, destPath); 193 | fse.outputFileSync(destPath, code, { 194 | encoding: this.gulp.enc 195 | }); 196 | this.cache[destPath] = true; 197 | } 198 | 199 | return { 200 | code: code, 201 | err: err 202 | }; 203 | }, 204 | getPkgConfig(lib, enc) { 205 | let pkg = fs.readFileSync(path.join(this.src_node_modules_dir(), lib, 'package.json'), enc); 206 | try { 207 | pkg = JSON.parse(pkg); 208 | } catch (e) { 209 | pkg = null; 210 | } 211 | return pkg; 212 | }, 213 | doPlugins: function(depCode, destPath) { 214 | let result = depCode; 215 | let plugins = config.plugins; 216 | if (config.plugins) { 217 | for (let i = 0; i < plugins.length; i++) { 218 | let plugin = plugins[i]; 219 | result = plugin(result, destPath, gwcn.gulp); 220 | } 221 | } 222 | return result; 223 | } 224 | } 225 | 226 | module.exports = function(options) { 227 | 228 | config = Object.assign(config, options); 229 | return through.obj(function(file, enc, callback) { 230 | gwcn.gulp.file = file; 231 | gwcn.gulp.enc = enc; 232 | gwcn.gulp.callback = callback; 233 | gwcn.cache = {}; 234 | let sourceCode = file._contents.toString(enc); 235 | let { 236 | err, 237 | code 238 | } = gwcn.copyNPMDeps(sourceCode, gwcn.srcToDest(file.path), gwcn.src_node_modules_dir(), false); 239 | // let transformCode = gwcn.replaceNPMDeps(sourceCode, gwcn.srcToDest(file.path)) 240 | file._contents = new Buffer(code); 241 | // err maybe null 242 | callback(err, file); 243 | }); 244 | } 245 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gulp-wxa-copy-npm", 3 | "version": "0.1.4", 4 | "description": "微信小程序gulp插件,解决npm包管理和babel-runtime", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/mdsb100/gulp-wxa-copy-npm.git" 12 | }, 13 | "keywords": [ 14 | "wechat-app", 15 | "little-app", 16 | "微信小程序" 17 | ], 18 | "author": "曹俊", 19 | "license": "MIT", 20 | "bugs": { 21 | "url": "https://github.com/mdsb100/gulp-wxa-copy-npm/issues" 22 | }, 23 | "homepage": "https://github.com/mdsb100/gulp-wxa-copy-npm#readme", 24 | "dependencies": { 25 | "chalk": "^1.1.3", 26 | "fs-extra": "^2.0.0", 27 | "gulp-util": "^3.0.8", 28 | "through2": "^2.0.3" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | ansi-regex@^2.0.0: 6 | version "2.1.1" 7 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 8 | 9 | ansi-styles@^2.2.1: 10 | version "2.2.1" 11 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 12 | 13 | array-differ@^1.0.0: 14 | version "1.0.0" 15 | resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" 16 | 17 | array-uniq@^1.0.2: 18 | version "1.0.3" 19 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 20 | 21 | beeper@^1.0.0: 22 | version "1.1.1" 23 | resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" 24 | 25 | buffer-shims@^1.0.0: 26 | version "1.0.0" 27 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 28 | 29 | chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: 30 | version "1.1.3" 31 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 32 | dependencies: 33 | ansi-styles "^2.2.1" 34 | escape-string-regexp "^1.0.2" 35 | has-ansi "^2.0.0" 36 | strip-ansi "^3.0.0" 37 | supports-color "^2.0.0" 38 | 39 | clone-stats@^0.0.1: 40 | version "0.0.1" 41 | resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" 42 | 43 | clone@^1.0.0: 44 | version "1.0.2" 45 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" 46 | 47 | core-util-is@~1.0.0: 48 | version "1.0.2" 49 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 50 | 51 | dateformat@^2.0.0: 52 | version "2.0.0" 53 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" 54 | 55 | duplexer2@0.0.2: 56 | version "0.0.2" 57 | resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" 58 | dependencies: 59 | readable-stream "~1.1.9" 60 | 61 | escape-string-regexp@^1.0.2: 62 | version "1.0.5" 63 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 64 | 65 | fancy-log@^1.1.0: 66 | version "1.3.0" 67 | resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" 68 | dependencies: 69 | chalk "^1.1.1" 70 | time-stamp "^1.0.0" 71 | 72 | fs-extra@^2.0.0: 73 | version "2.0.0" 74 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.0.0.tgz#337352bded4a0b714f3eb84de8cea765e9d37600" 75 | dependencies: 76 | graceful-fs "^4.1.2" 77 | jsonfile "^2.1.0" 78 | 79 | glogg@^1.0.0: 80 | version "1.0.0" 81 | resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" 82 | dependencies: 83 | sparkles "^1.0.0" 84 | 85 | graceful-fs@^4.1.2, graceful-fs@^4.1.6: 86 | version "4.1.11" 87 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 88 | 89 | gulp-util@^3.0.8: 90 | version "3.0.8" 91 | resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" 92 | dependencies: 93 | array-differ "^1.0.0" 94 | array-uniq "^1.0.2" 95 | beeper "^1.0.0" 96 | chalk "^1.0.0" 97 | dateformat "^2.0.0" 98 | fancy-log "^1.1.0" 99 | gulplog "^1.0.0" 100 | has-gulplog "^0.1.0" 101 | lodash._reescape "^3.0.0" 102 | lodash._reevaluate "^3.0.0" 103 | lodash._reinterpolate "^3.0.0" 104 | lodash.template "^3.0.0" 105 | minimist "^1.1.0" 106 | multipipe "^0.1.2" 107 | object-assign "^3.0.0" 108 | replace-ext "0.0.1" 109 | through2 "^2.0.0" 110 | vinyl "^0.5.0" 111 | 112 | gulplog@^1.0.0: 113 | version "1.0.0" 114 | resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" 115 | dependencies: 116 | glogg "^1.0.0" 117 | 118 | has-ansi@^2.0.0: 119 | version "2.0.0" 120 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 121 | dependencies: 122 | ansi-regex "^2.0.0" 123 | 124 | has-gulplog@^0.1.0: 125 | version "0.1.0" 126 | resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" 127 | dependencies: 128 | sparkles "^1.0.0" 129 | 130 | inherits@~2.0.1: 131 | version "2.0.3" 132 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 133 | 134 | isarray@0.0.1: 135 | version "0.0.1" 136 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 137 | 138 | isarray@~1.0.0: 139 | version "1.0.0" 140 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 141 | 142 | jsonfile@^2.1.0: 143 | version "2.4.0" 144 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" 145 | optionalDependencies: 146 | graceful-fs "^4.1.6" 147 | 148 | lodash._basecopy@^3.0.0: 149 | version "3.0.1" 150 | resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" 151 | 152 | lodash._basetostring@^3.0.0: 153 | version "3.0.1" 154 | resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" 155 | 156 | lodash._basevalues@^3.0.0: 157 | version "3.0.0" 158 | resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" 159 | 160 | lodash._getnative@^3.0.0: 161 | version "3.9.1" 162 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 163 | 164 | lodash._isiterateecall@^3.0.0: 165 | version "3.0.9" 166 | resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" 167 | 168 | lodash._reescape@^3.0.0: 169 | version "3.0.0" 170 | resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" 171 | 172 | lodash._reevaluate@^3.0.0: 173 | version "3.0.0" 174 | resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" 175 | 176 | lodash._reinterpolate@^3.0.0: 177 | version "3.0.0" 178 | resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" 179 | 180 | lodash._root@^3.0.0: 181 | version "3.0.1" 182 | resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" 183 | 184 | lodash.escape@^3.0.0: 185 | version "3.2.0" 186 | resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" 187 | dependencies: 188 | lodash._root "^3.0.0" 189 | 190 | lodash.isarguments@^3.0.0: 191 | version "3.1.0" 192 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 193 | 194 | lodash.isarray@^3.0.0: 195 | version "3.0.4" 196 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 197 | 198 | lodash.keys@^3.0.0: 199 | version "3.1.2" 200 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 201 | dependencies: 202 | lodash._getnative "^3.0.0" 203 | lodash.isarguments "^3.0.0" 204 | lodash.isarray "^3.0.0" 205 | 206 | lodash.restparam@^3.0.0: 207 | version "3.6.1" 208 | resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" 209 | 210 | lodash.template@^3.0.0: 211 | version "3.6.2" 212 | resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" 213 | dependencies: 214 | lodash._basecopy "^3.0.0" 215 | lodash._basetostring "^3.0.0" 216 | lodash._basevalues "^3.0.0" 217 | lodash._isiterateecall "^3.0.0" 218 | lodash._reinterpolate "^3.0.0" 219 | lodash.escape "^3.0.0" 220 | lodash.keys "^3.0.0" 221 | lodash.restparam "^3.0.0" 222 | lodash.templatesettings "^3.0.0" 223 | 224 | lodash.templatesettings@^3.0.0: 225 | version "3.1.1" 226 | resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" 227 | dependencies: 228 | lodash._reinterpolate "^3.0.0" 229 | lodash.escape "^3.0.0" 230 | 231 | minimist@^1.1.0: 232 | version "1.2.0" 233 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 234 | 235 | multipipe@^0.1.2: 236 | version "0.1.2" 237 | resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" 238 | dependencies: 239 | duplexer2 "0.0.2" 240 | 241 | object-assign@^3.0.0: 242 | version "3.0.0" 243 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" 244 | 245 | process-nextick-args@~1.0.6: 246 | version "1.0.7" 247 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 248 | 249 | readable-stream@^2.1.5: 250 | version "2.2.3" 251 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.3.tgz#9cf49463985df016c8ae8813097a9293a9b33729" 252 | dependencies: 253 | buffer-shims "^1.0.0" 254 | core-util-is "~1.0.0" 255 | inherits "~2.0.1" 256 | isarray "~1.0.0" 257 | process-nextick-args "~1.0.6" 258 | string_decoder "~0.10.x" 259 | util-deprecate "~1.0.1" 260 | 261 | readable-stream@~1.1.9: 262 | version "1.1.14" 263 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" 264 | dependencies: 265 | core-util-is "~1.0.0" 266 | inherits "~2.0.1" 267 | isarray "0.0.1" 268 | string_decoder "~0.10.x" 269 | 270 | replace-ext@0.0.1: 271 | version "0.0.1" 272 | resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" 273 | 274 | sparkles@^1.0.0: 275 | version "1.0.0" 276 | resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" 277 | 278 | string_decoder@~0.10.x: 279 | version "0.10.31" 280 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 281 | 282 | strip-ansi@^3.0.0: 283 | version "3.0.1" 284 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 285 | dependencies: 286 | ansi-regex "^2.0.0" 287 | 288 | supports-color@^2.0.0: 289 | version "2.0.0" 290 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 291 | 292 | through2@^2.0.0, through2@^2.0.3: 293 | version "2.0.3" 294 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 295 | dependencies: 296 | readable-stream "^2.1.5" 297 | xtend "~4.0.1" 298 | 299 | time-stamp@^1.0.0: 300 | version "1.0.1" 301 | resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.0.1.tgz#9f4bd23559c9365966f3302dbba2b07c6b99b151" 302 | 303 | util-deprecate@~1.0.1: 304 | version "1.0.2" 305 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 306 | 307 | vinyl@^0.5.0: 308 | version "0.5.3" 309 | resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" 310 | dependencies: 311 | clone "^1.0.0" 312 | clone-stats "^0.0.1" 313 | replace-ext "0.0.1" 314 | 315 | xtend@~4.0.1: 316 | version "4.0.1" 317 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 318 | --------------------------------------------------------------------------------