mirror of
https://github.com/typicode/json-server.git
synced 2025-07-28 04:32:24 +08:00
webpack 4 + preact (#786)
This commit is contained in:
13
.babelrc
13
.babelrc
@ -1,10 +1,11 @@
|
|||||||
{
|
{
|
||||||
"presets": [
|
"presets": [
|
||||||
["env", {
|
[
|
||||||
"targets": {
|
"env", {
|
||||||
"node": 4
|
"targets": {
|
||||||
},
|
"node": "6"
|
||||||
"exclude": ["transform-regenerator"]
|
}
|
||||||
}]
|
}
|
||||||
|
]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
extends: ['standard', 'prettier'],
|
extends: ['standard', 'standard-preact', 'prettier'],
|
||||||
plugins: ['prettier'],
|
plugins: ['prettier'],
|
||||||
rules: {
|
rules: {
|
||||||
'prettier/prettier': [
|
'prettier/prettier': [
|
||||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -2,6 +2,7 @@
|
|||||||
node_modules
|
node_modules
|
||||||
tmp
|
tmp
|
||||||
lib
|
lib
|
||||||
|
dist
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.idea
|
.idea
|
||||||
db.json
|
db.json
|
7882
package-lock.json
generated
7882
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
49
package.json
49
package.json
@ -7,6 +7,20 @@
|
|||||||
"directories": {
|
"directories": {
|
||||||
"test": "test"
|
"test": "test"
|
||||||
},
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "npm run test:cli && npm run test:server && npm run lint",
|
||||||
|
"test:cli": "npm run build && cross-env NODE_ENV=test mocha test/cli/*.js",
|
||||||
|
"test:server": "cross-env NODE_ENV=test mocha test/server/*.js",
|
||||||
|
"start": "run-p start:**",
|
||||||
|
"start:babel-node": "babel-node src/cli/bin db.json -r routes.json",
|
||||||
|
"start:webpack": "webpack -d --watch",
|
||||||
|
"lint": "eslint . --ignore-path .gitignore",
|
||||||
|
"fix": "npm run lint -- --fix",
|
||||||
|
"build": "babel src -d lib && webpack -p",
|
||||||
|
"toc": "markdown-toc -i README.md",
|
||||||
|
"prepublishOnly": "npm test && npm run build && pkg-ok",
|
||||||
|
"precommit": "npm test"
|
||||||
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"body-parser": "^1.18.2",
|
"body-parser": "^1.18.2",
|
||||||
"chalk": "^2.3.0",
|
"chalk": "^2.3.0",
|
||||||
@ -33,40 +47,47 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"babel-cli": "^6.26.0",
|
"babel-cli": "^6.26.0",
|
||||||
"babel-preset-env": "^1.6.1",
|
"babel-core": "^6.26.3",
|
||||||
|
"babel-loader": "^7.1.4",
|
||||||
|
"babel-plugin-transform-regenerator": "^6.26.0",
|
||||||
|
"babel-polyfill": "^6.26.0",
|
||||||
|
"babel-preset-env": "^1.7.0",
|
||||||
|
"babel-preset-preact": "^1.1.0",
|
||||||
"babel-register": "^6.26.0",
|
"babel-register": "^6.26.0",
|
||||||
|
"clean-webpack-plugin": "^0.1.19",
|
||||||
"cross-env": "^5.1.1",
|
"cross-env": "^5.1.1",
|
||||||
|
"css-loader": "^0.28.11",
|
||||||
"eslint": "^4.10.0",
|
"eslint": "^4.10.0",
|
||||||
"eslint-config-prettier": "^2.7.0",
|
"eslint-config-prettier": "^2.7.0",
|
||||||
"eslint-config-standard": "^10.2.1",
|
"eslint-config-standard": "^10.2.1",
|
||||||
|
"eslint-config-standard-preact": "^1.1.6",
|
||||||
"eslint-plugin-import": "^2.8.0",
|
"eslint-plugin-import": "^2.8.0",
|
||||||
"eslint-plugin-node": "^5.2.1",
|
"eslint-plugin-node": "^5.2.1",
|
||||||
"eslint-plugin-prettier": "^2.3.1",
|
"eslint-plugin-prettier": "^2.3.1",
|
||||||
"eslint-plugin-promise": "^3.6.0",
|
"eslint-plugin-promise": "^3.6.0",
|
||||||
|
"eslint-plugin-react": "^7.8.2",
|
||||||
"eslint-plugin-standard": "^3.0.1",
|
"eslint-plugin-standard": "^3.0.1",
|
||||||
|
"html-webpack-plugin": "^3.2.0",
|
||||||
"husky": "^0.14.3",
|
"husky": "^0.14.3",
|
||||||
"markdown-toc": "^1.2.0",
|
"markdown-toc": "^1.2.0",
|
||||||
|
"milligram": "^1.3.0",
|
||||||
|
"mini-css-extract-plugin": "^0.4.0",
|
||||||
"mkdirp": "^0.5.1",
|
"mkdirp": "^0.5.1",
|
||||||
"mocha": "^4.0.1",
|
"mocha": "^4.0.1",
|
||||||
|
"npm-run-all": "^4.1.3",
|
||||||
"os-tmpdir": "^1.0.1",
|
"os-tmpdir": "^1.0.1",
|
||||||
"pkg-ok": "^2.1.0",
|
"pkg-ok": "^2.1.0",
|
||||||
|
"preact": "^8.2.9",
|
||||||
"prettier": "^1.7.4",
|
"prettier": "^1.7.4",
|
||||||
|
"promise-polyfill": "^7.1.2",
|
||||||
"rimraf": "^2.6.2",
|
"rimraf": "^2.6.2",
|
||||||
"server-ready": "^0.3.1",
|
"server-ready": "^0.3.1",
|
||||||
"standard": "^10.0.3",
|
"standard": "^10.0.3",
|
||||||
"supertest": "^3.0.0",
|
"supertest": "^3.0.0",
|
||||||
"temp-write": "^3.3.0"
|
"temp-write": "^3.3.0",
|
||||||
},
|
"webpack": "^4.9.1",
|
||||||
"scripts": {
|
"webpack-cli": "^2.1.4",
|
||||||
"test": "npm run test:cli && npm run test:server && eslint .",
|
"whatwg-fetch": "^2.0.4"
|
||||||
"test:cli": "npm run build && cross-env NODE_ENV=test mocha test/cli/*.js",
|
|
||||||
"test:server": "cross-env NODE_ENV=test mocha test/server/*.js",
|
|
||||||
"start": "babel-node src/cli/bin",
|
|
||||||
"fix": "eslint . --fix",
|
|
||||||
"build": "babel src -d lib --copy-files",
|
|
||||||
"toc": "markdown-toc -i README.md",
|
|
||||||
"prepublishOnly": "npm run build && npm run lf && pkg-ok",
|
|
||||||
"precommit": "npm test"
|
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -95,6 +116,6 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/typicode/json-server",
|
"homepage": "https://github.com/typicode/json-server",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=4"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,9 +7,14 @@ const enableDestroy = require('server-destroy')
|
|||||||
const pause = require('connect-pause')
|
const pause = require('connect-pause')
|
||||||
const is = require('./utils/is')
|
const is = require('./utils/is')
|
||||||
const load = require('./utils/load')
|
const load = require('./utils/load')
|
||||||
const example = require('./example.json')
|
|
||||||
const jsonServer = require('../server')
|
const jsonServer = require('../server')
|
||||||
|
|
||||||
|
const example = {
|
||||||
|
posts: [{ id: 1, title: 'json-server', author: 'typicode' }],
|
||||||
|
comments: [{ id: 1, body: 'some comment', postId: 1 }],
|
||||||
|
profile: { name: 'typicode' }
|
||||||
|
}
|
||||||
|
|
||||||
function prettyPrint(argv, object, rules) {
|
function prettyPrint(argv, object, rules) {
|
||||||
const host = argv.host === '0.0.0.0' ? 'localhost' : argv.host
|
const host = argv.host === '0.0.0.0' ? 'localhost' : argv.host
|
||||||
const port = argv.port
|
const port = argv.port
|
||||||
|
3
src/front/.babelrc
Normal file
3
src/front/.babelrc
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"presets": [ "env", "preact"]
|
||||||
|
}
|
Before Width: | Height: | Size: 318 B After Width: | Height: | Size: 318 B |
@ -2,10 +2,6 @@
|
|||||||
|
|
||||||
<head>
|
<head>
|
||||||
<title>JSON Server</title>
|
<title>JSON Server</title>
|
||||||
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic">
|
|
||||||
<link rel="stylesheet" href="//cdn.rawgit.com/necolas/normalize.css/master/normalize.css">
|
|
||||||
<link rel="stylesheet" href="//cdn.rawgit.com/milligram/milligram/master/dist/milligram.min.css">
|
|
||||||
<link rel="stylesheet" href="style.css">
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
@ -53,9 +49,5 @@
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<script src="https://unpkg.com/mithril/mithril.min.js"></script>
|
|
||||||
<script src="main.js"></script>
|
|
||||||
</body>
|
</body>
|
||||||
|
</html>
|
||||||
</html>
|
|
75
src/front/index.js
Normal file
75
src/front/index.js
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
import 'promise-polyfill/src/polyfill'
|
||||||
|
import 'whatwg-fetch'
|
||||||
|
import { h, render } from 'preact'
|
||||||
|
import 'milligram/dist/milligram.css'
|
||||||
|
import './style.css'
|
||||||
|
|
||||||
|
function ResourceItem({ name, length }) {
|
||||||
|
return (
|
||||||
|
<li>
|
||||||
|
<a href={name}>/{name}</a> <sup>{length ? `${length}x` : 'object'}</sup>
|
||||||
|
</li>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function ResourceList({ db }) {
|
||||||
|
return (
|
||||||
|
<ul>
|
||||||
|
{Object.keys(db).map(name => (
|
||||||
|
<ResourceItem
|
||||||
|
name={name}
|
||||||
|
length={Array.isArray(db[name]) && db[name].length}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function NoResources() {
|
||||||
|
return <p>No resources found</p>
|
||||||
|
}
|
||||||
|
|
||||||
|
function ResourcesBlock({ db }) {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h4>Resources</h4>
|
||||||
|
{Object.keys(db).length ? <ResourceList db={db} /> : <NoResources />}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
window
|
||||||
|
.fetch('db')
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(db =>
|
||||||
|
render(<ResourcesBlock db={db} />, document.getElementById('resources'))
|
||||||
|
)
|
||||||
|
|
||||||
|
function CustomRoutesBlock({ customRoutes }) {
|
||||||
|
const rules = Object.keys(customRoutes)
|
||||||
|
if (rules.length) {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h4>Custom Routes</h4>
|
||||||
|
<table>
|
||||||
|
{rules.map(rule => (
|
||||||
|
<tr>
|
||||||
|
<td>{rule}</td>
|
||||||
|
<td>⇢ {customRoutes[rule]}</td>
|
||||||
|
</tr>
|
||||||
|
))}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window
|
||||||
|
.fetch('__rules')
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(customRoutes => {
|
||||||
|
render(
|
||||||
|
<CustomRoutesBlock customRoutes={customRoutes} />,
|
||||||
|
document.getElementById('custom-routes')
|
||||||
|
)
|
||||||
|
})
|
@ -5,6 +5,7 @@ html {
|
|||||||
body {
|
body {
|
||||||
display: flex;
|
display: flex;
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
|
font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
padding:0;
|
padding:0;
|
||||||
margin: 0;
|
margin: 0;
|
@ -10,7 +10,7 @@ const bodyParser = require('./body-parser')
|
|||||||
|
|
||||||
module.exports = function(opts) {
|
module.exports = function(opts) {
|
||||||
const userDir = path.join(process.cwd(), 'public')
|
const userDir = path.join(process.cwd(), 'public')
|
||||||
const defaultDir = path.join(__dirname, 'public')
|
const defaultDir = path.join(__dirname, '../../dist')
|
||||||
const staticDir = fs.existsSync(userDir) ? userDir : defaultDir
|
const staticDir = fs.existsSync(userDir) ? userDir : defaultDir
|
||||||
|
|
||||||
opts = objectAssign({ logger: true, static: staticDir }, opts)
|
opts = objectAssign({ logger: true, static: staticDir }, opts)
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 278 B |
@ -1,57 +0,0 @@
|
|||||||
/* global m */
|
|
||||||
|
|
||||||
// Resource list
|
|
||||||
var db = {}
|
|
||||||
|
|
||||||
m.request('db').then(function(data) {
|
|
||||||
db = data
|
|
||||||
})
|
|
||||||
|
|
||||||
m.mount(document.getElementById('resources'), {
|
|
||||||
view: function() {
|
|
||||||
var keys = Object.keys(db)
|
|
||||||
var resourceList = m(
|
|
||||||
'ul',
|
|
||||||
keys
|
|
||||||
.map(function(key) {
|
|
||||||
return m('li', [
|
|
||||||
m('a', { href: key }, '/' + key),
|
|
||||||
m(
|
|
||||||
'sup',
|
|
||||||
Array.isArray(db[key]) ? ' ' + db[key].length + 'x' : ' object'
|
|
||||||
)
|
|
||||||
])
|
|
||||||
})
|
|
||||||
.concat([m('a', { href: 'db' }, '/db'), m('sup', m('em', ' state'))])
|
|
||||||
)
|
|
||||||
|
|
||||||
return [
|
|
||||||
m('h4', 'Resources'),
|
|
||||||
keys.length ? resourceList : m('p', 'No resources found')
|
|
||||||
]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// Custom routes
|
|
||||||
var customRoutes = {}
|
|
||||||
|
|
||||||
m.request('__rules').then(function(data) {
|
|
||||||
customRoutes = data
|
|
||||||
})
|
|
||||||
|
|
||||||
m.mount(document.getElementById('custom-routes'), {
|
|
||||||
view: function() {
|
|
||||||
var rules = Object.keys(customRoutes)
|
|
||||||
if (rules.length) {
|
|
||||||
return [
|
|
||||||
m('h4', 'Custom routes'),
|
|
||||||
m(
|
|
||||||
'table',
|
|
||||||
rules.map(function(rule) {
|
|
||||||
return m('tr', [m('td', rule), m('td', '⇢ ' + customRoutes[rule])])
|
|
||||||
})
|
|
||||||
)
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
@ -698,10 +698,10 @@ describe('Server', () => {
|
|||||||
.expect(200))
|
.expect(200))
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('GET /style.css', () => {
|
describe('GET /main.css', () => {
|
||||||
it('should respond with css', () =>
|
it('should respond with css', () =>
|
||||||
request(server)
|
request(server)
|
||||||
.get('/style.css')
|
.get('/main.css')
|
||||||
.expect('Content-Type', /css/)
|
.expect('Content-Type', /css/)
|
||||||
.expect(200))
|
.expect(200))
|
||||||
})
|
})
|
||||||
|
21
webpack.config.js
Normal file
21
webpack.config.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
const CleanWebpackPlugin = require('clean-webpack-plugin')
|
||||||
|
const HtmlWebpackPlugin = require('html-webpack-plugin')
|
||||||
|
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
entry: './src/front/index.js',
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
{ test: /\.css$/, use: [MiniCssExtractPlugin.loader, 'css-loader'] },
|
||||||
|
{ test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
new CleanWebpackPlugin(['dist']),
|
||||||
|
new HtmlWebpackPlugin({
|
||||||
|
favicon: 'src/front/favicon.ico',
|
||||||
|
template: 'src/front/index.html'
|
||||||
|
}),
|
||||||
|
new MiniCssExtractPlugin()
|
||||||
|
]
|
||||||
|
}
|
Reference in New Issue
Block a user