import { parseComponent } from "vue-template-compiler/browser";
import ejs from "ejs";
const outputVueTemplate = `
Page
<% for(var i = 0; i < cssLibs.length; ++i) { %>
<% } %>
<%- templateHolder %>
<% for(var i = 0; i < scriptLibs.length; ++i) { %>
<% } %>
`;
const libAddressMap = {
vue: {
js: ["https://cdn.bootcdn.net/ajax/libs/vue/3.2.31/vue.global.min.js"],
css: "",
},
ele: {
js: ["https://cdn.bootcdn.net/ajax/libs/element-plus/2.1.0/index.full.min.js"],
css: "https://cdn.bootcdn.net/ajax/libs/element-plus/2.1.0/theme-chalk/index.min.css",
libName: "ElementPlus",
},
antd: {
js: [
"https://cdn.bootcdn.net/ajax/libs/dayjs/1.10.8/dayjs.min.js",
"https://cdn.bootcdn.net/ajax/libs/ant-design-vue/3.0.0-alpha.14/antd.min.js",
],
css: "https://cdn.bootcdn.net/ajax/libs/ant-design-vue/3.0.0-alpha.14/antd.min.css",
libName: "antd",
},
vant: {
js: ["https://cdn.bootcdn.net/ajax/libs/vant/3.3.7/vant.min.js"],
css: "https://cdn.bootcdn.net/ajax/libs/vant/3.3.7/index.min.css",
libName: "vant",
},
};
export default function (vueCode, dependenciesLibs, vue3 = true) {
const { template, script, styles, customBlocks } = parseComponent(vueCode);
let newScript = script.content.replace(/\s*export default\s*/, "");
const tempDependenciesLibs = dependenciesLibs.slice();
const tempLibAddressMap = vue3 ? libAddressMap: libAddressMapForVue2
tempDependenciesLibs.unshift("vue");
const output = ejs.render(outputVueTemplate, {
cssLibs: tempDependenciesLibs.map((item) => tempLibAddressMap[item].css).filter((item) => !!item),
scriptLibs: tempDependenciesLibs
.map((item) => tempLibAddressMap[item].js)
.flat()
.filter((item) => !!item),
vue3,
vue3UseLib: tempDependenciesLibs
.filter((item) => item != "vue")
.map((item) => tempLibAddressMap[item].libName),
style: styles[0].content,
templateHolder: template.content,
logicHolder: newScript,
});
return output;
}
const libAddressMapForVue2 = {
vue: {
js: ["https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.min.js"],
css: "",
},
ele: {
js: ["https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.7/index.min.js"],
css: "https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.7/theme-chalk/index.min.css",
},
antd: {
js: [
"https://cdn.bootcdn.net/ajax/libs/moment.js/2.29.1/moment.min.js",
"https://cdn.bootcdn.net/ajax/libs/ant-design-vue/1.7.8/antd.js",
],
css: "https://cdn.bootcdn.net/ajax/libs/ant-design-vue/1.7.8/antd.css",
},
vant: {
js: ["https://cdn.bootcdn.net/ajax/libs/vant/2.12.44/vant.min.js"],
css: "https://cdn.bootcdn.net/ajax/libs/vant/2.12.44/index.min.css",
},
};