mirror of
https://github.com/typicode/json-server.git
synced 2025-07-30 13:42:11 +08:00
Update dependencies and watch
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@ -3,4 +3,3 @@ node_modules
|
|||||||
tmp
|
tmp
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.idea
|
.idea
|
||||||
generate.js
|
|
||||||
|
18
package.json
18
package.json
@ -8,27 +8,30 @@
|
|||||||
"test": "test"
|
"test": "test"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"body-parser": "^1.8.1",
|
"body-parser": "^1.15.2",
|
||||||
"chalk": "^0.4.0",
|
"chalk": "^1.1.3",
|
||||||
|
"chokidar": "^1.6.0",
|
||||||
"compression": "^1.6.0",
|
"compression": "^1.6.0",
|
||||||
"connect-pause": "^0.1.0",
|
"connect-pause": "^0.1.0",
|
||||||
"cors": "^2.3.0",
|
"cors": "^2.3.0",
|
||||||
"errorhandler": "^1.2.0",
|
"errorhandler": "^1.2.0",
|
||||||
"express": "^4.9.5",
|
"express": "^4.9.5",
|
||||||
"got": "^3.3.0",
|
"got": "^6.3.0",
|
||||||
"lodash": "^4.11.2",
|
"lodash": "^4.11.2",
|
||||||
"lowdb": "^0.13.0-beta.2",
|
"lowdb": "^0.13.1",
|
||||||
"method-override": "^2.1.2",
|
"method-override": "^2.1.2",
|
||||||
"morgan": "^1.3.1",
|
"morgan": "^1.3.1",
|
||||||
"node-uuid": "^1.4.2",
|
"node-uuid": "^1.4.2",
|
||||||
"object-assign": "^4.0.1",
|
"object-assign": "^4.0.1",
|
||||||
"pluralize": "^1.1.2",
|
"pluralize": "^3.0.0",
|
||||||
"server-destroy": "^1.0.1",
|
"server-destroy": "^1.0.1",
|
||||||
"underscore-db": "^0.10.0",
|
"underscore-db": "^0.10.0",
|
||||||
"update-notifier": "^0.5.0",
|
"update-notifier": "^1.0.2",
|
||||||
"yargs": "^4.2.0"
|
"yargs": "^4.2.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"babel-cli": "^6.10.1",
|
||||||
|
"babel-preset-es2015": "^6.9.0",
|
||||||
"husky": "^0.11.4",
|
"husky": "^0.11.4",
|
||||||
"mocha": "^2.2.4",
|
"mocha": "^2.2.4",
|
||||||
"rimraf": "^2.4.1",
|
"rimraf": "^2.4.1",
|
||||||
@ -41,7 +44,8 @@
|
|||||||
"test:cli": "NODE_ENV=test mocha -R spec test/cli/*.js",
|
"test:cli": "NODE_ENV=test mocha -R spec test/cli/*.js",
|
||||||
"test:server": "NODE_ENV=test mocha -R spec test/server/*.js",
|
"test:server": "NODE_ENV=test mocha -R spec test/server/*.js",
|
||||||
"start": "node bin",
|
"start": "node bin",
|
||||||
"prepush": "npm t"
|
"prepush": "npm t",
|
||||||
|
"build": "babel src -d lib"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
var fs = require('fs')
|
var fs = require('fs')
|
||||||
var path = require('path')
|
var path = require('path')
|
||||||
|
var _ = require('lodash')
|
||||||
var chalk = require('chalk')
|
var chalk = require('chalk')
|
||||||
|
var chokidar = require('chokidar')
|
||||||
var enableDestroy = require('server-destroy')
|
var enableDestroy = require('server-destroy')
|
||||||
|
var pause = require('connect-pause')
|
||||||
var is = require('./utils/is')
|
var is = require('./utils/is')
|
||||||
var load = require('./utils/load')
|
var load = require('./utils/load')
|
||||||
var watch = require('./watch')
|
|
||||||
var pause = require('connect-pause')
|
|
||||||
var jsonServer = require('../server')
|
var jsonServer = require('../server')
|
||||||
|
|
||||||
function prettyPrint (argv, object, rules) {
|
function prettyPrint (argv, object, rules) {
|
||||||
@ -37,9 +38,9 @@ function createApp (source, object, routes, argv) {
|
|||||||
var app = jsonServer.create()
|
var app = jsonServer.create()
|
||||||
|
|
||||||
var router = jsonServer.router(
|
var router = jsonServer.router(
|
||||||
is.JSON(source) ?
|
is.JSON(source)
|
||||||
source :
|
? source
|
||||||
object
|
: object
|
||||||
)
|
)
|
||||||
|
|
||||||
var defaultsOpts = {
|
var defaultsOpts = {
|
||||||
@ -149,13 +150,41 @@ module.exports = function (argv) {
|
|||||||
if (argv.watch) {
|
if (argv.watch) {
|
||||||
console.log(chalk.gray(' Watching...'))
|
console.log(chalk.gray(' Watching...'))
|
||||||
console.log()
|
console.log()
|
||||||
watch(argv, function (file) {
|
var source = argv._[0]
|
||||||
console.log(chalk.gray(' ' + file + ' has changed, reloading...'))
|
|
||||||
server && server.destroy()
|
// Can't watch URL
|
||||||
start()
|
if (is.URL(source)) throw new Error('Can\'t watch URL')
|
||||||
})
|
|
||||||
|
// Watch .js or .json file
|
||||||
|
chokidar
|
||||||
|
.watch(source)
|
||||||
|
.on('change', function (file) {
|
||||||
|
if (is.JSON(file)) {
|
||||||
|
var obj = JSON.parse(fs.readFileSync(file))
|
||||||
|
// Compare .json file content with in memory database
|
||||||
|
var isDatabaseDifferent = !_.eq(obj, app.db.getState())
|
||||||
|
if (isDatabaseDifferent) {
|
||||||
|
console.log(chalk.gray(' ' + file + ' has changed, reloading...'))
|
||||||
|
server && server.destroy()
|
||||||
|
start()
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
server && server.destroy()
|
||||||
|
start()
|
||||||
|
})
|
||||||
|
|
||||||
|
// Watch routes
|
||||||
|
if (argv.routes) {
|
||||||
|
chokidar
|
||||||
|
.watch(argv.routes)
|
||||||
|
.on('change', function (file) {
|
||||||
|
console.log(chalk.gray(' ' + file + ' has changed, reloading...'))
|
||||||
|
server && server.destroy()
|
||||||
|
start()
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,9 +9,13 @@ module.exports = function (source, cb) {
|
|||||||
|
|
||||||
if (is.URL(source)) {
|
if (is.URL(source)) {
|
||||||
|
|
||||||
got(source, { json: true }, function (err, data) {
|
got(source, { json: true })
|
||||||
cb(err, data)
|
.then(function (response) {
|
||||||
})
|
cb(null, response.body)
|
||||||
|
})
|
||||||
|
.catch(function (err) {
|
||||||
|
cb(err)
|
||||||
|
})
|
||||||
|
|
||||||
} else if (is.JS(source)) {
|
} else if (is.JS(source)) {
|
||||||
|
|
||||||
|
@ -1,44 +0,0 @@
|
|||||||
var fs = require('fs')
|
|
||||||
var path = require('path')
|
|
||||||
var is = require('./utils/is')
|
|
||||||
|
|
||||||
module.exports = watch
|
|
||||||
|
|
||||||
// Because JSON file can be modified by the server, we need to be able to
|
|
||||||
// distinguish between user modification vs server modification.
|
|
||||||
// When the server modifies the JSON file, it generates a rename event.
|
|
||||||
// When the user modifies the JSON file, it generate a change event.
|
|
||||||
function watchDB (file, cb) {
|
|
||||||
var watchedDir = path.dirname(file)
|
|
||||||
var watchedFile = path.basename(file)
|
|
||||||
|
|
||||||
fs.watch(watchedDir, function (event, changedFile) {
|
|
||||||
if (event === 'change' && changedFile === watchedFile) cb()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function watchJS (file, cb) {
|
|
||||||
fs.watchFile(file, cb)
|
|
||||||
}
|
|
||||||
|
|
||||||
function watchSource (source, cb) {
|
|
||||||
if (is.JSON(source)) {
|
|
||||||
return watchDB(source, cb)
|
|
||||||
}
|
|
||||||
if (is.JS(source)) return watchJS(source, cb)
|
|
||||||
if (is.URL(source)) throw new Error('Can\'t watch URL')
|
|
||||||
}
|
|
||||||
|
|
||||||
function watch (argv, cb) {
|
|
||||||
var source = argv._[0]
|
|
||||||
|
|
||||||
watchSource(source, function () {
|
|
||||||
cb(source)
|
|
||||||
})
|
|
||||||
|
|
||||||
if (argv.routes) {
|
|
||||||
fs.watchFile(argv.routes, function () {
|
|
||||||
cb(argv.routes)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
@ -64,8 +64,9 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<script src="//code.jquery.com/jquery-1.10.1.min.js"></script>
|
<script
|
||||||
<script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
|
src="https://code.jquery.com/jquery-3.0.0.min.js"
|
||||||
|
integrity="sha256-JmvOoLtYsmqlsWxa7mDSLMwa6dZ9rrIdtrrVYRnDRH0=" crossorigin="anonymous"></script>
|
||||||
<script>
|
<script>
|
||||||
$(function() {
|
$(function() {
|
||||||
$.get('db').then(function(data) {
|
$.get('db').then(function(data) {
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
var os = require('os')
|
|
||||||
var fs = require('fs')
|
var fs = require('fs')
|
||||||
var path = require('path')
|
var path = require('path')
|
||||||
var cp = require('child_process')
|
var cp = require('child_process')
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
var supertest = require('supertest')
|
var supertest = require('supertest')
|
||||||
var rmrf = require('rimraf')
|
var rmrf = require('rimraf')
|
||||||
|
var express = require('express')
|
||||||
var serverReady = require('server-ready')
|
var serverReady = require('server-ready')
|
||||||
var pkg = require('../../package.json')
|
var pkg = require('../../package.json')
|
||||||
|
|
||||||
@ -95,12 +95,17 @@ describe('cli', function () {
|
|||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('http://jsonplaceholder.typicode.com/db', function () {
|
describe('http://localhost:8080/db', function () {
|
||||||
|
|
||||||
beforeEach(function (done) {
|
beforeEach(function (done) {
|
||||||
child = cli(['http://jsonplaceholder.typicode.com/db'])
|
var fakeServer = express()
|
||||||
this.timeout(10000)
|
fakeServer.get('/db', function (req, res) {
|
||||||
serverReady(PORT, done)
|
res.jsonp({ posts: [] })
|
||||||
|
})
|
||||||
|
fakeServer.listen(8080, function () {
|
||||||
|
child = cli(['http://localhost:8080/db'])
|
||||||
|
serverReady(PORT, done)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should support URL file', function (done) {
|
it('should support URL file', function (done) {
|
||||||
@ -247,31 +252,29 @@ describe('cli', function () {
|
|||||||
|
|
||||||
// FIXME test fails on OS X and maybe on Windows
|
// FIXME test fails on OS X and maybe on Windows
|
||||||
// But manually updating db.json works...
|
// But manually updating db.json works...
|
||||||
if (os.platform() === 'linux') {
|
describe('--watch db.json -r routes.json', function () {
|
||||||
describe('--watch db.json -r routes.json', function () {
|
|
||||||
|
|
||||||
beforeEach(function (done) {
|
|
||||||
child = cli(['--watch', dbFile, '-r', routesFile])
|
|
||||||
serverReady(PORT, done)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should watch db file', function (done) {
|
|
||||||
fs.writeFileSync(dbFile, JSON.stringify({ foo: [] }))
|
|
||||||
setTimeout(function () {
|
|
||||||
request.get('/foo').expect(200, done)
|
|
||||||
}, 1000)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should watch routes file', function (done) {
|
|
||||||
// Can be very slow
|
|
||||||
this.timeout(10000)
|
|
||||||
fs.writeFileSync(routesFile, JSON.stringify({ '/api/': '/' }))
|
|
||||||
setTimeout(function () {
|
|
||||||
request.get('/api/posts').expect(200, done)
|
|
||||||
}, 9000)
|
|
||||||
})
|
|
||||||
|
|
||||||
|
beforeEach(function (done) {
|
||||||
|
child = cli(['--watch', dbFile, '-r', routesFile])
|
||||||
|
serverReady(PORT, done)
|
||||||
})
|
})
|
||||||
}
|
|
||||||
|
it('should watch db file', function (done) {
|
||||||
|
fs.writeFileSync(dbFile, JSON.stringify({ foo: [] }))
|
||||||
|
setTimeout(function () {
|
||||||
|
request.get('/foo').expect(200, done)
|
||||||
|
}, 1000)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should watch routes file', function (done) {
|
||||||
|
// Can be very slow
|
||||||
|
this.timeout(10000)
|
||||||
|
fs.writeFileSync(routesFile, JSON.stringify({ '/api/': '/' }))
|
||||||
|
setTimeout(function () {
|
||||||
|
request.get('/api/posts').expect(200, done)
|
||||||
|
}, 9000)
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
})
|
})
|
||||||
|
Reference in New Issue
Block a user