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');
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');
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');
22 const REPO
= 'TryGhost/Casper';
23 const REPO_READONLY
= 'TryGhost/Casper';
24 const CHANGELOG_PATH
= path
.join(process
.cwd(), '.', 'changelog.md');
26 function serve(done
) {
31 const handleError
= (done
) => {
32 return function (err
) {
42 src(['*.hbs', 'partials/**/*.hbs']),
44 ], handleError(done
));
49 src('assets/css/*.css', {sourcemaps
: true}),
56 dest('assets/built/', {sourcemaps
: '.'}),
58 ], handleError(done
));
64 // pull in lib files first so our own code can depend on it
67 ], {sourcemaps
: true}),
70 dest('assets/built/', {sourcemaps
: '.'}),
72 ], handleError(done
));
75 function zipper(done
) {
76 const filename
= require('./package.json').name
+ '.zip';
81 '!node_modules', '!node_modules/**',
89 ], handleError(done
));
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
);
97 exports
.build
= build
;
98 exports
.zip
= series(build
, zipper
);
99 exports
.default = series(build
, serve
, watcher
);
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
;
107 if (!newVersion
|| newVersion
=== '') {
108 console
.log(`Invalid version: ${newVersion}`);
112 console
.log(`\nCreating release for ${newVersion}...`);
114 const githubToken
= process
.env
.GST_TOKEN
;
117 console
.log('Please configure your environment with a GitHub token located in GST_TOKEN');
122 const result
= await inquirer
.prompt([{
124 name
: 'compatibleWithGhost',
125 message
: 'Which version of Ghost is it compatible with?',
129 const compatibleWithGhost
= result
.compatibleWithGhost
;
131 const releasesResponse
= await releaseUtils
.releases
.get({
133 uri
: `https://api.github.com/repos/${REPO_READONLY}/releases`
136 if (!releasesResponse
|| !releasesResponse
) {
137 console
.log('No releases found. Skipping...');
141 let previousVersion
= releasesResponse
[0].tag_name
|| releasesResponse
[0].name
;
142 console
.log(`Previous version: ${previousVersion}`);
144 const changelog
= new releaseUtils
.Changelog({
145 changelogPath
: CHANGELOG_PATH
,
146 folder
: path
.join(process
.cwd(), '.')
151 githubRepoPath
: `https://github.com/${REPO}`,
152 lastVersion
: previousVersion
157 const newReleaseResponse
= await releaseUtils
.releases
.create({
160 tagName
: 'v' + newVersion
,
161 releaseName
: newVersion
,
163 uri
: `https://api.github.com/repos/${REPO}/releases`,
167 content
: [`**Compatible with Ghost ≥ ${compatibleWithGhost}**\n\n`],
168 changelogPath
: CHANGELOG_PATH
170 console
.log(`\nRelease draft generated: ${newReleaseResponse.releaseUrl}\n`);