UNPKG

koa-viewer

Version:

Directory and file viewer for koa 2

1 lines • 10.5 kB
{"version":3,"sources":["../src/index.js"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport glob from 'glob';\nimport etag from 'etag';\nimport mime from 'mime';\n\nconst head = `\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\">\n <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n <meta name=\"format-detection\" content=\"telephone=no\">\n <meta name=\"screen-orientation\" content=\"portrait\">\n <meta name=\"x5-orientation\" content=\"portrait\">\n <style>\n *,\n *:before,\n *:after {\n box-sizing: border-box;\n }\n body{\n margin: 0;\n padding: 0;\n font-size: 87.5%;\n font-family: Consolas, Tahoma;\n }\n a{\n text-decoration: none;\n color: #333;\n }\n a:hover{\n background: #eaeaea;\n }\n ul{\n list-style-type: none;\n margin: 0;\n padding: 0;\n }\n .crumb{\n margin-bottom: 1em;\n padding: 1em;\n background: #333;\n }\n .crumb li{\n display: inline;\n margin-right: 5px;\n color: #ccc;\n }\n .crumb li a{\n color: #ccc;\n }\n .crumb li a:hover{\n text-decoration: underline;\n background: inherit;\n }\n .list{\n margin-bottom: 1em;\n }\n .list li{\n min-height: .5em;\n display: inline-block;\n width: 33.33%;\n }\n .list.block li{\n width: 100%;\n }\n .list li a{\n display: block;\n padding: 0 1em;\n line-height: 2;\n }\n @media only screen and (max-width : 768px) {\n .list li{\n display: block;\n width: 100%;\n }\n .list li a{\n line-height: 3;\n border-bottom: 1px dotted #ccc;\n }\n }\n </style>\n `;\n\n/**\n * [description]\n * @param {[type]} root [description]\n * @param {[json]} opts:\n {\n flat: false,\n cwd: realPath,\n nodir: false,\n dot: false\n }\n * @return {[type]} [description]\n */\nexport default (root, opts) => {\n root = (!root || root === '') ? process.cwd() : root;\n opts = opts || {};\n\n return async(ctx, next) => {\n\n if (!next) {\n return await genHtml(ctx, root, opts);\n } else {\n\n console.log('Send: ' + ctx.path);\n ctx.body = await genHtml(ctx, root, opts);\n\n return next();\n }\n\n }\n}\n\nasync function genHtml(ctx, root, opts) {\n try {\n let url = ctx.path;\n const realPath = path.join(root, url);\n const stats = await statp(realPath);\n\n // folder\n if (stats.isDirectory()) {\n\n let settings = {\n flat: false,\n cwd: realPath,\n nodir: false,\n dot: false\n };\n\n let html = `\n ${head}\n {crumb}\n {list}\n `;\n let listHtml = '';\n let listHtml_folder = '<ul class=\"list\">';\n let listHtml_file = '<ul class=\"list\">';\n let crumbHtml = '<ul class=\"crumb\">';\n merge(settings, opts);\n\n if (settings.flat) {\n settings.nodir = opts.nodir === undefined ? true : opts.nodir;\n const list = await globPromise('**/*', settings);\n crumbHtml += '<li>' + url + ':</li></ul>';\n listHtml += '<ul class=\"list block\">';\n for (let item of list) {\n listHtml += '<li><a href=\"' + url + item + '\">' + item + '</a></li>'\n }\n listHtml += '</ul>';\n } else {\n const list = await globPromise('*', settings);\n for (let item of list) {\n const itemStats = await statp(realPath + item);\n if (itemStats.isDirectory()) {\n listHtml_folder += '<li><a href=\"' + url + item + '/\">' + item + '/</a></li>'\n } else {\n listHtml_file += '<li><a href=\"' + url + item + '\">' + item + '</a></li>'\n }\n }\n listHtml_folder += '</ul>';\n listHtml_file += '</ul>';\n listHtml = listHtml_folder + listHtml_file;\n crumbHtml += '<li><a href=\"/\">/</a></li>';\n\n if (url !== '/') {\n let dirUrl = '/';\n const urlArr = url.substr(1, url.length - 2).split('/');\n for (let u of urlArr) {\n dirUrl += u + '/';\n crumbHtml += '<li><a href=\"' + dirUrl + '\">' + u + '/</a></li>'\n }\n }\n crumbHtml += '</ul>';\n }\n\n html = html.replace('{crumb}', crumbHtml).replace('{list}', listHtml);\n\n return html;\n }\n\n // file\n if (stats.isFile()) {\n const type = mime.lookup(realPath);\n const charset = mime.charsets.lookup(type);\n const headers = {\n ETag: etag(stats),\n 'Content-Type': type + (charset ? '; charset=' + charset : ''),\n 'Content-Length': stats.size,\n 'Cache-Control': 'no-store, no-cache, must-revalidate, max-age=0',\n Expires: 'Sat, 01 Jan 2000 00:00:00 GMT'\n };\n ctx.set(headers);\n return fs.createReadStream(realPath);\n }\n\n } catch (err) {\n throw err;\n }\n}\n\nfunction merge(target) {\n var sources = [].slice.call(arguments, 1);\n sources.forEach(function(source) {\n for (var p in source)\n if (typeof source[p] === 'object') {\n target[p] = target[p] || (Array.isArray(source[p]) ? [] : {});\n merge(target[p], source[p]);\n } else {\n target[p] = source[p];\n }\n })\n return target;\n}\n\nfunction globPromise(pattern, options) {\n return new Promise((resolve, reject) => {\n glob(pattern, options, (err, files) => {\n return err === null ? resolve(files) : reject(err)\n })\n })\n}\n\nfunction statp(realPath) {\n return new Promise((resolve, reject) => {\n fs.stat(realPath, (err, stats) => {\n return err === null ? resolve(stats) : reject(err)\n })\n })\n}\n"]}