mirror of
https://github.com/element-plus/element-plus.git
synced 2024-12-27 03:01:14 +08:00
82 lines
2.2 KiB
JavaScript
82 lines
2.2 KiB
JavaScript
|
/* eslint-disable @typescript-eslint/no-var-requires */
|
|||
|
const { compileTemplate, TemplateCompiler } = require('@vue/compiler-sfc')
|
|||
|
|
|||
|
function stripScript(content) {
|
|||
|
const result = content.match(/<(script)>([\s\S]+)<\/\1>/)
|
|||
|
return result && result[2] ? result[2].trim() : ''
|
|||
|
}
|
|||
|
|
|||
|
function stripStyle(content) {
|
|||
|
const result = content.match(/<(style)\s*>([\s\S]+)<\/\1>/)
|
|||
|
return result && result[2] ? result[2].trim() : ''
|
|||
|
}
|
|||
|
|
|||
|
// 编写例子时不一定有 template。所以采取的方案是剔除其他的内容
|
|||
|
function stripTemplate(content) {
|
|||
|
content = content.trim()
|
|||
|
if (!content) {
|
|||
|
return content
|
|||
|
}
|
|||
|
return content.replace(/<(script|style)[\s\S]+<\/\1>/g, '').trim()
|
|||
|
}
|
|||
|
|
|||
|
function pad(source) {
|
|||
|
return source
|
|||
|
.split(/\r?\n/)
|
|||
|
.map(line => ` ${line}`)
|
|||
|
.join('\n')
|
|||
|
}
|
|||
|
|
|||
|
function genInlineComponentText(template, script) {
|
|||
|
// https://github.com/vuejs/vue-loader/blob/423b8341ab368c2117931e909e2da9af74503635/lib/loaders/templateLoader.js#L46
|
|||
|
const finalOptions = {
|
|||
|
source: `<div>${template}</div>`,
|
|||
|
filename: 'inline-component', // TODO:这里有待调整
|
|||
|
compiler: TemplateCompiler,
|
|||
|
compilerOptions: {
|
|||
|
mode: 'function',
|
|||
|
},
|
|||
|
}
|
|||
|
const compiled = compileTemplate(finalOptions)
|
|||
|
// tips
|
|||
|
if (compiled.tips && compiled.tips.length) {
|
|||
|
compiled.tips.forEach(tip => {
|
|||
|
console.warn(tip)
|
|||
|
})
|
|||
|
}
|
|||
|
// errors
|
|||
|
if (compiled.errors && compiled.errors.length) {
|
|||
|
console.error(
|
|||
|
`\n Error compiling template:\n${pad(compiled.source)}\n` +
|
|||
|
compiled.errors.map(e => ` - ${e}`).join('\n') +
|
|||
|
'\n',
|
|||
|
)
|
|||
|
}
|
|||
|
let demoComponentContent = `
|
|||
|
${(compiled.code).replace('return function render','function render')}
|
|||
|
`
|
|||
|
// todo: 这里采用了硬编码有待改进
|
|||
|
script = script.trim()
|
|||
|
if (script) {
|
|||
|
script = script.replace(/export\s+default/, 'const democomponentExport =')
|
|||
|
} else {
|
|||
|
script = 'const democomponentExport = {}'
|
|||
|
}
|
|||
|
demoComponentContent = `(function() {
|
|||
|
${demoComponentContent}
|
|||
|
${script}
|
|||
|
return {
|
|||
|
render,
|
|||
|
...democomponentExport
|
|||
|
}
|
|||
|
})()`
|
|||
|
return demoComponentContent
|
|||
|
}
|
|||
|
|
|||
|
module.exports = {
|
|||
|
stripScript,
|
|||
|
stripStyle,
|
|||
|
stripTemplate,
|
|||
|
genInlineComponentText,
|
|||
|
}
|