javascript.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /*******************************
  2. Build Task
  3. *******************************/
  4. const
  5. gulp = require('gulp'),
  6. // node dependencies
  7. console = require('better-console'),
  8. // gulp dependencies
  9. chmod = require('gulp-chmod'),
  10. concat = require('gulp-concat'),
  11. dedupe = require('gulp-dedupe'),
  12. flatten = require('gulp-flatten'),
  13. gulpif = require('gulp-if'),
  14. header = require('gulp-header'),
  15. normalize = require('normalize-path'),
  16. plumber = require('gulp-plumber'),
  17. print = require('gulp-print').default,
  18. rename = require('gulp-rename'),
  19. replace = require('gulp-replace'),
  20. uglify = require('gulp-uglify'),
  21. // config
  22. config = require('./../config/user'),
  23. docsConfig = require('./../config/docs'),
  24. tasks = require('../config/tasks'),
  25. install = require('../config/project/install'),
  26. // shorthand
  27. globs = config.globs,
  28. assets = config.paths.assets,
  29. banner = tasks.banner,
  30. filenames = tasks.filenames,
  31. comments = tasks.regExp.comments,
  32. log = tasks.log,
  33. settings = tasks.settings
  34. ;
  35. /**
  36. * Concat and uglify the Javascript files
  37. * @param {string|array} src - source files
  38. * @param type
  39. * @param config
  40. * @return {*}
  41. */
  42. function build(src, type, config) {
  43. return gulp.src(src)
  44. .pipe(plumber())
  45. .pipe(flatten())
  46. .pipe(replace(comments.license.in, comments.license.out))
  47. .pipe(gulpif(config.hasPermissions, chmod(config.parsedPermissions)))
  48. .pipe(gulp.dest(config.paths.output.uncompressed))
  49. .pipe(print(log.created))
  50. .pipe(uglify(settings.uglify))
  51. .pipe(rename(settings.rename.minJS))
  52. .pipe(header(banner, settings.header))
  53. .pipe(gulpif(config.hasPermissions, chmod(config.parsedPermissions)))
  54. .pipe(gulp.dest(config.paths.output.compressed))
  55. .pipe(print(log.created))
  56. ;
  57. }
  58. /**
  59. * Packages the Javascript files in dist
  60. * @param {string} type - type of the js processing (none, rtl, docs)
  61. * @param {boolean} compress - should the output be compressed
  62. */
  63. function pack(type, compress) {
  64. const output = type === 'docs' ? docsConfig.paths.output : config.paths.output;
  65. const concatenatedJS = compress ? filenames.concatenatedMinifiedJS : filenames.concatenatedJS;
  66. return gulp.src(output.uncompressed + '/**/' + globs.components + globs.ignored + '.js')
  67. .pipe(plumber())
  68. .pipe(dedupe())
  69. .pipe(replace(assets.uncompressed, assets.packaged))
  70. .pipe(concat(concatenatedJS))
  71. .pipe(gulpif(compress, uglify(settings.concatUglify)))
  72. .pipe(header(banner, settings.header))
  73. .pipe(gulpif(config.hasPermissions, chmod(config.parsedPermissions)))
  74. .pipe(gulp.dest(output.packaged))
  75. .pipe(print(log.created))
  76. ;
  77. }
  78. function buildJS(src, type, config, callback) {
  79. if (!install.isSetup()) {
  80. console.error('Cannot build Javascript. Run "gulp install" to set-up Semantic');
  81. callback();
  82. return;
  83. }
  84. if (callback === undefined) {
  85. callback = config;
  86. config = type;
  87. type = src;
  88. src = config.paths.source.definitions + '/**/' + config.globs.components + (config.globs.ignored || '') + '.js';
  89. }
  90. // copy source javascript
  91. const js = () => build(src, type, config);
  92. js.displayName = "Building un/compressed Javascript";
  93. const packUncompressed = () => pack(type, false);
  94. packUncompressed.displayName = 'Packing uncompressed Javascript';
  95. const packCompressed = () => pack(type, true);
  96. packCompressed.displayName = 'Packing compressed Javascript';
  97. gulp.series(js, gulp.parallel(packUncompressed, packCompressed))(callback);
  98. }
  99. module.exports = function (callback) {
  100. buildJS(false, config, callback);
  101. };
  102. // We keep the changed files in an array to call build with all of them at the same time
  103. let timeout, files = [];
  104. module.exports.watch = function (type, config) {
  105. gulp
  106. .watch([normalize(config.paths.source.definitions + '/**/*.js')])
  107. .on('all', function (event, path) {
  108. // We don't handle deleted files yet
  109. if (event === 'unlink' || event === 'unlinkDir') {
  110. return;
  111. }
  112. // Clear timeout
  113. timeout && clearTimeout(timeout);
  114. // Add file to internal changed files array
  115. if (!files.includes(path)) {
  116. files.push(path);
  117. }
  118. // Update timeout
  119. timeout = setTimeout(() => {
  120. console.log('Change in javascript detected');
  121. // Copy files to build in another array
  122. const buildFiles = [...files];
  123. // Call method
  124. gulp.series((callback) => buildJS(buildFiles, type, config, callback))();
  125. // Reset internal changed files array
  126. files = [];
  127. }, 1000);
  128. });
  129. };
  130. module.exports.buildJS = buildJS;