Repository navigation
Expand file tree
/
Copy pathgulpfile.js
More file actions
130 lines (109 loc) · 4.09 KB
/
Copy pathgulpfile.js
File metadata and controls
130 lines (109 loc) · 4.09 KB
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
const path = require('path')
const fs = require('fs')
const { mkdir, rm, writeFile } = require('node:fs/promises')
const gulp = require('gulp')
const git = require('gulp-git')
const shell = require('gulp-shell')
// С версии 0.15 gulp-esbuild экспортирует именованные функции вместо самого
// себя, а entryPoints и outfile стали обязательными: раньше точка входа
// бралась из потока gulp. Без них поток молча повисает, и gulp сообщает
// только «Did you forget to signal async completion?».
const { gulpEsbuild } = require('gulp-esbuild')
// gulp-rev 12 и gulp-rev-rewrite 7 собраны как ESM: при require() приезжает
// пространство имён с __esModule, а сама функция лежит в default.
const rev = require('gulp-rev').default
const revRewrite = require('gulp-rev-rewrite').default
const { contentRepGithub, contentRepFolders } = require(path.join(__dirname, 'config/constants'))
const { styleEntries, bundleStyle } = require(path.join(__dirname, 'config/css'))
// Раньше здесь был пакет del. С 7-й версии он ESM-only и больше не callable
// (экспортирует deleteAsync/deleteSync), а обе площадки вызова передавали
// обычные пути без глобов — то есть ровно то, что умеет родной fs.rm.
const removePaths = (paths) => Promise.all(paths.map((target) => rm(target, { recursive: true, force: true })))
const cloneContent = () => git.clone(contentRepGithub)
const makeLinks = shell.task(`node make-links.js --default`, {
env: {
PATH_TO_CONTENT: path.join(__dirname, 'content'),
PATH: process.env.PATH,
},
})
// Styles
// lightningcss сам собирает @import, ставит префиксы и минифицирует, поэтому
// gulp-поток здесь не нужен: точки входа известны, файлы он читает с диска.
const styles = async () => {
await mkdir('dist/styles', { recursive: true })
await Promise.all(
styleEntries.map((entry) =>
writeFile(path.join('dist/styles', entry), bundleStyle(path.join('src/styles', entry))),
),
)
}
// Scripts
const sw = () => {
return gulp
.src('src/sw.js')
.pipe(
gulpEsbuild({
entryPoints: ['src/sw.js'],
outfile: 'sw.js',
target: 'es2015',
minify: true,
}),
)
.pipe(gulp.dest('dist/'))
}
const scripts = () => {
return gulp
.src('src/scripts/index.js')
.pipe(
gulpEsbuild({
entryPoints: ['src/scripts/index.js'],
outfile: 'index.js',
target: 'es2015',
bundle: true,
minify: true,
plugins: [
{
name: 'node-modules-resolution',
setup(build) {
build.onResolve({ filter: /^\// }, (args) => {
const cwd = process.cwd()
const newPath = args.path.includes(cwd) ? args.path : path.join(cwd, 'node_modules', args.path)
return {
path: newPath,
}
})
},
},
],
}),
)
.pipe(gulp.dest('dist/scripts'))
}
// Clean
const clean = () => {
return removePaths(['dist/styles', 'dist/scripts', 'dist/sw.js'])
}
// Cache
const cacheHash = () => {
return gulp
.src('dist/**/*.{css,js}')
.pipe(rev())
.pipe(gulp.dest('dist'))
.pipe(rev.manifest('rev-manifset.json'))
.pipe(gulp.dest('dist'))
}
const cacheReplace = () => {
return gulp
.src('dist/**/*.{html,css,svg}')
.pipe(
revRewrite({
manifest: fs.readFileSync('dist/rev-manifset.json'),
}),
)
.pipe(gulp.dest('dist'))
}
const cache = gulp.series(cacheHash, cacheReplace)
exports.setupContent = gulp.series(cloneContent, makeLinks)
exports.dropContent = () => removePaths(['content', ...contentRepFolders.map((folder) => `src/${folder}`)])
// Default
exports.default = gulp.series(clean, styles, scripts, sw, cache)