vuecssuiant-designantdreactantantd-vueenterprisefrontendui-designvue-antdvue-antd-uivue3vuecomponent
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
499 lines
13 KiB
499 lines
13 KiB
/* eslint-disable no-console */ |
|
const { getProjectPath, getConfig } = require('./utils/projectHelper'); |
|
const runCmd = require('./runCmd'); |
|
const getBabelCommonConfig = require('./getBabelCommonConfig'); |
|
const merge2 = require('merge2'); |
|
const { execSync } = require('child_process'); |
|
const through2 = require('through2'); |
|
const webpack = require('webpack'); |
|
const babel = require('gulp-babel'); |
|
const argv = require('minimist')(process.argv.slice(2)); |
|
const { Octokit } = require('@octokit/rest'); |
|
|
|
// 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 ts = require('gulp-typescript'); |
|
const gulp = require('gulp'); |
|
const fs = require('fs'); |
|
const rimraf = require('rimraf'); |
|
const stripCode = require('gulp-strip-code'); |
|
const compareVersions = require('compare-versions'); |
|
const getTSCommonConfig = require('./getTSCommonConfig'); |
|
const replaceLib = require('./replaceLib'); |
|
const sortApiTable = require('./sortApiTable'); |
|
const { glob } = require('glob'); |
|
|
|
const packageJson = require(getProjectPath('package.json')); |
|
const tsDefaultReporter = ts.reporter.defaultReporter(); |
|
const cwd = process.cwd(); |
|
const libDir = getProjectPath('lib'); |
|
const esDir = getProjectPath('es'); |
|
const localeDir = getProjectPath('locale'); |
|
|
|
const tsConfig = getTSCommonConfig(); |
|
|
|
// FIXME: hard code, not find typescript can modify the path resolution |
|
const localeDts = `import type { Locale } from '../lib/locale-provider'; |
|
declare const localeValues: Locale; |
|
export default localeValues;`; |
|
|
|
function dist(done) { |
|
rimraf.sync(path.join(cwd, 'dist')); |
|
process.env.RUN_ENV = 'PRODUCTION'; |
|
const webpackConfig = require(getProjectPath('webpack.build.conf.js')); |
|
webpack(webpackConfig, (err, stats) => { |
|
if (err) { |
|
console.error(err.stack || err); |
|
if (err.details) { |
|
console.error(err.details); |
|
} |
|
return; |
|
} |
|
|
|
const info = stats.toJson(); |
|
const { dist: { finalize } = {}, bail } = getConfig(); |
|
|
|
if (stats.hasErrors()) { |
|
(info.errors || []).forEach(error => { |
|
console.error(error); |
|
}); |
|
// https://github.com/ant-design/ant-design/pull/31662 |
|
if (bail) { |
|
process.exit(1); |
|
} |
|
} |
|
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); |
|
// Additional process of dist finalize |
|
if (finalize) { |
|
console.log('[Dist] Finalization...'); |
|
finalize(); |
|
} |
|
done(0); |
|
}); |
|
} |
|
|
|
const tsFiles = ['**/*.ts', '**/*.tsx', '!node_modules/**/*.*', 'typings/**/*.d.ts']; |
|
|
|
function compileTs(stream) { |
|
return stream |
|
.pipe(ts(tsConfig)) |
|
.js.pipe( |
|
through2.obj(function (file, encoding, next) { |
|
// console.log(file.path, file.base); |
|
file.path = file.path.replace(/\.[jt]sx$/, '.js'); |
|
this.push(file); |
|
next(); |
|
}), |
|
) |
|
.pipe(gulp.dest(process.cwd())); |
|
} |
|
|
|
gulp.task('tsc', () => |
|
compileTs( |
|
gulp.src(tsFiles, { |
|
base: cwd, |
|
}), |
|
), |
|
); |
|
|
|
gulp.task('clean', () => { |
|
rimraf.sync(getProjectPath('_site')); |
|
rimraf.sync(getProjectPath('_data')); |
|
}); |
|
|
|
function babelify(js, modules) { |
|
const babelConfig = getBabelCommonConfig(modules); |
|
babelConfig.babelrc = false; |
|
delete babelConfig.cacheDirectory; |
|
if (modules === false) { |
|
babelConfig.plugins.push(replaceLib); |
|
} |
|
const stream = js.pipe(babel(babelConfig)).pipe( |
|
through2.obj(function z(file, encoding, next) { |
|
this.push(file.clone()); |
|
if (modules !== false) { |
|
const content = file.contents.toString(encoding); |
|
file.contents = Buffer.from( |
|
content |
|
.replace(/lodash-es/g, 'lodash') |
|
.replace(/@ant-design\/icons-vue/g, '@ant-design/icons-vue/lib/icons'), |
|
); |
|
this.push(file); |
|
} |
|
next(); |
|
}), |
|
); |
|
return stream.pipe(gulp.dest(modules === false ? esDir : libDir)); |
|
} |
|
|
|
function compile(modules) { |
|
const { compile: { transformTSFile, transformFile } = {} } = getConfig(); |
|
rimraf.sync(modules !== false ? libDir : esDir); |
|
|
|
const assets = gulp |
|
.src(['components/**/*.@(png|svg)']) |
|
.pipe(gulp.dest(modules === false ? esDir : libDir)); |
|
let error = 0; |
|
|
|
// =============================== FILE =============================== |
|
let transformFileStream; |
|
|
|
if (transformFile) { |
|
transformFileStream = gulp |
|
.src(['components/**/*.tsx']) |
|
.pipe( |
|
through2.obj(function (file, encoding, next) { |
|
let nextFile = transformFile(file) || file; |
|
nextFile = Array.isArray(nextFile) ? nextFile : [nextFile]; |
|
nextFile.forEach(f => this.push(f)); |
|
next(); |
|
}), |
|
) |
|
.pipe(gulp.dest(modules === false ? esDir : libDir)); |
|
} |
|
|
|
// ================================ TS ================================ |
|
const source = [ |
|
'components/**/*.js', |
|
'components/**/*.jsx', |
|
'components/**/*.tsx', |
|
'components/**/*.ts', |
|
'typings/**/*.d.ts', |
|
'!components/*/__tests__/*', |
|
]; |
|
|
|
// Strip content if needed |
|
let sourceStream = gulp.src(source); |
|
if (modules === false) { |
|
sourceStream = sourceStream.pipe( |
|
stripCode({ |
|
start_comment: '@remove-on-es-build-begin', |
|
end_comment: '@remove-on-es-build-end', |
|
}), |
|
); |
|
} |
|
|
|
if (transformTSFile) { |
|
sourceStream = sourceStream.pipe( |
|
through2.obj(function (file, encoding, next) { |
|
let nextFile = transformTSFile(file) || file; |
|
nextFile = Array.isArray(nextFile) ? nextFile : [nextFile]; |
|
nextFile.forEach(f => this.push(f)); |
|
next(); |
|
}), |
|
); |
|
} |
|
|
|
const tsResult = sourceStream.pipe( |
|
ts(tsConfig, { |
|
error(e) { |
|
tsDefaultReporter.error(e); |
|
error = 1; |
|
}, |
|
finish: tsDefaultReporter.finish, |
|
}), |
|
); |
|
|
|
function check() { |
|
if (error && !argv['ignore-error']) { |
|
process.exit(1); |
|
} |
|
} |
|
|
|
tsResult.on('finish', check); |
|
tsResult.on('end', check); |
|
const tsFilesStream = babelify(tsResult.js, modules); |
|
const tsd = tsResult.dts.pipe(gulp.dest(modules === false ? esDir : libDir)); |
|
return merge2([tsFilesStream, tsd, assets, transformFileStream].filter(s => s)); |
|
} |
|
|
|
function generateLocale() { |
|
if (!fs.existsSync(localeDir)) { |
|
fs.mkdirSync(localeDir); |
|
} |
|
|
|
const localeFiles = glob.sync('components/locale/*.ts?(x)'); |
|
localeFiles.forEach(item => { |
|
const match = item.match(/components\/locale\/(.*)\.tsx?/); |
|
if (match) { |
|
const locale = match[1]; |
|
fs.writeFileSync( |
|
path.join(localeDir, `${locale}.js`), |
|
`module.exports = require('../lib/locale/${locale}');`, |
|
); |
|
fs.writeFileSync(path.join(localeDir, `${locale}.d.ts`), localeDts); |
|
} |
|
}); |
|
} |
|
|
|
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 Octokit({ |
|
auth: 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(); |
|
}) |
|
.catch(err => { |
|
console.log(err); |
|
}); |
|
} |
|
|
|
gulp.task( |
|
'tag', |
|
gulp.series(done => { |
|
tag(); |
|
githubRelease(done); |
|
}), |
|
); |
|
|
|
gulp.task( |
|
'check-git', |
|
gulp.series(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) { |
|
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); |
|
} |
|
} |
|
|
|
const startTime = new Date(); |
|
gulp.task('compile-with-es', done => { |
|
console.log('start compile at ', startTime); |
|
console.log('[Parallel] Compile to es...'); |
|
compile(false).on('finish', done); |
|
}); |
|
|
|
gulp.task('compile-with-lib', done => { |
|
console.log('[Parallel] Compile to js...'); |
|
compile().on('finish', () => { |
|
generateLocale(); |
|
done(); |
|
}); |
|
}); |
|
|
|
gulp.task('compile-finalize', done => { |
|
// Additional process of compile finalize |
|
const { compile: { finalize } = {} } = getConfig(); |
|
if (finalize) { |
|
console.log('[Compile] Finalization...'); |
|
finalize(); |
|
} |
|
done(); |
|
}); |
|
|
|
gulp.task( |
|
'compile', |
|
gulp.series(gulp.parallel('compile-with-es', 'compile-with-lib'), 'compile-finalize', done => { |
|
console.log('end compile at ', new Date()); |
|
console.log('compile time ', (new Date() - startTime) / 1000, 's'); |
|
done(); |
|
}), |
|
); |
|
|
|
gulp.task( |
|
'dist', |
|
gulp.series(done => { |
|
dist(done); |
|
}), |
|
); |
|
|
|
gulp.task( |
|
'pub', |
|
gulp.series('check-git', 'compile', 'dist', done => { |
|
// if (!process.env.GITHUB_TOKEN) { |
|
// console.log('no GitHub token found, skip'); |
|
// } else { |
|
// pub(done); |
|
// } |
|
pub(done); |
|
}), |
|
); |
|
|
|
gulp.task( |
|
'pub-with-ci', |
|
gulp.series(done => { |
|
if (!process.env.NPM_TOKEN) { |
|
console.log('no NPM token found, skip'); |
|
} else { |
|
const github = new Octokit({ |
|
auth: 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 listCommits = github.repos.listCommits({ |
|
owner, |
|
repo, |
|
per_page: 1, |
|
}); |
|
Promise.all([getLatestRelease, listCommits]).then(([latestRelease, commits]) => { |
|
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 |
|
) { |
|
// eslint-disable-next-line no-unused-vars |
|
runCmd('npm', ['run', 'pub'], _code => { |
|
done(); |
|
}); |
|
} else { |
|
console.log('donot need publish' + version); |
|
} |
|
}); |
|
} |
|
}), |
|
); |
|
|
|
gulp.task( |
|
'guard', |
|
gulp.series(done => { |
|
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('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')); |
|
} |
|
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 && |
|
!process.env.npm_config_with_antd_tools |
|
) { |
|
reportError(); |
|
done(1); |
|
return; |
|
} |
|
} |
|
} |
|
done(); |
|
}), |
|
); |
|
|
|
gulp.task( |
|
'sort-api-table', |
|
gulp.series(done => { |
|
sortApiTable(); |
|
done(); |
|
}), |
|
);
|
|
|