compile-vue-templates.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. const fs = require('fs')
  2. const path = require('path')
  3. const compiler = require('vue-template-compiler')
  4. const roots = [
  5. path.join(__dirname, '../src/views'),
  6. path.join(__dirname, '../../saas-mgnui/src/views'),
  7. path.join(__dirname, '../../adminui/src/views')
  8. ]
  9. function walk(dir, files = []) {
  10. if (!fs.existsSync(dir)) return files
  11. for (const name of fs.readdirSync(dir)) {
  12. const full = path.join(dir, name)
  13. if (fs.statSync(full).isDirectory()) walk(full, files)
  14. else if (name.endsWith('.vue')) files.push(full)
  15. }
  16. return files
  17. }
  18. function rootTemplate(content) {
  19. const scriptIdx = content.search(/<script[\s>]/)
  20. const block = scriptIdx >= 0 ? content.slice(0, scriptIdx) : content
  21. const start = block.indexOf('<template>')
  22. const end = block.lastIndexOf('</template>')
  23. if (start < 0 || end <= start) return null
  24. return block.slice(start + '<template>'.length, end)
  25. }
  26. const errors = []
  27. for (const root of roots) {
  28. for (const file of walk(root)) {
  29. const content = fs.readFileSync(file, 'utf8')
  30. const tpl = rootTemplate(content)
  31. if (!tpl) continue
  32. const result = compiler.compile(tpl, { whitespace: 'preserve' })
  33. if (result.errors && result.errors.length) {
  34. errors.push({ file, messages: result.errors })
  35. }
  36. }
  37. }
  38. console.log('Template compile errors:', errors.length)
  39. for (const e of errors) {
  40. console.log('\n' + e.file.replace(/\\/g, '/'))
  41. for (const msg of e.messages.slice(0, 5)) console.log(' ', msg)
  42. if (e.messages.length > 5) console.log(' ', `... +${e.messages.length - 5} more`)
  43. }