@meng-xi/vite-plugin 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/README-en.md +264 -533
  2. package/README.md +253 -522
  3. package/dist/common/format/index.cjs +1 -0
  4. package/dist/common/format/index.d.cts +156 -0
  5. package/dist/common/format/index.d.mts +156 -0
  6. package/dist/common/format/index.d.ts +156 -0
  7. package/dist/common/format/index.mjs +1 -0
  8. package/dist/common/fs/index.cjs +1 -0
  9. package/dist/common/fs/index.d.cts +150 -0
  10. package/dist/common/fs/index.d.mts +150 -0
  11. package/dist/common/fs/index.d.ts +150 -0
  12. package/dist/common/fs/index.mjs +1 -0
  13. package/dist/common/html/index.cjs +2 -0
  14. package/dist/common/html/index.d.cts +109 -0
  15. package/dist/common/html/index.d.mts +109 -0
  16. package/dist/common/html/index.d.ts +109 -0
  17. package/dist/common/html/index.mjs +2 -0
  18. package/dist/common/index.cjs +1 -1
  19. package/dist/common/index.d.cts +7 -417
  20. package/dist/common/index.d.mts +7 -417
  21. package/dist/common/index.d.ts +7 -417
  22. package/dist/common/index.mjs +1 -1
  23. package/dist/common/object/index.cjs +1 -0
  24. package/dist/common/object/index.d.cts +30 -0
  25. package/dist/common/object/index.d.mts +30 -0
  26. package/dist/common/object/index.d.ts +30 -0
  27. package/dist/common/object/index.mjs +1 -0
  28. package/dist/common/script/index.cjs +1 -0
  29. package/dist/common/script/index.d.cts +54 -0
  30. package/dist/common/script/index.d.mts +54 -0
  31. package/dist/common/script/index.d.ts +54 -0
  32. package/dist/common/script/index.mjs +1 -0
  33. package/dist/common/validation/index.cjs +1 -0
  34. package/dist/common/validation/index.d.cts +93 -0
  35. package/dist/common/validation/index.d.mts +93 -0
  36. package/dist/common/validation/index.d.ts +93 -0
  37. package/dist/common/validation/index.mjs +1 -0
  38. package/dist/factory/index.cjs +1 -1
  39. package/dist/factory/index.d.cts +1 -1
  40. package/dist/factory/index.d.mts +1 -1
  41. package/dist/factory/index.d.ts +1 -1
  42. package/dist/factory/index.mjs +1 -1
  43. package/dist/index.cjs +1 -1
  44. package/dist/index.d.cts +16 -3
  45. package/dist/index.d.mts +16 -3
  46. package/dist/index.d.ts +16 -3
  47. package/dist/index.mjs +1 -1
  48. package/dist/plugins/buildProgress/index.cjs +2 -0
  49. package/dist/plugins/buildProgress/index.d.cts +187 -0
  50. package/dist/plugins/buildProgress/index.d.mts +187 -0
  51. package/dist/plugins/buildProgress/index.d.ts +187 -0
  52. package/dist/plugins/buildProgress/index.mjs +2 -0
  53. package/dist/plugins/compressAssets/index.cjs +1 -0
  54. package/dist/plugins/compressAssets/index.d.cts +132 -0
  55. package/dist/plugins/compressAssets/index.d.mts +132 -0
  56. package/dist/plugins/compressAssets/index.d.ts +132 -0
  57. package/dist/plugins/compressAssets/index.mjs +1 -0
  58. package/dist/plugins/copyFile/index.cjs +1 -0
  59. package/dist/plugins/copyFile/index.d.cts +78 -0
  60. package/dist/plugins/copyFile/index.d.mts +78 -0
  61. package/dist/plugins/copyFile/index.d.ts +78 -0
  62. package/dist/plugins/copyFile/index.mjs +1 -0
  63. package/dist/plugins/faviconManager/index.cjs +1 -0
  64. package/dist/plugins/faviconManager/index.d.cts +143 -0
  65. package/dist/plugins/faviconManager/index.d.mts +143 -0
  66. package/dist/plugins/faviconManager/index.d.ts +143 -0
  67. package/dist/plugins/faviconManager/index.mjs +1 -0
  68. package/dist/plugins/generateRouter/index.cjs +35 -0
  69. package/dist/plugins/generateRouter/index.d.cts +215 -0
  70. package/dist/plugins/generateRouter/index.d.mts +215 -0
  71. package/dist/plugins/generateRouter/index.d.ts +215 -0
  72. package/dist/plugins/generateRouter/index.mjs +35 -0
  73. package/dist/plugins/generateVersion/index.cjs +1 -0
  74. package/dist/plugins/generateVersion/index.d.cts +184 -0
  75. package/dist/plugins/generateVersion/index.d.mts +184 -0
  76. package/dist/plugins/generateVersion/index.d.ts +184 -0
  77. package/dist/plugins/generateVersion/index.mjs +1 -0
  78. package/dist/plugins/htmlInject/index.cjs +7 -0
  79. package/dist/plugins/htmlInject/index.d.cts +278 -0
  80. package/dist/plugins/htmlInject/index.d.mts +278 -0
  81. package/dist/plugins/htmlInject/index.d.ts +278 -0
  82. package/dist/plugins/htmlInject/index.mjs +7 -0
  83. package/dist/plugins/index.cjs +1 -1
  84. package/dist/plugins/index.d.cts +11 -1714
  85. package/dist/plugins/index.d.mts +11 -1714
  86. package/dist/plugins/index.d.ts +11 -1714
  87. package/dist/plugins/index.mjs +1 -1
  88. package/dist/plugins/loadingManager/index.cjs +487 -0
  89. package/dist/plugins/loadingManager/index.d.cts +769 -0
  90. package/dist/plugins/loadingManager/index.d.mts +769 -0
  91. package/dist/plugins/loadingManager/index.d.ts +769 -0
  92. package/dist/plugins/loadingManager/index.mjs +487 -0
  93. package/dist/plugins/versionUpdateChecker/index.cjs +185 -0
  94. package/dist/plugins/versionUpdateChecker/index.d.cts +200 -0
  95. package/dist/plugins/versionUpdateChecker/index.d.mts +200 -0
  96. package/dist/plugins/versionUpdateChecker/index.d.ts +200 -0
  97. package/dist/plugins/versionUpdateChecker/index.mjs +185 -0
  98. package/dist/shared/vite-plugin.Bcg6RW2N.cjs +3 -0
  99. package/dist/shared/{vite-plugin.CiHfwMiN.d.ts → vite-plugin.DRRlWY8P.d.cts} +50 -0
  100. package/dist/shared/{vite-plugin.CiHfwMiN.d.cts → vite-plugin.DRRlWY8P.d.mts} +50 -0
  101. package/dist/shared/{vite-plugin.CiHfwMiN.d.mts → vite-plugin.DRRlWY8P.d.ts} +50 -0
  102. package/dist/shared/{vite-plugin.B88RyRN8.mjs → vite-plugin.DcExl6jd.mjs} +2 -2
  103. package/package.json +80 -3
  104. package/dist/shared/vite-plugin.CawoITTT.cjs +0 -1
  105. package/dist/shared/vite-plugin.D6Law9Ke.mjs +0 -706
  106. package/dist/shared/vite-plugin.D8L9KzuW.cjs +0 -706
  107. package/dist/shared/vite-plugin.DFjf9wFM.mjs +0 -2
  108. package/dist/shared/vite-plugin.DSb6XzBn.mjs +0 -1
  109. package/dist/shared/vite-plugin.IGZeStMa.cjs +0 -3
  110. package/dist/shared/vite-plugin.Tab4qcIM.cjs +0 -2
