UNPKG

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