gulpfile.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. /* Utlimate Jay Mega Gulpfile */
  2. /* global require:true */
  3. /* jshint laxbreak:true */
  4. (function () {
  5. 'use strict';
  6. var pkg = require('./package.json'),
  7. del = require('del'),
  8. yargs = require('yargs'),
  9. exec = require('exec'),
  10. fs = require('fs'),
  11. spawn = require('child_process').spawn,
  12. gulp = require('gulp'),
  13. bump = require('gulp-bump'),
  14. header = require('gulp-header'),
  15. cssmin = require('gulp-cssmin'),
  16. prefixer = require('gulp-autoprefixer'),
  17. uglify = require('gulp-uglify'),
  18. sourcemap = require('gulp-sourcemaps'),
  19. jshint = require('gulp-jshint'),
  20. gutil = require('gulp-util'),
  21. zip = require('gulp-zip'),
  22. rename = require('gulp-rename'),
  23. replace = require('gulp-replace'),
  24. gsync = require('gulp-sync'),
  25. sync = gsync(gulp).sync;
  26. var bumpVersion = yargs.argv.type || 'patch';
  27. var settings = {
  28. name: 'vegas',
  29. banner: {
  30. content: [
  31. '/*!-----------------------------------------------------------------------------',
  32. ' * <%= pkg.description %>',
  33. ' * v<%= pkg.version %> - built <%= datetime %>',
  34. ' * Licensed under the MIT License.',
  35. ' * http://vegas.jaysalvat.com/',
  36. ' * ----------------------------------------------------------------------------',
  37. ' * Copyright (C) 2010-<%= year %> Jay Salvat',
  38. ' * http://jaysalvat.com/',
  39. ' * --------------------------------------------------------------------------*/',
  40. ''
  41. ].join('\n'),
  42. vars: {
  43. pkg: pkg,
  44. datetime: gutil.date('yyyy-mm-dd'),
  45. year: gutil.date('yyyy')
  46. }
  47. }
  48. };
  49. var getPackageJson = function () {
  50. return JSON.parse(fs.readFileSync('./package.json'));
  51. };
  52. gulp.task('clean', function (cb) {
  53. return del([ './dist' ], cb);
  54. });
  55. gulp.task('tmp-clean', function (cb) {
  56. return del([ './tmp' ], cb);
  57. });
  58. gulp.task('tmp-create', function (cb) {
  59. return exec('mkdir -p ./tmp', cb);
  60. });
  61. gulp.task('tmp-copy', [ 'tmp-create' ], function () {
  62. return gulp.src('./dist/**/*')
  63. .pipe(gulp.dest('./tmp'));
  64. });
  65. gulp.task('zip', [ 'tmp-create' ], function () {
  66. var filename = settings.name + '.zip';
  67. return gulp.src('./dist/**/*')
  68. .pipe(zip(filename))
  69. .pipe(gulp.dest('./tmp'));
  70. });
  71. gulp.task('fail-if-dirty', function (cb) {
  72. return exec('git diff-index HEAD --', function (err, output) { // err, output, code
  73. if (err) {
  74. return cb(err);
  75. }
  76. if (output) {
  77. return cb('Repository is dirty');
  78. }
  79. return cb();
  80. });
  81. });
  82. gulp.task('fail-if-not-master', function (cb) {
  83. exec('git symbolic-ref -q HEAD', function (err, output) { // err, output, code
  84. if (err) {
  85. return cb(err);
  86. }
  87. if (!/refs\/heads\/master/.test(output)) {
  88. return cb('Branch is not Master');
  89. }
  90. return cb();
  91. });
  92. });
  93. gulp.task('git-tag', function (cb) {
  94. var message = 'v' + getPackageJson().version;
  95. return exec('git tag ' + message, cb);
  96. });
  97. gulp.task('git-add', function (cb) {
  98. return exec('git add -A', cb);
  99. });
  100. gulp.task('git-commit', [ 'git-add' ], function (cb) {
  101. var message = 'Build v' + getPackageJson().version;
  102. return exec('git commit -m "' + message + '"', cb);
  103. });
  104. gulp.task('git-pull', function (cb) {
  105. return exec('git pull origin master', function (err, output, code) {
  106. if (code !== 0) {
  107. return cb(err + output);
  108. }
  109. return cb();
  110. });
  111. });
  112. gulp.task('git-push', [ 'git-commit' ], function (cb) {
  113. return exec('git push origin master --tags', function (err, output, code) {
  114. if (code !== 0) {
  115. return cb(err + output);
  116. }
  117. return cb();
  118. });
  119. });
  120. gulp.task("npm-publish", function (cb) {
  121. exec('npm publish', function (err, output, code) {
  122. if (code !== 0) {
  123. return cb(err + output);
  124. }
  125. return cb();
  126. }
  127. );
  128. });
  129. gulp.task('meta', [ 'tmp-create' ], function (cb) {
  130. var metadata = {
  131. date: gutil.date('yyyy-mm-dd HH:MM'),
  132. version: 'v' + getPackageJson().version
  133. },
  134. json = JSON.stringify(metadata, null, 4);
  135. fs.writeFileSync('tmp/metadata.json', json);
  136. fs.writeFileSync('tmp/metadata.js', '__metadata(' + json + ');');
  137. return cb();
  138. });
  139. gulp.task('bump', function () {
  140. return gulp.src([ 'package.json', 'bower.json', 'component.json' ])
  141. .pipe(bump(
  142. /^[a-z]+$/.test(bumpVersion)
  143. ? { type: bumpVersion }
  144. : { version: bumpVersion }
  145. ))
  146. .pipe(gulp.dest('.'));
  147. });
  148. gulp.task('year', function () {
  149. return gulp.src([ './LICENSE.md', './README.md' ])
  150. .pipe(replace(/(Copyright )(\d{4})/g, '$1' + gutil.date('yyyy')))
  151. .pipe(gulp.dest('.'));
  152. });
  153. gulp.task('lint', function() {
  154. return gulp.src('./src/**.js')
  155. .pipe(jshint())
  156. .pipe(jshint.reporter('default'));
  157. });
  158. gulp.task('copy', function () {
  159. return gulp.src('./src/**/*')
  160. .pipe(gulp.dest('./dist'));
  161. });
  162. gulp.task('autoprefixer', function () {
  163. return gulp.src('./dist/**/*.css')
  164. .pipe(prefixer())
  165. .pipe(gulp.dest('./dist'));
  166. });
  167. gulp.task('uglify', function () {
  168. return gulp.src('./dist/**/!(*.min.js).js')
  169. .pipe(rename({ suffix: '.min' }))
  170. .pipe(sourcemap.init())
  171. .pipe(uglify({
  172. compress: {
  173. warnings: false
  174. },
  175. mangle: true,
  176. outSourceMap: true
  177. }))
  178. .pipe(sourcemap.write('.'))
  179. .pipe(gulp.dest('./dist/'));
  180. });
  181. gulp.task('cssmin', function () {
  182. return gulp.src('./dist/**/!(*.min.css).css')
  183. .pipe(prefixer())
  184. .pipe(rename({ suffix: '.min' }))
  185. .pipe(cssmin())
  186. .pipe(gulp.dest('./dist/'));
  187. });
  188. gulp.task('header', function () {
  189. settings.banner.vars.pkg = getPackageJson();
  190. return gulp.src('./dist/*.js')
  191. .pipe(header(settings.banner.content, settings.banner.vars ))
  192. .pipe(gulp.dest('./dist/'));
  193. });
  194. gulp.task('gh-pages', function (cb) {
  195. var version = getPackageJson().version;
  196. exec([ 'git checkout gh-pages',
  197. 'rm -rf releases/' + version,
  198. 'mkdir -p releases/' + version,
  199. 'cp -r tmp/* releases/' + version,
  200. 'git add -A releases/' + version,
  201. 'rm -rf releases/latest',
  202. 'mkdir -p releases/latest',
  203. 'cp -r tmp/* releases/latest',
  204. 'git add -A releases/latest',
  205. 'git commit -m "Publish release v' + version + '."',
  206. 'git push origin gh-pages',
  207. 'git checkout -'
  208. ].join(' && '),
  209. function (err, output, code) {
  210. if (code !== 0) {
  211. return cb(err + output);
  212. }
  213. return cb();
  214. }
  215. );
  216. });
  217. gulp.task('changelog', function (cb) {
  218. var filename = 'CHANGELOG.md',
  219. editor = process.env.EDITOR || 'vim',
  220. version = getPackageJson().version,
  221. date = gutil.date('yyyy-mm-dd'),
  222. changelog = fs.readFileSync(filename).toString(),
  223. lastDate = /\d{4}-\d{2}-\d{2}/.exec(changelog)[0];
  224. exec('git log --since="' + lastDate + '" --oneline --pretty=format:"%s"', function (err, stdout, stderr) {
  225. if (err) {
  226. return cb(err);
  227. }
  228. if (!stdout) {
  229. return cb();
  230. }
  231. var updates = [
  232. '### Vegas ' + version + ' ' + date,
  233. '',
  234. '* ' + stdout.replace(/\n/g, '\n* ')
  235. ].join('\n');
  236. changelog = changelog.replace(/(## CHANGE LOG)/, '$1\n\n' + updates);
  237. fs.writeFileSync(filename, changelog);
  238. var vim = spawn(editor, [ filename, '-n', '+7' ], {
  239. stdio: 'inherit'
  240. });
  241. vim.on('close', function (e, code) {
  242. return cb();
  243. });
  244. });
  245. });
  246. gulp.task('watch', function() {
  247. gulp.watch("./src/**/*", [ 'build' ]);
  248. });
  249. gulp.task('build', sync([
  250. 'lint',
  251. 'clean',
  252. 'copy',
  253. 'autoprefixer',
  254. 'uglify',
  255. 'cssmin',
  256. 'header'
  257. ],
  258. 'building'));
  259. gulp.task('release', sync([
  260. [ 'fail-if-not-master', 'fail-if-dirty' ],
  261. 'git-pull',
  262. 'bump',
  263. 'changelog',
  264. 'year',
  265. 'clean',
  266. 'copy',
  267. 'autoprefixer',
  268. 'uglify',
  269. 'cssmin',
  270. 'header',
  271. 'git-add',
  272. 'git-commit',
  273. 'git-tag',
  274. 'git-push',
  275. 'publish',
  276. 'npm-publish'
  277. ],
  278. 'releasing'));
  279. gulp.task('publish', sync([
  280. [ 'fail-if-not-master', 'fail-if-dirty' ],
  281. 'tmp-create',
  282. 'tmp-copy',
  283. 'meta',
  284. 'zip',
  285. 'gh-pages',
  286. 'tmp-clean'
  287. ],
  288. 'publising'));
  289. })();
  290. /*
  291. NPM Installation
  292. ----------------
  293. npm install --save-dev del
  294. npm install --save-dev yargs
  295. npm install --save-dev exec
  296. npm install --save-dev fs
  297. npm install --save-dev gulp
  298. npm install --save-dev gulp-bump
  299. npm install --save-dev gulp-header
  300. npm install --save-dev gulp-cssmin
  301. npm install --save-dev gulp-autoprefixer
  302. npm install --save-dev gulp-uglify
  303. npm install --save-dev gulp-sourcemaps
  304. npm install --save-dev gulp-jshint
  305. npm install --save-dev gulp-util
  306. npm install --save-dev gulp-zip
  307. npm install --save-dev gulp-rename
  308. npm install --save-dev gulp-replace
  309. npm install --save-dev gulp-sync
  310. Gh-pages creation
  311. -----------------
  312. git checkout --orphan gh-pages
  313. git rm -rf .
  314. rm -fr
  315. echo 'Welcome' > index.html
  316. git add index.html
  317. git commit -a -m 'First commit'
  318. git push origin gh-pages
  319. git checkout -
  320. */