You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
2.7 KiB

10 years ago
9 years ago
10 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
  1. #!/usr/bin/env node
  2. 'use strict'
  3. const localWebServer = require('../')
  4. const cliOptions = require('../lib/cli-options')
  5. const commandLineArgs = require('command-line-args')
  6. const ansi = require('ansi-escape-sequences')
  7. const loadConfig = require('config-master')
  8. const path = require('path')
  9. const s = require('string-tools')
  10. const os = require('os')
  11. const cli = commandLineArgs(cliOptions.definitions)
  12. const usage = cli.getUsage(cliOptions.usageData)
  13. const stored = loadConfig('local-web-server')
  14. const options = collectOptions()
  15. // TODO summary line on server launch
  16. if (options.misc.help) {
  17. console.log(usage)
  18. process.exit(0)
  19. }
  20. if (options.misc.config) {
  21. console.log(JSON.stringify(options.server, null, ' '))
  22. process.exit(0)
  23. }
  24. const app = localWebServer({
  25. static: {
  26. root: options.server.directory,
  27. options: {
  28. hidden: true
  29. }
  30. },
  31. serveIndex: {
  32. path: options.server.directory,
  33. options: {
  34. icons: true,
  35. hidden: true
  36. }
  37. },
  38. log: {
  39. format: options.server['log-format']
  40. },
  41. compress: options.server.compress,
  42. mime: options.server.mime,
  43. forbid: options.server.forbid,
  44. spa: options.server.spa,
  45. 'no-cache': options.server['no-cache'],
  46. rewrite: options.server.rewrite,
  47. verbose: options.server.verbose
  48. })
  49. app
  50. .on('verbose', (category, message) => {
  51. console.error(ansi.format(s.padRight(category, 14), 'bold'), message)
  52. })
  53. .listen(options.server.port, onServerUp)
  54. function halt (err) {
  55. console.log(ansi.format(`Error: ${err.message}`, 'red'))
  56. console.log(usage)
  57. process.exit(1)
  58. }
  59. function onServerUp () {
  60. const ipList = Object.keys(os.networkInterfaces())
  61. .map(key => os.networkInterfaces()[key])
  62. .reduce((prev, curr) => prev = prev.concat(curr), [])
  63. .filter(iface => iface.family === 'IPv4')
  64. .map(iface => `[underline]{${iface.address}:${options.server.port}}`)
  65. .join(', ')
  66. console.error(ansi.format(
  67. path.resolve(options.server.directory) === process.cwd()
  68. ? `serving at `
  69. : `serving [underline]{${options.server.directory}} at ${ipList}`
  70. ))
  71. }
  72. function collectOptions () {
  73. let options = {}
  74. /* parse command line args */
  75. try {
  76. options = cli.parse()
  77. } catch (err) {
  78. halt(err)
  79. }
  80. const builtIn = {
  81. port: 8000,
  82. directory: process.cwd(),
  83. forbid: [],
  84. rewrite: []
  85. }
  86. if (options.server.rewrite) {
  87. options.server.rewrite = parseRewriteRules(options.server.rewrite)
  88. }
  89. /* override built-in defaults with stored config and then command line args */
  90. options.server = Object.assign(builtIn, stored, options.server)
  91. return options
  92. }
  93. function parseRewriteRules (rules) {
  94. return rules && rules.map(rule => {
  95. const matches = rule.match(/(\S*)\s*->\s*(\S*)/)
  96. return {
  97. from: matches[1],
  98. to: matches[2]
  99. }
  100. })
  101. }