140 lines
3.6 KiB
JavaScript
140 lines
3.6 KiB
JavaScript
import { readFileSync, existsSync } from 'fs';
|
||
import path from 'path';
|
||
import { fileURLToPath } from 'url';
|
||
import { glob } from 'glob';
|
||
|
||
// 获取当前文件所在目录的绝对路径
|
||
const __filename = fileURLToPath(import.meta.url);
|
||
const __dirname = path.dirname(__filename);
|
||
|
||
/**
|
||
* 收集所有的入口文件
|
||
*
|
||
* 遍历 enum 目录,查找所有 .js 文件作为打包入口
|
||
* 注意:json 目录被排除,因为 JSON 文件直接复制,不作为入口处理
|
||
*
|
||
* @returns {Object} 入口文件对象,格式:{ 'enum/dictionary/index.js': '/absolute/path/enum/dictionary/index.js' }
|
||
*/
|
||
function getEntryFiles() {
|
||
const entries = {};
|
||
const baseDir = __dirname;
|
||
const srcDir = path.join(baseDir, 'src');
|
||
|
||
// 只处理枚举目录,JSON 文件直接复制不转换
|
||
const dirs = ['enum'];
|
||
|
||
dirs.forEach(dir => {
|
||
const dirPath = path.join(srcDir, dir);
|
||
|
||
if (existsSync(dirPath)) {
|
||
// 递归查找当前目录下所有 .js 文件
|
||
const files = glob.sync('**/*.js', {
|
||
cwd: dirPath,
|
||
absolute: false
|
||
});
|
||
|
||
// 为每个文件创建入口映射,并保留源文件目录结构
|
||
files.forEach(file => {
|
||
const key = path.join(dir, file);
|
||
entries[key] = path.join(srcDir, dir, file);
|
||
});
|
||
}
|
||
});
|
||
|
||
return entries;
|
||
}
|
||
|
||
/**
|
||
* 自定义插件:复制类型声明文件和 JSON 文件
|
||
*
|
||
* 功能:
|
||
* 1. 复制 enum 目录下的 .d.ts 类型声明文件
|
||
* 2. 复制 json 目录下的 .json 数据文件,保持原始格式
|
||
*
|
||
* 注意:所有源文件都在 src/ 目录,构建输出到根目录
|
||
*/
|
||
const copyTypesPlugin = () => ({
|
||
name: 'copy-types',
|
||
|
||
// 在生成 bundle 时执行
|
||
generateBundle() {
|
||
const srcDir = path.join(__dirname, 'src');
|
||
const enumDir = path.join(srcDir, 'enum');
|
||
const this$1 = this;
|
||
|
||
// ===== 1. 复制枚举类型声明文件 (.d.ts) =====
|
||
if (existsSync(enumDir)) {
|
||
const dtsFiles = glob.sync('**/*.d.ts', {
|
||
cwd: enumDir,
|
||
absolute: true
|
||
});
|
||
|
||
dtsFiles.forEach(file => {
|
||
const relativePath = path.relative(enumDir, file);
|
||
const content = readFileSync(file, 'utf-8');
|
||
|
||
this$1.emitFile({
|
||
type: 'asset',
|
||
fileName: path.join('enum', relativePath),
|
||
source: content
|
||
});
|
||
});
|
||
}
|
||
|
||
// ===== 2. 复制 json 文件夹(保持原始格式,不转换) =====
|
||
const jsonDir = path.join(srcDir, 'json');
|
||
if (existsSync(jsonDir)) {
|
||
const jsonFiles = glob.sync('**/*.json', {
|
||
cwd: jsonDir,
|
||
absolute: true
|
||
});
|
||
|
||
jsonFiles.forEach(file => {
|
||
const relativePath = path.relative(jsonDir, file);
|
||
const content = readFileSync(file, 'utf-8');
|
||
|
||
this$1.emitFile({
|
||
type: 'asset',
|
||
fileName: path.join('json', relativePath),
|
||
source: content
|
||
});
|
||
});
|
||
}
|
||
}
|
||
});
|
||
|
||
/**
|
||
* 创建 Rollup 配置的辅助函数
|
||
*
|
||
* @param {string} outputDir - 输出目录
|
||
* @param {string} format - 输出格式('esm' 或 'cjs')
|
||
* @param {Array} plugins - 插件列表
|
||
* @returns {Object} Rollup 配置对象
|
||
*/
|
||
function createConfig(outputDir, format, plugins) {
|
||
return {
|
||
// 入口文件对象
|
||
input: getEntryFiles(),
|
||
|
||
// 输出配置
|
||
output: {
|
||
dir: outputDir,
|
||
format: format,
|
||
preserveModules: true,
|
||
preserveModulesRoot: './',
|
||
entryFileNames: '[name]',
|
||
exports: 'named'
|
||
},
|
||
|
||
// 插件列表
|
||
plugins
|
||
};
|
||
}
|
||
|
||
/**
|
||
* 导出配置
|
||
*
|
||
* 只输出 ESM 格式到根目录(enum/、json/)
|
||
*/
|
||
export default createConfig('.', 'esm', [copyTypesPlugin()]);
|