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.

99 lines
2.3 KiB

12 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 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 cli = commandLineArgs(cliOptions.definitions)
  10. const usage = cli.getUsage(cliOptions.usageData)
  11. const stored = loadConfig('local-web-server')
  12. const options = collectOptions()
  13. // TODO summary line on server launch
  14. if (options.misc.help) {
  15. console.log(usage)
  16. process.exit(0)
  17. }
  18. if (options.misc.config) {
  19. console.log(JSON.stringify(options.server, null, ' '))
  20. process.exit(0)
  21. }
  22. localWebServer({
  23. static: {
  24. root: options.server.directory,
  25. options: {
  26. hidden: true
  27. }
  28. },
  29. serveIndex: {
  30. path: options.server.directory,
  31. options: {
  32. icons: true,
  33. hidden: true
  34. }
  35. },
  36. log: {
  37. format: options.server['log-format']
  38. },
  39. compress: options.server.compress,
  40. mime: options.server.mime,
  41. forbid: options.server.forbid,
  42. spa: options.server.spa,
  43. 'no-cache': options.server['no-cache'],
  44. rewrite: options.server.rewrite
  45. }).listen(options.server.port, onServerUp)
  46. function halt (err) {
  47. console.log(ansi.format(`Error: ${err.message}`, 'red'))
  48. console.log(usage)
  49. process.exit(1)
  50. }
  51. function onServerUp () {
  52. console.error(ansi.format(
  53. path.resolve(options.server.directory) === process.cwd()
  54. ? `serving at [underline]{http://localhost:${options.server.port}}`
  55. : `serving [underline]{${options.server.directory}} at [underline]{http://localhost:${options.server.port}}`
  56. ))
  57. }
  58. function collectOptions () {
  59. let options = {}
  60. /* parse command line args */
  61. try {
  62. options = cli.parse()
  63. } catch (err) {
  64. halt(err)
  65. }
  66. const builtIn = {
  67. port: 8000,
  68. directory: process.cwd(),
  69. forbid: [],
  70. rewrite: []
  71. }
  72. if (options.server.rewrite) {
  73. options.server.rewrite = parseRewriteRules(options.server.rewrite)
  74. }
  75. /* override built-in defaults with stored config and then command line args */
  76. options.server = Object.assign(builtIn, stored, options.server)
  77. return options
  78. }
  79. function parseRewriteRules (rules) {
  80. return rules && rules.map(rule => {
  81. const matches = rule.match(/(\S*)\s*->\s*(\S*)/)
  82. return {
  83. from: matches[1],
  84. to: matches[2]
  85. }
  86. })
  87. }