24 lines
2.6 KiB
JavaScript
24 lines
2.6 KiB
JavaScript
/** Offline B04 lifecycle regression. --build-only emits a standalone own-component fixture. */
|
|
import fs from 'node:fs'
|
|
import path from 'node:path'
|
|
import { createRequire } from 'node:module'
|
|
const require = createRequire(import.meta.url)
|
|
fs.mkdirSync('.tmp',{recursive:true})
|
|
const output=fs.mkdtempSync(path.resolve('.tmp/b04-image-'))
|
|
await require('esbuild').build({entryPoints:['scripts/b04-image-lifecycle-fixture.tsx'],outfile:path.join(output,'fixture.js'),bundle:true,platform:'browser',format:'iife',jsx:'automatic',loader:{'.woff2':'dataurl','.woff':'dataurl','.ttf':'dataurl','.svg':'dataurl','.png':'dataurl'},logLevel:'error'})
|
|
fs.writeFileSync(path.join(output,'index.html'),`<!doctype html><meta charset="utf-8"><meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src data: blob:; font-src data:; connect-src 'none'"><link rel="stylesheet" href="fixture.css"><style>body{margin:20px;width:800px}.markdown-content__image{max-height:400px;max-width:100%}</style><div id="root"></div><pre id="report">Running synthetic own-component frame probe…</pre><script src="fixture.js"></script><script>window.__b04.probe().then(r=>{window.__b04Report=r;document.getElementById('report').textContent=JSON.stringify(r,null,2)}).catch(e=>{window.__b04Error=String(e);document.getElementById('report').textContent=String(e)})</script>`)
|
|
if(process.argv.includes('--build-only')){console.log(JSON.stringify({result:'BUILD_ONLY',output,limits:'Not executed in a native browser; open index.html in a permitted browser for synthetic consecutive-frame probe.'}));process.exit(0)}
|
|
const {JSDOM}=require(process.env.YCODE_TEST_DOM_MODULE||process.env.YCODE_JSDOM_MODULE||'jsdom')
|
|
const dom=new JSDOM('<!doctype html><div id="root"></div>',{url:'https://fixture.invalid',runScripts:'outside-only',pretendToBeVisual:true})
|
|
const w=dom.window
|
|
w.fetch=()=>{throw Error('Fixture forbids network')}
|
|
w.ResizeObserver=class {observe(){}unobserve(){}disconnect(){}}
|
|
w.matchMedia=()=>({matches:false,addEventListener(){},removeEventListener(){}})
|
|
let timer
|
|
try {
|
|
w.eval(fs.readFileSync(path.join(output,'fixture.js'),'utf8'))
|
|
const report=await Promise.race([w.__b04.run(),new Promise((_,reject)=>{timer=setTimeout(()=>reject(Error('B04 fixture timed out after 20s')),20000)})])
|
|
fs.writeFileSync(path.join(output,'report.json'),JSON.stringify(report,null,2))
|
|
console.log(JSON.stringify({result:'PASS',checks:report.checks.length,samples:report.samples.length,output,limits:report.limits}))
|
|
}finally{clearTimeout(timer);dom.window.close()}
|