gulpfile.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. 'use strict';
  2. var gulp = require('gulp');
  3. var eslint = require('gulp-eslint');
  4. var file = require('gulp-file');
  5. var rename = require('gulp-rename');
  6. var replace = require('gulp-replace');
  7. var streamify = require('gulp-streamify');
  8. var uglify = require('gulp-uglify');
  9. var gutil = require('gulp-util');
  10. var zip = require('gulp-zip');
  11. var karma = require('karma');
  12. var merge = require('merge2');
  13. var path = require('path');
  14. var rollup = require('rollup-stream');
  15. var source = require('vinyl-source-stream');
  16. var {exec} = require('mz/child_process');
  17. var pkg = require('./package.json');
  18. var argv = require('yargs')
  19. .option('output', {alias: 'o', default: 'dist'})
  20. .option('samples-dir', {default: 'samples'})
  21. .option('docs-dir', {default: 'docs'})
  22. .option('www-dir', {default: 'www'})
  23. .argv;
  24. function watch(glob, task, done) {
  25. gutil.log('Waiting for changes...');
  26. return gulp.watch(glob, task)
  27. .on('end', done)
  28. .on('change', function(e) {
  29. gutil.log('Changes detected for', path.relative('.', e.path), '(' + e.type + ')');
  30. });
  31. }
  32. gulp.task('default', ['build']);
  33. gulp.task('build', function(done) {
  34. var out = argv.output;
  35. var task = function() {
  36. return rollup('rollup.config.js')
  37. .pipe(source(pkg.name + '.js'))
  38. .pipe(gulp.dest(out))
  39. .pipe(rename(pkg.name + '.min.js'))
  40. .pipe(streamify(uglify({output: {comments: 'some'}})))
  41. .pipe(gulp.dest(out));
  42. };
  43. return argv.watch
  44. ? [task(), watch('src/**/*.js', task, done)]
  45. : task();
  46. });
  47. gulp.task('test', function(done) {
  48. new karma.Server({
  49. configFile: path.join(__dirname, 'karma.config.js'),
  50. singleRun: !argv.watch,
  51. args: {
  52. coverage: !!argv.coverage,
  53. inputs: argv.inputs
  54. ? argv.inputs.split(';')
  55. : ['test/specs/**/*.js']
  56. }
  57. },
  58. function(error) {
  59. // https://github.com/karma-runner/gulp-karma/issues/18
  60. error = error ? new Error('Karma returned with the error code: ' + error) : undefined;
  61. done(error);
  62. }).start();
  63. });
  64. gulp.task('lint', function() {
  65. var files = [
  66. 'samples/**/*.js',
  67. 'src/**/*.js',
  68. 'test/**/*.js',
  69. '*.js'
  70. ];
  71. return gulp.src(files)
  72. .pipe(eslint())
  73. .pipe(eslint.format())
  74. .pipe(eslint.failAfterError());
  75. });
  76. gulp.task('docs', function(done) {
  77. var script = require.resolve('gitbook-cli/bin/gitbook.js');
  78. var out = path.join(argv.output, argv.docsDir);
  79. var cmd = process.execPath;
  80. exec([cmd, script, 'install', './'].join(' ')).then(() => {
  81. return exec([cmd, script, argv.watch ? 'serve' : 'build', './', out].join(' '));
  82. }).then(() => {
  83. done();
  84. }).catch((err) => {
  85. done(new Error(err.stdout || err));
  86. });
  87. });
  88. gulp.task('samples', function() {
  89. // since we moved the dist files one folder up (package root), we need to rewrite
  90. // samples src="../dist/ to src="../ and then copy them in the /samples directory.
  91. var out = path.join(argv.output, argv.samplesDir);
  92. return gulp.src('samples/**/*', {base: 'samples'})
  93. .pipe(streamify(replace(/src="((?:\.\.\/)+)dist\//g, 'src="$1', {skipBinary: true})))
  94. .pipe(gulp.dest(out));
  95. });
  96. gulp.task('package', ['build', 'samples'], function() {
  97. var out = argv.output;
  98. var streams = merge(
  99. gulp.src(path.join(out, argv.samplesDir, '**/*'), {base: out}),
  100. gulp.src([path.join(out, '*.js'), 'LICENSE.md'])
  101. );
  102. return streams
  103. .pipe(zip(pkg.name + '.zip'))
  104. .pipe(gulp.dest(out));
  105. });
  106. gulp.task('netlify', ['build', 'docs', 'samples'], function() {
  107. var root = argv.output;
  108. var out = path.join(root, argv.wwwDir);
  109. var streams = merge(
  110. gulp.src(path.join(root, argv.docsDir, '**/*'), {base: path.join(root, argv.docsDir)}),
  111. gulp.src(path.join(root, argv.samplesDir, '**/*'), {base: root}),
  112. gulp.src(path.join(root, '*.js'))
  113. );
  114. return streams
  115. .pipe(streamify(replace(/https?:\/\/chartjs-plugin-datalabels\.netlify\.com\/?/g, '/', {skipBinary: true})))
  116. .pipe(gulp.dest(out));
  117. });
  118. gulp.task('bower', function() {
  119. var json = JSON.stringify({
  120. name: pkg.name,
  121. description: pkg.description,
  122. homepage: pkg.homepage,
  123. license: pkg.license,
  124. version: pkg.version,
  125. main: argv.output + '/' + pkg.name + '.js'
  126. }, null, 2);
  127. return file('bower.json', json, {src: true})
  128. .pipe(gulp.dest('./'));
  129. });
  130. // Workaround: Gulp process does not end because of karma/node process hanging
  131. // https://github.com/sindresorhus/gulp-mocha/issues/1#issuecomment-55710159
  132. // https://github.com/karma-runner/karma/issues/2867
  133. gulp.doneCallback = function(err) {
  134. // eslint-disable-next-line no-process-exit
  135. process.exit(err ? 1 : 0);
  136. };