UNPKG

1.79 kBJavaScriptView Raw
1'use strict'
2
3/* eslint no-prototype-builtins: 0 */
4
5const {
6 kReply,
7 kRequest
8} = require('./symbols.js')
9
10const {
11 codes: {
12 FST_ERR_DEC_ALREADY_PRESENT,
13 FST_ERR_DEC_MISSING_DEPENDENCY
14 }
15} = require('./errors')
16
17function decorate (instance, name, fn, dependencies) {
18 if (instance.hasOwnProperty(name)) {
19 throw new FST_ERR_DEC_ALREADY_PRESENT(name)
20 }
21
22 if (dependencies) {
23 checkDependencies(instance, dependencies)
24 }
25
26 if (fn && (typeof fn.getter === 'function' || typeof fn.setter === 'function')) {
27 Object.defineProperty(instance, name, {
28 get: fn.getter,
29 set: fn.setter
30 })
31 } else {
32 instance[name] = fn
33 }
34}
35
36function decorateFastify (name, fn, dependencies) {
37 decorate(this, name, fn, dependencies)
38 return this
39}
40
41function checkExistence (instance, name) {
42 if (name) {
43 return name in instance
44 }
45
46 return instance in this
47}
48
49function checkRequestExistence (name) {
50 return checkExistence(this[kRequest].prototype, name)
51}
52
53function checkReplyExistence (name) {
54 return checkExistence(this[kReply].prototype, name)
55}
56
57function checkDependencies (instance, deps) {
58 for (var i = 0; i < deps.length; i++) {
59 if (!checkExistence(instance, deps[i])) {
60 throw new FST_ERR_DEC_MISSING_DEPENDENCY(deps[i])
61 }
62 }
63}
64
65function decorateReply (name, fn, dependencies) {
66 decorate(this[kReply].prototype, name, fn, dependencies)
67 return this
68}
69
70function decorateRequest (name, fn, dependencies) {
71 decorate(this[kRequest].prototype, name, fn, dependencies)
72 return this
73}
74
75module.exports = {
76 add: decorateFastify,
77 exist: checkExistence,
78 existRequest: checkRequestExistence,
79 existReply: checkReplyExistence,
80 dependencies: checkDependencies,
81 decorateReply: decorateReply,
82 decorateRequest: decorateRequest
83}