| 
1 | 1 | #!/usr/bin/env node  | 
2 |  | -var fs = require('fs')  | 
3 |  | -var path = require('path')  | 
4 |  | -var updateNotifier = require('update-notifier')  | 
5 |  | -var _db = require('underscore-db')  | 
6 |  | -var yargs = require('yargs')  | 
7 |  | -var chalk = require('chalk')  | 
8 |  | -var got = require('got')  | 
9 |  | -var pkg = require('../package.json')  | 
10 |  | -var jsonServer = require('../src')  | 
11 |  | -var jsMockGenerator = null  | 
12 |  | - | 
13 |  | -updateNotifier({packageName: pkg.name, packageVersion: pkg.version}).notify()  | 
14 |  | - | 
15 |  | -// Parse arguments  | 
16 |  | -var argv = yargs  | 
17 |  | -    .usage('$0 [options] <source>')  | 
18 |  | -    .options({  | 
19 |  | -      port: {  | 
20 |  | -        alias: 'p',  | 
21 |  | -        description: 'Set port',  | 
22 |  | -        default: 3000  | 
23 |  | -      },  | 
24 |  | -      host: {  | 
25 |  | -        alias: 'H',  | 
26 |  | -        description: 'Set host',  | 
27 |  | -        default: '0.0.0.0'  | 
28 |  | -      },  | 
29 |  | -      watch: {  | 
30 |  | -        alias: 'w',  | 
31 |  | -        description: 'Reload database on JSON file change'  | 
32 |  | -      },  | 
33 |  | -      routes: {  | 
34 |  | -        alias: 'r',  | 
35 |  | -        description: 'Load routes file'  | 
36 |  | -      },  | 
37 |  | -      id: {  | 
38 |  | -        description: 'Set database id property (e.g. _id)',  | 
39 |  | -        default: 'id'  | 
40 |  | -      }  | 
41 |  | -    })  | 
42 |  | -    .boolean('watch')  | 
43 |  | -    .help('help').alias('help', 'h')  | 
44 |  | -    .version(pkg.version).alias('version', 'v')  | 
45 |  | -    .example('$0 db.json', '')  | 
46 |  | -    .example('$0 file.js', '')  | 
47 |  | -    .example('$0 http://example.com/db.json', '')  | 
48 |  | -    .epilog('https://github.com/typicode/json-server')  | 
49 |  | -    .require(1, 'Missing <source> argument')  | 
50 |  | -    .argv  | 
51 |  | - | 
52 |  | -function showResources (hostname, port, object) {  | 
53 |  | -  for (var prop in object) {  | 
54 |  | -    console.log(chalk.gray('  http://' + hostname + ':' + port + '/') + chalk.cyan(prop))  | 
55 |  | -  }  | 
56 |  | -}  | 
57 |  | - | 
58 |  | -function start (object, filename) {  | 
59 |  | -  var port = process.env.PORT || argv.port  | 
60 |  | -  var hostname = argv.host === '0.0.0.0' ? 'localhost' : argv.host  | 
61 |  | - | 
62 |  | -  console.log()  | 
63 |  | -  showResources(hostname, port, object)  | 
64 |  | -  console.log()  | 
65 |  | -  console.log(  | 
66 |  | -      'You can now go to ' + chalk.gray('http://' + hostname + ':' + port)  | 
67 |  | -  )  | 
68 |  | -  console.log()  | 
69 |  | -  console.log(  | 
70 |  | -      'Enter ' + chalk.cyan('s') + ' at any time to create a snapshot of the db'  | 
71 |  | -  )  | 
72 |  | - | 
73 |  | -  // Snapshot  | 
74 |  | -  process.stdin.resume()  | 
75 |  | -  process.stdin.setEncoding('utf8')  | 
76 |  | -  process.stdin.on('data', function (chunk) {  | 
77 |  | -    if (chunk.trim().toLowerCase() === 's') {  | 
78 |  | -      var file = 'db-' + Date.now() + '.json'  | 
79 |  | -      _db.save(object, file)  | 
80 |  | -      console.log('Saved snapshot to ' + chalk.cyan(file) + '\n')  | 
81 |  | -    }  | 
82 |  | -  })  | 
83 |  | - | 
84 |  | -  // Router  | 
85 |  | -  var router = jsonServer.router(filename ? filename : object)  | 
86 |  | - | 
87 |  | -  // Watcher  | 
88 |  | -  if (argv.watch) {  | 
89 |  | -    console.log('Watching', chalk.cyan(source))  | 
90 |  | - | 
91 |  | -    var db = router.db  | 
92 |  | -    var watchedDir = path.dirname(filename)  | 
93 |  | -    var watchedFile = path.basename(filename)  | 
94 |  | - | 
95 |  | -    fs.watch(watchedDir, function (event, changedFile) {  | 
96 |  | -      // lowdb generates 'rename' event on watchedFile  | 
97 |  | -      // using it to know if file has been modified by the user  | 
98 |  | -      if ((event === 'change' || event === 'rename') && (changedFile === watchedFile || changedFile === source)) {  | 
99 |  | -        console.log(chalk.cyan(source), 'has changed, reloading database')  | 
100 |  | - | 
101 |  | -        try {  | 
102 |  | -          if (filename) {  | 
103 |  | -            db.object = JSON.parse(fs.readFileSync(filename))  | 
104 |  | -          } else {  | 
105 |  | -            require.cache[jsMockGenerator] = null  | 
106 |  | -            db.object = require(jsMockGenerator)()  | 
107 |  | -          }  | 
108 |  | -          showResources(hostname, port, db.object)  | 
109 |  | -        } catch (e) {  | 
110 |  | -          console.log('Can\'t parse', chalk.cyan(source))  | 
111 |  | -          console.log(e.message)  | 
112 |  | -        }  | 
113 |  | - | 
114 |  | -        console.log()  | 
115 |  | -      }  | 
116 |  | -    })  | 
117 |  | -  }  | 
118 |  | -  console.log()  | 
119 |  | - | 
120 |  | -  var server = jsonServer.create()  | 
121 |  | -  server.use(jsonServer.defaults)  | 
122 |  | - | 
123 |  | -  // Rewriter  | 
124 |  | -  if (argv.routes) {  | 
125 |  | -    var routes = JSON.parse(fs.readFileSync(process.cwd() + '/' + argv.routes))  | 
126 |  | -    var rewriter = jsonServer.rewriter(routes)  | 
127 |  | -    server.use(rewriter)  | 
128 |  | -  }  | 
129 |  | - | 
130 |  | -  server.use(router)  | 
131 |  | - | 
132 |  | -  // Custom id  | 
133 |  | -  router.db._.id = argv.id  | 
134 |  | - | 
135 |  | -  server.listen(port, argv.host)  | 
136 |  | -}  | 
137 |  | - | 
138 |  | -// Set file and port  | 
139 |  | -var source = argv._[0]  | 
140 |  | - | 
141 |  | -// Say hi, load file and start server  | 
142 |  | -console.log(chalk.cyan('  {^_^} Hi!\n'))  | 
143 |  | -console.log('Loading database from ' + chalk.cyan(source))  | 
144 |  | - | 
145 |  | -// Remote source  | 
146 |  | -if (/^(http|https):/.test(source)) {  | 
147 |  | -  got(source, function (err, data) {  | 
148 |  | -    if (err) {  | 
149 |  | -      console.log('Error', err)  | 
150 |  | -      process.exit(1)  | 
151 |  | -    }  | 
152 |  | -    var object = JSON.parse(data)  | 
153 |  | -    start(object)  | 
154 |  | -  })  | 
155 |  | -// JSON file  | 
156 |  | -} else if (/\.json$/.test(source)) {  | 
157 |  | -  var filename = process.cwd() + '/' + source  | 
158 |  | -  var object = require(filename)  | 
159 |  | -  start(object, filename)  | 
160 |  | -// JS file  | 
161 |  | -} else if (/\.js$/.test(source)) {  | 
162 |  | -  jsMockGenerator = process.cwd() + '/' + source  | 
163 |  | -  var object = require(jsMockGenerator)()  | 
164 |  | -  start(object)  | 
165 |  | -}  | 
 | 2 | +require('../src/cli')()  | 
0 commit comments