diff --git a/app/css/app.css b/app/css/app.css index 7defae5b..ad0860a3 100644 --- a/app/css/app.css +++ b/app/css/app.css @@ -1,7 +1,7 @@ /* app css stylesheet */ html { - background: #dee4e9 url(../img/bg_tile.png?1) 0 0 repeat; + background: #dee4e9 url(../img/bg_tile.png) 0 0 repeat; /*background-size: 300px 468px;*/ } body { @@ -255,12 +255,12 @@ input[type="number"]::-webkit-inner-spin-button { height: 18px; vertical-align: text-top; - background: url(../img/icons/IconsetW.png?1) -15px -419px no-repeat; + background: url(../img/icons/IconsetW.png) -15px -419px no-repeat; background-size: 42px 560px; opacity: 0.6; } .is_1x .icon-back { - background-image: url(../img/icons/IconsetW_1x.png?2); + background-image: url(../img/icons/IconsetW_1x.png); } .tg_page_head .navbar-quick-nav a:hover .icon-back { opacity: 1; @@ -510,7 +510,7 @@ input[type="number"]::-webkit-inner-spin-button { .im_dialogs_search_field { font-size: 12px; line-height: normal; - background: #F2F2F2 url(../img/icons/IconsetW.png?1) -6px -205px no-repeat; + background: #F2F2F2 url(../img/icons/IconsetW.png) -6px -205px no-repeat; background-size: 42px 560px; border: 1px solid #F2F2F2; border-radius: 3px; @@ -519,7 +519,7 @@ input[type="number"]::-webkit-inner-spin-button { margin: 0; } .is_1x .im_dialogs_search_field { - background-image: url(../img/icons/IconsetW_1x.png?2); + background-image: url(../img/icons/IconsetW_1x.png); } .im_dialogs_search_field:focus, .im_dialogs_search_field:active { @@ -534,12 +534,12 @@ input[type="number"]::-webkit-inner-spin-button { width: 13px; height: 13px; vertical-align: text-top; - background: url(../img/icons/IconsetW.png?1) -15px -192px no-repeat; + background: url(../img/icons/IconsetW.png) -15px -192px no-repeat; background-size: 42px 560px; opacity: 0.6; } .is_1x .im_dialogs_search_clear { - background-image: url(../img/icons/IconsetW_1x.png?2); + background-image: url(../img/icons/IconsetW_1x.png); } .im_dialogs_search_clear:hover { opacity: 1; @@ -787,11 +787,11 @@ a.im_dialog:hover .im_dialog_date { margin-top: 7px; margin-left: 6px; - background: url(../img/icons/IconsetW.png?1) -17px -444px no-repeat; + background: url(../img/icons/IconsetW.png) -17px -444px no-repeat; background-size: 42px 560px; } .is_1x .icon-caret { - background-image: url(../img/icons/IconsetW_1x.png?2); + background-image: url(../img/icons/IconsetW_1x.png); } .im_history_panel_media_dropdown .dropdown-menu { @@ -986,11 +986,11 @@ div.im_message_video_thumb { width: 15px; height: 19px; - background: url(../img/icons/IconsetW.png?1) -14px -389px no-repeat; + background: url(../img/icons/IconsetW.png) -14px -389px no-repeat; background-size: 42px 560px; } .is_1x .icon-geo-point { - background-image: url(../img/icons/IconsetW_1x.png?2); + background-image: url(../img/icons/IconsetW_1x.png); } @@ -1014,7 +1014,7 @@ div.im_message_video_thumb { height: 38px; vertical-align: text-top; - background: #F2F2F2 url(../img/icons/IconsetW.png?1) -2px -229px no-repeat; + background: #F2F2F2 url(../img/icons/IconsetW.png) -2px -229px no-repeat; background-size: 42px 560px; border-radius: 3px; margin-right: 10px; @@ -1022,7 +1022,7 @@ div.im_message_video_thumb { .is_1x .icon-document, .is_1x .icon-photo, .is_1x .icon-video { - background-image: url(../img/icons/IconsetW_1x.png?2); + background-image: url(../img/icons/IconsetW_1x.png); } .im_message_selected .icon-document, @@ -1075,13 +1075,13 @@ div.im_message_video_thumb { height: 38px; vertical-align: text-top; - background: #F2F2F2 url(../img/icons/IconsetW.png?1) -2px -277px no-repeat; + background: #F2F2F2 url(../img/icons/IconsetW.png) -2px -277px no-repeat; background-size: 42px 560px; border-radius: 3px; margin-right: 10px; } .is_1x .icon-audio { - background-image: url(../img/icons/IconsetW_1x.png?2); + background-image: url(../img/icons/IconsetW_1x.png); } .im_message_audio_info { @@ -1202,14 +1202,14 @@ div.im_message_video_thumb { display: none; width: 16px; height: 10px; - background: url(../img/icons/Checks2_2x.png?1) 0 0 no-repeat; + background: url(../img/icons/Checks2_2x.png) 0 0 no-repeat; background-size: 16px 10px; top: 2px; position: relative; } .icon-message-status-tick.message-status-unread-tick { /*width: 13px;*/ - background: url(../img/icons/Checks1_2x.png?1) 0 0 no-repeat; + background: url(../img/icons/Checks1_2x.png) 0 0 no-repeat; background-size: 16px 10px; } .im_message_date { @@ -1334,12 +1334,12 @@ textarea.im_message_field { width: 19px; height: 23px; vertical-align: text-top; - background: url(../img/icons/IconsetW.png?1) -12px -68px no-repeat; + background: url(../img/icons/IconsetW.png) -12px -68px no-repeat; background-size: 42px 560px; opacity: 0.8; } .is_1x .icon-paperclip { - background-image: url(../img/icons/IconsetW_1x.png?2); + background-image: url(../img/icons/IconsetW_1x.png); } .im_attach:hover .icon-paperclip { opacity: 1; @@ -1362,12 +1362,12 @@ textarea.im_message_field { width: 23px; height: 23px; vertical-align: text-top; - background: url(../img/icons/IconsetW.png?1) -10px -4px no-repeat; + background: url(../img/icons/IconsetW.png) -10px -4px no-repeat; background-size: 42px 560px; opacity: 0.8; } .is_1x .icon-emoji { - background-image: url(../img/icons/IconsetW_1x.png?2); + background-image: url(../img/icons/IconsetW_1x.png); } .im_emoji_btn:hover .icon-emoji { opacity: 1; @@ -1412,12 +1412,12 @@ textarea.im_message_field { width: 25px; height: 21px; vertical-align: text-top; - background: url(../img/icons/IconsetW.png?1) -9px -132px no-repeat; + background: url(../img/icons/IconsetW.png) -9px -132px no-repeat; background-size: 42px 560px; opacity: 0.8; } .is_1x .icon-camera { - background-image: url(../img/icons/IconsetW_1x.png?2); + background-image: url(../img/icons/IconsetW_1x.png); } .im_media_attach:hover .icon-camera { opacity: 1; @@ -1832,14 +1832,14 @@ img.img_fullsize { .emoji-menu-tail { display: none; - background: url(../img/icons/IconsetW.png?1) -14px -268px no-repeat; + background: url(../img/icons/IconsetW.png) -14px -268px no-repeat; background-size: 42px 560px; width: 14px; height: 7px; margin: 0 83px; } .is_1x .emoji-menu-tail { - background-image: url(../img/icons/IconsetW_1x.png?2); + background-image: url(../img/icons/IconsetW_1x.png); } @@ -1983,7 +1983,7 @@ img.img_fullsize { .contacts_modal_search_field { font-size: 12px; line-height: normal; - background: #F2F2F2 url(../img/icons/IconsetW.png?1) -6px -205px no-repeat; + background: #F2F2F2 url(../img/icons/IconsetW.png) -6px -205px no-repeat; background-size: 42px 560px; border: 1px solid #F2F2F2; border-radius: 3px; @@ -1992,7 +1992,7 @@ img.img_fullsize { margin: 0; } .is_1x .contacts_modal_search_field { - background-image: url(../img/icons/IconsetW_1x.png?2); + background-image: url(../img/icons/IconsetW_1x.png); } .contacts_modal_search_field:focus, .contacts_modal_search_field:active { @@ -2007,12 +2007,12 @@ img.img_fullsize { width: 13px; height: 13px; vertical-align: text-top; - background: url(../img/icons/IconsetW.png?1) -15px -192px no-repeat; + background: url(../img/icons/IconsetW.png) -15px -192px no-repeat; background-size: 42px 560px; opacity: 0.6; } .is_1x .contacts_modal_search_clear { - background-image: url(../img/icons/IconsetW_1x.png?2); + background-image: url(../img/icons/IconsetW_1x.png); } .contacts_modal_search_clear:hover { opacity: 1; @@ -2084,12 +2084,12 @@ a.contacts_modal_contact:hover .contacts_modal_contact_status { top: 22px; width: 17px; height: 15px; - background: url(../img/icons/IconsetW.png?1) -13px -366px no-repeat; + background: url(../img/icons/IconsetW.png) -13px -366px no-repeat; background-size: 42px 560px; opacity: 0.5; } .is_1x .icon-contact-tick { - background-image: url(../img/icons/IconsetW_1x.png?2); + background-image: url(../img/icons/IconsetW_1x.png); } .contacts_modal_members_list a.contacts_modal_contact:hover .icon-contact-tick { background-position: -13px -366px; @@ -2182,11 +2182,11 @@ a.contacts_modal_contact:hover .contacts_modal_contact_status { width: 12px; height: 15px; - background: url(../img/icons/IconsetW.png?1) -15px -319px no-repeat; + background: url(../img/icons/IconsetW.png) -15px -319px no-repeat; background-size: 42px 560px; } .is_1x .icon-delete { - background-image: url(../img/icons/IconsetW_1x.png?2); + background-image: url(../img/icons/IconsetW_1x.png); } .im_message_selected { background: #f2f6fa; @@ -2229,11 +2229,11 @@ a.contacts_modal_contact:hover .contacts_modal_contact_status { width: 26px; height: 26px; margin: 13px 0 0 40px; - background: url(../img/icons/IconsetW.png?1) -9px -516px no-repeat; + background: url(../img/icons/IconsetW.png) -9px -516px no-repeat; background-size: 42px 560px; } .is_1x .icon-select-tick { - background-image: url(../img/icons/IconsetW_1x.png?2); + background-image: url(../img/icons/IconsetW_1x.png); } .im_history_selectable .icon-select-tick, .im_content_message_select_area:hover .icon-select-tick { diff --git a/app/index.html b/app/index.html index 29a5a0b1..6ece9a17 100644 --- a/app/index.html +++ b/app/index.html @@ -4,10 +4,14 @@ Webogram + + - + - + + + @@ -21,31 +25,35 @@
- + + - + - - - - - + + + + + - + - - - - - - - - + + + + + + + + + + + diff --git a/app/js/app.js b/app/js/app.js index 9d6ea783..cddd3249 100644 --- a/app/js/app.js +++ b/app/js/app.js @@ -1,5 +1,5 @@ /*! - * Webogram v0.0.19 - messaging web application for MTProto + * Webogram v0.0.1 - messaging web application for MTProto * https://github.com/zhukov/webogram * Copyright (C) 2014 Igor Zhukov * https://github.com/zhukov/webogram/blob/master/LICENSE @@ -30,6 +30,7 @@ angular.module('myApp', [ 'ngAnimate', 'ngSanitize', 'ui.bootstrap', + 'partials', 'myApp.filters', 'myApp.services', 'mtproto.services', @@ -63,9 +64,9 @@ config(['$locationProvider', '$routeProvider', '$compileProvider', function($loc // $locationProvider.html5Mode(true); - $routeProvider.when('/', {templateUrl: 'partials/welcome.html?4', controller: 'AppWelcomeController'}); - $routeProvider.when('/login', {templateUrl: 'partials/login.html?5', controller: 'AppLoginController'}); - $routeProvider.when('/im', {templateUrl: 'partials/im.html?13', controller: 'AppIMController', reloadOnSearch: false}); + $routeProvider.when('/', {templateUrl: 'partials/welcome.html', controller: 'AppWelcomeController'}); + $routeProvider.when('/login', {templateUrl: 'partials/login.html', controller: 'AppLoginController'}); + $routeProvider.when('/im', {templateUrl: 'partials/im.html', controller: 'AppIMController', reloadOnSearch: false}); $routeProvider.otherwise({redirectTo: '/'}); }]); diff --git a/app/js/background.js b/app/js/background.js index 09020469..2f8ac9ad 100644 --- a/app/js/background.js +++ b/app/js/background.js @@ -1,5 +1,5 @@ /*! - * Webogram v0.0.19 - messaging web application for MTProto + * Webogram v0.0.1 - messaging web application for MTProto * https://github.com/zhukov/webogram * Copyright (C) 2014 Igor Zhukov * https://github.com/zhukov/webogram/blob/master/LICENSE diff --git a/app/js/controllers.js b/app/js/controllers.js index 30cdbd95..4f8e1cba 100644 --- a/app/js/controllers.js +++ b/app/js/controllers.js @@ -1,5 +1,5 @@ /*! - * Webogram v0.0.19 - messaging web application for MTProto + * Webogram v0.0.1 - messaging web application for MTProto * https://github.com/zhukov/webogram * Copyright (C) 2014 Igor Zhukov * https://github.com/zhukov/webogram/blob/master/LICENSE @@ -168,7 +168,7 @@ angular.module('myApp.controllers', []) $scope.isLoggedIn = true; $scope.openSettings = function () { $modal.open({ - templateUrl: 'partials/settings_modal.html?3', + templateUrl: 'partials/settings_modal.html', controller: 'SettingsModalController', scope: $rootScope.$new(), windowClass: 'settings_modal_window' @@ -191,7 +191,7 @@ angular.module('myApp.controllers', []) scope.userIDs = userIDs; $modal.open({ - templateUrl: 'partials/chat_create_modal.html?3', + templateUrl: 'partials/chat_create_modal.html', controller: 'ChatCreateModalController', scope: scope, windowClass: 'contacts_modal_window' @@ -965,7 +965,7 @@ angular.module('myApp.controllers', []) scope.chatID = $scope.chatID; $modal.open({ - templateUrl: 'partials/chat_edit_modal.html?3', + templateUrl: 'partials/chat_edit_modal.html', controller: 'ChatEditModalController', scope: scope, windowClass: 'contacts_modal_window' diff --git a/app/js/directives.js b/app/js/directives.js index 29bbd22d..93d9ae14 100644 --- a/app/js/directives.js +++ b/app/js/directives.js @@ -1,5 +1,5 @@ /*! - * Webogram v0.0.19 - messaging web application for MTProto + * Webogram v0.0.1 - messaging web application for MTProto * https://github.com/zhukov/webogram * Copyright (C) 2014 Igor Zhukov * https://github.com/zhukov/webogram/blob/master/LICENSE @@ -16,7 +16,7 @@ angular.module('myApp.directives', ['myApp.filters']) restrict: 'AE', scope: true, translude: false, - templateUrl: 'partials/dialog.html?5' + templateUrl: 'partials/dialog.html' }; }) @@ -25,7 +25,7 @@ angular.module('myApp.directives', ['myApp.filters']) restrict: 'AE', scope: true, translude: false, - templateUrl: 'partials/message.html?7' + templateUrl: 'partials/message.html' }; }) diff --git a/app/js/filters.js b/app/js/filters.js index b2fedc6e..1ede38eb 100644 --- a/app/js/filters.js +++ b/app/js/filters.js @@ -1,5 +1,5 @@ /*! - * Webogram v0.0.19 - messaging web application for MTProto + * Webogram v0.0.1 - messaging web application for MTProto * https://github.com/zhukov/webogram * Copyright (C) 2014 Igor Zhukov * https://github.com/zhukov/webogram/blob/master/LICENSE diff --git a/app/js/lib/aes_worker.js b/app/js/lib/aes_worker.js index a8418fe7..0c5ef9d9 100644 --- a/app/js/lib/aes_worker.js +++ b/app/js/lib/aes_worker.js @@ -1,5 +1,5 @@ /*! - * Webogram v0.0.19 - messaging web application for MTProto + * Webogram v0.0.1 - messaging web application for MTProto * https://github.com/zhukov/webogram * Copyright (C) 2014 Igor Zhukov * https://github.com/zhukov/webogram/blob/master/LICENSE diff --git a/app/js/lib/mtproto.js b/app/js/lib/mtproto.js index f032152c..8cae493f 100644 --- a/app/js/lib/mtproto.js +++ b/app/js/lib/mtproto.js @@ -1,5 +1,5 @@ /*! - * Webogram v0.0.19 - messaging web application for MTProto + * Webogram v0.0.1 - messaging web application for MTProto * https://github.com/zhukov/webogram * Copyright (C) 2014 Igor Zhukov * https://github.com/zhukov/webogram/blob/master/LICENSE diff --git a/app/js/lib/pq_worker.js b/app/js/lib/pq_worker.js index 3cc216a7..4123a7d5 100644 --- a/app/js/lib/pq_worker.js +++ b/app/js/lib/pq_worker.js @@ -1,5 +1,5 @@ /*! - * Webogram v0.0.19 - messaging web application for MTProto + * Webogram v0.0.1 - messaging web application for MTProto * https://github.com/zhukov/webogram * Copyright (C) 2014 Igor Zhukov * https://github.com/zhukov/webogram/blob/master/LICENSE diff --git a/app/js/lib/sha1_worker.js b/app/js/lib/sha1_worker.js index 5dee15f0..5d677b1a 100644 --- a/app/js/lib/sha1_worker.js +++ b/app/js/lib/sha1_worker.js @@ -1,5 +1,5 @@ /*! - * Webogram v0.0.19 - messaging web application for MTProto + * Webogram v0.0.1 - messaging web application for MTProto * https://github.com/zhukov/webogram * Copyright (C) 2014 Igor Zhukov * https://github.com/zhukov/webogram/blob/master/LICENSE diff --git a/app/js/services.js b/app/js/services.js index 928563b6..8efd1641 100644 --- a/app/js/services.js +++ b/app/js/services.js @@ -1,5 +1,5 @@ /*! - * Webogram v0.0.19 - messaging web application for MTProto + * Webogram v0.0.1 - messaging web application for MTProto * https://github.com/zhukov/webogram * Copyright (C) 2014 Igor Zhukov * https://github.com/zhukov/webogram/blob/master/LICENSE @@ -289,7 +289,7 @@ angular.module('myApp.services', []) scope.userID = userID; var modalInstance = $modal.open({ - templateUrl: 'partials/user_modal.html?2', + templateUrl: 'partials/user_modal.html', controller: 'UserModalController', scope: scope, windowClass: 'user_modal_window' @@ -425,7 +425,7 @@ angular.module('myApp.services', []) scope.chatID = chatID; var modalInstance = $modal.open({ - templateUrl: 'partials/chat_modal.html?4', + templateUrl: 'partials/chat_modal.html', controller: 'ChatModalController', windowClass: 'chat_modal_window', scope: scope @@ -1724,7 +1724,7 @@ angular.module('myApp.services', []) scope.photoID = photoID; var modalInstance = $modal.open({ - templateUrl: 'partials/photo_modal.html?1', + templateUrl: 'partials/photo_modal.html', controller: 'PhotoModalController', scope: scope }); @@ -1824,7 +1824,7 @@ angular.module('myApp.services', []) scope.player = {}; var modalInstance = $modal.open({ - templateUrl: 'partials/video_modal.html?1', + templateUrl: 'partials/video_modal.html', controller: 'VideoModalController', scope: scope }); diff --git a/app/js/util.js b/app/js/util.js index ac0d08ee..51d3a57f 100644 --- a/app/js/util.js +++ b/app/js/util.js @@ -1,5 +1,5 @@ /*! - * Webogram v0.0.19 - messaging web application for MTProto + * Webogram v0.0.1 - messaging web application for MTProto * https://github.com/zhukov/webogram * Copyright (C) 2014 Igor Zhukov * https://github.com/zhukov/webogram/blob/master/LICENSE diff --git a/app/partials/im.html b/app/partials/im.html index 54ce1021..735e2e22 100644 --- a/app/partials/im.html +++ b/app/partials/im.html @@ -1,4 +1,4 @@ -
+
diff --git a/app/partials/login.html b/app/partials/login.html index 5cd289d5..b52c3b38 100644 --- a/app/partials/login.html +++ b/app/partials/login.html @@ -1,4 +1,4 @@ -
+
\ No newline at end of file +
diff --git a/app/partials/welcome.html b/app/partials/welcome.html index c4c721ba..3071b474 100644 --- a/app/partials/welcome.html +++ b/app/partials/welcome.html @@ -1,4 +1,4 @@ -
+
@@ -14,4 +14,4 @@ Start Messaging
- \ No newline at end of file + diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 00000000..c93bdf2e --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,86 @@ +var gulp = require('gulp'); +var es = require('event-stream'); +var pj = require('./package.json'); +var $ = require('gulp-load-plugins')(); +var concat = require('gulp-concat'); + +// The generated file is being created at src +// so it can be fetched by usemin. +gulp.task('templates', function() { + return gulp.src('app/partials/*.html') + .pipe($.angularTemplatecache('partials.js', { + root: 'partials', + module: 'partials', + standalone: true + })) + .pipe(gulp.dest('app/js')); +}); + +gulp.task('copy', function() { + return es.concat( + gulp.src(['app/favicon.ico', 'app/favicon_unread.ico', 'app/manifest.webapp', 'app/manifest.json', 'app/**/*worker.js', 'app/img/**/*', '!app/img/screenshot*']) + .pipe(gulp.dest('dist')), + gulp.src('app/vendor/console-polyfill/console-polyfill.js') + .pipe(gulp.dest('dist/vendor/console-polyfill')), + gulp.src('app/js/lib/mtproto.js') + .pipe(gulp.dest('dist/js/lib')), + gulp.src('app/js/lib/config.js') + .pipe(gulp.dest('dist/js/lib')), + gulp.src('app/vendor/jsbn/jsbn_combined.js') + .pipe(gulp.dest('dist/vendor/jsbn')), + gulp.src('app/vendor/cryptoJS/crypto.js') + .pipe(gulp.dest('dist/vendor/cryptoJS')) + ); +}); + +gulp.task('update-version-manifests', function() { + return gulp.src(['app/manifest.webapp', 'app/manifest.json']) + .pipe($.replace(/"version": ".*",/, '"version": "' + pj.version + '",')) + .pipe(gulp.dest('app')); +}); + +gulp.task('update-version-settings', function() { + return gulp.src('app/partials/settings_modal.html') + .pipe($.replace(/alpha .*<\/span>/, 'alpha ' + pj.version + '<\/span>')) + .pipe(gulp.dest('app/partials')); +}); + +gulp.task('update-version-comments', function() { + return gulp.src('app/**/*') + .pipe($.grepStream('Webogram v')) + .pipe($.replace(/Webogram v[0-9.]*/, 'Webogram v' + pj.version)) + .pipe(gulp.dest('app')); +}); + +gulp.task('usemin', ['templates'], function() { + return gulp.src('app/index.html') + .pipe($.usemin({ + html: [$.minifyHtml({empty: true})], + js: ['concat', $.rev()], + css: [$.minifyCss(), 'concat'] + })) + .pipe(gulp.dest('dist')); +}); + +gulp.task('clean', function() { + return gulp.src('dist').pipe($.clean()); +}); + +gulp.task('compress-dist', function() { + return es.concat( + gulp.src('dist/*') + .pipe($.zip('webogram_v' + pj.version + '.zip')) + .pipe(gulp.dest('package')), + gulp.src('package/*.zip') + .pipe(gulp.dest('.')), + gulp.src('package/**/*').pipe($.clean()) + ); +}); + +gulp.task('bump', ['update-version-manifests', 'update-version-settings', 'update-version-comments']); +gulp.task('build', ['clean', 'templates', 'usemin', 'copy']); +gulp.task('package', ['build', 'compress-dist']); + +gulp.task('default', function() { + gulp.start('build'); +}); diff --git a/package.json b/package.json new file mode 100644 index 00000000..5a453e4a --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "name": "webogram", + "version": "0.0.1", + "description": "UNOFFICIAL Telegram Web App.", + "main": "server.js", + "scripts": { + "start": "node server.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/zhukov/webogram.git" + }, + "author": "zhukov", + "license": "GPL", + "bugs": { + "url": "https://github.com/zhukov/webogram/issues" + }, + "homepage": "http://zhukov.github.io/webogram", + "devDependencies": { + "gulp": "~3.5.5", + "gulp-angular-templatecache": "^1.1.0", + "gulp-load-plugins": "^0.4.0", + "gulp-usemin": "^0.3.3", + "gulp-uglify": "^0.2.1", + "gulp-rev": "^0.3.0", + "gulp-minify-css": "^0.3.0", + "gulp-minify-html": "^0.1.1", + "gulp-imagemin": "^0.1.5", + "gulp-clean": "^0.2.4", + "gulp-replace": "^0.2.0", + "gulp-concat": "^2.1.7", + "gulp-grep-stream": "0.0.2", + "event-stream": "^3.1.0", + "gulp-zip": "^0.1.2" + } +}