github.com/evanw/esbuild@v0.21.4/scripts/browser/browser-tests.js (about) 1 const http = require('http') 2 const path = require('path') 3 const url = require('url') 4 const fs = require('fs') 5 6 const js = fs.readFileSync(path.join(__dirname, '..', '..', 'npm', 'esbuild-wasm', 'lib', 'browser.js')) 7 const jsMin = fs.readFileSync(path.join(__dirname, '..', '..', 'npm', 'esbuild-wasm', 'lib', 'browser.min.js')) 8 const esm = fs.readFileSync(path.join(__dirname, '..', '..', 'npm', 'esbuild-wasm', 'esm', 'browser.js')) 9 const esmMin = fs.readFileSync(path.join(__dirname, '..', '..', 'npm', 'esbuild-wasm', 'esm', 'browser.min.js')) 10 const wasm = fs.readFileSync(path.join(__dirname, '..', '..', 'npm', 'esbuild-wasm', 'esbuild.wasm')) 11 const html = fs.readFileSync(path.join(__dirname, '..', '..', 'scripts', 'browser', 'index.html')) 12 13 const server = http.createServer((req, res) => { 14 console.log(`[http] ${req.method} ${req.url}`) 15 16 try { 17 if (req.method === 'GET' && req.url) { 18 const parsed = url.parse(req.url) 19 20 if (parsed.pathname === '/npm/esbuild-wasm/lib/browser.js') { 21 res.writeHead(200, { 'Content-Type': 'text/javascript' }) 22 res.end(js) 23 return 24 } 25 26 if (parsed.pathname === '/npm/esbuild-wasm/lib/browser.min.js') { 27 res.writeHead(200, { 'Content-Type': 'text/javascript' }) 28 res.end(jsMin) 29 return 30 } 31 32 if (parsed.pathname === '/npm/esbuild-wasm/esm/browser.js') { 33 res.writeHead(200, { 'Content-Type': 'text/javascript' }) 34 res.end(esm) 35 return 36 } 37 38 if (parsed.pathname === '/npm/esbuild-wasm/esm/browser.min.js') { 39 res.writeHead(200, { 'Content-Type': 'text/javascript' }) 40 res.end(esmMin) 41 return 42 } 43 44 if (parsed.pathname === '/npm/esbuild-wasm/esbuild.wasm') { 45 res.writeHead(200, { 'Content-Type': 'application/wasm' }) 46 res.end(wasm) 47 return 48 } 49 50 if (parsed.pathname === '/scripts/browser/index.html') { 51 res.writeHead(200, { 'Content-Type': 'text/html' }) 52 res.end(html) 53 return 54 } 55 56 if (parsed.pathname === '/scripts/browser/esbuild.wasm.bagel') { 57 res.writeHead(200, { 'Content-Type': 'application/octet-stream' }) 58 res.end(wasm) 59 return 60 } 61 } 62 63 res.writeHead(404) 64 res.end('404 Not Found') 65 } 66 67 catch (err) { 68 res.writeHead(500) 69 res.end('500 Internal Server Error') 70 console.error(err) 71 } 72 }) 73 74 server.listen() 75 const { address, port } = server.address() 76 const serverURL = url.format({ protocol: 'http', hostname: address, port }) 77 console.log(`[http] listening on ${serverURL}`) 78 79 async function main() { 80 let allTestsPassed = true 81 try { 82 const browser = await require('puppeteer').launch() 83 84 const page = await browser.newPage() 85 page.on('console', obj => { 86 console.log(`[console.${obj.type()}] ${obj.text()}`) 87 }) 88 89 page.exposeFunction('testBegin', args => { 90 const { esm, min, worker, mime, approach } = JSON.parse(args) 91 console.log(`💬 config: esm=${esm}, min=${min}, worker=${worker}, mime=${mime}, approach=${approach}`) 92 }) 93 94 page.exposeFunction('testEnd', args => { 95 if (args === null) console.log(`👍 success`) 96 else { 97 const { test, stack, error } = JSON.parse(args) 98 console.log(`❌ error${test ? ` [${test}]` : ``}: ${error}`) 99 allTestsPassed = false 100 } 101 }) 102 103 const testDone = new Promise(resolve => { 104 page.exposeFunction('testDone', resolve) 105 }) 106 107 await page.goto(`${serverURL}/scripts/browser/index.html`, { waitUntil: 'domcontentloaded' }) 108 await testDone 109 await page.close() 110 await browser.close() 111 } 112 113 catch (e) { 114 allTestsPassed = false 115 console.log(`❌ error: ${e && e.stack || e && e.message || e}`) 116 } 117 118 server.close() 119 120 if (!allTestsPassed) { 121 console.error(`❌ browser test failed`) 122 process.exit(1) 123 } else { 124 console.log(`✅ browser test passed`) 125 } 126 } 127 128 main().catch(error => setTimeout(() => { throw error }))