98 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| import { fileURLToPath } from 'node:url';
 | |
| import path from 'node:path';
 | |
| import fs from 'fs';
 | |
| 
 | |
| import tailwindcss from 'tailwindcss';
 | |
| import ts from 'rollup-plugin-ts';
 | |
| import postcss from 'rollup-plugin-postcss';
 | |
| import { nodeExternals } from 'rollup-plugin-node-externals';
 | |
| import cleanup from 'rollup-plugin-cleanup';
 | |
| import autoprefixer from 'autoprefixer';
 | |
| import replace from '@rollup/plugin-replace';
 | |
| import { nodeResolve } from '@rollup/plugin-node-resolve';
 | |
| import json from '@rollup/plugin-json';
 | |
| import commonjs from '@rollup/plugin-commonjs';
 | |
| 
 | |
| const __filename = fileURLToPath(import.meta.url);
 | |
| const __dirname = path.dirname(__filename);
 | |
| const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf-8'));
 | |
| 
 | |
| // CI 环境下不需要构建这么多版本
 | |
| const isInCIEnv = process.env.CI === 'true';
 | |
| 
 | |
| const banner =
 | |
|   '/*!\n' +
 | |
|   ` * ${packageJson.name} v${packageJson.version}\n` +
 | |
|   ` * (c) 2023-${new Date().getFullYear()} Flow team\n` +
 | |
|   ' */';
 | |
| 
 | |
| const outputConfigs = {
 | |
|   esm: {
 | |
|     banner,
 | |
|     format: 'es',
 | |
|     file: path.resolve(__dirname, 'dist/esm/index.js'),
 | |
|   },
 | |
|   umd: {
 | |
|     banner,
 | |
|     format: 'umd',
 | |
|     file: path.resolve(__dirname, 'dist/umd/index.js'),
 | |
|   },
 | |
| };
 | |
| 
 | |
| const createReplacePlugin = () =>
 | |
|   replace({
 | |
|     preventAssignment: true,
 | |
|     values: {
 | |
|       __TEST__: false,
 | |
|       __VERSION__: `'${packageJson.version}'`,
 | |
|       __DEV__: process.env.NODE_ENV === 'development',
 | |
|     },
 | |
|   });
 | |
| 
 | |
| const createConfig = (format, output) => {
 | |
|   const isUmdBuild = /^umd/.test(format);
 | |
|   const isEsmBuild = /^esm/.test(format);
 | |
| 
 | |
|   const input = path.resolve(__dirname, './src/index.ts');
 | |
| 
 | |
|   // TODO: 这里替换成真实的名称
 | |
|   if (isUmdBuild) {
 | |
|     output.name = 'FlowFoo';
 | |
|   }
 | |
| 
 | |
|   return {
 | |
|     input,
 | |
|     output,
 | |
|     plugins: [
 | |
|       commonjs(),
 | |
|       createReplacePlugin(),
 | |
|       nodeResolve(),
 | |
|       cleanup(),
 | |
|       postcss({
 | |
|         plugins: [tailwindcss(), autoprefixer()],
 | |
|         autoModules: true,
 | |
|         modules: {
 | |
|           generateScopedName: '[name][local]_[hash:base64:5]',
 | |
|         },
 | |
|         extensions: ['.css', '.less'],
 | |
|       }),
 | |
|       json({
 | |
|         namedExports: false,
 | |
|       }),
 | |
|       // ESM 仅打包必要内容
 | |
|       // UMD 由于需要放到 page 上直接运行,因此需要将所有依赖都打包进来
 | |
|       isEsmBuild
 | |
|         ? nodeExternals({ devDeps: true, peerDeps: true, deps: true })
 | |
|         : null,
 | |
|       ts({
 | |
|         transpiler: 'swc',
 | |
|         tsconfig: path.resolve(__dirname, './tsconfig.build.json'),
 | |
|       }),
 | |
|     ].filter(Boolean),
 | |
|   };
 | |
| };
 | |
| 
 | |
| export default Object.keys(outputConfigs)
 | |
|   .filter(k => (isInCIEnv ? k === 'esm' : true))
 | |
|   .map(format => createConfig(format, outputConfigs[format]));
 |