seitime-frappe/esbuild/frappe-vue-style.js
2022-10-03 13:54:48 +05:30

48 lines
1.3 KiB
JavaScript

const fs = require("fs");
const path = require("path");
const { sites_path } = require("./utils");
module.exports = {
name: "frappe-vue-style",
setup(build) {
build.initialOptions.write = false;
build.onEnd((result) => {
let files = get_files(result.metafile.outputs);
let keys = Object.keys(files);
for (let out of result.outputFiles) {
let asset_path = "/" + path.relative(sites_path, out.path);
let dir = path.dirname(out.path);
if (out.path.endsWith(".js") && keys.includes(asset_path)) {
let bundle_css = files[asset_path];
let include_css = '\nfrappe.require("' + bundle_css + '", null, true);\n';
let modified = include_css + out.text;
out.contents = Buffer.from(modified);
}
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir);
}
fs.writeFile(out.path, out.contents, (err) => {
err && console.error(err);
});
}
});
},
};
function get_files(files) {
let result = {};
for (let file in files) {
let info = files[file];
let asset_path = "/" + path.relative(sites_path, file);
if (info && info.entryPoint && Object.keys(info.inputs).length !== 0) {
for (let input in info.inputs) {
if (input.includes(".vue?type=style")) {
let bundle_css = path.basename(info.entryPoint).replace(".js", ".css");
result[asset_path] = bundle_css;
break;
}
}
}
}
return result;
}