fix-corrupted-list-layout.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /**
  2. * Repair list-page layout corruption: nested duplicate forms inside list-search-actions.
  3. */
  4. const fs = require('fs')
  5. const path = require('path')
  6. const viewsDir = process.argv[2]
  7. ? path.resolve(process.argv[2])
  8. : path.join(__dirname, '../src/views')
  9. function walk(dir, files = []) {
  10. for (const name of fs.readdirSync(dir)) {
  11. const full = path.join(dir, name)
  12. if (fs.statSync(full).isDirectory()) walk(full, files)
  13. else if (name.endsWith('.vue')) files.push(full)
  14. }
  15. return files
  16. }
  17. function repair(content) {
  18. if (!content.includes('list-search-actions')) return content
  19. if (!/<el-form-item class="list-search-actions">[\s\S]*?(head-container|ref="queryForm")/.test(content)) {
  20. return content
  21. }
  22. const searchBtn = content.match(/<el-button[^>]*@click="handleQuery"[^>]*>[^<]*<\/el-button>/)
  23. const resetBtn = content.match(/<el-button[^>]*@click="resetQuery"[^>]*>[^<]*<\/el-button>/)
  24. const searchHtml = searchBtn
  25. ? searchBtn[0].replace(/type="primary"/, 'type="cyan"').replace(/\stype="cyan"\s+type="cyan"/, ' type="cyan"')
  26. : '<el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">锟斤拷锟斤拷</el-button>'
  27. const resetHtml = resetBtn
  28. ? resetBtn[0]
  29. : '<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">锟斤拷锟斤拷</el-button>'
  30. const actionsBlock = ` <el-form-item class="list-search-actions">
  31. ${searchHtml}
  32. ${resetHtml}
  33. </el-form-item>
  34. </el-form>`
  35. const repaired = content.replace(
  36. /(\s+<\/el-form-item>\s*\n)\s*<el-form-item class="list-search-actions">[\s\S]*?<\/el-form>\s*\n\s*<el-row :gutter="10" class="mb8 list-toolbar">[\s\S]*?<\/el-form-item>\s*\n\s*<\/el-form>\s*\n(\s*<el-row :gutter="10" class="mb8 list-toolbar">)/,
  37. `$1${actionsBlock}\n\n$2`
  38. )
  39. return repaired
  40. }
  41. let fixed = 0
  42. for (const file of walk(viewsDir)) {
  43. const original = fs.readFileSync(file, 'utf8')
  44. const next = repair(original)
  45. if (next !== original) {
  46. fs.writeFileSync(file, next, 'utf8')
  47. fixed++
  48. console.log(path.relative(viewsDir, file))
  49. }
  50. }
  51. console.log('\nRepaired ' + fixed + ' files')