vite-plugin-singlefile-compression
Version:
Compress all assets and embeds them into `dist/index.html`, making it convenient to share as a single HTML file.
46 lines (45 loc) • 1.33 kB
JavaScript
import fs from 'fs';
import { fileURLToPath } from 'url';
import { compress } from './compress.js';
function r(name) {
return fs.readFileSync(fileURLToPath(import.meta.resolve(`./template/${name}.js`))).toString();
}
function rt(name, template) {
const s = r(name).split(template, 2);
if (s.length !== 2)
throw "s.length!==2";
return s;
}
const files = {
base64: r('base64'),
base128: r('base128'),
assets: rt('assets', '{"":""}'),
css: rt('css', '"<style>"'),
icon: rt('icon', '"<icon>"'),
importmeta: rt('importmeta', '"<path>"'),
};
export const template = {
base(script, format, useBase128) {
script = compress(format, script, useBase128);
if (useBase128) {
return files.base128
.replace("<format>", format)
.split('"<script>"', 2).join(script);
}
return files.base64
.replace("<format>", format)
.split("<script>", 2).join(script);
},
assets(assetsJSON) {
return files.assets.join(assetsJSON);
},
css(cssSource) {
return files.css.join(JSON.stringify(cssSource));
},
icon(dataURL) {
return files.icon.join(JSON.stringify(dataURL));
},
importmeta(p) {
return files.importmeta.join(JSON.stringify(p));
},
};