cocos-html-pack-3d
Version:
Single html web mobile template for Cocos verions 2.x
100 lines (87 loc) • 2.83 kB
text/typescript
import * as fs from 'fs';
import * as path from 'path';
import minify from 'minify';
import tinify from 'tinify';
import JSZip from 'jszip';
class Util {
walk(res: string[], dir: string, ext?: string): void {
const names = fs.readdirSync(dir);
for (const name of names) {
const filename = path.join(dir, name);
if (fs.statSync(filename).isDirectory()) {
// Walk into each dir
this.walk(res, filename, ext);
} else {
// Or match
const ok = ext ? path.extname(filename) === ext : true;
if (ok) {
res.push(filename);
}
}
}
}
copyFilesSync(src: string, dest: string) {
const names = fs.readdirSync(src);
for (const name of names) {
fs.copyFileSync(path.join(src, name), path.join(dest, name));
}
}
copyFilesSyncWithExt(src: string, dest: string, ext: string) {
const names = fs.readdirSync(src);
for (const name of names) {
const filename = path.join(src, name);
if (!fs.statSync(filename).isDirectory()) {
const ok = ext ? path.extname(name) === ext : true;
if (ok) {
fs.copyFileSync(path.join(src, name), path.join(dest, name));
}
}
}
}
copyDirSync(src: string, dest: string) {
fs.readdirSync(src).forEach((e) => {
if (fs.lstatSync(path.join(src, e)).isFile()) {
fs.copyFileSync(path.join(src, e), path.join(dest, e));
} else {
fs.mkdirSync(path.join(dest, e));
this.copyDirSync(path.join(src, e), path.join(dest, e));
}
});
}
write(filename: string, value: string) {
fs.writeFileSync(filename, value);
}
writeJSON(filename: string, data: unknown) {
this.write(filename, JSON.stringify(data, null, 2));
}
//zip file with jszip
zipFile(inputfilename: string, value: string, outputFileName: string, outputFolder: string) {
const _zip = new JSZip();
//create a file
_zip.file(inputfilename, value);
_zip.generateNodeStream({ type: 'nodebuffer', streamFiles: true })
.pipe(fs.createWriteStream(outputFileName))
.on('finish', () => {
console.log('zip file success with name: ', outputFileName);
this.copyFilesSyncWithExt(path.join(__dirname, '../'), outputFolder, '.zip');
});
}
/// Compress HTML + JS with minify
async useMinify(filename: string) {
const data = await minify(filename);
this.write(filename, data);
}
/// Compress image with TinyPNG
async useTinify(key: string, dir: string): Promise<void[]> {
tinify.key = key;
const filenames: string[] = [];
this.walk(filenames, dir, '.png');
return Promise.all(
filenames.map((e) => {
return tinify.fromFile(e).toFile(e);
}),
);
}
}
const singleton = new Util();
export { singleton as Util };