ant-design-vue/antd-tools/gulpfile.js

353 lines
9.5 KiB
JavaScript
Raw Normal View History

2019-01-12 11:33:27 +08:00
'use strict';
2018-03-18 19:59:38 +08:00
// const install = require('./install')
2019-01-12 11:33:27 +08:00
const runCmd = require('./runCmd');
const getBabelCommonConfig = require('./getBabelCommonConfig');
const merge2 = require('merge2');
const { execSync } = require('child_process');
const through2 = require('through2');
const transformLess = require('./transformLess');
const webpack = require('webpack');
const babel = require('gulp-babel');
const argv = require('minimist')(process.argv.slice(2));
const GitHub = require('@octokit/rest');
2018-03-18 19:59:38 +08:00
2019-01-12 11:33:27 +08:00
const packageJson = require(`${process.cwd()}/package.json`);
2018-03-18 19:59:38 +08:00
// const getNpm = require('./getNpm')
// const selfPackage = require('../package.json')
2019-01-12 11:33:27 +08:00
const chalk = require('chalk');
const getNpmArgs = require('./utils/get-npm-args');
const getChangelog = require('./utils/getChangelog');
const path = require('path');
2018-03-18 19:59:38 +08:00
// const watch = require('gulp-watch')
2019-01-12 11:33:27 +08:00
const gulp = require('gulp');
const fs = require('fs');
const rimraf = require('rimraf');
const replaceLib = require('./replaceLib');
const stripCode = require('gulp-strip-code');
const compareVersions = require('compare-versions');
2018-03-18 19:59:38 +08:00
2019-01-12 11:33:27 +08:00
const cwd = process.cwd();
const libDir = path.join(cwd, 'lib');
const esDir = path.join(cwd, 'es');
2018-03-18 19:59:38 +08:00
2019-01-12 11:33:27 +08:00
function dist(done) {
rimraf.sync(path.join(cwd, 'dist'));
process.env.RUN_ENV = 'PRODUCTION';
const webpackConfig = require(path.join(cwd, 'webpack.build.config.js'));
2018-03-18 19:59:38 +08:00
webpack(webpackConfig, (err, stats) => {
if (err) {
2019-01-12 11:33:27 +08:00
console.error(err.stack || err);
2018-03-18 19:59:38 +08:00
if (err.details) {
2019-01-12 11:33:27 +08:00
console.error(err.details);
2018-03-18 19:59:38 +08:00
}
2019-01-12 11:33:27 +08:00
return;
2018-03-18 19:59:38 +08:00
}
2019-01-12 11:33:27 +08:00
const info = stats.toJson();
2018-03-18 19:59:38 +08:00
if (stats.hasErrors()) {
2019-01-12 11:33:27 +08:00
console.error(info.errors);
2018-03-18 19:59:38 +08:00
}
if (stats.hasWarnings()) {
2019-01-12 11:33:27 +08:00
console.warn(info.warnings);
2018-03-18 19:59:38 +08:00
}
const buildInfo = stats.toString({
colors: true,
children: true,
chunks: false,
modules: false,
chunkModules: false,
hash: false,
version: false,
2019-01-12 11:33:27 +08:00
});
console.log(buildInfo);
done(0);
});
2018-03-18 19:59:38 +08:00
}
2019-01-12 11:33:27 +08:00
function babelify(js, modules) {
const babelConfig = getBabelCommonConfig(modules);
babelConfig.babelrc = false;
delete babelConfig.cacheDirectory;
2018-03-19 17:51:47 +08:00
if (modules === false) {
2019-01-12 11:33:27 +08:00
babelConfig.plugins.push(replaceLib);
2018-03-19 17:51:47 +08:00
} else {
2019-01-12 11:33:27 +08:00
babelConfig.plugins.push(require.resolve('babel-plugin-add-module-exports'));
2018-03-19 17:51:47 +08:00
}
2019-01-12 11:33:27 +08:00
let stream = js.pipe(babel(babelConfig)).pipe(
through2.obj(function z(file, encoding, next) {
this.push(file.clone());
2018-05-02 10:13:46 +08:00
if (file.path.match(/\/style\/index\.(js|jsx)$/)) {
2019-01-12 11:33:27 +08:00
const content = file.contents.toString(encoding);
file.contents = Buffer.from(
content.replace(/\/style\/?'/g, "/style/css'").replace(/\.less/g, '.css'),
);
file.path = file.path.replace(/index\.(js|jsx)$/, 'css.js');
this.push(file);
next();
2018-03-19 17:51:47 +08:00
} else {
2019-01-12 11:33:27 +08:00
next();
2018-03-19 17:51:47 +08:00
}
2019-01-12 11:33:27 +08:00
}),
);
2018-03-19 17:51:47 +08:00
if (modules === false) {
2019-01-12 11:33:27 +08:00
stream = stream.pipe(
stripCode({
start_comment: '@remove-on-es-build-begin',
end_comment: '@remove-on-es-build-end',
}),
);
2018-03-19 17:51:47 +08:00
}
2019-01-12 11:33:27 +08:00
return stream.pipe(gulp.dest(modules === false ? esDir : libDir));
2018-03-19 17:51:47 +08:00
}
2019-01-12 11:33:27 +08:00
function compile(modules) {
rimraf.sync(modules !== false ? libDir : esDir);
const less = gulp
.src(['components/**/*.less'])
.pipe(
through2.obj(function(file, encoding, next) {
this.push(file.clone());
if (
file.path.match(/\/style\/index\.less$/) ||
file.path.match(/\/style\/v2-compatible-reset\.less$/)
) {
transformLess(file.path)
.then(css => {
file.contents = Buffer.from(css);
file.path = file.path.replace(/\.less$/, '.css');
this.push(file);
next();
})
.catch(e => {
console.error(e);
});
} else {
next();
}
}),
)
.pipe(gulp.dest(modules === false ? esDir : libDir));
const assets = gulp
.src(['components/**/*.@(png|svg)'])
.pipe(gulp.dest(modules === false ? esDir : libDir));
2018-03-19 17:51:47 +08:00
2019-01-12 11:33:27 +08:00
const source = ['components/**/*.js', 'components/**/*.jsx', '!components/*/__tests__/*'];
const jsFilesStream = babelify(gulp.src(source), modules);
return merge2([less, jsFilesStream, assets]);
2018-03-19 17:51:47 +08:00
}
2019-01-12 11:33:27 +08:00
function tag() {
console.log('tagging');
const { version } = packageJson;
execSync(`git config --global user.email ${process.env.GITHUB_USER_EMAIL}`);
execSync(`git config --global user.name ${process.env.GITHUB_USER_NAME}`);
execSync(`git tag ${version}`);
execSync(
`git push https://${
process.env.GITHUB_TOKEN
}@github.com/vueComponent/ant-design-vue.git ${version}:${version}`,
);
execSync(
`git push https://${
process.env.GITHUB_TOKEN
}@github.com/vueComponent/ant-design-vue.git master:master`,
);
console.log('tagged');
2018-04-21 18:41:13 +08:00
}
2019-01-12 11:33:27 +08:00
function githubRelease(done) {
2018-04-21 18:41:13 +08:00
const changlogFiles = [
path.join(cwd, 'CHANGELOG.en-US.md'),
path.join(cwd, 'CHANGELOG.zh-CN.md'),
2019-01-12 11:33:27 +08:00
];
console.log('creating release on GitHub');
2018-04-21 18:41:13 +08:00
if (!process.env.GITHUB_TOKEN) {
2019-01-12 11:33:27 +08:00
console.log('no GitHub token found, skip');
return;
2018-04-21 18:41:13 +08:00
}
if (!changlogFiles.every(file => fs.existsSync(file))) {
2019-01-12 11:33:27 +08:00
console.log('no changelog found, skip');
return;
2018-04-21 18:41:13 +08:00
}
2019-01-12 11:33:27 +08:00
const github = new GitHub();
2018-04-21 18:41:13 +08:00
github.authenticate({
type: 'oauth',
token: process.env.GITHUB_TOKEN,
2019-01-12 11:33:27 +08:00
});
const date = new Date();
const { version } = packageJson;
const enChangelog = getChangelog(changlogFiles[0], version);
const cnChangelog = getChangelog(changlogFiles[1], version);
2018-04-21 18:41:13 +08:00
const changelog = [
`\`${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}\``,
enChangelog,
'\n',
'---',
'\n',
cnChangelog,
2019-01-12 11:33:27 +08:00
].join('\n');
2018-04-21 18:41:13 +08:00
const [_, owner, repo] = execSync('git remote get-url origin') // eslint-disable-line
.toString()
2019-01-12 11:33:27 +08:00
.match(/github.com[:/](.+)\/(.+)\.git/);
github.repos
.createRelease({
owner,
repo,
tag_name: version,
name: version,
body: changelog,
})
.then(() => {
done();
});
2018-04-21 18:41:13 +08:00
}
2018-07-27 21:42:45 +08:00
2019-01-12 11:33:27 +08:00
gulp.task('tag', done => {
tag();
githubRelease(done);
});
2018-07-27 21:42:45 +08:00
2019-01-12 11:33:27 +08:00
gulp.task('check-git', done => {
2018-04-21 18:41:13 +08:00
runCmd('git', ['status', '--porcelain'], (code, result) => {
if (/^\?\?/m.test(result)) {
return done(`There are untracked files in the working tree.\n${result}
2019-01-12 11:33:27 +08:00
`);
2018-04-21 18:41:13 +08:00
}
if (/^([ADRM]| [ADRM])/m.test(result)) {
return done(`There are uncommitted changes in the working tree.\n${result}
2019-01-12 11:33:27 +08:00
`);
2018-04-21 18:41:13 +08:00
}
2019-01-12 11:33:27 +08:00
return done();
});
});
2018-04-21 18:41:13 +08:00
2019-01-12 11:33:27 +08:00
function publish(tagString, done) {
let args = ['publish', '--with-antd-tools'];
2018-04-21 18:41:13 +08:00
if (tagString) {
2019-01-12 11:33:27 +08:00
args = args.concat(['--tag', tagString]);
2018-04-21 18:41:13 +08:00
}
2019-01-12 11:33:27 +08:00
const publishNpm = process.env.PUBLISH_NPM_CLI || 'npm';
runCmd(publishNpm, args, code => {
tag();
2018-07-21 16:13:54 +08:00
githubRelease(() => {
2019-01-12 11:33:27 +08:00
done(code);
});
});
2018-04-21 18:41:13 +08:00
}
2019-01-12 11:33:27 +08:00
function pub(done) {
dist(code => {
2018-04-21 18:41:13 +08:00
if (code) {
2019-01-12 11:33:27 +08:00
done(code);
return;
2018-04-21 18:41:13 +08:00
}
2019-01-12 11:33:27 +08:00
const notOk = !packageJson.version.match(/^\d+\.\d+\.\d+$/);
let tagString;
2018-04-21 18:41:13 +08:00
if (argv['npm-tag']) {
2019-01-12 11:33:27 +08:00
tagString = argv['npm-tag'];
2018-04-21 18:41:13 +08:00
}
if (!tagString && notOk) {
2019-01-12 11:33:27 +08:00
tagString = 'next';
2018-04-21 18:41:13 +08:00
}
if (packageJson.scripts['pre-publish']) {
2019-01-12 11:33:27 +08:00
runCmd('npm', ['run', 'pre-publish'], code2 => {
2018-04-21 18:41:13 +08:00
if (code2) {
2019-01-12 11:33:27 +08:00
done(code2);
return;
2018-04-21 18:41:13 +08:00
}
2019-01-12 11:33:27 +08:00
publish(tagString, done);
});
2018-04-21 18:41:13 +08:00
} else {
2019-01-12 11:33:27 +08:00
publish(tagString, done);
2018-04-21 18:41:13 +08:00
}
2019-01-12 11:33:27 +08:00
});
2018-04-21 18:41:13 +08:00
}
2019-01-12 11:33:27 +08:00
gulp.task('dist', ['compile'], done => {
dist(done);
});
gulp.task('compile', ['compile-with-es'], done => {
compile().on('finish', function() {
done();
});
});
gulp.task('compile-with-es', done => {
compile(false).on('finish', function() {
done();
});
});
2018-04-21 18:41:13 +08:00
2019-01-12 11:33:27 +08:00
gulp.task('pub', ['check-git', 'compile'], done => {
2018-05-08 11:49:56 +08:00
if (!process.env.GITHUB_TOKEN) {
2019-01-12 11:33:27 +08:00
console.log('no GitHub token found, skip');
2018-05-08 11:49:56 +08:00
} else {
2019-01-12 11:33:27 +08:00
pub(done);
2018-05-08 11:49:56 +08:00
}
2019-01-12 11:33:27 +08:00
});
2018-04-21 18:41:13 +08:00
2019-01-12 11:33:27 +08:00
gulp.task('pub-with-ci', done => {
2018-07-21 13:52:21 +08:00
if (!process.env.NPM_TOKEN) {
2019-01-12 11:33:27 +08:00
console.log('no NPM token found, skip');
2018-07-21 12:36:49 +08:00
} else {
2019-01-12 11:33:27 +08:00
const github = new GitHub();
2018-07-21 12:36:49 +08:00
github.authenticate({
type: 'oauth',
token: process.env.GITHUB_TOKEN,
2019-01-12 11:33:27 +08:00
});
2018-07-21 12:36:49 +08:00
const [_, owner, repo] = execSync('git remote get-url origin') // eslint-disable-line
.toString()
2019-01-12 11:33:27 +08:00
.match(/github.com[:/](.+)\/(.+)\.git/);
2018-07-21 12:36:49 +08:00
const getLatestRelease = github.repos.getLatestRelease({
owner,
repo,
2019-01-12 11:33:27 +08:00
});
2018-07-21 12:36:49 +08:00
const getCommits = github.repos.getCommits({
owner,
repo,
per_page: 1,
2019-01-12 11:33:27 +08:00
});
2018-07-21 12:36:49 +08:00
Promise.all([getLatestRelease, getCommits]).then(([latestRelease, commits]) => {
2019-01-12 11:33:27 +08:00
const preVersion = latestRelease.data.tag_name;
const { version } = packageJson;
const [_, newVersion] = commits.data[0].commit.message.trim().match(/bump (.+)/) || []; // eslint-disable-line
if (
compareVersions(version, preVersion) === 1 &&
newVersion &&
newVersion.trim() === version
) {
gulp.run('pub', err => {
err && console.log('err', err);
done();
});
2018-07-21 12:36:49 +08:00
} else {
2019-01-12 11:33:27 +08:00
console.log('donot need publish' + version);
2018-07-21 12:36:49 +08:00
}
2019-01-12 11:33:27 +08:00
});
2018-07-21 12:36:49 +08:00
}
2019-01-12 11:33:27 +08:00
});
2018-07-21 12:36:49 +08:00
2019-01-12 11:33:27 +08:00
function reportError() {
console.log(chalk.bgRed('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'));
console.log(chalk.bgRed('!! `npm publish` is forbidden for this package. !!'));
console.log(chalk.bgRed('!! Use `npm run pub` instead. !!'));
console.log(chalk.bgRed('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'));
2018-04-21 18:41:13 +08:00
}
2019-01-12 11:33:27 +08:00
gulp.task('guard', done => {
const npmArgs = getNpmArgs();
2018-04-21 18:41:13 +08:00
if (npmArgs) {
for (let arg = npmArgs.shift(); arg; arg = npmArgs.shift()) {
if (/^pu(b(l(i(sh?)?)?)?)?$/.test(arg) && npmArgs.indexOf('--with-antd-tools') < 0) {
2019-01-12 11:33:27 +08:00
reportError();
done(1);
return;
2018-04-21 18:41:13 +08:00
}
}
}
2019-01-12 11:33:27 +08:00
done();
});