@@ -0,0 +1,132 @@
1
+ import { BasePluginOptions, PluginFactory } from '../../factory/index.cjs';
2
+ import 'vite';
3
+ import '../../shared/vite-plugin.CLr0ttuO.cjs';
4
+ import '../../shared/vite-plugin.DRRlWY8P.cjs';
5
+
6
+ /**
7
+ * 压缩算法类型
8
+ *
9
+ * @typedef {('gzip' | 'brotli' | 'both')} CompressAlgorithm
10
+ * @description 支持的压缩算法:
11
+ * - `gzip`: 使用 gzip 压缩,输出 `.gz` 文件
12
+ * - `brotli`: 使用 brotli 压缩,输出 `.br` 文件
13
+ * - `both`: 同时生成 gzip 和 brotli 两种压缩文件
14
+ */
15
+ type CompressAlgorithm = 'gzip' | 'brotli' | 'both';
16
+ /**
17
+ * 单个文件的压缩统计信息
18
+ *
19
+ * @interface CompressStats
20
+ * @description 记录单个文件经过压缩后的详细统计数据
21
+ */
22
+ interface CompressStats {
23
+ /** 原始文件路径 */
24
+ file: string;
25
+ /** 原始文件大小(字节) */
26
+ originalSize: number;
27
+ /** 压缩后文件大小(字节) */
28
+ compressedSize: number;
29
+ /** 压缩率百分比(0-100),如 75.3 表示压缩后体积减少 75.3% */
30
+ ratio: number;
31
+ /** 使用的压缩算法 */
32
+ algorithm: 'gzip' | 'brotli';
33
+ }
34
+ /**
35
+ * 压缩操作的汇总统计信息
36
+ *
37
+ * @interface CompressSummary
38
+ * @description 包含整个压缩操作的总体统计数据,用于报告生成和日志输出
39
+ */
40
+ interface CompressSummary {
41
+ /** 压缩的文件总数 */
42
+ totalFiles: number;
43
+ /** 所有文件的原始大小总和(字节) */
44
+ totalOriginalSize: number;
45
+ /** 所有文件的压缩后大小总和(字节) */
46
+ totalCompressedSize: number;
47
+ /** 总体压缩率百分比 */
48
+ totalRatio: number;
49
+ /** 使用 gzip 压缩的文件数量 */
50
+ gzipFiles: number;
51
+ /** 使用 brotli 压缩的文件数量 */
52
+ brotliFiles: number;
53
+ /** 压缩操作总耗时(毫秒) */
54
+ executionTime: number;
55
+ /** 每个文件的详细压缩统计 */
56
+ stats: CompressStats[];
57
+ }
58
+ /**
59
+ * 构建产物压缩插件的配置选项
60
+ *
61
+ * @interface CompressAssetsOptions
62
+ * @extends {BasePluginOptions}
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * compressAssets({
67
+ * algorithm: 'both',
68
+ * threshold: 2048,
69
+ * compressionLevel: 9,
70
+ * brotliQuality: 11,
71
+ * reportOutput: 'compress-report.json'
72
+ * })
73
+ * ```
74
+ */
75
+ interface CompressAssetsOptions extends BasePluginOptions {
76
+ /** 压缩算法,支持 gzip、brotli 或同时使用两者 */
77
+ algorithm?: CompressAlgorithm;
78
+ /** 最小压缩阈值(字节),小于此大小的文件将被跳过 */
79
+ threshold?: number;
80
+ /** 是否在压缩后删除原始文件,仅保留压缩版本 */
81
+ deleteOriginalFile?: boolean;
82
+ /** 需要压缩的文件扩展名列表,如 ['.js', '.css', '.html'] */
83
+ includeExtensions?: string[];
84
+ /** 需要排除的文件扩展名列表,优先级高于 includeExtensions */
85
+ excludeExtensions?: string[];
86
+ /** 需要排除的路径前缀列表,匹配到的路径下的文件将跳过压缩 */
87
+ excludePaths?: string[];
88
+ /** gzip 压缩级别,范围 1-9,1 最快压缩率最低,9 最慢压缩率最高 */
89
+ compressionLevel?: number;
90
+ /** brotli 崩质量参数,范围 1-11,1 最快质量最低,11 最慢质量最高 */
91
+ brotliQuality?: number;
92
+ /** 压缩报告输出路径,设为 false 则不生成报告 */
93
+ reportOutput?: string | false;
94
+ /** 并发压缩的最大文件数,控制同时进行压缩操作的文件数量 */
95
+ parallelLimit?: number;
96
+ }
97
+
98
+ /**
99
+ * 创建构建产物压缩插件
100
+ *
101
+ * @function compressAssets
102
+ * @param {Partial<CompressAssetsOptions>} [options] - 插件配置选项
103
+ * @returns {Plugin} Vite 插件实例
104
+ *
105
+ * @description 在 Vite 构建完成后自动压缩输出目录中的文件,
106
+ * 支持 gzip 和 brotli 两种压缩算法,可配置压缩级别、文件过滤规则、
107
+ * 并发数量等参数,并生成压缩统计报告。
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * // vite.config.ts
112
+ * import { compressAssets } from '@meng-xi/vite-plugin'
113
+ *
114
+ * export default defineConfig({
115
+ * plugins: [
116
+ * compressAssets({
117
+ * algorithm: 'both',
118
+ * threshold: 2048,
119
+ * deleteOriginalFile: false,
120
+ * compressionLevel: 9,
121
+ * brotliQuality: 11,
122
+ * reportOutput: 'compress-report.json',
123
+ * parallelLimit: 10
124
+ * })
125
+ * ]
126
+ * })
127
+ * ```
128
+ */
129
+ declare const compressAssets: PluginFactory<CompressAssetsOptions, CompressAssetsOptions>;
130
+
131
+ export { compressAssets };
132
+ export type { CompressAlgorithm, CompressAssetsOptions, CompressStats, CompressSummary };
@@ -0,0 +1,132 @@
1
+ import { BasePluginOptions, PluginFactory } from '../../factory/index.mjs';
2
+ import 'vite';
3
+ import '../../shared/vite-plugin.CLr0ttuO.mjs';
4
+ import '../../shared/vite-plugin.DRRlWY8P.mjs';
5
+
6
+ /**
7
+ * 压缩算法类型
8
+ *
9
+ * @typedef {('gzip' | 'brotli' | 'both')} CompressAlgorithm
10
+ * @description 支持的压缩算法:
11
+ * - `gzip`: 使用 gzip 压缩,输出 `.gz` 文件
12
+ * - `brotli`: 使用 brotli 压缩,输出 `.br` 文件
13
+ * - `both`: 同时生成 gzip 和 brotli 两种压缩文件
14
+ */
15
+ type CompressAlgorithm = 'gzip' | 'brotli' | 'both';
16
+ /**
17
+ * 单个文件的压缩统计信息
18
+ *
19
+ * @interface CompressStats
20
+ * @description 记录单个文件经过压缩后的详细统计数据
21
+ */
22
+ interface CompressStats {
23
+ /** 原始文件路径 */
24
+ file: string;
25
+ /** 原始文件大小(字节) */
26
+ originalSize: number;
27
+ /** 压缩后文件大小(字节) */
28
+ compressedSize: number;
29
+ /** 压缩率百分比(0-100),如 75.3 表示压缩后体积减少 75.3% */
30
+ ratio: number;
31
+ /** 使用的压缩算法 */
32
+ algorithm: 'gzip' | 'brotli';
33
+ }
34
+ /**
35
+ * 压缩操作的汇总统计信息
36
+ *
37
+ * @interface CompressSummary
38
+ * @description 包含整个压缩操作的总体统计数据,用于报告生成和日志输出
39
+ */
40
+ interface CompressSummary {
41
+ /** 压缩的文件总数 */
42
+ totalFiles: number;
43
+ /** 所有文件的原始大小总和(字节) */
44
+ totalOriginalSize: number;
45
+ /** 所有文件的压缩后大小总和(字节) */
46
+ totalCompressedSize: number;
47
+ /** 总体压缩率百分比 */
48
+ totalRatio: number;
49
+ /** 使用 gzip 压缩的文件数量 */
50
+ gzipFiles: number;
51
+ /** 使用 brotli 压缩的文件数量 */
52
+ brotliFiles: number;
53
+ /** 压缩操作总耗时(毫秒) */
54
+ executionTime: number;
55
+ /** 每个文件的详细压缩统计 */
56
+ stats: CompressStats[];
57
+ }
58
+ /**
59
+ * 构建产物压缩插件的配置选项
60
+ *
61
+ * @interface CompressAssetsOptions
62
+ * @extends {BasePluginOptions}
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * compressAssets({
67
+ * algorithm: 'both',
68
+ * threshold: 2048,
69
+ * compressionLevel: 9,
70
+ * brotliQuality: 11,
71
+ * reportOutput: 'compress-report.json'
72
+ * })
73
+ * ```
74
+ */
75
+ interface CompressAssetsOptions extends BasePluginOptions {
76
+ /** 压缩算法,支持 gzip、brotli 或同时使用两者 */
77
+ algorithm?: CompressAlgorithm;
78
+ /** 最小压缩阈值(字节),小于此大小的文件将被跳过 */
79
+ threshold?: number;
80
+ /** 是否在压缩后删除原始文件,仅保留压缩版本 */
81
+ deleteOriginalFile?: boolean;
82
+ /** 需要压缩的文件扩展名列表,如 ['.js', '.css', '.html'] */
83
+ includeExtensions?: string[];
84
+ /** 需要排除的文件扩展名列表,优先级高于 includeExtensions */
85
+ excludeExtensions?: string[];
86
+ /** 需要排除的路径前缀列表,匹配到的路径下的文件将跳过压缩 */
87
+ excludePaths?: string[];
88
+ /** gzip 压缩级别,范围 1-9,1 最快压缩率最低,9 最慢压缩率最高 */
89
+ compressionLevel?: number;
90
+ /** brotli 崩质量参数,范围 1-11,1 最快质量最低,11 最慢质量最高 */
91
+ brotliQuality?: number;
92
+ /** 压缩报告输出路径,设为 false 则不生成报告 */
93
+ reportOutput?: string | false;
94
+ /** 并发压缩的最大文件数,控制同时进行压缩操作的文件数量 */
95
+ parallelLimit?: number;
96
+ }
97
+
98
+ /**
99
+ * 创建构建产物压缩插件
100
+ *
101
+ * @function compressAssets
102
+ * @param {Partial<CompressAssetsOptions>} [options] - 插件配置选项
103
+ * @returns {Plugin} Vite 插件实例
104
+ *
105
+ * @description 在 Vite 构建完成后自动压缩输出目录中的文件,
106
+ * 支持 gzip 和 brotli 两种压缩算法,可配置压缩级别、文件过滤规则、
107
+ * 并发数量等参数,并生成压缩统计报告。
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * // vite.config.ts
112
+ * import { compressAssets } from '@meng-xi/vite-plugin'
113
+ *
114
+ * export default defineConfig({
115
+ * plugins: [
116
+ * compressAssets({
117
+ * algorithm: 'both',
118
+ * threshold: 2048,
119
+ * deleteOriginalFile: false,
120
+ * compressionLevel: 9,
121
+ * brotliQuality: 11,
122
+ * reportOutput: 'compress-report.json',
123
+ * parallelLimit: 10
124
+ * })
125
+ * ]
126
+ * })
127
+ * ```
128
+ */
129
+ declare const compressAssets: PluginFactory<CompressAssetsOptions, CompressAssetsOptions>;
130
+
131
+ export { compressAssets };
132
+ export type { CompressAlgorithm, CompressAssetsOptions, CompressStats, CompressSummary };
@@ -0,0 +1,132 @@
1
+ import { BasePluginOptions, PluginFactory } from '../../factory/index.js';
2
+ import 'vite';
3
+ import '../../shared/vite-plugin.CLr0ttuO.js';
4
+ import '../../shared/vite-plugin.DRRlWY8P.js';
5
+
6
+ /**
7
+ * 压缩算法类型
8
+ *
9
+ * @typedef {('gzip' | 'brotli' | 'both')} CompressAlgorithm
10
+ * @description 支持的压缩算法:
11
+ * - `gzip`: 使用 gzip 压缩,输出 `.gz` 文件
12
+ * - `brotli`: 使用 brotli 压缩,输出 `.br` 文件
13
+ * - `both`: 同时生成 gzip 和 brotli 两种压缩文件
14
+ */
15
+ type CompressAlgorithm = 'gzip' | 'brotli' | 'both';
16
+ /**
17
+ * 单个文件的压缩统计信息
18
+ *
19
+ * @interface CompressStats
20
+ * @description 记录单个文件经过压缩后的详细统计数据
21
+ */
22
+ interface CompressStats {
23
+ /** 原始文件路径 */
24
+ file: string;
25
+ /** 原始文件大小(字节) */
26
+ originalSize: number;
27
+ /** 压缩后文件大小(字节) */
28
+ compressedSize: number;
29
+ /** 压缩率百分比(0-100),如 75.3 表示压缩后体积减少 75.3% */
30
+ ratio: number;
31
+ /** 使用的压缩算法 */
32
+ algorithm: 'gzip' | 'brotli';
33
+ }
34
+ /**
35
+ * 压缩操作的汇总统计信息
36
+ *
37
+ * @interface CompressSummary
38
+ * @description 包含整个压缩操作的总体统计数据,用于报告生成和日志输出
39
+ */
40
+ interface CompressSummary {
41
+ /** 压缩的文件总数 */
42
+ totalFiles: number;
43
+ /** 所有文件的原始大小总和(字节) */
44
+ totalOriginalSize: number;
45
+ /** 所有文件的压缩后大小总和(字节) */
46
+ totalCompressedSize: number;
47
+ /** 总体压缩率百分比 */
48
+ totalRatio: number;
49
+ /** 使用 gzip 压缩的文件数量 */
50
+ gzipFiles: number;
51
+ /** 使用 brotli 压缩的文件数量 */
52
+ brotliFiles: number;
53
+ /** 压缩操作总耗时(毫秒) */
54
+ executionTime: number;
55
+ /** 每个文件的详细压缩统计 */
56
+ stats: CompressStats[];
57
+ }
58
+ /**
59
+ * 构建产物压缩插件的配置选项
60
+ *
61
+ * @interface CompressAssetsOptions
62
+ * @extends {BasePluginOptions}
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * compressAssets({
67
+ * algorithm: 'both',
68
+ * threshold: 2048,
69
+ * compressionLevel: 9,
70
+ * brotliQuality: 11,
71
+ * reportOutput: 'compress-report.json'
72
+ * })
73
+ * ```
74
+ */
75
+ interface CompressAssetsOptions extends BasePluginOptions {
76
+ /** 压缩算法,支持 gzip、brotli 或同时使用两者 */
77
+ algorithm?: CompressAlgorithm;
78
+ /** 最小压缩阈值(字节),小于此大小的文件将被跳过 */
79
+ threshold?: number;
80
+ /** 是否在压缩后删除原始文件,仅保留压缩版本 */
81
+ deleteOriginalFile?: boolean;
82
+ /** 需要压缩的文件扩展名列表,如 ['.js', '.css', '.html'] */
83
+ includeExtensions?: string[];
84
+ /** 需要排除的文件扩展名列表,优先级高于 includeExtensions */
85
+ excludeExtensions?: string[];
86
+ /** 需要排除的路径前缀列表,匹配到的路径下的文件将跳过压缩 */
87
+ excludePaths?: string[];
88
+ /** gzip 压缩级别,范围 1-9,1 最快压缩率最低,9 最慢压缩率最高 */
89
+ compressionLevel?: number;
90
+ /** brotli 崩质量参数,范围 1-11,1 最快质量最低,11 最慢质量最高 */
91
+ brotliQuality?: number;
92
+ /** 压缩报告输出路径,设为 false 则不生成报告 */
93
+ reportOutput?: string | false;
94
+ /** 并发压缩的最大文件数,控制同时进行压缩操作的文件数量 */
95
+ parallelLimit?: number;
96
+ }
97
+
98
+ /**
99
+ * 创建构建产物压缩插件
100
+ *
101
+ * @function compressAssets
102
+ * @param {Partial<CompressAssetsOptions>} [options] - 插件配置选项
103
+ * @returns {Plugin} Vite 插件实例
104
+ *
105
+ * @description 在 Vite 构建完成后自动压缩输出目录中的文件,
106
+ * 支持 gzip 和 brotli 两种压缩算法,可配置压缩级别、文件过滤规则、
107
+ * 并发数量等参数,并生成压缩统计报告。
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * // vite.config.ts
112
+ * import { compressAssets } from '@meng-xi/vite-plugin'
113
+ *
114
+ * export default defineConfig({
115
+ * plugins: [
116
+ * compressAssets({
117
+ * algorithm: 'both',
118
+ * threshold: 2048,
119
+ * deleteOriginalFile: false,
120
+ * compressionLevel: 9,
121
+ * brotliQuality: 11,
122
+ * reportOutput: 'compress-report.json',
123
+ * parallelLimit: 10
124
+ * })
125
+ * ]
126
+ * })
127
+ * ```
128
+ */
129
+ declare const compressAssets: PluginFactory<CompressAssetsOptions, CompressAssetsOptions>;
130
+
131
+ export { compressAssets };
132
+ export type { CompressAlgorithm, CompressAssetsOptions, CompressStats, CompressSummary };
@@ -0,0 +1 @@
1
+ import{createPluginFactory as d,BasePlugin as z}from"../../factory/index.mjs";import{createGzip as S,createBrotliCompress as y,constants as x}from"node:zlib";import{promises as u,createReadStream as h,createWriteStream as f}from"node:fs";import{pipeline as F}from"node:stream/promises";import m from"node:path";import{writeFileContent as E,runWithConcurrency as w}from"../../common/fs/index.mjs";import"../../logger/index.mjs";import"../../common/object/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";import"path";async function B(i,t,e){const s=(await u.stat(i)).size,r=S({level:e});await F(h(i),r,f(t));const o=(await u.stat(t)).size;return{file:i,originalSize:s,compressedSize:o,ratio:s>0?Number(((1-o/s)*100).toFixed(1)):0,algorithm:"gzip"}}async function b(i,t,e){const s=(await u.stat(i)).size,r=y({params:{[x.BROTLI_PARAM_QUALITY]:e}});await F(h(i),r,f(t));const o=(await u.stat(t)).size;return{file:i,originalSize:s,compressedSize:o,ratio:s>0?Number(((1-o/s)*100).toFixed(1)):0,algorithm:"brotli"}}async function C(i,t,e,s){const r=i+(t==="gzip"?".gz":".br");return t==="gzip"?B(i,r,e):b(i,r,s)}function O(i,t,e,s){const r=i.replace(/\\/g,"/");if(e<s.threshold||s.excludeExtensions.length>0&&s.excludeExtensions.includes(t)||s.includeExtensions.length>0&&!s.includeExtensions.includes(t))return!1;if(s.excludePaths.length>0)for(const o of s.excludePaths){const l=o.replace(/\\/g,"/");if(r.startsWith(l)||r.includes(l))return!1}return!(t===".gz"||t===".br")}async function A(i,t){const e=[];async function s(r){const o=await u.readdir(r,{withFileTypes:!0});for(const l of o){const a=m.join(r,l.name);if(l.isDirectory())await s(a);else if(l.isFile()){const n=await u.stat(a),p=m.relative(i,a),g=m.extname(l.name).toLowerCase();O(p,g,n.size,t)&&e.push({filePath:a,relativePath:p,size:n.size,ext:g})}}}return await s(i),e}function D(i,t){const e=i.reduce((o,l)=>o+l.originalSize,0),s=i.reduce((o,l)=>o+l.compressedSize,0),r=e>0?Number(((1-s/e)*100).toFixed(1)):0;return{totalFiles:i.length,totalOriginalSize:e,totalCompressedSize:s,totalRatio:r,gzipFiles:i.filter(o=>o.algorithm==="gzip").length,brotliFiles:i.filter(o=>o.algorithm==="brotli").length,executionTime:t,stats:i}}function c(i){return i<1024?`${i}B`:i<1024*1024?`${(i/1024).toFixed(1)}KB`:`${(i/(1024*1024)).toFixed(2)}MB`}async function v(i,t,e){if(!t)return;const s=m.isAbsolute(t)?t:m.join(i,t),r={timestamp:new Date().toISOString(),summary:{totalFiles:e.totalFiles,totalOriginalSize:e.totalOriginalSize,totalCompressedSize:e.totalCompressedSize,totalRatio:e.totalRatio,gzipFiles:e.gzipFiles,brotliFiles:e.brotliFiles,executionTime:e.executionTime},files:e.stats.map(o=>({file:o.file,originalSize:o.originalSize,compressedSize:o.compressedSize,ratio:o.ratio,algorithm:o.algorithm}))};await E(s,JSON.stringify(r,null,2))}async function P(i){const t=[...new Set(i.map(e=>e.file))];for(const e of t)try{await u.unlink(e)}catch{}}class $ extends z{allStats=[];summary=null;getDefaultOptions(){return{algorithm:"gzip",threshold:1024,deleteOriginalFile:!1,includeExtensions:[".js",".css",".html",".svg",".json",".xml",".txt"],excludeExtensions:[],excludePaths:[],compressionLevel:9,brotliQuality:11,reportOutput:"compress-report.json",parallelLimit:10}}validateOptions(){this.validator.field("algorithm").enum(["gzip","brotli","both"]).field("threshold").number().minValue(0).field("deleteOriginalFile").boolean().field("includeExtensions").array().field("excludeExtensions").array().field("excludePaths").array().field("compressionLevel").number().minValue(1).maxValue(9).field("brotliQuality").number().minValue(1).maxValue(11).field("reportOutput").custom(t=>t===!1||typeof t=="string","reportOutput \u5FC5\u987B\u4E3A false \u6216\u5B57\u7B26\u4E32\u8DEF\u5F84").field("parallelLimit").number().minValue(1).maxValue(50).validate()}getPluginName(){return"compress-assets"}getEnforce(){return"post"}addPluginHooks(t){t.writeBundle=async()=>{await this.safeExecute(()=>this.compressAllFiles(),"\u538B\u7F29\u6784\u5EFA\u4EA7\u7269")}}async compressAllFiles(){if(!this.viteConfig)return;const t=this.viteConfig.build.outDir,e=Date.now();this.logger.info(`\u5F00\u59CB\u626B\u63CF\u6784\u5EFA\u4EA7\u7269\u76EE\u5F55: ${t}`);const s=await A(t,this.options);if(s.length===0){this.logger.info("\u672A\u627E\u5230\u9700\u8981\u538B\u7F29\u7684\u6587\u4EF6");return}this.logger.info(`\u53D1\u73B0 ${s.length} \u4E2A\u5F85\u538B\u7F29\u6587\u4EF6`),this.allStats=[];const r=this.options.algorithm==="both"?["gzip","brotli"]:[this.options.algorithm];for(const l of r){const a=await w(s,async n=>C(n.filePath,l,this.options.compressionLevel,this.options.brotliQuality),this.options.parallelLimit);this.allStats.push(...a)}const o=Date.now()-e;this.summary=D(this.allStats,o),this.options.deleteOriginalFile&&(await P(this.allStats),this.logger.info("\u5DF2\u5220\u9664\u539F\u59CB\u6587\u4EF6\uFF0C\u4EC5\u4FDD\u7559\u538B\u7F29\u7248\u672C")),this.options.reportOutput&&(await v(t,this.options.reportOutput,this.summary),this.logger.info(`\u538B\u7F29\u62A5\u544A\u5DF2\u751F\u6210: ${this.options.reportOutput}`)),this.logSummary()}logSummary(){if(!this.summary)return;const{totalFiles:t,totalOriginalSize:e,totalCompressedSize:s,totalRatio:r,executionTime:o}=this.summary;this.logger.success(`\u538B\u7F29\u5B8C\u6210: ${t} \u4E2A\u6587\u4EF6`,`\u539F\u59CB\u4F53\u79EF: ${c(e)} \u2192 \u538B\u7F29\u540E: ${c(s)}\uFF0C\u538B\u7F29\u7387: ${r}%\uFF0C\u8017\u65F6: ${o}ms`);const l=[...this.allStats].sort((a,n)=>n.ratio-a.ratio).slice(0,5);if(l.length>0){this.logger.info("\u538B\u7F29\u7387 Top 5:");for(const a of l)this.logger.info(` ${a.algorithm.toUpperCase().padEnd(6)} ${a.ratio}% ${c(a.originalSize)} \u2192 ${c(a.compressedSize)}`)}}getStats(){return[...this.allStats]}getSummary(){return this.summary}}const L=d($);export{L as compressAssets};
@@ -0,0 +1 @@
1
+ "use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs");require("../../logger/index.cjs"),require("../../common/object/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("fs"),require("path");class p extends factory_index.BasePlugin{getDefaultOptions(){return{overwrite:!0,recursive:!0,incremental:!0}}validateOptions(){this.validator.field("sourceDir").required().string().custom(e=>e.trim()!=="","sourceDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("targetDir").required().string().custom(e=>e.trim()!=="","targetDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("overwrite").boolean().field("recursive").boolean().field("incremental").boolean().validate()}getPluginName(){return"copy-file"}getEnforce(){return"post"}async copyFiles(){const{sourceDir:e,targetDir:u,overwrite:i=!0,recursive:t=!0,incremental:s=!0,enabled:o=!0}=this.options;if(!o){this.logger.info(`\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6267\u884C\uFF1A\u4ECE ${e} \u590D\u5236\u5230 ${u}`);return}await common_fs_index.checkSourceExists(e);const r=await common_fs_index.copySourceToTarget(e,u,{recursive:t,overwrite:i,incremental:s});this.logger.success(`\u590D\u5236\u6587\u4EF6\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${u}`,`\u590D\u5236\u4E86 ${r.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${r.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${r.executionTime}ms`)}addPluginHooks(e){e.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u590D\u5236\u6587\u4EF6")}}}const copyFile=factory_index.createPluginFactory(p);exports.copyFile=copyFile;
@@ -0,0 +1,78 @@
1
+ import { BasePluginOptions, PluginFactory } from '../../factory/index.cjs';
2
+ import 'vite';
3
+ import '../../shared/vite-plugin.CLr0ttuO.cjs';
4
+ import '../../shared/vite-plugin.DRRlWY8P.cjs';
5
+
6
+ /**
7
+ * 复制文件插件的配置选项接口
8
+ *
9
+ * @interface CopyFileOptions
10
+ */
11
+ interface CopyFileOptions extends BasePluginOptions {
12
+ /**
13
+ * 源文件目录的路径
14
+ *
15
+ * @example 'src/assets'
16
+ */
17
+ sourceDir: string;
18
+ /**
19
+ * 目标文件目录的路径
20
+ *
21
+ * @example 'dist/assets'
22
+ */
23
+ targetDir: string;
24
+ /**
25
+ * 是否覆盖同名文件
26
+ *
27
+ * @default true
28
+ */
29
+ overwrite?: boolean;
30
+ /**
31
+ * 是否支持递归复制
32
+ *
33
+ * @default true
34
+ */
35
+ recursive?: boolean;
36
+ /**
37
+ * 是否启用增量复制
38
+ *
39
+ * @default true
40
+ */
41
+ incremental?: boolean;
42
+ }
43
+
44
+ /**
45
+ * 复制文件插件
46
+ *
47
+ * @param {CopyFileOptions} options - 插件配置选项
48
+ * @returns {Plugin} 一个 Vite 插件实例
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * // 基本使用
53
+ * copyFile({
54
+ * sourceDir: 'src/assets',
55
+ * targetDir: 'dist/assets'
56
+ * })
57
+ *
58
+ * // 高级配置
59
+ * copyFile({
60
+ * sourceDir: 'src/static',
61
+ * targetDir: 'dist/static',
62
+ * overwrite: false,
63
+ * recursive: true,
64
+ * incremental: true,
65
+ * enabled: true,
66
+ * verbose: true,
67
+ * errorStrategy: 'throw'
68
+ * })
69
+ * ```
70
+ *
71
+ * @remarks
72
+ * 该插件会在 Vite 构建完成后执行,将指定源目录的所有文件和子目录复制到目标目录。
73
+ * 支持增量复制、递归复制和覆盖控制等功能。
74
+ */
75
+ declare const copyFile: PluginFactory<CopyFileOptions, CopyFileOptions>;
76
+
77
+ export { copyFile };
78
+ export type { CopyFileOptions };
@@ -0,0 +1,78 @@
1
+ import { BasePluginOptions, PluginFactory } from '../../factory/index.mjs';
2
+ import 'vite';
3
+ import '../../shared/vite-plugin.CLr0ttuO.mjs';
4
+ import '../../shared/vite-plugin.DRRlWY8P.mjs';
5
+
6
+ /**
7
+ * 复制文件插件的配置选项接口
8
+ *
9
+ * @interface CopyFileOptions
10
+ */
11
+ interface CopyFileOptions extends BasePluginOptions {
12
+ /**
13
+ * 源文件目录的路径
14
+ *
15
+ * @example 'src/assets'
16
+ */
17
+ sourceDir: string;
18
+ /**
19
+ * 目标文件目录的路径
20
+ *
21
+ * @example 'dist/assets'
22
+ */
23
+ targetDir: string;
24
+ /**
25
+ * 是否覆盖同名文件
26
+ *
27
+ * @default true
28
+ */
29
+ overwrite?: boolean;
30
+ /**
31
+ * 是否支持递归复制
32
+ *
33
+ * @default true
34
+ */
35
+ recursive?: boolean;
36
+ /**
37
+ * 是否启用增量复制
38
+ *
39
+ * @default true
40
+ */
41
+ incremental?: boolean;
42
+ }
43
+
44
+ /**
45
+ * 复制文件插件
46
+ *
47
+ * @param {CopyFileOptions} options - 插件配置选项
48
+ * @returns {Plugin} 一个 Vite 插件实例
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * // 基本使用
53
+ * copyFile({
54
+ * sourceDir: 'src/assets',
55
+ * targetDir: 'dist/assets'
56
+ * })
57
+ *
58
+ * // 高级配置
59
+ * copyFile({
60
+ * sourceDir: 'src/static',
61
+ * targetDir: 'dist/static',
62
+ * overwrite: false,
63
+ * recursive: true,
64
+ * incremental: true,
65
+ * enabled: true,
66
+ * verbose: true,
67
+ * errorStrategy: 'throw'
68
+ * })
69
+ * ```
70
+ *
71
+ * @remarks
72
+ * 该插件会在 Vite 构建完成后执行,将指定源目录的所有文件和子目录复制到目标目录。
73
+ * 支持增量复制、递归复制和覆盖控制等功能。
74
+ */
75
+ declare const copyFile: PluginFactory<CopyFileOptions, CopyFileOptions>;
76
+
77
+ export { copyFile };
78
+ export type { CopyFileOptions };
@@ -0,0 +1,78 @@
1
+ import { BasePluginOptions, PluginFactory } from '../../factory/index.js';
2
+ import 'vite';
3
+ import '../../shared/vite-plugin.CLr0ttuO.js';
4
+ import '../../shared/vite-plugin.DRRlWY8P.js';
5
+
6
+ /**
7
+ * 复制文件插件的配置选项接口
8
+ *
9
+ * @interface CopyFileOptions
10
+ */
11
+ interface CopyFileOptions extends BasePluginOptions {
12
+ /**
13
+ * 源文件目录的路径
14
+ *
15
+ * @example 'src/assets'
16
+ */
17
+ sourceDir: string;
18
+ /**
19
+ * 目标文件目录的路径
20
+ *
21
+ * @example 'dist/assets'
22
+ */
23
+ targetDir: string;
24
+ /**
25
+ * 是否覆盖同名文件
26
+ *
27
+ * @default true
28
+ */
29
+ overwrite?: boolean;
30
+ /**
31
+ * 是否支持递归复制
32
+ *
33
+ * @default true
34
+ */
35
+ recursive?: boolean;
36
+ /**
37
+ * 是否启用增量复制
38
+ *
39
+ * @default true
40
+ */
41
+ incremental?: boolean;
42
+ }
43
+
44
+ /**
45
+ * 复制文件插件
46
+ *
47
+ * @param {CopyFileOptions} options - 插件配置选项
48
+ * @returns {Plugin} 一个 Vite 插件实例
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * // 基本使用
53
+ * copyFile({
54
+ * sourceDir: 'src/assets',
55
+ * targetDir: 'dist/assets'
56
+ * })
57
+ *
58
+ * // 高级配置
59
+ * copyFile({
60
+ * sourceDir: 'src/static',
61
+ * targetDir: 'dist/static',
62
+ * overwrite: false,
63
+ * recursive: true,
64
+ * incremental: true,
65
+ * enabled: true,
66
+ * verbose: true,
67
+ * errorStrategy: 'throw'
68
+ * })
69
+ * ```
70
+ *
71
+ * @remarks
72
+ * 该插件会在 Vite 构建完成后执行,将指定源目录的所有文件和子目录复制到目标目录。
73
+ * 支持增量复制、递归复制和覆盖控制等功能。
74
+ */
75
+ declare const copyFile: PluginFactory<CopyFileOptions, CopyFileOptions>;
76
+
77
+ export { copyFile };
78
+ export type { CopyFileOptions };
@@ -0,0 +1 @@
1
+ import{createPluginFactory as c,BasePlugin as n}from"../../factory/index.mjs";import{checkSourceExists as a,copySourceToTarget as l}from"../../common/fs/index.mjs";import"../../logger/index.mjs";import"../../common/object/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";import"path";class F extends n{getDefaultOptions(){return{overwrite:!0,recursive:!0,incremental:!0}}validateOptions(){this.validator.field("sourceDir").required().string().custom(e=>e.trim()!=="","sourceDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("targetDir").required().string().custom(e=>e.trim()!=="","targetDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("overwrite").boolean().field("recursive").boolean().field("incremental").boolean().validate()}getPluginName(){return"copy-file"}getEnforce(){return"post"}async copyFiles(){const{sourceDir:e,targetDir:u,overwrite:t=!0,recursive:i=!0,incremental:o=!0,enabled:s=!0}=this.options;if(!s){this.logger.info(`\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6267\u884C\uFF1A\u4ECE ${e} \u590D\u5236\u5230 ${u}`);return}await a(e);const r=await l(e,u,{recursive:i,overwrite:t,incremental:o});this.logger.success(`\u590D\u5236\u6587\u4EF6\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${u}`,`\u590D\u5236\u4E86 ${r.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${r.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${r.executionTime}ms`)}addPluginHooks(e){e.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u590D\u5236\u6587\u4EF6")}}}const E=c(F);export{E as copyFile};
@@ -0,0 +1 @@
1
+ "use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),validator=require("../../shared/vite-plugin.Bcg6RW2N.cjs"),common_html_index=require("../../common/html/index.cjs");require("../../logger/index.cjs"),require("../../common/object/index.cjs"),require("fs"),require("path");function generateIconTagDescriptors(u){const i=[];if(u.link)return[];if(u.icons&&u.icons.length>0)for(const e of u.icons){const t={rel:e.rel,href:e.href};e.sizes&&(t.sizes=e.sizes),e.type&&(t.type=e.type),i.push({tag:"link",attrs:t,injectTo:"head"})}else if(u.url)i.push({tag:"link",attrs:{rel:"icon",href:u.url},injectTo:"head"});else{const e=u.base||"/",t=e.endsWith("/")?`${e}favicon.ico`:`${e}/favicon.ico`;i.push({tag:"link",attrs:{rel:"icon",href:t},injectTo:"head"})}return i}class f extends factory_index.BasePlugin{getDefaultOptions(){return{base:"/"}}validateOptions(){this.validator.field("base").string().field("url").string().field("link").string().field("icons").array(),this.options?.copyOptions&&(this.validator.field("copyOptions").object(),new validator.Validator(this.options.copyOptions).field("sourceDir").required().string().field("targetDir").required().string().field("overwrite").boolean().field("recursive").boolean().validate()),this.validator.validate()}getPluginName(){return"favicon-manager"}getIconTagDescriptors(){if(!this.options.enabled)return this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),[];const i=generateIconTagDescriptors(this.options);return i.length>0&&this.logger.success(`\u6210\u529F\u6CE8\u5165 ${i.length} \u4E2A\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6`),i}injectCustomLinkTag(i){if(!this.options.enabled||!this.options.link)return i;const e=this.options.link,t=common_html_index.injectBeforeTag(i,"</head>",e);return t.injected?(this.logger.success("\u6210\u529F\u6CE8\u5165\u81EA\u5B9A\u4E49\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6"),this.logger.info(` - ${e}`),t.html):(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),i)}async copyFiles(){if(!this.options.enabled){this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6587\u4EF6\u590D\u5236");return}const{copyOptions:i}=this.options;if(!i)return;const{sourceDir:e,targetDir:t,overwrite:r=!0,recursive:n=!0}=i;await common_fs_index.checkSourceExists(e);const s=await common_fs_index.copySourceToTarget(e,t,{recursive:n,overwrite:r,incremental:!0});this.logger.success(`\u56FE\u6807\u6587\u4EF6\u590D\u5236\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${t}`,`\u590D\u5236\u4E86 ${s.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${s.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${s.executionTime}ms`)}addPluginHooks(i){i.transformIndexHtml={order:"pre",handler:e=>{if(this.options.link)return this.injectCustomLinkTag(e);const t=this.getIconTagDescriptors();return t.length>0?{html:e,tags:t}:e}},i.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u56FE\u6807\u6587\u4EF6\u590D\u5236")}}}const faviconManager=factory_index.createPluginFactory(f,u=>typeof u=="string"?{base:u}:u||{});exports.faviconManager=faviconManager;