diff --git a/gulpfile.js b/gulpfile.js index 148740c4958178863f7ec91b68504e888c1049fd..b0a61542ed19a092f6fb5f8bfc4c38055f33811e 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,13 +1,13 @@ 'use strict'; const gulp = require('gulp'), + debug = require('gulp-debug'), sass = require('gulp-sass'), cleanCss = require('gulp-clean-css'), base64 = require('gulp-base64-v2'), rename = require('gulp-rename'), ngConstant = require('gulp-ng-constant'), fs = require("fs"), - argv = require('yargs').argv, header = require('gulp-header'), footer = require('gulp-footer'), removeCode = require('gulp-remove-code'), @@ -19,6 +19,7 @@ const gulp = require('gulp'), zip = require('gulp-zip'), del = require('del'), useref = require('gulp-useref'), + hash_src = require("gulp-hash-src"), filter = require('gulp-filter'), uglify = require('gulp-uglify-es').default, csso = require('gulp-csso'), @@ -30,8 +31,8 @@ const gulp = require('gulp'), jshint = require('gulp-jshint'), markdown = require('gulp-markdown'), log = require('fancy-log'), - colors = require('ansi-colors'); - + colors = require('ansi-colors'), + argv = require('yargs').argv; const paths = { license_md: ['./www/license/*.md'], sass: ['./scss/ionic.app.scss'], @@ -350,8 +351,8 @@ function webCopyFiles() { //gulp.src('./www/feed*.json') // .pipe(gulp.dest(tmpPath)), - // Copy lib - gulp.src('./www/lib/**/*.*') + // Copy lib (JS, CSS and fonts) + gulp.src(['./www/lib/**/*.js', './www/lib/**/*.css', './www/lib/**/fonts/**/*.*']) .pipe(gulp.dest(tmpPath + '/lib')), // Copy license into HTML @@ -445,48 +446,68 @@ function webDebugFile() { } function webUglify() { - log(colors.green('Optimizing JS and CSS files...')); - - const wwwPath =Â './dist/web/www'; - const jsFilter = filter(["**/*.js", '!**/config.js'], { restore: true }); - const cssFilter = filter("**/*.css", { restore: true }); - const revFilesFilter = filter(['**/*', '!**/index.html', '!**/config.js'], { restore: true }); - const uglifyOptions = { - toplevel: true, - warnings: true, - compress: { - global_defs: { - "@console.log": "alert" + const wwwPath = './dist/web/www'; + const enableUglify = argv.release || argv.useref || argv.uglify || false; + if (enableUglify) { + + log(colors.green('Uglify JS and CSS files...')); + + const jsFilter = filter(["**/*.js", '!**/config.js'], {restore: true}); + const cssFilter = filter("**/*.css", {restore: true}); + const revFilesFilter = filter(['**/*', '!**/index.html', '!**/config.js'], { restore: true }); + const uglifyOptions = { + toplevel: true, + warnings: true, + compress: { + global_defs: { + "@console.log": "alert" + }, + passes: 2 }, - passes: 2 - }, - output: { - beautify: false, - preamble: "/* minified */", - max_line_len: 120000 - } - }; + output: { + beautify: false, + preamble: "/* minified */", + max_line_len: 120000 + } + }; + + // Process index.html + return gulp.src(wwwPath + '/index.html') + .pipe(useref()) // Concatenate with gulp-useref + + // Process JS + .pipe(jsFilter) + .pipe(uglify(uglifyOptions)) // Minify javascript files + .pipe(jsFilter.restore) + + // Process CSS + .pipe(cssFilter) + .pipe(csso()) // Minify any CSS sources + .pipe(cssFilter.restore) + + // Add revision to filename (but not index.html and config.js) + .pipe(revFilesFilter) + .pipe(rev()) // Rename the concatenated files + .pipe(revFilesFilter.restore) + + .pipe(revReplace()) // Substitute in new filenames + .pipe(gulp.dest(wwwPath)); + } +} - // Process index.html - return gulp.src(wwwPath + '/index.html') - .pipe(useref()) // Concatenate with gulp-useref +function webIntegrity() { + const wwwPath = './dist/web/www'; - // Process JS - .pipe(jsFilter) - .pipe(uglify(uglifyOptions)) // Minify javascript files - .pipe(jsFilter.restore) + log(colors.green('Add integrity hash to <script src> tag...')); - // Process CSS - .pipe(cssFilter) - .pipe(csso()) // Minify any CSS sources - .pipe(cssFilter.restore) + // Process index.html + return gulp.src(wwwPath + '/index.html') - // Add revision to filename (but not index.html and config.js) - .pipe(revFilesFilter) - .pipe(rev()) // Rename the concatenated files - .pipe(revFilesFilter.restore) + // Add an integrity hash + .pipe(hash_src({build_dir: wwwPath, src_path: wwwPath, hash: 'sha256', enc: 'base64'})) + .pipe(replace(/"config\.js\?cbh=[^"]+"/g, '"config.js"')) + .pipe(replace('.js?cbh=', '.js" integrity="sha256-')) - .pipe(revReplace()) // Substitute in new filenames .pipe(gulp.dest(wwwPath)); } @@ -509,56 +530,83 @@ function webApiDebugFile() { } function webApiUglify() { - log(colors.green('API: Optimizing JS and CSS files...')); const tmpPath = './dist/web/www'; - const jsFilter = filter(["**/*.js", '!**/config.js'], { restore: true }); - const cssFilter = filter("**/*.css", { restore: true }); - const revFilesFilter = filter(['**/*', '!**/index.html', '!**/config.js'], { restore: true }); - const indexFilter = filter('**/index.html', { restore: true }); - const uglifyOptions = { - toplevel: true, - warnings: true, - compress: { - global_defs: { - "@console.log": "alert" + const jsFilter = filter(["**/*.js", '!**/config.js'], {restore: true}); + const cssFilter = filter("**/*.css", {restore: true}); + const indexFilter = filter('**/index.html', {restore: true}); + + // Skip if not required + const enableUglify = argv.release || argv.useref || argv.uglify || false; + if (enableUglify) { + log(colors.green('API: Optimizing JS and CSS files...')); + const revFilesFilter = filter(['**/*', '!**/index.html', '!**/config.js'], {restore: true}); + const uglifyOptions = { + toplevel: true, + warnings: true, + compress: { + global_defs: { + "@console.log": "alert" + }, + passes: 2 }, - passes: 2 - }, - output: { - beautify: false, - preamble: "/* minified */", - max_line_len: 120000 - } - }; - - // Process api/index.html - return gulp.src(tmpPath + '/*/index.html') - .pipe(useref()) // Concatenate with gulp-useref - - // Process JS - .pipe(jsFilter) - .pipe(uglify(uglifyOptions)) // Minify any javascript sources - .pipe(jsFilter.restore) + output: { + beautify: false, + preamble: "/* minified */", + max_line_len: 120000 + } + }; + + // Process api/index.html + return gulp.src(tmpPath + '/*/index.html') + //.pipe(refHash()) // Generate hashed filenames for the build blocks + .pipe(useref()) // Concatenate with gulp-useref + + // Process JS + .pipe(jsFilter) + .pipe(uglify(uglifyOptions)) // Minify any javascript sources + .pipe(jsFilter.restore) + + // Process CSS + .pipe(cssFilter) + .pipe(csso()) // Minify any CSS sources + .pipe(cssFilter.restore) + + // Add revision to filename (but not index.html and config.js) + .pipe(revFilesFilter) + .pipe(rev()) // Rename the concatenated files + .pipe(revFilesFilter.restore) + + .pipe(revReplace()) // Substitute in new filenames + + .pipe(indexFilter) + .pipe(replace("dist_js", "../dist_js")) + .pipe(replace("dist_css", "../dist_css")) + .pipe(replace("config.js", "../config.js")) + .pipe(indexFilter.restore) + + .pipe(gulp.dest(tmpPath)); + } - // Process CSS - .pipe(cssFilter) - .pipe(csso()) // Minify any CSS sources - .pipe(cssFilter.restore) + else { + log(colors.red('API: Uglify JS and CSS files. Skip') + colors.grey(' (missing options --release or --uglify)')); - // Add revision to filename (but not index.html and config.js) - .pipe(revFilesFilter) - .pipe(rev()) // Rename the concatenated files - .pipe(revFilesFilter.restore) + return gulp.src(tmpPath + '/*/index.html') + //.pipe(refHash()) // Generate hashed filenames for the build blocks + .pipe(useref()) // Concatenate with gulp-useref - .pipe(revReplace()) // Substitute in new filenames + // Process CSS + .pipe(cssFilter) + .pipe(csso()) // Minify any CSS sources + .pipe(cssFilter.restore) - .pipe(indexFilter) - .pipe(replace("dist_js", "../dist_js")) - .pipe(replace("dist_css", "../dist_css")) - .pipe(replace("config.js", "../config.js")) - .pipe(indexFilter.restore) + .pipe(indexFilter) + .pipe(replace("dist_js", "../dist_js")) + .pipe(replace("dist_css", "../dist_css")) + .pipe(replace("config.js", "../config.js")) + .pipe(indexFilter.restore) - .pipe(gulp.dest(tmpPath)); + .pipe(gulp.dest(tmpPath)); + } } function webCleanUnusedFiles() { @@ -587,20 +635,28 @@ function webCleanUnusedDirectories() { // Clean dir const wwwPath = './dist/web/www'; - return del.sync([ - wwwPath + '/css', - wwwPath + '/templates', - wwwPath + '/js', - wwwPath + '/plugins', - wwwPath + '/dist', - wwwPath + '/lib/*', - '!' + wwwPath + '/lib/ionic', - '!' + wwwPath + '/lib/robotodraft', - wwwPath + '/lib/ionic/*', - '!' + wwwPath + '/lib/ionic/fonts', - wwwPath + '/lib/robotodraft/*', - '!' + wwwPath + '/lib/robotodraft/fonts' - ]); + const patterns = [ + wwwPath + '/css', + wwwPath + '/templates', + wwwPath + '/js', + wwwPath + '/plugins', + wwwPath + '/dist', + wwwPath + '/lib/*', + + // Keep IonIcons font + '!' + wwwPath + '/lib/ionic', + wwwPath + '/lib/ionic/*', + '!' + wwwPath + '/lib/ionic/fonts', + + // Keep RobotoDraft font + '!' + wwwPath + '/lib/robotodraft', + wwwPath + '/lib/robotodraft/*', + '!' + wwwPath + '/lib/robotodraft/fonts' + ] + + return gulp.src(patterns, {read: false}) + //.pipe(debug({title: 'deleting '})) + .pipe(clean()); } function webZip() { @@ -639,22 +695,8 @@ function webExtensionCopyFiles() { return gulp.src([ wwwPath + '/**/*', - // Remove API + // Skip API and debug.html '!' + wwwPath + '/api', - - // Remove JS debug files - wwwPath + '/dist_js/*.*', - '!' + wwwPath + '/dist_js/cesium.js', - '!' + wwwPath + '/dist_js/vendor.js', - '!' + wwwPath + '/dist_js/cesium-api*.js', - '!' + wwwPath + '/dist_js/vendor-api*.js', - - // Remove CSS debug files - wwwPath + '/dist_css/*.*', - '!' + wwwPath + '/dist_css/cesium.css', - '!' + wwwPath + '/dist_css/cesium-api*.css', - - // Remove HTML debug files wwwPath + '/api/*', '!' + wwwPath + '/api/debug.html', '!' + wwwPath + '/debug.html', @@ -662,8 +704,10 @@ function webExtensionCopyFiles() { // Remove unused files (feed.json) in extension '!' + wwwPath + '/feed*.json', - // Add specific resource (and overwrite the default 'manifest.json') + // Skip web manifest '!' + wwwPath + '/manifest.json', + + // Add specific resource (and overwrite the default 'manifest.json') resourcesPath + '/**/*.*' ]) @@ -742,7 +786,9 @@ gulp.task('webPluginNgAnnotate', ['webPluginNgTemplate'], webPluginNgAnnotate); gulp.task('webDebugFile', ['webPluginNgAnnotate'], webDebugFile); gulp.task('webUglify', ['webDebugFile'], webUglify); -gulp.task('webApiDebugFile', ['webUglify'], webApiDebugFile); +gulp.task('webIntegrity', ['webUglify'], webIntegrity); + +gulp.task('webApiDebugFile', ['webIntegrity'], webApiDebugFile); gulp.task('webApiUglify', ['webApiDebugFile'], webApiUglify); gulp.task('webCleanUnusedFiles', ['webApiUglify'], webCleanUnusedFiles); @@ -756,3 +802,19 @@ gulp.task('webExtensionZip', ['webExtensionCopyFiles'], webExtensionZip); gulp.task('webBuild', ['webZip', 'webExtensionZip'], webBuildSuccess); gulp.task('build:web', ['webBuild']); // = webBuild +gulp.task('webExtBuild', ['webExtensionZip']); + +gulp.task('help', function() { + log(colors.green("Usage: gulp {config|webBuild|webExtBuild} OPTIONS")); + log(colors.green("")); + log(colors.green("NAME")); + log(colors.green("")); + log(colors.green(" config --env <config_name> Configure Cesium. ")); + log(colors.green(" webBuild Build Cesium has a web ZIP")); + log(colors.green(" webExtBuild Build Cesium has a webExtension")); + log(colors.green("")); + log(colors.green("OPTIONS")); + //log(colors.green("")); + //log(colors.green(" --release Release build")); + //log(colors.green(" --useref Build with uglify and useref plugins")); +}) diff --git a/package.json b/package.json index e08b31269ddc78d3f13053bf11c4351b41c8a04d..01d339a42ef030331cbdfb3df19152e72b403ae5 100644 --- a/package.json +++ b/package.json @@ -69,13 +69,13 @@ "@bower_components/ng-idle": "HackedByChinese/ng-idle#^1.3.2", "@bower_components/ngCordova": "driftyco/ng-cordova#0.1.27-alpha", "@bower_components/numeral": "adamwdraper/Numeral-js#^1.5.6", + "@bower_components/qrcode-generator": "kazuhikoarase/qrcode-generator#js1.4.4", "@bower_components/robotodraft": "raibutera/robotodraft#1.1.0", "@bower_components/socket.io": "socketio/socket.io#^1.7.4", "@bower_components/socket.io-client": "socketio/socket.io-client#^1.7.4", "@bower_components/ui-leaflet": "angular-ui/ui-leaflet#^2.0.0", "@bower_components/underscore": "jashkenas/underscore#^1.8.3", "@bower_components/waves": "fians/Waves#0.6", - "@bower_components/qrcode-generator": "kazuhikoarase/qrcode-generator#js1.4.4", "cordova": "^9.0.0", "cordova-android": "^8.1.0", "cordova-clipboard": "^1.3.0", @@ -110,6 +110,8 @@ "gulp": "^3.9.1", "gulp-angular-templatecache": "^2.2.7", "gulp-angular-translate": "^0.1.4", + "gulp-debug": "^4.0.0", + "gulp-hash-src": "^0.1.6", "gulp-base64": "^0.1.3", "gulp-base64-v2": "^1.0.4", "gulp-bump": "^2.1.0", @@ -214,4 +216,4 @@ "engines": { "yarn": ">= 1.0.0" } -} \ No newline at end of file +} diff --git a/www/js/config.js b/www/js/config.js index 539e0ce973c6f43dc5ccd1263efee9aec36b2edd..1d39cee12e82827137416a8cea154e93985749b2 100644 --- a/www/js/config.js +++ b/www/js/config.js @@ -98,7 +98,7 @@ angular.module("cesium.config", []) } }, "version": "1.5.11", - "build": "2020-03-13T17:20:00.591Z", + "build": "2020-03-13T18:57:05.777Z", "newIssueUrl": "https://git.duniter.org/clients/cesium-grp/cesium/issues/new" }) diff --git a/yarn.lock b/yarn.lock index bba3018109fe6e938f094cac01fccb0b8650ee5f..a58e75a59d05be2f5f1d5dab7a6e57657308e85f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2363,6 +2363,19 @@ degenerator@^1.0.4: escodegen "1.x.x" esprima "3.x.x" +del@^2.1.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + del@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" @@ -3024,7 +3037,7 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fancy-log@^1.1.0: +fancy-log@^1.1.0, fancy-log@^1.3.2: version "1.3.3" resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== @@ -3345,6 +3358,13 @@ fs@0.0.2: resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.2.tgz#e1f244ef3933c1b2a64bd4799136060d0f5914f8" integrity sha1-4fJE7zkzwbKmS9R5kTYGDQ9ZFPg= +fs_helper@=0.1.11: + version "0.1.11" + resolved "https://registry.yarnpkg.com/fs_helper/-/fs_helper-0.1.11.tgz#c76f466c3af6f3f3bef0ee9b4093fd39369f8faa" + integrity sha1-x29GbDr28/O+8O6bQJP9OTafj6o= + dependencies: + girdle "=0.1.15" + fsevents@~2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" @@ -3428,6 +3448,11 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -3469,6 +3494,16 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +girdle@=0.1.15: + version "0.1.15" + resolved "https://registry.yarnpkg.com/girdle/-/girdle-0.1.15.tgz#f808819e3092aa2370982cc3ec4df19a83605848" + integrity sha1-+AiBnjCSqiNwmCzD7E3xmoNgWEg= + +girdle@=0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/girdle/-/girdle-0.2.3.tgz#8ba29189adfc7fc5e08efa731d5b5563e86c24be" + integrity sha1-i6KRia38f8XgjvpzHVtVY+hsJL4= + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -3629,6 +3664,18 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -3875,6 +3922,30 @@ gulp-csso@^2.0.0: gulp-util "^3.0.6" vinyl-sourcemaps-apply "^0.2.1" +gulp-debug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/gulp-debug/-/gulp-debug-4.0.0.tgz#036f9539c3fb6af720e01a9ea5c195fc73f29d5b" + integrity sha512-cn/GhMD2nVZCVxAl5vWao4/dcoZ8wUJ8w3oqTvQaGDmC1vT7swNOEbhQTWJp+/otKePT64aENcqAQXDcdj5H1g== + dependencies: + chalk "^2.3.0" + fancy-log "^1.3.2" + plur "^3.0.0" + stringify-object "^3.0.0" + through2 "^2.0.0" + tildify "^1.1.2" + +gulp-dest-clean@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/gulp-dest-clean/-/gulp-dest-clean-0.5.0.tgz#92a156f74952f1ccc4c0f1d440a192a5ad5f413c" + integrity sha1-kqFW90lS8czEwPHUQKGSpa1fQTw= + dependencies: + chalk "^1.1.1" + del "^2.1.0" + gulp-util "^3.0.7" + lie "^3.0.1" + object-assign "^4.0.1" + through2 "^2.0.0" + gulp-filter@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/gulp-filter/-/gulp-filter-4.0.0.tgz#395f58a256c559cdb9e0d157f1caaf5248a38dcb" @@ -3905,6 +3976,15 @@ gulp-git@^1.2.4: require-dir "^0.1.0" through2 "^0.6.5" +gulp-hash-src@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/gulp-hash-src/-/gulp-hash-src-0.1.6.tgz#ff1d31660bcc6b13bb6be9fca562ee0c3c034423" + integrity sha1-/x0xZgvMaxO7a+n8pWLuDDwDRCM= + dependencies: + fs_helper "=0.1.11" + girdle "=0.2.3" + through2 "=0.4.2" + gulp-header@2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-2.0.7.tgz#07505740eb432e8d2bb2af68744858dabaaf491b" @@ -4031,6 +4111,15 @@ gulp-ng-constant@^1.1.0: through2 "^2.0.0" vinyl "^2.1.0" +gulp-ref-hash@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/gulp-ref-hash/-/gulp-ref-hash-0.0.2.tgz#7099efea0847532d36124de25f0280990b5c4744" + integrity sha1-cJnv6ghHUy02Ek3iXwKAmQtcR0Q= + dependencies: + gulp-util "^2.2.17" + through2 "^0.5.1" + underscore "^1.6.0" + gulp-remove-code@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/gulp-remove-code/-/gulp-remove-code-1.0.2.tgz#a05df4d87af6bc0821aa5fa6e24ceb4fd59d0256" @@ -4164,7 +4253,7 @@ gulp-util@3.0.3: through2 "^0.6.3" vinyl "^0.4.3" -gulp-util@^2.2.14, gulp-util@~2.2.14: +gulp-util@^2.2.14, gulp-util@^2.2.17, gulp-util@~2.2.14: version "2.2.20" resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" integrity sha1-1xRuVyiRC9jwR6awseVJvCLb1kw= @@ -4562,6 +4651,11 @@ ignore@^4.0.3: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= + import-fresh@^3.0.0: version "3.2.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" @@ -4780,6 +4874,11 @@ ipaddr.js@1.9.0: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== +irregular-plurals@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-2.0.0.tgz#39d40f05b00f656d0b7fa471230dd3b714af2872" + integrity sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw== + is-absolute-url@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-1.0.0.tgz#2d7ef0fd0bb2a88dac7e92253c6808a0ace24bfb" @@ -4998,7 +5097,7 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-obj@^1.0.0: +is-obj@^1.0.0, is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= @@ -5061,6 +5160,11 @@ is-regex@^1.0.4, is-regex@^1.0.5, is-regex@~1.0.5: dependencies: has "^1.0.3" +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + is-relative-url@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-relative-url/-/is-relative-url-1.0.0.tgz#87a9d35e8a789b49e079b4d7d69d64612e8e0e1f" @@ -5410,6 +5514,13 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lie@^3.0.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + liftoff@^2.1.0: version "2.5.0" resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" @@ -7171,6 +7282,13 @@ plugin-log@^0.1.0: chalk "^1.1.1" dateformat "^1.0.11" +plur@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/plur/-/plur-3.1.1.tgz#60267967866a8d811504fe58f2faaba237546a5b" + integrity sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w== + dependencies: + irregular-plurals "^2.0.0" + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -8563,6 +8681,15 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +stringify-object@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + stringmap@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/stringmap/-/stringmap-0.2.2.tgz#556c137b258f942b8776f5b2ef582aa069d7d1b1" @@ -8827,7 +8954,7 @@ through2@3.0.1, through2@^3.0.0: dependencies: readable-stream "2 || 3" -through2@^0.4.2, through2@~0.4.0, through2@~0.4.1: +through2@=0.4.2, through2@^0.4.2, through2@~0.4.0, through2@~0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" integrity sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s= @@ -8835,7 +8962,7 @@ through2@^0.4.2, through2@~0.4.0, through2@~0.4.1: readable-stream "~1.0.17" xtend "~2.1.1" -through2@^0.5.0: +through2@^0.5.0, through2@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" integrity sha1-390BLrnHAOIyP9M084rGIqs3Lac= @@ -8869,7 +8996,7 @@ thunkify@^2.1.2: resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d" integrity sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0= -tildify@^1.0.0: +tildify@^1.0.0, tildify@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo= @@ -9133,6 +9260,11 @@ underscore@1.2.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.2.1.tgz#fc5c6b0765673d92a2d4ac8b4dc0aa88702e2bd4" integrity sha1-/FxrB2VnPZKi1KyLTcCqiHAuK9Q= +underscore@^1.6.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.2.tgz#0c8d6f536d6f378a5af264a72f7bec50feb7cf2f" + integrity sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ== + underscore@^1.8.3, underscore@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"