@ant-design/tools
Version:
tools for ant design
256 lines (248 loc) • 10.3 kB
JavaScript
;
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();
}));