|
1 | | -const { join, relative } = require('path') |
2 | | -const { cwd } = require('process') |
3 | | -const { Transform } = require('stream') |
4 | | - |
5 | | -const autoprefixer = require('autoprefixer') |
6 | | -const cssnano = require('cssnano') |
| 1 | +const browserSync = require('browser-sync') |
7 | 2 | const gulp = require('gulp') |
8 | | -const postcss = require('gulp-postcss') |
9 | | -const rename = require('gulp-rename') |
10 | | -const gulpSass = require('gulp-sass') |
11 | | -const terser = require('gulp-terser') |
12 | | -const PluginError = require('plugin-error') |
13 | | -const dartSass = require('sass-embedded') |
14 | | -const webpack = require('webpack-stream') |
15 | | - |
16 | | -const { version } = require('./package.json') |
17 | | - |
18 | | -/** |
19 | | - * Import gulp tasks used for creating |
20 | | - * our website pages. |
21 | | - */ |
22 | | -require('./tasks/docs') |
23 | | - |
24 | | -/** |
25 | | - * Remove all compiled files |
26 | | - * @param {string[]} pattern - glob patterns or paths to clean |
27 | | - * @param {string[]} [ignore] - glob patterns or paths to ignore |
28 | | - */ |
29 | | -async function clean(pattern, ignore) { |
30 | | - const { deleteAsync } = await import('del') |
31 | | - await deleteAsync(pattern, { ignore }) |
32 | | -} |
33 | | - |
34 | | -/** |
35 | | - * CSS tasks |
36 | | - */ |
37 | | - |
38 | | -const sass = gulpSass(dartSass) |
39 | 3 |
|
40 | | -/* Build the CSS from source */ |
41 | | -function compileCSS(done) { |
42 | | - return gulp |
43 | | - .src(['packages/nhsuk.scss'], { |
44 | | - sourcemaps: true |
45 | | - }) |
46 | | - .pipe( |
47 | | - sass({ |
48 | | - sourceMap: true, |
49 | | - sourceMapIncludeSources: true |
50 | | - }).on('error', (error) => { |
51 | | - done( |
52 | | - new PluginError('compileCSS', error.messageFormatted, { |
53 | | - showProperties: false |
54 | | - }) |
55 | | - ) |
56 | | - }) |
57 | | - ) |
58 | | - .pipe( |
59 | | - new Transform({ |
60 | | - objectMode: true, |
61 | | - |
62 | | - // Make source file:// paths relative |
63 | | - transform(file, enc, cb) { |
64 | | - if (file.sourceMap?.sources) { |
65 | | - file.sourceMap.sources = file.sourceMap.sources.map((path) => |
66 | | - relative(join(cwd(), 'dist'), join(file.base, path)) |
67 | | - ) |
68 | | - } |
69 | | - |
70 | | - cb(null, file) |
71 | | - } |
72 | | - }) |
73 | | - ) |
74 | | - .pipe(postcss([autoprefixer()])) |
75 | | - .pipe( |
76 | | - gulp.dest('dist/', { |
77 | | - sourcemaps: '.' |
78 | | - }) |
79 | | - ) |
80 | | -} |
81 | | - |
82 | | -/* Minify CSS and add a min.css suffix */ |
83 | | -function minifyCSS() { |
84 | | - return gulp |
85 | | - .src( |
86 | | - [ |
87 | | - 'dist/*.css', |
88 | | - '!dist/*.min.css' // don't re-minify minified css |
89 | | - ], |
90 | | - { sourcemaps: true } |
91 | | - ) |
92 | | - .pipe(postcss([cssnano()])) |
93 | | - .pipe( |
94 | | - rename({ |
95 | | - suffix: `-${version}.min` |
96 | | - }) |
97 | | - ) |
98 | | - .pipe( |
99 | | - gulp.dest('dist/', { |
100 | | - sourcemaps: '.' |
101 | | - }) |
102 | | - ) |
103 | | -} |
104 | | - |
105 | | -/** |
106 | | - * JavaScript tasks |
107 | | - */ |
108 | | - |
109 | | -/* Use Webpack to build and minify the NHS.UK components JS. */ |
110 | | -function webpackJS(done) { |
111 | | - return gulp |
112 | | - .src('./packages/nhsuk.js', { |
113 | | - sourcemaps: true |
114 | | - }) |
115 | | - .pipe( |
116 | | - webpack({ |
117 | | - devtool: 'source-map', |
118 | | - mode: 'production', |
119 | | - module: { |
120 | | - rules: [ |
121 | | - { |
122 | | - use: { |
123 | | - loader: 'babel-loader', |
124 | | - options: { |
125 | | - rootMode: 'upward' |
126 | | - } |
127 | | - } |
128 | | - } |
129 | | - ] |
130 | | - }, |
131 | | - optimization: { |
132 | | - minimize: false // minification is handled by terser |
133 | | - }, |
134 | | - output: { |
135 | | - filename: 'nhsuk.js', |
136 | | - |
137 | | - // Make source webpack:// paths relative |
138 | | - devtoolModuleFilenameTemplate(info) { |
139 | | - return relative(join(cwd(), 'dist'), info.absoluteResourcePath) |
140 | | - } |
141 | | - }, |
142 | | - stats: { |
143 | | - colors: true, |
144 | | - errors: false |
145 | | - }, |
146 | | - target: 'browserslist' |
147 | | - }).on('error', (error) => { |
148 | | - done( |
149 | | - new PluginError('webpackJS', error, { |
150 | | - showProperties: false |
151 | | - }) |
152 | | - ) |
153 | | - }) |
154 | | - ) |
155 | | - .pipe( |
156 | | - gulp.dest('./dist', { |
157 | | - sourcemaps: '.' |
158 | | - }) |
159 | | - ) |
160 | | -} |
161 | | - |
162 | | -/* Minify the JS file for release */ |
163 | | -function minifyJS() { |
164 | | - return gulp |
165 | | - .src( |
166 | | - [ |
167 | | - 'dist/*.js', |
168 | | - '!dist/*.min.js' // don't re-minify minified javascript |
169 | | - ], |
170 | | - { sourcemaps: true } |
171 | | - ) |
172 | | - .pipe( |
173 | | - terser({ |
174 | | - format: { comments: false }, |
175 | | - sourceMap: { |
176 | | - includeSources: true |
177 | | - }, |
178 | | - |
179 | | - // Compatibility workarounds |
180 | | - ecma: 5, |
181 | | - safari10: true |
182 | | - }) |
183 | | - ) |
184 | | - .pipe( |
185 | | - rename({ |
186 | | - suffix: `-${version}.min` |
187 | | - }) |
188 | | - ) |
189 | | - .pipe( |
190 | | - gulp.dest('dist/', { |
191 | | - sourcemaps: '.' |
192 | | - }) |
193 | | - ) |
194 | | -} |
195 | | - |
196 | | -/** |
197 | | - * Assets tasks |
198 | | - */ |
199 | | - |
200 | | -/** |
201 | | - * Copy assets such as icons and images into the distribution |
202 | | - */ |
203 | | -function assets() { |
204 | | - return gulp |
205 | | - .src('packages/assets/**', { encoding: false }) |
206 | | - .pipe(gulp.dest('dist/assets/')) |
207 | | -} |
208 | | - |
209 | | -/** |
210 | | - * Release tasks |
211 | | - */ |
212 | | - |
213 | | -/* Copy JS files into their relevant folders */ |
214 | | -function jsFolder() { |
215 | | - return gulp.src('dist/*.min.{js,js.map}').pipe(gulp.dest('dist/js/')) |
216 | | -} |
217 | | - |
218 | | -/* Copy CSS files into their relevant folders */ |
219 | | - |
220 | | -function cssFolder() { |
221 | | - return gulp.src('dist/*.min.{css,css.map}').pipe(gulp.dest('dist/css/')) |
222 | | -} |
223 | | - |
224 | | -async function createZip() { |
225 | | - const { default: zip } = await import('gulp-zip') |
226 | | - |
227 | | - return gulp |
228 | | - .src( |
229 | | - [ |
230 | | - 'dist/css/*.min.{css,css.map}', |
231 | | - 'dist/js/*.min.{js,js.map}', |
232 | | - 'dist/assets/**' |
233 | | - ], |
234 | | - { |
235 | | - base: 'dist', |
236 | | - encoding: false |
237 | | - } |
238 | | - ) |
239 | | - .pipe(zip(`nhsuk-frontend-${version}.zip`)) |
240 | | - .pipe(gulp.dest('dist')) |
241 | | -} |
| 4 | +const { |
| 5 | + buildHTML, |
| 6 | + validateHTML, |
| 7 | + copyCSS, |
| 8 | + copyJS, |
| 9 | + copyBinaryAssets, |
| 10 | + serve |
| 11 | +} = require('./shared/tasks/app') |
| 12 | +const { clean } = require('./shared/tasks/clean') |
| 13 | +const { |
| 14 | + assets, |
| 15 | + cssFolder, |
| 16 | + jsFolder, |
| 17 | + createZip |
| 18 | +} = require('./shared/tasks/release') |
| 19 | +const { webpackJS, minifyJS } = require('./shared/tasks/scripts') |
| 20 | +const { compileCSS, minifyCSS } = require('./shared/tasks/styles') |
242 | 21 |
|
243 | 22 | /** |
244 | 23 | * Development tasks |
@@ -273,6 +52,27 @@ gulp.task('watch', () => |
273 | 52 | ]) |
274 | 53 | ) |
275 | 54 |
|
| 55 | +/** |
| 56 | + * Docs tasks |
| 57 | + */ |
| 58 | + |
| 59 | +gulp.task( |
| 60 | + 'docs:build', |
| 61 | + gulp.series([copyCSS, copyJS, copyBinaryAssets, buildHTML, validateHTML]) |
| 62 | +) |
| 63 | + |
| 64 | +gulp.task('docs:watch', () => |
| 65 | + Promise.all([ |
| 66 | + gulp.watch(['**/*.njk'], buildHTML), |
| 67 | + gulp.watch(['dist/**/*.html']).on('change', browserSync.reload), |
| 68 | + gulp.watch(['dist/*.min.{css,css.map}'], copyCSS), |
| 69 | + gulp.watch(['dist/*.min.{js,js.map}'], copyJS), |
| 70 | + gulp.watch(['packages/assets/**/*'], copyBinaryAssets) |
| 71 | + ]) |
| 72 | +) |
| 73 | + |
| 74 | +gulp.task('docs:serve', gulp.series([serve])) |
| 75 | + |
276 | 76 | /** |
277 | 77 | * The default task is to serve the docs and watch for changes |
278 | 78 | */ |
|
0 commit comments