yf-system-cli 1.0.0
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.
- package/README.md +82 -0
- package/bin/cli.js +33 -0
- package/package.json +37 -0
- package/src/commands/init.js +699 -0
- package/src/commands/list.js +27 -0
- package/src/commands/push.js +66 -0
- package/src/commands/remove.js +39 -0
- package/src/config.js +76 -0
- package/src/themes/aaa/package-lock.json +2739 -0
- package/templates/theme/README.md +11 -0
- package/templates/theme/build.js +119 -0
- package/templates/theme/localhost.crt +18 -0
- package/templates/theme/localhost.key +28 -0
- package/templates/theme/package-lock.json +2739 -0
- package/templates/theme/package.json +34 -0
- package/templates/theme/server.js +1723 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
const fs = require('fs-extra');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const { minify: minifyHtml } = require('html-minifier-terser');
|
|
4
|
+
const CleanCSS = require('clean-css');
|
|
5
|
+
const Terser = require('terser');
|
|
6
|
+
const glob = require('glob');
|
|
7
|
+
|
|
8
|
+
// 工具函数:确保目录存在
|
|
9
|
+
async function ensureDir(filePath) {
|
|
10
|
+
const dir = path.dirname(filePath);
|
|
11
|
+
await fs.ensureDir(dir);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// 1. 压缩 HTML 文件
|
|
15
|
+
async function processHtmlFiles() {
|
|
16
|
+
const htmlFiles = glob.sync('**/*.html', { ignore: 'dist/**/*.html' });
|
|
17
|
+
|
|
18
|
+
for (const file of htmlFiles) {
|
|
19
|
+
const content = await fs.readFile(file, 'utf8');
|
|
20
|
+
const result = await minifyHtml(content, {
|
|
21
|
+
collapseWhitespace: true,
|
|
22
|
+
removeComments: true,
|
|
23
|
+
minifyCSS: true,
|
|
24
|
+
minifyJS: true,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
if (result.error) {
|
|
28
|
+
} else {
|
|
29
|
+
const distPath = path.join('dist', file);
|
|
30
|
+
await ensureDir(distPath);
|
|
31
|
+
await fs.writeFile(distPath, result);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// 2. 压缩 CSS 文件(支持 @import 合并)
|
|
37
|
+
async function processCssFiles() {
|
|
38
|
+
const cssFiles = glob.sync('css/**/*.css', { ignore: 'dist/**/*.css' });
|
|
39
|
+
|
|
40
|
+
for (const file of cssFiles) {
|
|
41
|
+
try {
|
|
42
|
+
const content = await fs.readFile(file, 'utf8');
|
|
43
|
+
if (file === 'css/index.css') {
|
|
44
|
+
const content = await fs.readFile(file, 'utf8');
|
|
45
|
+
const distPath = path.join('dist', file);
|
|
46
|
+
await ensureDir(distPath);
|
|
47
|
+
await fs.writeFile(distPath, content);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const output = new CleanCSS({
|
|
51
|
+
inline: ['all'], // ✅ 关键:让 clean-css 自动处理 @import url(...)
|
|
52
|
+
}).minify(content);
|
|
53
|
+
|
|
54
|
+
if (output.errors && output.errors.length > 0) {
|
|
55
|
+
|
|
56
|
+
} else if (output.warnings && output.warnings.length > 0) {
|
|
57
|
+
|
|
58
|
+
} else {
|
|
59
|
+
const distPath = path.join('dist', file);
|
|
60
|
+
await ensureDir(distPath);
|
|
61
|
+
await fs.writeFile(distPath, output.styles);
|
|
62
|
+
}
|
|
63
|
+
} catch (err) {
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// 3. 压缩 JS 文件
|
|
69
|
+
async function processJsFiles() {
|
|
70
|
+
const jsFiles = glob.sync('js/**/*.js', { ignore: 'dist/**/*.js' });
|
|
71
|
+
|
|
72
|
+
for (const file of jsFiles) {
|
|
73
|
+
const content = await fs.readFile(file, 'utf8');
|
|
74
|
+
const result = await Terser.minify(content, {
|
|
75
|
+
compress: true,
|
|
76
|
+
mangle: true,
|
|
77
|
+
format: { comments: false },
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
if (result.error) {
|
|
81
|
+
} else {
|
|
82
|
+
const distPath = path.join('dist', file);
|
|
83
|
+
await ensureDir(distPath);
|
|
84
|
+
await fs.writeFile(distPath, result.code);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// 4. 拷贝其他静态资源(如图片、字体,不压缩)
|
|
90
|
+
async function copyStaticAssets() {
|
|
91
|
+
const assets = glob.sync('**/*', {
|
|
92
|
+
nodir: true,
|
|
93
|
+
ignore: [
|
|
94
|
+
'**/*.html',
|
|
95
|
+
'**/*.css',
|
|
96
|
+
'**/*.js',
|
|
97
|
+
'dist/**',
|
|
98
|
+
],
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
for (const file of assets) {
|
|
102
|
+
const distPath = path.join('dist', file);
|
|
103
|
+
await ensureDir(distPath);
|
|
104
|
+
await fs.copyFile(file, distPath);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// 主函数
|
|
109
|
+
async function build() {
|
|
110
|
+
await fs.remove('dist'); // 清空旧的 dist(可选)
|
|
111
|
+
await fs.ensureDir('dist');
|
|
112
|
+
|
|
113
|
+
// await processHtmlFiles();
|
|
114
|
+
await processCssFiles();
|
|
115
|
+
await processJsFiles();
|
|
116
|
+
// await copyStaticAssets();
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
build().catch(console.error);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
|
2
|
+
MIIC7DCCAdSgAwIBAgIQNIQXh1dJm75OaDuAUj2UiDANBgkqhkiG9w0BAQsFADAU
|
|
3
|
+
MRIwEAYDVQQDEwlsb2NhbGhvc3QwHhcNMjUwNDA0MTA0OTIxWhcNMzAwNDA0MDAw
|
|
4
|
+
MDAwWjAUMRIwEAYDVQQDEwlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IB
|
|
5
|
+
DwAwggEKAoIBAQDIBPR6mtqlRBDBMhwKCXZS/QJW7hSZEGdhWReTjzdr2VW4oB+j
|
|
6
|
+
qwkCW+EQrXqbFxL/ThtnJ/SyTgC2VSvyova5ziAsvxm/ehtX92rdI1hn1ikpfx86
|
|
7
|
+
iOP8mvDbijW4RTmcoaCVckMwaCuE/9U7weDHfWH/YMGBF1WwTf8nVj24g27TLn8D
|
|
8
|
+
oyoiw6QgNVma9TiyGa4eSScviz3Vm7FWY+K9CYH+iRNCh0o0qeo7Gj8hJxhNoPMc
|
|
9
|
+
ABXifBZDHo5eEl+ABXlrDvqDNTafHugS8zmj5HTCZQkRqCNo5pHQ8DJqtbzW+oMC
|
|
10
|
+
qA9C6WwQCI8rDtGqKnUtCnF2okhEhc6m1+HVAgMBAAGjOjA4MAsGA1UdDwQEAwIE
|
|
11
|
+
sDATBgNVHSUEDDAKBggrBgEFBQcDATAUBgNVHREEDTALgglsb2NhbGhvc3QwDQYJ
|
|
12
|
+
KoZIhvcNAQELBQADggEBAL5ysz6VHM/WruBjGVZYyfqig+Wxj6G2W6Vgkv8dUg6n
|
|
13
|
+
bbNqlYxsh7O7H904SgRAw5K1eJc3oGfz32vS/4V1QeeWvnXEPC9uvSkVPrXaLjR4
|
|
14
|
+
KpyeNgYCOrveNi9pP8QwOlflR9uMUpojbgDqUCclJVwWP2A/wbXaEJAF5br6KmCZ
|
|
15
|
+
CZLFHadahVY0GhpLu9AHXyuAm6DjV7BK43w4mgfBJvbg0HO6pLFIiTrU+lp+hBu5
|
|
16
|
+
jHeOcjfdygcnZb/of1cO9+5hMno4ApH/2XrZAWBNqi5GhnXVxihWXw6pXz121R7v
|
|
17
|
+
VbFLunYSesE0txP5AkoM+HMtHp84o/l+uQY5gn6RJ48=
|
|
18
|
+
-----END CERTIFICATE-----
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDIBPR6mtqlRBDB
|
|
3
|
+
MhwKCXZS/QJW7hSZEGdhWReTjzdr2VW4oB+jqwkCW+EQrXqbFxL/ThtnJ/SyTgC2
|
|
4
|
+
VSvyova5ziAsvxm/ehtX92rdI1hn1ikpfx86iOP8mvDbijW4RTmcoaCVckMwaCuE
|
|
5
|
+
/9U7weDHfWH/YMGBF1WwTf8nVj24g27TLn8Doyoiw6QgNVma9TiyGa4eSScviz3V
|
|
6
|
+
m7FWY+K9CYH+iRNCh0o0qeo7Gj8hJxhNoPMcABXifBZDHo5eEl+ABXlrDvqDNTaf
|
|
7
|
+
HugS8zmj5HTCZQkRqCNo5pHQ8DJqtbzW+oMCqA9C6WwQCI8rDtGqKnUtCnF2okhE
|
|
8
|
+
hc6m1+HVAgMBAAECggEBALs1yA2pOtRMbNImsI/EY3cxUCtFEwpgjCJVXPfDqD/N
|
|
9
|
+
X6o6VOK/huMqU/FkLclTQ3iqBoP6pdDtqUT/Wu7zELK/9uVqyBKrm0QuU1s/ZdNq
|
|
10
|
+
Y4Rvcy86SQl5i84wAi/CuzWbIc4+8Bwyo+kL+uy/fj+5XyvDx9mnmZA2sIaE9afn
|
|
11
|
+
1PPqgJVYKuSH4mBnXqy6KJ1REIwl2nUtPxYQOlMPPUBdtLyNBH59YqvG9m9Txnhc
|
|
12
|
+
rxmzQnA7I1TUwvHovMCWZVtJol2HyB5t8A6CpdArNoB3BsTQWD3YrS1NMqfbqcz2
|
|
13
|
+
NXHdL6msW3HG2dAyxgksNrHLLbsWEu2qCGQJ+l8WEVECgYEA3U2hNSDBGNH//KYv
|
|
14
|
+
7CyZSg4vDYSI0FBdQKL8s9Kuso/t+4TTokPkHyhp1kDmtyWAtDVxi1MmdO+ce7Hb
|
|
15
|
+
Pq5tTlM+0/DI1lox+p4S7BBzqg+SrIdf57JLXulDsBtHmuIH3qlPzXVOS/Ypq8Jg
|
|
16
|
+
ng1FXwWGgLg5m1GD4vpZouv1wUcCgYEA52EPu3A6Bsdcxk8YFA1H7Wg6ohTO6zvm
|
|
17
|
+
AQ6QsuEab10wq/ogi3CU6CJUVcql5KZhoZ41zG8QZyvmMuM23P5xeZrCWWP+1cG4
|
|
18
|
+
IpgdYMdZBTSbeNGRmscTzYnThxdOzjhmAe+wNjdglgRnsWINrnVFGYGgKtohqN9V
|
|
19
|
+
oILFfmBzcgMCgYEAjj/uFYZeWKPz1eTE/RyV0+JWIGxGvRBLQNcDdFtCbAjUQk5Y
|
|
20
|
+
8v6MzfJeRZgmNSdoGW4Y9COYnqW+gkwKz7mzDRu5UOZ/Ujlb0up040SX9IJaF4hU
|
|
21
|
+
/0u94t4x4itG1angwSE36Ks0juNGWd9x12ZUZwXYNTk13j6Bdg7SO0VNDNUCgYEA
|
|
22
|
+
2lAOlACT/4lj1AkU4vaVAz/w8rVHd1SQ9DZV+THDy4fWQK5Evsx+83hQspH+bPs/
|
|
23
|
+
60pn4Hh6tZ4KGcGhJms9jkujTMy4yd96acm1DneJWwwEFb9G7w8fdDOzTieDx7gX
|
|
24
|
+
J4SMcttVWrbVT90Ao7cqd6KDCWu/jqMLG+PHjDJdOxkCgYAJiTMnDfGze3YjUHlv
|
|
25
|
+
yhCR3Fy2lRJ95Gt+AW/VMjV3ozTtgCqNtAk1MM/0hqbyTDCxBqmEvYjmJFElUetl
|
|
26
|
+
txXZTBpyeuxVL2FuVU7eBTkQctF8PHuPiIJMyntmhcztwSxEqQ2r4De7yWiZk6Hs
|
|
27
|
+
BdXLj1fsrRrT6Ec16dsg+5ps0A==
|
|
28
|
+
-----END PRIVATE KEY-----
|