500 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			500 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			JavaScript
		
	
	
| /* 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();
 | |
|   }),
 | |
| );
 |