Repository navigation
Expand file tree
/
Copy pathgulpfile.js
More file actions
128 lines (115 loc) · 2.93 KB
/
Copy pathgulpfile.js
File metadata and controls
128 lines (115 loc) · 2.93 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
/*
Gulp build for Ghost theme
- Processes PostCSS from assets/css/screen.css → assets/built/screen.css
- Autoprefixes and minifies in production
- Generates sourcemaps in development
- Live reloads with BrowserSync (proxying local Ghost)
- Creates distributable zip with versioned filename
*/
const { src, dest, watch, series, parallel } = require("gulp");
const postcss = require("gulp-postcss");
const sourcemaps = require("gulp-sourcemaps");
const cssnano = require("cssnano");
const autoprefixer = require("autoprefixer");
const postcssImport = require("postcss-import");
const postcssNested = require("postcss-nested");
const browserSync = require("browser-sync").create();
const zipModule = require("gulp-zip");
const zip = typeof zipModule === "function" ? zipModule : zipModule.default;
const { deleteAsync } = require("del");
const fs = require("fs");
const path = require("path");
const isProduction = process.env.NODE_ENV === "production";
const paths = {
css: {
src: "assets/css/screen.css",
watch: "assets/css/**/*.css",
dest: "assets/built/",
},
hbs: ["**/*.hbs"],
dist: "dist/",
};
function styles() {
const plugins = [postcssImport(), postcssNested(), autoprefixer()];
if (isProduction) {
plugins.push(cssnano());
}
return src(paths.css.src)
.pipe(
isProduction
? require("stream").PassThrough({ objectMode: true })
: sourcemaps.init()
)
.pipe(postcss(plugins))
.pipe(
isProduction
? require("stream").PassThrough({ objectMode: true })
: sourcemaps.write(".")
)
.pipe(dest(paths.css.dest))
.pipe(browserSync.stream({ match: "**/*.css" }));
}
function serve(done) {
browserSync.init({
proxy: "http://localhost:2368",
open: false,
notify: false,
ghostMode: false,
ui: false,
});
done();
}
function watcher() {
watch(paths.css.watch, styles);
watch(paths.hbs).on("change", browserSync.reload);
}
function cleanDist() {
return deleteAsync([paths.dist]);
}
function zipTheme() {
const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, "package.json")));
const filename = `${pkg.name}-${pkg.version}.zip`;
return src(
[
"**/*",
"!node_modules/**",
"!dist/**",
"!.git/**",
"!.gitignore",
"!.DS_Store",
"!pnpm-lock.yaml",
"!package-lock.json",
"!yarn.lock",
"!**/*.map",
],
{ dot: true }
)
.pipe(zip(filename))
.pipe(dest(paths.dist));
}
const build = series(() => {
process.env.NODE_ENV = process.env.NODE_ENV || "production";
return Promise.resolve();
}, styles);
const dev = series(
() => {
process.env.NODE_ENV = "development";
return Promise.resolve();
},
styles,
serve,
watcher
);
const zipTask = series(
() => {
process.env.NODE_ENV = "production";
return Promise.resolve();
},
styles,
cleanDist,
zipTheme
);
exports.styles = styles;
exports.dev = dev;
exports.build = build;
exports.zip = zipTask;