1 | import { parse } from 'url'
|
2 | import fs from 'fs'
|
3 | import send from 'send'
|
4 |
|
5 | const panelsVersion = require('panels/package.json').version
|
6 | const panelsJs = require.resolve(`panels/bundle/panels-${panelsVersion}.js`)
|
7 | const panelsJsonFile = `${__dirname}/panels.json`
|
8 | const playgroundFile = `${__dirname}/playground.html`
|
9 |
|
10 | const FILES = {
|
11 |
|
12 | 'panels.js': panelsJs,
|
13 |
|
14 | 'panels.json': panelsJsonFile,
|
15 |
|
16 | [`panels-${panelsVersion}.js.map`]: `${panelsJs}.map`
|
17 | }
|
18 |
|
19 | function isFile(file) {
|
20 | try {
|
21 | const stat = fs.statSync(file)
|
22 | return stat.isFile()
|
23 | } catch(err) {
|
24 | return false
|
25 | }
|
26 | }
|
27 |
|
28 | export 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 |
|
36 | file = app.tmp
|
37 | } else if (isFile(assetFile)) {
|
38 |
|
39 | file = assetFile
|
40 | } else if (FILES[pathname]) {
|
41 | file = FILES[pathname]
|
42 | } else if (app.serveAsIs.find(regex => regex.test(pathname))) {
|
43 |
|
44 | if (isFile(assetFile)) {
|
45 | file = assetFile
|
46 | }
|
47 | } else {
|
48 |
|
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 | }
|