Chapter 4,6: prettier updates and web framework samples
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (http://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules
|
||||
jspm_packages
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# 0x
|
||||
profile-*
|
||||
|
||||
# mac files
|
||||
.DS_Store
|
||||
|
||||
# vim swap files
|
||||
*.swp
|
||||
|
||||
# webstorm
|
||||
.idea
|
||||
|
||||
# vscode
|
||||
.vscode
|
||||
*code-workspace
|
||||
|
||||
# clinic
|
||||
profile*
|
||||
*clinic*
|
||||
*flamegraph*
|
||||
|
||||
# generated code
|
||||
examples/typescript-server.js
|
||||
test/types/index.js
|
||||
@@ -0,0 +1,28 @@
|
||||
'use strict'
|
||||
|
||||
const path = require('path')
|
||||
const AutoLoad = require('fastify-autoload')
|
||||
|
||||
module.exports = function (fastify, opts, next) {
|
||||
// Place here your custom code!
|
||||
|
||||
// Do not touch the following lines
|
||||
|
||||
// This loads all plugins defined in plugins
|
||||
// those should be support plugins that are reused
|
||||
// through your application
|
||||
fastify.register(AutoLoad, {
|
||||
dir: path.join(__dirname, 'plugins'),
|
||||
options: Object.assign({}, opts)
|
||||
})
|
||||
|
||||
// This loads all plugins defined in services
|
||||
// define your routes in one of these
|
||||
fastify.register(AutoLoad, {
|
||||
dir: path.join(__dirname, 'services'),
|
||||
options: Object.assign({}, opts)
|
||||
})
|
||||
|
||||
// Make sure to call next when done
|
||||
next()
|
||||
}
|
||||
+3856
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"name": "fastify-generated",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "app.js",
|
||||
"directories": {
|
||||
"test": "test"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "tap test/**/*.test.js",
|
||||
"start": "fastify start -l info app.js",
|
||||
"dev": "fastify start -w -l info -P app.js"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"fastify": "^2.0.0",
|
||||
"fastify-plugin": "^1.5.0",
|
||||
"fastify-autoload": "^1.0.0",
|
||||
"fastify-cli": "^1.5.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"tap": "^12.5.3"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
# Plugins Folder
|
||||
|
||||
Plugins define behavior that is common to all the routes in your
|
||||
application. Authentication, caching, templates, and all the other cross
|
||||
cutting concerns should be handled by plugins placed in this folder.
|
||||
|
||||
Files in this folder are typically defined through the
|
||||
[`fastify-plugin`](https://github.com/fastify/fastify-plugin) module,
|
||||
making them non-encapsulated. They can define decorators and set hooks
|
||||
that will then be used in the rest of your application.
|
||||
|
||||
Check out:
|
||||
|
||||
* [The hitchhiker's guide to plugins](https://github.com/fastify/fastify/blob/master/docs/Plugins-Guide.md)
|
||||
* [Fastify decorators](https://www.fastify.io/docs/latest/Decorators/).
|
||||
* [Fastify lifecycle](https://www.fastify.io/docs/latest/Lifecycle/).
|
||||
@@ -0,0 +1,21 @@
|
||||
'use strict'
|
||||
|
||||
const fp = require('fastify-plugin')
|
||||
|
||||
// the use of fastify-plugin is required to be able
|
||||
// to export the decorators to the outer scope
|
||||
|
||||
module.exports = fp(function (fastify, opts, next) {
|
||||
fastify.decorate('someSupport', function () {
|
||||
return 'hugs'
|
||||
})
|
||||
next()
|
||||
})
|
||||
|
||||
// If you prefer async/await, use the following
|
||||
//
|
||||
// module.exports = fp(async function (fastify, opts) {
|
||||
// fastify.decorate('someSupport', function () {
|
||||
// return 'hugs'
|
||||
// })
|
||||
// })
|
||||
@@ -0,0 +1,24 @@
|
||||
# Services Folder
|
||||
|
||||
Services define routes within your application. Fastify provides an
|
||||
easy path to a microservice architecture, in the future you might want
|
||||
to independently deploy some of those.
|
||||
|
||||
In this folder you should define all the services that define the routes
|
||||
of your web application.
|
||||
Each service is a [Fastify
|
||||
plugin](https://www.fastify.io/docs/latest/Plugins/), it is
|
||||
encapsulated (it can have its own independent plugins) and it is
|
||||
typically stored in a file; be careful to group your routes logically,
|
||||
e.g. all `/users` routes in a `users.js` file. We have added
|
||||
a `root.js` file for you with a '/' root added.
|
||||
|
||||
If a single file become too large, create a folder and add a `index.js` file there:
|
||||
this file must be a Fastify plugin, and it will be loaded automatically
|
||||
by the application. You can now add as many files as you want inside that folder.
|
||||
In this way you can create complex services within a single monolith,
|
||||
and eventually extract them.
|
||||
|
||||
If you need to share functionality between services, place that
|
||||
functionality into the `plugins` folder, and share it via
|
||||
[decorators](https://www.fastify.io/docs/latest/Decorators/).
|
||||
@@ -0,0 +1,17 @@
|
||||
'use strict'
|
||||
|
||||
module.exports = function (fastify, opts, next) {
|
||||
fastify.get('/example', function (request, reply) {
|
||||
reply.send('this is an example')
|
||||
})
|
||||
|
||||
next()
|
||||
}
|
||||
|
||||
// If you prefer async/await, use the following
|
||||
//
|
||||
// module.exports = async function (fastify, opts) {
|
||||
// fastify.get('/example', async function (request, reply) {
|
||||
// return 'this is an example'
|
||||
// })
|
||||
// }
|
||||
@@ -0,0 +1,17 @@
|
||||
'use strict'
|
||||
|
||||
module.exports = function (fastify, opts, next) {
|
||||
fastify.get('/', function (request, reply) {
|
||||
reply.send({ root: true })
|
||||
})
|
||||
|
||||
next()
|
||||
}
|
||||
|
||||
// If you prefer async/await, use the following
|
||||
//
|
||||
// module.exports = async function (fastify, opts) {
|
||||
// fastify.get('/', async function (request, reply) {
|
||||
// return { root: true }
|
||||
// })
|
||||
// }
|
||||
@@ -0,0 +1,34 @@
|
||||
'use strict'
|
||||
|
||||
// This file contains code that we reuse
|
||||
// between our tests.
|
||||
|
||||
const Fastify = require('fastify')
|
||||
const fp = require('fastify-plugin')
|
||||
const App = require('../app')
|
||||
|
||||
// Fill in this config with all the configurations
|
||||
// needed for testing the application
|
||||
function config () {
|
||||
return {}
|
||||
}
|
||||
|
||||
// automatically build and tear down our instance
|
||||
function build (t) {
|
||||
const app = Fastify()
|
||||
|
||||
// fastify-plugin ensures that all decorators
|
||||
// are exposed for testing purposes, this is
|
||||
// different from the production setup
|
||||
app.register(fp(App), config())
|
||||
|
||||
// tear down our app after we are done
|
||||
t.tearDown(app.close.bind(app))
|
||||
|
||||
return app
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
config,
|
||||
build
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
'use strict'
|
||||
|
||||
const { test } = require('tap')
|
||||
const Fastify = require('fastify')
|
||||
const Support = require('../../plugins/support')
|
||||
|
||||
test('support works standalone', (t) => {
|
||||
t.plan(2)
|
||||
const fastify = Fastify()
|
||||
fastify.register(Support)
|
||||
|
||||
fastify.ready((err) => {
|
||||
t.error(err)
|
||||
t.equal(fastify.someSupport(), 'hugs')
|
||||
})
|
||||
})
|
||||
|
||||
// If you prefer async/await, use the following
|
||||
//
|
||||
// test('support works standalone', async (t) => {
|
||||
// const fastify = Fastify()
|
||||
// fastify.register(Support)
|
||||
//
|
||||
// await fastify.ready()
|
||||
// t.equal(fastify.someSupport(), 'hugs')
|
||||
// })
|
||||
@@ -0,0 +1,27 @@
|
||||
'use strict'
|
||||
|
||||
const { test } = require('tap')
|
||||
const { build } = require('../helper')
|
||||
|
||||
test('example is loaded', (t) => {
|
||||
t.plan(2)
|
||||
const app = build(t)
|
||||
|
||||
app.inject({
|
||||
url: '/example'
|
||||
}, (err, res) => {
|
||||
t.error(err)
|
||||
t.equal(res.payload, 'this is an example')
|
||||
})
|
||||
})
|
||||
|
||||
// If you prefer async/await, use the following
|
||||
//
|
||||
// test('example is loaded', async (t) => {
|
||||
// const app = build(t)
|
||||
//
|
||||
// const res = await app.inject({
|
||||
// url: '/example'
|
||||
// })
|
||||
// t.equal(res.payload, 'this is an example')
|
||||
// })
|
||||
@@ -0,0 +1,27 @@
|
||||
'use strict'
|
||||
|
||||
const { test } = require('tap')
|
||||
const { build } = require('../helper')
|
||||
|
||||
test('default root route', (t) => {
|
||||
t.plan(2)
|
||||
const app = build(t)
|
||||
|
||||
app.inject({
|
||||
url: '/'
|
||||
}, (err, res) => {
|
||||
t.error(err)
|
||||
t.deepEqual(JSON.parse(res.payload), { root: true })
|
||||
})
|
||||
})
|
||||
|
||||
// If you prefer async/await, use the following
|
||||
//
|
||||
// test('default root route', async (t) => {
|
||||
// const app = build(t)
|
||||
//
|
||||
// const res = await app.inject({
|
||||
// url: '/'
|
||||
// })
|
||||
// t.deepEqual(JSON.parse(res.payload), { root: true })
|
||||
// })
|
||||
Reference in New Issue
Block a user