const { readdirSync, readFileSync, writeFileSync, existsSync } = require('fs'); const { join, basename } = require('path'); const mkdirp = require('mkdirp'); function haveDependencies(pkg, depName) { if (pkg.dependencies && pkg.dependencies[depName]) { return true; } if (pkg.devDependencies && pkg.devDependencies[depName]) { return true; } return false; } const EXT_NAMES = ['.tsx', '.ts', '.jsx', '.js']; function getFile(cwd, fileName) { for (const ext of EXT_NAMES) { const file = join(cwd, `${fileName}${ext}`); if (existsSync(file)) { return file; } } } function haveImport(cwd, name) { const indexFile = getFile(cwd, 'src/index'); if (!indexFile) return false; const content = readFileSync(indexFile, 'utf-8'); return content.includes(`'${name}'`) || content.includes(`"${name}"`); } function parseJSON(root) { const dirs = readdirSync(root); const type = basename(root); const list = dirs.reduce((memo = [], dir) => { if (dir.charAt(0) === '.') return; const absDirPath = join(root, dir); const pkg = require(join(absDirPath, 'package.json')); const url = `https://github.com/umijs/umi-blocks/tree/master/${type}/${dir}`; const img = `https://github.com/umijs/umi-blocks/blob/master/${type}/${dir}/snapshot.png?raw=true`; const features = []; if (haveDependencies(pkg, 'antd') || haveImport(absDirPath, 'antd')) { features.push('antd'); } if (getFile(absDirPath, 'src/model')) { features.push('dva'); } memo.push({ name: pkg.name, description: pkg.description, url, tags: [], img, previewUrl: '', features, ...(pkg.block && pkg.block.category ? { category: pkg.block.category } : {}), }); return memo; }, []); return { list }; } function generate(root) { const dist = join(root, '..', 'dist'); const type = basename(root); console.log(`Generate json for ${type}`); mkdirp.sync(dist); const json = parseJSON(root); writeFileSync(join(dist, `${type}.json`), JSON.stringify(json, null, 2), 'utf-8'); } generate(join(__dirname, '..', 'templates')); generate(join(__dirname, '..', 'blocks'));