gulpfile.js 11 KB

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