UNPKG

1.76 kBJavaScriptView Raw
1import { parse } from 'url'
2import fs from 'fs'
3import send from 'send'
4
5const panelsVersion = require('panels/package.json').version
6const panelsJs = require.resolve(`panels/bundle/panels-${panelsVersion}.js`)
7const panelsJsonFile = `${__dirname}/panels.json`
8const playgroundFile = `${__dirname}/playground.html`
9
10const FILES = {
11 // serve the panels runtime
12 'panels.js': panelsJs,
13 // serve panels.json if it wasn't served from assets
14 'panels.json': panelsJsonFile,
15 // serve the panels runtime source map
16 [`panels-${panelsVersion}.js.map`]: `${panelsJs}.map`
17}
18
19function isFile(file) {
20 try {
21 const stat = fs.statSync(file)
22 return stat.isFile()
23 } catch(err) {
24 return false
25 }
26}
27
28export default app => (req, res) => {
29 try {
30 const pathname = parse(req.url).pathname.replace(app.root, '')
31 const assetFile = `${app.assets}${pathname}`
32 let file
33
34 if (pathname === 'app.js') {
35 // serve panels packaged app.js'
36 file = app.tmp
37 } else if (isFile(assetFile)) {
38 // serve static assets
39 file = assetFile
40 } else if (FILES[pathname]) {
41 file = FILES[pathname]
42 } else if (app.serveAsIs.find(regex => regex.test(pathname))) {
43 // serve files that the user defined they want them like that
44 if (isFile(assetFile)) {
45 file = assetFile
46 }
47 } else {
48 // catch all for index
49 const customIndexFile = `${app.assets}/index.html`
50
51 file = fs.existsSync(customIndexFile) ? customIndexFile : playgroundFile
52 }
53
54 res.setHeader('Access-Control-Allow-Origin', '*')
55 res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept')
56 send(req, file).pipe(res)
57 } catch(err) {
58 res.writeHead(404)
59 res.end()
60 }
61}