|
|
|
'use strict'
|
|
|
|
|
|
|
|
// const install = require('./install')
|
|
|
|
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')
|
|
|
|
|
|
|
|
const packageJson = require(`${process.cwd()}/package.json`)
|
|
|
|
// const getNpm = require('./getNpm')
|
|
|
|
// const selfPackage = require('../package.json')
|
|
|
|
const chalk = require('chalk')
|
|
|
|
const getNpmArgs = require('./utils/get-npm-args')
|
|
|
|
const getChangelog = require('./utils/getChangelog')
|
|
|
|
const path = require('path')
|
|
|
|
// const watch = require('gulp-watch')
|
|
|
|
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')
|
|
|
|
|
|
|
|
const cwd = process.cwd()
|
|
|
|
const libDir = path.join(cwd, 'lib')
|
|
|
|
const esDir = path.join(cwd, 'es')
|
|
|
|
|
|
|
|
function dist (done) {
|
|
|
|
rimraf.sync(path.join(cwd, 'dist'))
|
|
|
|
process.env.RUN_ENV = 'PRODUCTION'
|
|
|
|
const webpackConfig = require(path.join(cwd, 'webpack.build.config.js'))
|
|
|
|
webpack(webpackConfig, (err, stats) => {
|
|
|
|
if (err) {
|
|
|
|
console.error(err.stack || err)
|
|
|
|
if (err.details) {
|
|
|
|
console.error(err.details)
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
const info = stats.toJson()
|
|
|
|
|
|
|
|
if (stats.hasErrors()) {
|
|
|
|
console.error(info.errors)
|
|
|
|
}
|
|
|
|
|
|
|
|
if (stats.hasWarnings()) {
|
|
|
|
console.warn(info.warnings)
|
|
|
|
}
|
|
|
|
|
|
|
|
const buildInfo = stats.toString({
|
|
|
|
colors: true,
|
|
|
|
children: true,
|
|
|
|
chunks: false,
|
|
|
|
modules: false,
|
|
|
|
chunkModules: false,
|
|
|
|
hash: false,
|
|
|
|
version: false,
|
|
|
|
})
|
|
|
|
console.log(buildInfo)
|
|
|
|
done(0)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
function babelify (js, modules) {
|
|
|
|
const babelConfig = getBabelCommonConfig(modules)
|
|
|
|
babelConfig.babelrc = false
|
|
|
|
delete babelConfig.cacheDirectory
|
|
|
|
if (modules === false) {
|
|
|
|
babelConfig.plugins.push(replaceLib)
|
|
|
|
} else {
|
|
|
|
babelConfig.plugins.push(require.resolve('babel-plugin-add-module-exports'))
|
|
|
|
}
|
|
|
|
let stream = js.pipe(babel(babelConfig))
|
|
|
|
.pipe(through2.obj(function z (file, encoding, next) {
|
|
|
|
this.push(file.clone())
|
|
|
|
if (file.path.match(/\/style\/index\.(js|jsx)$/)) {
|
|
|
|
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()
|
|
|
|
} else {
|
|
|
|
next()
|
|
|
|
}
|
|
|
|
}))
|
|
|
|
if (modules === false) {
|
|
|
|
stream = stream.pipe(stripCode({
|
|
|
|
start_comment: '@remove-on-es-build-begin',
|
|
|
|
end_comment: '@remove-on-es-build-end',
|
|
|
|
}))
|
|
|
|
}
|
|
|
|
return stream.pipe(gulp.dest(modules === false ? esDir : libDir))
|
|
|
|
}
|
|
|
|
|
|
|
|
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))
|
|
|
|
|
|
|
|
const source = [
|
|
|
|
'components/**/*.js',
|
|
|
|
'components/**/*.jsx',
|
|
|
|
'!components/*/__tests__/*',
|
|
|
|
]
|
|
|
|
const jsFilesStream = babelify(gulp.src(source), modules)
|
|
|
|
return merge2([less, jsFilesStream, assets])
|
|
|
|
}
|
|
|
|
|
|
|
|
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')
|
|
|
|
}
|
|
|
|
|
|
|
|
function githubRelease (done) {
|
|
|
|
const changlogFiles = [
|
|
|
|
path.join(cwd, 'CHANGELOG.en-US.md'),
|
|
|
|
path.join(cwd, 'CHANGELOG.zh-CN.md'),
|
|
|
|
]
|
|
|
|
console.log('creating release on GitHub')
|
|
|
|
if (!process.env.GITHUB_TOKEN) {
|
|
|
|
console.log('no GitHub token found, skip')
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if (!changlogFiles.every(file => fs.existsSync(file))) {
|
|
|
|
console.log('no changelog found, skip')
|
|
|
|
return
|
|
|
|
}
|
|
|
|
const github = new GitHub()
|
|
|
|
github.authenticate({
|
|
|
|
type: 'oauth',
|
|
|
|
token: process.env.GITHUB_TOKEN,
|
|
|
|
})
|
|
|
|
const date = new Date()
|
|
|
|
const { version } = packageJson
|
|
|
|
const enChangelog = getChangelog(changlogFiles[0], version)
|
|
|
|
const cnChangelog = getChangelog(changlogFiles[1], version)
|
|
|
|
const changelog = [
|
|
|
|
`\`${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}\``,
|
|
|
|
enChangelog,
|
|
|
|
'\n',
|
|
|
|
'---',
|
|
|
|
'\n',
|
|
|
|
cnChangelog,
|
|
|
|
].join('\n')
|
|
|
|
const [_, owner, repo] = execSync('git remote get-url origin') // eslint-disable-line
|
|
|
|
.toString()
|
|
|
|
.match(/github.com[:/](.+)\/(.+)\.git/)
|
|
|
|
github.repos.createRelease({
|
|
|
|
owner,
|
|
|
|
repo,
|
|
|
|
tag_name: version,
|
|
|
|
name: version,
|
|
|
|
body: changelog,
|
|
|
|
}).then(() => {
|
|
|
|
done()
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
gulp.task('tag', (done) => {
|
|
|
|
tag()
|
|
|
|
githubRelease(done)
|
|
|
|
})
|
|
|
|
|
|
|
|
gulp.task('check-git', (done) => {
|
|
|
|
runCmd('git', ['status', '--porcelain'], (code, result) => {
|
|
|
|
if (/^\?\?/m.test(result)) {
|
|
|
|
return done(`There are untracked files in the working tree.\n${result}
|
|
|
|
`)
|
|
|
|
}
|
|
|
|
if (/^([ADRM]| [ADRM])/m.test(result)) {
|
|
|
|
return done(`There are uncommitted changes in the working tree.\n${result}
|
|
|
|
`)
|
|
|
|
}
|
|
|
|
return done()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
function publish (tagString, done) {
|
|
|
|
let args = ['publish', '--with-antd-tools']
|
|
|
|
if (tagString) {
|
|
|
|
args = args.concat(['--tag', tagString])
|
|
|
|
}
|
|
|
|
const publishNpm = process.env.PUBLISH_NPM_CLI || 'npm'
|
|
|
|
runCmd(publishNpm, args, (code) => {
|
|
|
|
tag()
|
|
|
|
githubRelease(() => {
|
|
|
|
done(code)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
function pub (done) {
|
|
|
|
dist((code) => {
|
|
|
|
if (code) {
|
|
|
|
done(code)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
const notOk = !packageJson.version.match(/^\d+\.\d+\.\d+$/)
|
|
|
|
let tagString
|
|
|
|
if (argv['npm-tag']) {
|
|
|
|
tagString = argv['npm-tag']
|
|
|
|
}
|
|
|
|
if (!tagString && notOk) {
|
|
|
|
tagString = 'next'
|
|
|
|
}
|
|
|
|
if (packageJson.scripts['pre-publish']) {
|
|
|
|
runCmd('npm', ['run', 'pre-publish'], (code2) => {
|
|
|
|
if (code2) {
|
|
|
|
done(code2)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
publish(tagString, done)
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
publish(tagString, done)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
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()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
gulp.task('pub', ['check-git', 'compile'], (done) => {
|
|
|
|
if (!process.env.GITHUB_TOKEN) {
|
|
|
|
console.log('no GitHub token found, skip')
|
|
|
|
} else {
|
|
|
|
pub(done)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
gulp.task('pub-with-ci', (done) => {
|
|
|
|
if (!process.env.NPM_TOKEN) {
|
|
|
|
console.log('no NPM token found, skip')
|
|
|
|
} else {
|
|
|
|
const github = new GitHub()
|
|
|
|
github.authenticate({
|
|
|
|
type: 'oauth',
|
|
|
|
token: process.env.GITHUB_TOKEN,
|
|
|
|
})
|
|
|
|
const [_, owner, repo] = execSync('git remote get-url origin') // eslint-disable-line
|
|
|
|
.toString()
|
|
|
|
.match(/github.com[:/](.+)\/(.+)\.git/)
|
|
|
|
const getLatestRelease = github.repos.getLatestRelease({
|
|
|
|
owner,
|
|
|
|
repo,
|
|
|
|
})
|
|
|
|
const getCommits = github.repos.getCommits({
|
|
|
|
owner,
|
|
|
|
repo,
|
|
|
|
per_page: 1,
|
|
|
|
})
|
|
|
|
Promise.all([getLatestRelease, getCommits]).then(([latestRelease, commits]) => {
|
|
|
|
const preVersion = latestRelease.data.tag_name
|
|
|
|
const { version } = packageJson
|
|
|
|
const [_, newVersion] = commits.data[0].commit.message.trim().match(/bump (.+)/) || []
|
|
|
|
if (compareVersions(version, preVersion) === 1 && newVersion && newVersion.trim() === version) {
|
|
|
|
gulp.run('pub', (err) => {
|
|
|
|
err && console.log('err', err)
|
|
|
|
done()
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
console.log('donot need publish' + version)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
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('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'))
|
|
|
|
}
|
|
|
|
|
|
|
|
gulp.task('guard', (done) => {
|
|
|
|
const npmArgs = getNpmArgs()
|
|
|
|
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) {
|
|
|
|
reportError()
|
|
|
|
done(1)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
done()
|
|
|
|
})
|
|
|
|
|