const fs = require("fs"); const path = require("path"); const { sites_path } = require("./utils"); module.exports = { name: "xhiveframework-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 name = out.path.split(".bundle.")[0]; name = path.basename(name); let index = result.outputFiles.findIndex((f) => { return f.path.endsWith(".css") && f.path.includes(`/${name}.bundle.`); }); let css_data = JSON.stringify(result.outputFiles[index].text); let modified = `xhiveframework.dom.set_style(${css_data});\n${out.text}`; out.contents = Buffer.from(modified); result.outputFiles.splice(index, 1); if (result.outputFiles[index - 1].path.endsWith(".css.map")) { result.outputFiles.splice(index - 1, 1); } } if (!fs.existsSync(dir)) { fs.mkdirSync(dir, { recursive: true }); } 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; }