-
Notifications
You must be signed in to change notification settings - Fork 15
/
gulpfile.js
150 lines (137 loc) · 5.22 KB
/
gulpfile.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/* @author Ulrik Moe */
/* eslint-env node */
const fs = require('fs');
const Path = require('path');
const gulp = require('gulp');
const connect = require('gulp-connect');
const mo3 = require('mo3place')();
const through = require('through2');
const sass = require('gulp-sass')(require('sass'));
const concat = require('gulp-concat');
const sourcemaps = require('gulp-sourcemaps');
const applySourceMap = require('vinyl-sourcemaps-apply');
const terser = require("terser");
const htmlmin = require("html-minifier");
const { ESLint } = require("eslint");
const eslint = new ESLint();
const config = require('./config.json');
const env = require('minimist')(process.argv.slice(2));
env.gitStamp = env.gitStamp || '1';
env.cssStamp = env.cssStamp || '1';
// Last changed
const months = ['jan', 'feb', 'mar', 'apr', 'maj', 'juni',
'juli', 'aug', 'sept', 'okt', 'nov', 'dec'];
const date = new Date();
env.lastUpdate = date.getDate() + '. ' + months[date.getMonth()] + ', ' +
date.getFullYear();
let currency_values = "'EUR':1,"
async function getCurrencyRates() {
const raw = await fetch('https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml');
const txt = await raw.text();
const array = [...txt.matchAll(/currency='([A-Z]{3})' rate='([0-9.]+)'/g)];
array.forEach((m) => currency_values += `'${m[1]}':${parseFloat(m[2])},`);
return currency_values;
}
function assets() {
return gulp.src(['src/assets/**'], { base: 'src/assets' })
.pipe(gulp.dest('www'))
.pipe(connect.reload());
}
function css() {
return gulp.src(['src/css/**.scss'], { base: 'src/css' })
.pipe(sourcemaps.init())
.pipe(sass({ outputStyle: 'compressed' }).on('error', sass.logError))
.pipe(sourcemaps.write('.'))
.pipe(gulp.dest('www/css'))
.pipe(connect.reload());
}
function scripts() {
return gulp.src(['src/js/data/dk.js', 'src/js/currency.js',
'src/js/tools.js', 'src/js/main.js'])
.pipe(through.obj((file, enc, cb) => {
let str = file.contents.toString();
if (file.path.slice(-11) === 'currency.js') {
str = str.replace("currency_values = {}", "currency_values = {" + currency_values + "}");
}
file.contents = Buffer.from(mo3.fromString(str, env), 'utf-8');
cb(null, file);
}))
.pipe(sourcemaps.init())
.pipe(concat('all.js'))
.pipe(through.obj(async (file, enc, cb) => {
const str = file.contents.toString();
const results = await eslint.lintText(str);
if (results[0].warningCount || results[0].errorCount) {
const formatter = await eslint.loadFormatter("stylish");
console.error(formatter.format(results)); // output ESlint errors
}
const opts = { ...config.terser };
opts.sourceMap.filename = file.sourceMap.file;
opts.sourceMap.content = file.sourceMap;
const minified = await terser.minify(str, opts);
file.contents = Buffer.from(minified.code, 'utf-8');
applySourceMap(file, JSON.parse(minified.map))
cb(null, file);
}))
.pipe(sourcemaps.write('.'))
.pipe(gulp.dest('www/js/'))
.pipe(connect.reload());
}
function html() {
return gulp.src(['src/*.html'])
.pipe(through.obj((file, enc, cb) => {
file.contents = Buffer.from(
htmlmin.minify(
mo3.fromString(file.contents.toString(), env),
config.htmlmin
),
'utf-8'
);
file.stat.mtime = false; // bump to current time
cb(null, file);
}))
.pipe(gulp.dest('www'))
.pipe(connect.reload());
}
gulp.task('sitemap', (cb) => {
let map = '<?xml version="1.0" encoding="UTF-8"?>\n<urlset ' +
'xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
const pages = ['/', '/ofte-stillede-spørgsmål'];
for (const url of pages) {
const path = (url[url.length - 1] === '/') ?
url + 'index.html' : url + '.html';
let stat = fs.statSync(Path.join(__dirname, 'src', path));
if (url === '/') {
const jsStat = fs.statSync('www/js/all.js');
if (jsStat.mtimeMs > stat.mtimeMs) stat = jsStat;
}
map += `
<url>
<loc>https://kortgebyr.dk${url}</loc>
<lastmod>${stat.mtime.toISOString()}</lastmod>
</url>`
}
map += '\n</urlset>';
const fd = fs.openSync(Path.join(__dirname, 'www', 'sitemap.xml'), 'w');
fs.writeSync(fd, map);
fs.closeSync(fd);
cb(null);
});
gulp.task('serve', () => {
connect.server({
root: 'www',
livereload: true,
middleware: () => ([(req, res, next) => {
if (req.url.slice(-1) !== '/' && req.url.indexOf('.') === -1) {
req.url += '.html';
}
next();
}])
});
gulp.watch(['src/assets/**'], assets);
gulp.watch(['src/css/**'], css);
gulp.watch(['src/*.html'], html);
gulp.watch(['src/js/**/*.js'], gulp.series(scripts, html));
});
gulp.task('build', gulp.series(getCurrencyRates, assets, scripts, css, html, 'sitemap'));
gulp.task('default', gulp.series('build', 'serve'));