-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuild.js
More file actions
115 lines (94 loc) · 3.2 KB
/
build.js
File metadata and controls
115 lines (94 loc) · 3.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import { readFileSync, writeFileSync, mkdirSync } from 'fs';
import { dirname, join } from 'path';
import CleanCSS from 'clean-css';
import { minify } from 'terser';
// Minify CSS
async function minifyCSS(inputPath, outputPath) {
const css = readFileSync(inputPath, 'utf8');
const minified = new CleanCSS().minify(css);
writeFileSync(outputPath, minified.styles);
console.log(`CSS minified: ${inputPath} -> ${outputPath}`);
};
// Minify JS
async function minifyJS(inputPath, outputPath) {
const js = readFileSync(inputPath, 'utf8');
const minified = await minify(js, {
module: true,
compress: {
passes: 2
},
mangle: {
toplevel: false
},
format: {
comments: false
}
});
if (!minified.code) {
throw new Error(`Terser failed to minify ${inputPath}`);
}
//writeFileSync(outputPath, minified.code);
writeFileSync(outputPath, js);
console.log(`JS minified: ${inputPath} -> ${outputPath}`);
}
// Extract external files from HTML
function extractExternalFiles(htmlPath) {
const html = readFileSync(htmlPath, 'utf8');
// Extract CSS files
const cssFiles = [...html.matchAll(/<link[^>]+href=["']([^"']+\.css)["']/g)]
.map(match => match[1]);
// Extract JS files
const jsFiles = [...html.matchAll(/<script[^>]+src=["']([^"']+\.js)["']/g)]
.map(match => match[1]);
return { cssFiles, jsFiles };
};
// Minify all assets referenced in HTML
async function minifyAllAssets(htmlPath, outputDir) {
//const { cssFiles, jsFiles } = extractExternalFiles(htmlPath);
const cssFiles = [
"./css/askzai.css"
];
const jsFiles = [
'./js/utils.js',
'./js/router.js',
'./js/askzai.js',
'./js/exampleQueries.js'
];
const baseDir = dirname(htmlPath);
// Minify CSS files
for (const cssFile of cssFiles) {
const inputPath = join(baseDir, cssFile);
const outputPath = join(outputDir, cssFile.replace('.css', '.css'));
const css = readFileSync(inputPath, 'utf8');
const minified = new CleanCSS().minify(css);
mkdirSync(dirname(outputPath), { recursive: true });
writeFileSync(outputPath, minified.styles);
console.log(`Minified: ${cssFile}`);
}
// Minify JS files
for (const jsFile of jsFiles) {
const inputPath = join(baseDir, jsFile);
const outputPath = join(outputDir, jsFile.replace('.js', '.js'));
const js = readFileSync(inputPath, 'utf8');
//const minified = await minify(js);
const minified = await minify(js, {
module: true,
compress: {
passes: 2
},
mangle: {
toplevel: true
},
format: {
comments: false
}
});
mkdirSync(dirname(outputPath), { recursive: true });
writeFileSync(outputPath, minified.code);
console.log(`Minified: ${jsFile}`);
}
};
// Usage
// minifyCSS('./styles.css', './styles.min.css');
// minifyJS('./script.js', './script.min.js');
minifyAllAssets('./src/index.html', './docs');