typing.ts 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. import type { Options as HtmlMinifierOptions } from 'html-minifier-terser';
  2. import type { PluginVisualizerOptions } from 'rollup-plugin-visualizer';
  3. import type { PluginOptions } from 'unplugin-dts';
  4. import type {
  5. ConfigEnv,
  6. PluginOption,
  7. UserConfig,
  8. UserConfigFnPromise,
  9. } from 'vite';
  10. import type { Options as PwaPluginOptions } from 'vite-plugin-pwa';
  11. /**
  12. * ImportMap 配置接口
  13. * @description 用于配置模块导入映射,支持自定义导入路径和范围
  14. * @example
  15. * ```typescript
  16. * {
  17. * imports: {
  18. * 'vue': 'https://unpkg.com/vue@3.2.47/dist/vue.esm-browser.js'
  19. * },
  20. * scopes: {
  21. * 'https://site.com/': {
  22. * 'vue': 'https://unpkg.com/vue@3.2.47/dist/vue.esm-browser.js'
  23. * }
  24. * }
  25. * }
  26. * ```
  27. */
  28. interface IImportMap {
  29. /** 模块导入映射 */
  30. imports?: Record<string, string>;
  31. /** 作用域特定的导入映射 */
  32. scopes?: {
  33. [scope: string]: Record<string, string>;
  34. };
  35. }
  36. /**
  37. * 打印插件配置选项
  38. * @description 用于配置控制台打印信息
  39. */
  40. interface PrintPluginOptions {
  41. /**
  42. * 打印的数据映射
  43. * @description 键值对形式的数据,将在控制台打印
  44. * @example
  45. * ```typescript
  46. * {
  47. * 'App Version': '1.0.0',
  48. * 'Build Time': '2024-01-01'
  49. * }
  50. * ```
  51. */
  52. infoMap?: Record<string, string | undefined>;
  53. }
  54. /**
  55. * Nitro Mock 插件配置选项
  56. * @description 用于配置 Nitro Mock 服务器的行为
  57. */
  58. interface NitroMockPluginOptions {
  59. /**
  60. * Mock 服务器包名
  61. * @default '@vbenjs/nitro-mock'
  62. */
  63. mockServerPackage?: string;
  64. /**
  65. * Mock 服务端口
  66. * @default 3000
  67. */
  68. port?: number;
  69. /**
  70. * 是否打印 Mock 日志
  71. * @default false
  72. */
  73. verbose?: boolean;
  74. }
  75. /**
  76. * 归档插件配置选项
  77. * @description 用于配置构建产物的压缩归档
  78. */
  79. interface ArchiverPluginOptions {
  80. /**
  81. * 输出文件名
  82. * @default 'dist'
  83. */
  84. name?: string;
  85. /**
  86. * 输出目录
  87. * @default '.'
  88. */
  89. outputDir?: string;
  90. }
  91. /**
  92. * HTML 插件配置
  93. * @description 用于配置基于 transformIndexHtml 的 HTML 压缩行为
  94. */
  95. type HtmlPluginOptions = HtmlMinifierOptions;
  96. /**
  97. * ImportMap 插件配置
  98. * @description 用于配置模块的 CDN 导入
  99. */
  100. interface ImportmapPluginOptions {
  101. /**
  102. * CDN 供应商
  103. * @default 'jspm.io'
  104. * @description 支持 esm.sh 和 jspm.io 两种 CDN 供应商
  105. */
  106. defaultProvider?: 'esm.sh' | 'jspm.io';
  107. /**
  108. * ImportMap 配置数组
  109. * @description 配置需要从 CDN 导入的包
  110. * @example
  111. * ```typescript
  112. * [
  113. * { name: 'vue' },
  114. * { name: 'pinia', range: '^2.0.0' }
  115. * ]
  116. * ```
  117. */
  118. importmap?: Array<{ name: string; range?: string }>;
  119. /**
  120. * 手动配置 ImportMap
  121. * @description 自定义 ImportMap 配置
  122. */
  123. inputMap?: IImportMap;
  124. }
  125. /**
  126. * 条件插件配置
  127. * @description 用于根据条件动态加载插件
  128. */
  129. interface ConditionPlugin {
  130. /**
  131. * 判断条件
  132. * @description 当条件为 true 时加载插件
  133. */
  134. condition?: boolean;
  135. /**
  136. * 插件对象
  137. * @description 返回插件数组或 Promise
  138. */
  139. plugins: () => PluginOption[] | PromiseLike<PluginOption[]>;
  140. }
  141. /**
  142. * 通用插件配置选项
  143. * @description 所有插件共用的基础配置
  144. */
  145. interface CommonPluginOptions {
  146. /**
  147. * 是否开启开发工具
  148. * @default false
  149. */
  150. devtools?: boolean;
  151. /**
  152. * 环境变量
  153. * @description 自定义环境变量
  154. */
  155. env?: Record<string, any>;
  156. /**
  157. * 是否注入元数据
  158. * @default true
  159. */
  160. injectMetadata?: boolean;
  161. /**
  162. * 是否为构建模式
  163. * @default false
  164. */
  165. isBuild?: boolean;
  166. /**
  167. * 构建模式
  168. * @default 'development'
  169. */
  170. mode?: string;
  171. /**
  172. * 是否开启依赖分析
  173. * @default false
  174. * @description 使用 rollup-plugin-visualizer 分析依赖
  175. */
  176. visualizer?: boolean | PluginVisualizerOptions;
  177. }
  178. /**
  179. * 应用插件配置选项
  180. * @description 用于配置应用构建时的插件选项
  181. */
  182. interface ApplicationPluginOptions extends CommonPluginOptions {
  183. /**
  184. * 是否开启压缩归档
  185. * @default false
  186. * @description 开启后会在打包目录生成 zip 文件
  187. */
  188. archiver?: boolean;
  189. /**
  190. * 压缩归档插件配置
  191. * @description 配置压缩归档的行为
  192. */
  193. archiverPluginOptions?: ArchiverPluginOptions;
  194. /**
  195. * 是否开启压缩
  196. * @default false
  197. * @description 支持 gzip 和 brotli 压缩
  198. */
  199. compress?: boolean;
  200. /**
  201. * 压缩类型
  202. * @default ['gzip']
  203. * @description 可选的压缩类型
  204. */
  205. compressTypes?: ('brotli' | 'gzip')[];
  206. /**
  207. * 是否抽离配置文件
  208. * @default false
  209. * @description 在构建时抽离配置文件
  210. */
  211. extraAppConfig?: boolean;
  212. /**
  213. * 是否开启 HTML 插件
  214. * @default true
  215. */
  216. html?: boolean | HtmlPluginOptions;
  217. /**
  218. * 是否开启国际化
  219. * @default false
  220. */
  221. i18n?: boolean;
  222. /**
  223. * 是否开启 ImportMap CDN
  224. * @default false
  225. */
  226. importmap?: boolean;
  227. /**
  228. * ImportMap 插件配置
  229. */
  230. importmapOptions?: ImportmapPluginOptions;
  231. /**
  232. * 是否注入应用加载动画
  233. * @default true
  234. */
  235. injectAppLoading?: boolean;
  236. /**
  237. * 是否注入全局 SCSS
  238. * @default true
  239. */
  240. injectGlobalScss?: boolean;
  241. /**
  242. * 是否注入版权信息
  243. * @default true
  244. */
  245. license?: boolean;
  246. /**
  247. * 是否开启 Nitro Mock
  248. * @default false
  249. */
  250. nitroMock?: boolean;
  251. /**
  252. * Nitro Mock 插件配置
  253. */
  254. nitroMockOptions?: NitroMockPluginOptions;
  255. /**
  256. * 是否开启控制台打印
  257. * @default false
  258. */
  259. print?: boolean;
  260. /**
  261. * 打印插件配置
  262. */
  263. printInfoMap?: PrintPluginOptions['infoMap'];
  264. /**
  265. * 是否开启 PWA
  266. * @default false
  267. */
  268. pwa?: boolean;
  269. /**
  270. * PWA 插件配置
  271. */
  272. pwaOptions?: Partial<PwaPluginOptions>;
  273. /**
  274. * 是否开启 VXE Table 懒加载
  275. * @default false
  276. */
  277. vxeTableLazyImport?: boolean;
  278. }
  279. /**
  280. * 库插件配置选项
  281. * @description 用于配置库构建时的插件选项
  282. */
  283. interface LibraryPluginOptions extends CommonPluginOptions {
  284. /**
  285. * 是否开启 DTS 输出
  286. * @default true
  287. * @description 生成 TypeScript 类型声明文件
  288. */
  289. dts?: boolean | PluginOptions;
  290. }
  291. /**
  292. * 应用配置选项类型
  293. */
  294. type ApplicationOptions = ApplicationPluginOptions;
  295. /**
  296. * 库配置选项类型
  297. */
  298. type LibraryOptions = LibraryPluginOptions;
  299. /**
  300. * 应用配置定义函数类型
  301. * @description 用于定义应用构建配置
  302. */
  303. type DefineApplicationOptions = (config?: ConfigEnv) => Promise<{
  304. /** 应用插件配置 */
  305. application?: ApplicationOptions;
  306. /** Vite 配置 */
  307. vite?: UserConfig;
  308. }>;
  309. /**
  310. * 库配置定义函数类型
  311. * @description 用于定义库构建配置
  312. */
  313. type DefineLibraryOptions = (config?: ConfigEnv) => Promise<{
  314. /** 库插件配置 */
  315. library?: LibraryOptions;
  316. /** Vite 配置 */
  317. vite?: UserConfig;
  318. }>;
  319. /**
  320. * 配置定义类型
  321. * @description 应用或库的配置定义
  322. */
  323. type DefineConfig = DefineApplicationOptions | DefineLibraryOptions;
  324. type VbenViteConfig = Promise<UserConfig> | UserConfig | UserConfigFnPromise;
  325. export type {
  326. ApplicationPluginOptions,
  327. ArchiverPluginOptions,
  328. CommonPluginOptions,
  329. ConditionPlugin,
  330. DefineApplicationOptions,
  331. DefineConfig,
  332. DefineLibraryOptions,
  333. HtmlPluginOptions,
  334. IImportMap,
  335. ImportmapPluginOptions,
  336. LibraryPluginOptions,
  337. NitroMockPluginOptions,
  338. PrintPluginOptions,
  339. VbenViteConfig,
  340. };