protect-builder.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /* eslint-disable @lwc/lwc/no-async-await */
  2. const path = require('path')
  3. const fs = require('fs')
  4. const compiler = require('vue/compiler-sfc')
  5. const { minify } = require('terser')
  6. const terserOptions = {
  7. compress: {
  8. defaults: false,
  9. },
  10. }
  11. const builderDir = path.join(process.cwd(), 'src', 'form-designer')
  12. fs.readdirSync(builderDir, { withFileTypes: true }).forEach((dirent) => {
  13. if (
  14. dirent.isFile() &&
  15. !['index.js', 'index-normalize-route.js'].includes(dirent.name)
  16. // &&dirent.name === 'util.js'
  17. // &&dirent.name === 'sd-default-value.vue'
  18. ) {
  19. const file = path.join(builderDir, dirent.name)
  20. if (dirent.name.endsWith('.vue')) {
  21. processVue(file)
  22. } else if (dirent.name.endsWith('.js')) {
  23. processJS(file)
  24. }
  25. }
  26. })
  27. function logError(error) {
  28. const { message } = error
  29. if (message !== 'Unexpected token: operator (<)') {
  30. // jsx导致的报错不提示
  31. console.log(path, error)
  32. }
  33. }
  34. async function processJS(path) {
  35. const content = fs.readFileSync(path).toString()
  36. try {
  37. const result = await minify(content, terserOptions)
  38. writeFile(path, '/* eslint-disable */\n' + result.code)
  39. } catch (error) {
  40. logError(error)
  41. }
  42. }
  43. async function processVue(path) {
  44. const content = fs.readFileSync(path).toString()
  45. // const resultx = compiler.parseComponent(content)
  46. // const template = result.template
  47. // const render = compiler.compileToFunctions(template.content)
  48. // const parseResult = utils.parse({ source: content, compiler, needMap: false })
  49. const parseResult = compiler.parseComponent(content)
  50. if (!parseResult.template) return
  51. const template = parseResult.template.content
  52. const render = compiler.compileTemplate({ source: template, filename: path }).code
  53. let script = parseResult.script.content
  54. // 压缩 js
  55. try {
  56. const minifyResult = await minify(script, terserOptions)
  57. script = minifyResult.code
  58. } catch (error) {
  59. logError(error)
  60. }
  61. // 加上 render
  62. script = script.replace(/export default ?{/, render + '\nexport default {\n render,')
  63. let result = content.replace(/<template>[\s\S]*<\/template>/, '')
  64. result = result.replace(
  65. /<script>[\s\S]*<\/script>/,
  66. '<script>\n/* eslint-disable */\n// sd-skip-auto-import\n' + script + '\n</script>'
  67. )
  68. writeFile(path, result)
  69. }
  70. function writeFile(jsFile, jsContent) {
  71. // 生成最终的js文件
  72. fs.writeFile(jsFile, jsContent, (error) => {
  73. if (error) {
  74. // eslint-disable-next-line no-console
  75. console.error('Error while creating ' + jsFile)
  76. throw error
  77. }
  78. })
  79. }