/* ============================================================================
* JcXx.optimized.vue 验收脚本
* 1) 真实 SFC 编译:vue-template-compiler / @babel/parser / sass
* 2) 功能集合零变化:script 哈希 + 模板指令/列/按钮/弹窗集合比对
* 3) 优化前 / 优化后同一份静态 DOM + 两份真实 CSS,多视口截图与布局断言
* 用法:node verify_jcxx.cjs
* ==========================================================================*/
const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
const ROOT = path.resolve(__dirname, '..', '..', '..');
const VUE = path.join(ROOT, 'YktVue');
const SRC = path.join(VUE, 'src', 'views', 'JcXx.vue');
const OUT = path.join(VUE, 'src', 'views', 'JcXx.optimized.vue');
const UI = path.join(ROOT, 'docs', 'frontend', 'ui');
const req = p => require(path.join(VUE, 'node_modules', p));
const compiler = req('vue-template-compiler');
const babel = req('@babel/parser');
const sass = req('sass');
let chromium;
const PW = 'C:/Users/zfjia/AppData/Roaming/npm/node_modules/@playwright/cli/node_modules/playwright';
const EXE = 'C:/Users/zfjia/AppData/Local/ms-playwright/chromium_headless_shell-1243/chrome-headless-shell-win64/chrome-headless-shell.exe';
try { ({ chromium } = require(PW)); } catch (e) { ({ chromium } = require('playwright')); }
const beforeVue = fs.readFileSync(SRC, 'utf8');
const afterVue = fs.readFileSync(OUT, 'utf8');
function parts(s) {
// 注意:模板内部有大量 ,必须取最后一个
const a = s.indexOf('') + ''.length;
const b = s.lastIndexOf('');
const c = s.indexOf('') + 9;
const e = s.indexOf('
${makeBody()}