|
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