UNPKG

6.2 kBJavaScriptView Raw
1const gulp = require("gulp");
2const del = require("del");
3const sass = require("gulp-sass");
4const typescript = require("gulp-typescript");
5
6const rollupPipe = require("gulp-better-rollup");
7const babel = require("rollup-plugin-babel");
8const nodeResolve = require("rollup-plugin-node-resolve");
9const commonJs = require("rollup-plugin-commonjs");
10
11
12const defaultRollupOptions = [{
13 "plugins": [
14 babel({
15 babelrc: false,
16 comments: false,
17 presets: [['@babel/preset-env', {
18 targets: {
19 "ie": "11"
20 },
21 loose: true,
22 modules: false
23 }]],
24 runtimeHelpers: true,
25 plugins: [
26 ["@babel/transform-runtime"]
27 ]
28 }),
29 commonJs(),
30 nodeResolve()
31 ]
32}, {
33 "format": "iife"
34}]
35
36
37/**
38 * Generates exports for a gulpfile based on our common business patterns
39 * @param {*} options
40 */
41const createGulpfile = (options) => {
42 const {
43 include = {}
44 } = options;
45
46
47 let tasks = {}; // Tasks that may be called individually
48
49 let cleanTask = null; // Before all other build tasks
50 let parallelBuildTasks = []; // One-time build of project
51
52 let watchTasks = []; // Watch tasks in parallel
53
54
55 /**
56 * Setup clean tasks
57 */
58 if (include.clean) {
59 const cleanParams = include.clean;
60 const clean = () => del(cleanParams);
61
62 cleanTask = clean;
63 tasks.clean = clean;
64 // Clean doesn't have a watch task associated with it
65 }
66
67 /**
68 * Setup copy tasks
69 */
70 if (include.copy) {
71 const copyDefsParam = include.copy;
72 const result = createCopyAll(copyDefsParam);
73
74 tasks = {...tasks, ...result.tasks};
75 parallelBuildTasks = [...parallelBuildTasks, ...result.parallelBuildTasks];
76 watchTasks = [...watchTasks, ...result.watchTasks];
77 }
78
79 /**
80 * Setup Sass tasks
81 */
82 if (include.scss) {
83 const {src, dest, options} = include.scss;
84 const {scss, scssWatch} = createSass(src, dest);
85
86 tasks.scss = scss;
87 parallelBuildTasks.push(scss);
88 watchTasks.push(scssWatch);
89 }
90
91 /**
92 * Setup TypeScript tasks
93 */
94 if (include.ts) {
95 const {src, dest, tsconfig, clean} = include.ts;
96 const {ts, tsWatch} = createTypeScript(src, dest, tsconfig);
97
98 let rollupTask;
99 let cleanTask;
100
101 let rollupOptions = include.ts.rollup; // To deal with variable/constant scope and same-named variables
102
103 if (rollupOptions) {
104 const {src, dest, options} = rollupOptions;
105
106 const rollup = () => gulp.src(src)
107 .pipe(rollupPipe(options || defaultRollupOptions))
108 .pipe(gulp.dest(dest));
109
110 const rollupWatch = () => gulp.watch(src, rollup);
111
112 tasks.rollup = rollup;
113 rollupTask = rollup;
114 watchTasks.push(rollupWatch);
115 }
116
117 if (clean) {
118 const tsClean = () => del(clean);
119 tasks.tsClean = tsClean;
120 cleanTask = tsClean;
121 }
122
123 tsAndRollup = [ts];
124 if (rollupTask) tsAndRollup.push(rollupTask);
125 if (cleanTask) tsAndRollup.push(cleanTask);
126
127 tasks.ts = ts;
128 parallelBuildTasks.push(tsAndRollup.length > 1 ? gulp.series(...tsAndRollup) : ts); // TODO: Include Rollup and delete temp directory
129 watchTasks.push(tsWatch);
130 }
131
132
133
134
135 /**
136 * Setup main build and watch tasks
137 */
138 const buildTasks = [];
139 if (cleanTask) buildTasks.push(cleanTask);
140 if (parallelBuildTasks.length > 0) buildTasks.push(gulp.parallel(...parallelBuildTasks));
141
142 const watch = watchTasks.length > 0 ? gulp.parallel(...watchTasks) : done => done(); // TODO: Don't even add watch if no watch tasks defined
143 const build = gulp.series(...buildTasks);
144 const buildAndWatch = gulp.series(build, /* deploy, serve, */ watch); // Not finished
145
146 return {
147 ...tasks,
148 watch,
149 build,
150 buildAndWatch,
151 default: buildAndWatch
152 }
153}
154
155/**
156 * Create many copy tasks named after given keys with src and dest arrays
157 * @param {*} copyDefs
158 */
159const createCopyAll = (copyDefs) => {
160 let tasks = {};
161 const parallelBuildTasks = [];
162 const watchTasks = [];
163
164 for (const key of Object.keys(copyDefs)) {
165 const [src, dest] = copyDefs[key];
166 const result = createCopy(key, src, dest)
167
168 tasks = {...tasks, ...result};
169 parallelBuildTasks.push(result[key]);
170 watchTasks.push(result[key + "Watch"]);
171 }
172
173 return {
174 tasks,
175 parallelBuildTasks,
176 watchTasks
177 }
178}
179
180/**
181 * Generate a copy function for Gulp
182 * @param {*} src
183 * @param {*} dest
184 */
185const createCopy = (name, src, dest) => {
186 const result = {
187 [name]: () => gulp.src(src).pipe(gulp.dest(dest)),
188 [name + "Watch"]: () => gulp.watch(src, copy)
189 }
190 return result;
191 const copy = () => gulp.src(src).pipe(gulp.dest(dest));
192 const copyWatch = () => gulp.watch(src, copy);
193
194 return {copy, copyWatch};
195}
196
197/**
198 * Creates a sass pipe for Gulp
199 * @param {*} src
200 * @param {*} dest
201 */
202const createSass = (src, dest) => {
203 const scss = () => gulp.src(src)
204 .pipe(sass()) // TODO: allow options like csso, minification, sourcemaps, and logging
205 .pipe(gulp.dest(dest))
206
207 const scssWatch = () => gulp.watch(src, scss);
208
209 return {scss, scssWatch}
210}
211
212/**
213 * Create a typescript pipe for Gulp
214 * @param {*} src
215 * @param {*} dest
216 * @param {*} config
217 */
218const createTypeScript = (src, dest, config = "tsconfig.json") => {
219 const ts = () => gulp.src(src)
220 .pipe(typescript.createProject("tsconfig.json")())
221 .pipe(gulp.dest(dest));
222
223 const tsWatch = () => gulp.watch(src, ts);
224
225 return {ts, tsWatch};
226}
227
228
229
230module.exports = {
231 createGulpfile
232}
233
234
235// Tests
236console.log(createGulpfile({
237 include: {
238 clean: true,
239 copy: {
240 static: ["./src/static/**/*", "./dist"]
241 },
242 scss: {
243 src: "./src/scss",
244 dest: "./dist"
245 }
246 }
247}));
\No newline at end of file