Updated for Ghost 5
[ghost-theme-lbbg.git] / gulpfile.js
1 const {series, watch, src, dest, parallel} = require('gulp');
2 const pump = require('pump');
3 const path = require('path');
4 const releaseUtils = require('@tryghost/release-utils');
5 const inquirer = require('inquirer');
6
7 // gulp plugins and utils
8 const livereload = require('gulp-livereload');
9 const postcss = require('gulp-postcss');
10 const zip = require('gulp-zip');
11 const concat = require('gulp-concat');
12 const uglify = require('gulp-uglify');
13 const beeper = require('beeper');
14 const fs = require('fs');
15
16 // postcss plugins
17 const autoprefixer = require('autoprefixer');
18 const colorFunction = require('postcss-color-mod-function');
19 const cssnano = require('cssnano');
20 const easyimport = require('postcss-easy-import');
21
22 const REPO = 'TryGhost/Casper';
23 const REPO_READONLY = 'TryGhost/Casper';
24 const CHANGELOG_PATH = path.join(process.cwd(), '.', 'changelog.md');
25
26 function serve(done) {
27 livereload.listen();
28 done();
29 }
30
31 const handleError = (done) => {
32 return function (err) {
33 if (err) {
34 beeper();
35 }
36 return done(err);
37 };
38 };
39
40 function hbs(done) {
41 pump([
42 src(['*.hbs', 'partials/**/*.hbs']),
43 livereload()
44 ], handleError(done));
45 }
46
47 function css(done) {
48 pump([
49 src('assets/css/*.css', {sourcemaps: true}),
50 postcss([
51 easyimport,
52 colorFunction(),
53 autoprefixer(),
54 cssnano()
55 ]),
56 dest('assets/built/', {sourcemaps: '.'}),
57 livereload()
58 ], handleError(done));
59 }
60
61 function js(done) {
62 pump([
63 src([
64 // pull in lib files first so our own code can depend on it
65 'assets/js/lib/*.js',
66 'assets/js/*.js'
67 ], {sourcemaps: true}),
68 concat('casper.js'),
69 uglify(),
70 dest('assets/built/', {sourcemaps: '.'}),
71 livereload()
72 ], handleError(done));
73 }
74
75 function zipper(done) {
76 const filename = require('./package.json').name + '.zip';
77
78 pump([
79 src([
80 '**',
81 '!node_modules', '!node_modules/**',
82 '!dist', '!dist/**',
83 '!yarn-error.log',
84 '!yarn.lock',
85 '!gulpfile.js'
86 ]),
87 zip(filename),
88 dest('dist/')
89 ], handleError(done));
90 }
91
92 const cssWatcher = () => watch('assets/css/**', css);
93 const hbsWatcher = () => watch(['*.hbs', 'partials/**/*.hbs'], hbs);
94 const watcher = parallel(cssWatcher, hbsWatcher);
95 const build = series(css, js);
96
97 exports.build = build;
98 exports.zip = series(build, zipper);
99 exports.default = series(build, serve, watcher);
100
101 exports.release = async () => {
102 // @NOTE: https://yarnpkg.com/lang/en/docs/cli/version/
103 // require(./package.json) can run into caching issues, this re-reads from file everytime on release
104 let packageJSON = JSON.parse(fs.readFileSync('./package.json'));
105 const newVersion = packageJSON.version;
106
107 if (!newVersion || newVersion === '') {
108 console.log(`Invalid version: ${newVersion}`);
109 return;
110 }
111
112 console.log(`\nCreating release for ${newVersion}...`);
113
114 const githubToken = process.env.GST_TOKEN;
115
116 if (!githubToken) {
117 console.log('Please configure your environment with a GitHub token located in GST_TOKEN');
118 return;
119 }
120
121 try {
122 const result = await inquirer.prompt([{
123 type: 'input',
124 name: 'compatibleWithGhost',
125 message: 'Which version of Ghost is it compatible with?',
126 default: '4.0.0'
127 }]);
128
129 const compatibleWithGhost = result.compatibleWithGhost;
130
131 const releasesResponse = await releaseUtils.releases.get({
132 userAgent: 'Casper',
133 uri: `https://api.github.com/repos/${REPO_READONLY}/releases`
134 });
135
136 if (!releasesResponse || !releasesResponse) {
137 console.log('No releases found. Skipping...');
138 return;
139 }
140
141 let previousVersion = releasesResponse[0].tag_name || releasesResponse[0].name;
142 console.log(`Previous version: ${previousVersion}`);
143
144 const changelog = new releaseUtils.Changelog({
145 changelogPath: CHANGELOG_PATH,
146 folder: path.join(process.cwd(), '.')
147 });
148
149 changelog
150 .write({
151 githubRepoPath: `https://github.com/${REPO}`,
152 lastVersion: previousVersion
153 })
154 .sort()
155 .clean();
156
157 const newReleaseResponse = await releaseUtils.releases.create({
158 draft: true,
159 preRelease: false,
160 tagName: 'v' + newVersion,
161 releaseName: newVersion,
162 userAgent: 'Casper',
163 uri: `https://api.github.com/repos/${REPO}/releases`,
164 github: {
165 token: githubToken
166 },
167 content: [`**Compatible with Ghost ≥ ${compatibleWithGhost}**\n\n`],
168 changelogPath: CHANGELOG_PATH
169 });
170 console.log(`\nRelease draft generated: ${newReleaseResponse.releaseUrl}\n`);
171 } catch (err) {
172 console.error(err);
173 process.exit(1);
174 }
175 };