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 }))