UNPKG

@ant-design/tools

Version:
256 lines (248 loc) 10.3 kB
"use strict"; var _merge = _interopRequireDefault(require("merge2")); var _through = _interopRequireDefault(require("through2")); var _webpack = _interopRequireDefault(require("webpack")); var _gulpBabel = _interopRequireDefault(require("gulp-babel")); var _minimist = _interopRequireDefault(require("minimist")); var _path = _interopRequireDefault(require("path")); var _gulpWatch = _interopRequireDefault(require("gulp-watch")); var _gulpTypescript = _interopRequireDefault(require("gulp-typescript")); var _gulp = _interopRequireDefault(require("gulp")); var _glob = _interopRequireDefault(require("glob")); var _fsExtra = _interopRequireDefault(require("fs-extra")); var _rimraf = _interopRequireDefault(require("rimraf")); var _projectHelper = require("./utils/projectHelper"); var _getBabelCommonConfig = _interopRequireDefault(require("./getBabelCommonConfig")); var _getTSCommonConfig = _interopRequireDefault(require("./getTSCommonConfig")); var _replaceLib = _interopRequireDefault(require("./replaceLib")); var _checkDiff = _interopRequireDefault(require("./lint/checkDiff")); var _apiCollection = _interopRequireDefault(require("./apiCollection")); var _sortApiTable = _interopRequireDefault(require("./sortApiTable")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } const argv = (0, _minimist.default)(process.argv.slice(2)); const tsConfig = (0, _getTSCommonConfig.default)(); const packageJson = _fsExtra.default.readJsonSync((0, _projectHelper.getProjectPath)('package.json')); const tsDefaultReporter = _gulpTypescript.default.reporter.defaultReporter(); const cwd = process.cwd(); const libDir = (0, _projectHelper.getProjectPath)('lib'); const esDir = (0, _projectHelper.getProjectPath)('es'); const localeDir = (0, _projectHelper.getProjectPath)('locale'); // FIXME: hard code, not find typescript can modify the path resolution const localeDts = `import type { Locale } from '../lib/locale'; declare const localeValues: Locale; export default localeValues;`; async function dist(done) { _rimraf.default.sync((0, _projectHelper.getProjectPath)('dist')); process.env.RUN_ENV = 'PRODUCTION'; const configModule = await (specifier => new Promise(r => r(`${specifier}`)).then(s => _interopRequireWildcard(require(s))))((0, _projectHelper.getProjectPath)('webpack.config.js')); const webpackConfig = configModule.default || configModule; (0, _webpack.default)(webpackConfig, async (err, stats) => { if (err) { console.error(err.stack || err); return; } const info = stats.toJson(); const { dist: { finalize } = {}, bail } = await (0, _projectHelper.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); }); } _gulp.default.task('clean', () => { _rimraf.default.sync((0, _projectHelper.getProjectPath)('_site')); _rimraf.default.sync((0, _projectHelper.getProjectPath)('_data')); }); _gulp.default.task('dist', _gulp.default.series(done => { dist(done); })); const tsFiles = ['**/*.ts', '**/*.tsx', '!node_modules/**/*.*', 'typings/**/*.d.ts']; function compileTs(stream) { return stream.pipe((0, _gulpTypescript.default)(tsConfig)).js.pipe(_through.default.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.default.dest(process.cwd())); } _gulp.default.task('tsc', () => compileTs(_gulp.default.src(tsFiles, { base: cwd }))); _gulp.default.task('watch-tsc', _gulp.default.series('tsc', () => { (0, _gulpWatch.default)(tsFiles, f => { if (f.event === 'unlink') { const fileToDelete = f.path.replace(/\.tsx?$/, '.js'); if (_fsExtra.default.existsSync(fileToDelete)) { _fsExtra.default.unlinkSync(fileToDelete); } return; } const myPath = _path.default.relative(cwd, f.path); compileTs(_gulp.default.src([myPath, 'typings/**/*.d.ts'], { base: cwd })); }); })); function babelify(js, modules) { const babelConfig = (0, _getBabelCommonConfig.default)(modules); delete babelConfig.cacheDirectory; if (modules === false) { babelConfig.plugins.push(_replaceLib.default); } const stream = js.pipe((0, _gulpBabel.default)(babelConfig)); return stream.pipe(_gulp.default.dest(modules === false ? esDir : libDir)); } function insertUseClient() { const header = '"use client"\n'; return _through.default.obj(function (file, _, next) { const { path: filepath } = file; if ( // eslint-disable-next-line no-constant-condition /\.(j|t)sx$/.test(filepath) || // components/index.ts // components/xxx/index.ts /components(\/[\w-]+)?\/index\.ts$/.test(filepath)) { file.contents = Buffer.concat([Buffer.from(header), file.contents]); } this.push(file); next(); }); } async function compile(modules) { const { compile: { transformTSFile, transformFile } = {} } = await (0, _projectHelper.getConfig)(); _rimraf.default.sync(modules !== false ? libDir : esDir); const assets = _gulp.default.src(['components/**/*.@(png|svg|json)']).pipe(_gulp.default.dest(modules === false ? esDir : libDir)); let error = 0; // =============================== FILE =============================== let transformFileStream; if (transformFile) { transformFileStream = _gulp.default.src(['components/**/*.tsx']).pipe(_through.default.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.default.dest(modules === false ? esDir : libDir)); } // ================================ TS ================================ const source = ['components/**/*.tsx', 'components/**/*.ts', 'typings/**/*.d.ts', '!components/**/__tests__/**', '!components/**/demo/**', '!components/**/design/**']; // allow jsx file in components/xxx/ if (tsConfig.allowJs) { source.unshift('components/**/*.jsx'); } // Strip content if needed let sourceStream = _gulp.default.src(source); if (transformTSFile) { sourceStream = sourceStream.pipe(_through.default.obj(function (file, encoding, next) { let nextFile = transformTSFile(file) || file; nextFile = Array.isArray(nextFile) ? nextFile : [nextFile]; nextFile.forEach(f => this.push(f)); next(); })); } sourceStream = sourceStream.pipe(insertUseClient()); const tsResult = sourceStream.pipe((0, _gulpTypescript.default)(tsConfig, { error(e) { tsDefaultReporter.error(e, undefined); 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.default.dest(modules === false ? esDir : libDir)); return (0, _merge.default)([tsFilesStream, tsd, assets, transformFileStream].filter(s => s)); } function generateLocale() { _rimraf.default.sync(localeDir); _fsExtra.default.mkdirSync(localeDir); const localeFiles = _glob.default.sync('components/locale/*.ts?(x)'); localeFiles.forEach(item => { const match = item.match(/components\/locale\/(.*)\.tsx?/); if (match) { const locale = match[1]; _fsExtra.default.writeFileSync(_path.default.join(localeDir, `${locale}.js`), `module.exports = require('../lib/locale/${locale}');`); _fsExtra.default.writeFileSync(_path.default.join(localeDir, `${locale}.d.ts`), localeDts); } }); } // We use https://unpkg.com/[name]/?meta to check exist files _gulp.default.task('package-diff', _gulp.default.series(done => { (0, _checkDiff.default)(packageJson.name, packageJson.version, done); })); _gulp.default.task('compile-with-es', async done => { console.log('[Parallel] Compile to es...'); (await compile(false)).on('finish', done); }); _gulp.default.task('compile-with-lib', async done => { console.log('[Parallel] Compile to js...'); (await compile()).on('finish', () => { generateLocale(); done(); }); }); _gulp.default.task('compile-finalize', async done => { // Additional process of compile finalize const { compile: { finalize } = {} } = await (0, _projectHelper.getConfig)(); if (finalize) { console.log('[Compile] Finalization...'); finalize(); } done(); }); _gulp.default.task('compile', _gulp.default.series(_gulp.default.parallel('compile-with-es', 'compile-with-lib'), 'compile-finalize')); _gulp.default.task('sort-api-table', _gulp.default.series(done => { (0, _sortApiTable.default)(); done(); })); _gulp.default.task('api-collection', _gulp.default.series(done => { (0, _apiCollection.default)(); done(); }));