@adaptivestone/framework 4.4.0 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/controllers/Auth.test.js +2 -0
  3. package/controllers/Home.test.js +2 -0
  4. package/controllers/index.js +20 -17
  5. package/coverage/base.css +224 -0
  6. package/coverage/block-navigation.js +87 -0
  7. package/coverage/clover.xml +3433 -0
  8. package/coverage/coverage-final.json +41 -0
  9. package/coverage/favicon.png +0 -0
  10. package/coverage/framework/config/auth.js.html +100 -0
  11. package/coverage/framework/config/http.js.html +112 -0
  12. package/coverage/framework/config/i18n.js.html +121 -0
  13. package/coverage/framework/config/index.html +236 -0
  14. package/coverage/framework/config/log.js.html +151 -0
  15. package/coverage/framework/config/mail.js.html +172 -0
  16. package/coverage/framework/config/mongo.js.html +94 -0
  17. package/coverage/framework/config/rateLimiter.js.html +133 -0
  18. package/coverage/framework/config/redis.js.html +97 -0
  19. package/coverage/framework/config/validate.js.html +94 -0
  20. package/coverage/framework/controllers/Auth.js.html +721 -0
  21. package/coverage/framework/controllers/Home.js.html +169 -0
  22. package/coverage/framework/controllers/index.html +146 -0
  23. package/coverage/framework/controllers/index.js.html +268 -0
  24. package/coverage/framework/controllers/test/SomeController.js.html +616 -0
  25. package/coverage/framework/controllers/test/index.html +116 -0
  26. package/coverage/framework/helpers/redis/clearNamespace.js.html +127 -0
  27. package/coverage/framework/helpers/redis/index.html +116 -0
  28. package/coverage/framework/index.html +116 -0
  29. package/coverage/framework/models/Sequence.js.html +151 -0
  30. package/coverage/framework/models/User.js.html +859 -0
  31. package/coverage/framework/models/index.html +131 -0
  32. package/coverage/framework/modules/AbstractController.js.html +1315 -0
  33. package/coverage/framework/modules/AbstractModel.js.html +268 -0
  34. package/coverage/framework/modules/Base.js.html +577 -0
  35. package/coverage/framework/modules/index.html +146 -0
  36. package/coverage/framework/server.js.html +820 -0
  37. package/coverage/framework/services/cache/Cache.js.html +430 -0
  38. package/coverage/framework/services/cache/index.html +116 -0
  39. package/coverage/framework/services/documentation/DocumentationGenerator.js.html +598 -0
  40. package/coverage/framework/services/documentation/index.html +116 -0
  41. package/coverage/framework/services/http/HttpServer.js.html +373 -0
  42. package/coverage/framework/services/http/index.html +116 -0
  43. package/coverage/framework/services/http/middleware/AbstractMiddleware.js.html +238 -0
  44. package/coverage/framework/services/http/middleware/Auth.js.html +145 -0
  45. package/coverage/framework/services/http/middleware/GetUserByToken.js.html +223 -0
  46. package/coverage/framework/services/http/middleware/I18n.js.html +442 -0
  47. package/coverage/framework/services/http/middleware/Pagination.js.html +253 -0
  48. package/coverage/framework/services/http/middleware/PrepareAppInfo.js.html +139 -0
  49. package/coverage/framework/services/http/middleware/RateLimiter.js.html +472 -0
  50. package/coverage/framework/services/http/middleware/RequestLogger.js.html +151 -0
  51. package/coverage/framework/services/http/middleware/RequestParser.js.html +199 -0
  52. package/coverage/framework/services/http/middleware/Role.js.html +172 -0
  53. package/coverage/framework/services/http/middleware/index.html +251 -0
  54. package/coverage/framework/services/http/middleware/test/CheckFlag.js.html +139 -0
  55. package/coverage/framework/services/http/middleware/test/index.html +116 -0
  56. package/coverage/framework/services/messaging/email/index.html +116 -0
  57. package/coverage/framework/services/messaging/email/index.js.html +739 -0
  58. package/coverage/framework/services/messaging/index.html +116 -0
  59. package/coverage/framework/services/messaging/index.js.html +100 -0
  60. package/coverage/framework/services/validate/ValidateService.js.html +568 -0
  61. package/coverage/framework/services/validate/drivers/AbstractValidator.js.html +196 -0
  62. package/coverage/framework/services/validate/drivers/CustomValidator.js.html +241 -0
  63. package/coverage/framework/services/validate/drivers/YupValidator.js.html +394 -0
  64. package/coverage/framework/services/validate/drivers/index.html +146 -0
  65. package/coverage/framework/services/validate/index.html +116 -0
  66. package/coverage/index.html +341 -0
  67. package/coverage/prettify.css +1 -0
  68. package/coverage/prettify.js +2 -0
  69. package/coverage/sort-arrow-sprite.png +0 -0
  70. package/coverage/sorter.js +196 -0
  71. package/models/Sequence.test.js +2 -0
  72. package/models/User.js +8 -8
  73. package/models/User.test.js +2 -0
  74. package/modules/AbstractModel.js +1 -0
  75. package/modules/BaseCli.js +2 -2
  76. package/modules/Modules.test.js +3 -2
  77. package/package.json +7 -18
  78. package/server.js +9 -9
  79. package/services/http/middleware/I18n.test.js +12 -5
  80. package/services/http/middleware/PrepareAppInfo.test.js +7 -3
  81. package/services/http/middleware/RateLimiter.js +5 -6
  82. package/services/http/middleware/RateLimiter.test.js +184 -1
  83. package/services/http/middleware/RequestParser.test.js +7 -4
  84. package/services/validate/ValidateService.test.js +2 -0
  85. package/tests/setup.js +2 -2
  86. package/tests/setupVitest.js +119 -0
  87. package/vitest.config.js +9 -0
@@ -0,0 +1,820 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for framework/server.js</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../prettify.css" />
9
+ <link rel="stylesheet" href="../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../index.html">All files</a> / <a href="index.html">framework</a> server.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">87.34% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>214/245</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">80% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>16/20</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">91.66% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>11/12</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">87.34% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>214/245</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input oninput="onInput()" type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">11x</span>
312
+ <span class="cline-any cline-yes">11x</span>
313
+ <span class="cline-any cline-yes">11x</span>
314
+ <span class="cline-any cline-yes">11x</span>
315
+ <span class="cline-any cline-yes">11x</span>
316
+ <span class="cline-any cline-yes">11x</span>
317
+ <span class="cline-any cline-yes">11x</span>
318
+ <span class="cline-any cline-yes">11x</span>
319
+ <span class="cline-any cline-yes">11x</span>
320
+ <span class="cline-any cline-yes">11x</span>
321
+ <span class="cline-any cline-yes">11x</span>
322
+ <span class="cline-any cline-yes">11x</span>
323
+ <span class="cline-any cline-yes">11x</span>
324
+ <span class="cline-any cline-yes">11x</span>
325
+ <span class="cline-any cline-yes">11x</span>
326
+ <span class="cline-any cline-yes">11x</span>
327
+ <span class="cline-any cline-yes">11x</span>
328
+ <span class="cline-any cline-yes">11x</span>
329
+ <span class="cline-any cline-yes">11x</span>
330
+ <span class="cline-any cline-yes">11x</span>
331
+ <span class="cline-any cline-yes">11x</span>
332
+ <span class="cline-any cline-yes">11x</span>
333
+ <span class="cline-any cline-yes">11x</span>
334
+ <span class="cline-any cline-yes">11x</span>
335
+ <span class="cline-any cline-yes">11x</span>
336
+ <span class="cline-any cline-yes">11x</span>
337
+ <span class="cline-any cline-yes">11x</span>
338
+ <span class="cline-any cline-yes">11x</span>
339
+ <span class="cline-any cline-yes">11x</span>
340
+ <span class="cline-any cline-yes">11x</span>
341
+ <span class="cline-any cline-yes">11x</span>
342
+ <span class="cline-any cline-yes">11x</span>
343
+ <span class="cline-any cline-yes">11x</span>
344
+ <span class="cline-any cline-yes">4x</span>
345
+ <span class="cline-any cline-yes">11x</span>
346
+ <span class="cline-any cline-yes">11x</span>
347
+ <span class="cline-any cline-yes">11x</span>
348
+ <span class="cline-any cline-yes">11x</span>
349
+ <span class="cline-any cline-yes">11x</span>
350
+ <span class="cline-any cline-yes">11x</span>
351
+ <span class="cline-any cline-yes">11x</span>
352
+ <span class="cline-any cline-yes">11x</span>
353
+ <span class="cline-any cline-yes">11x</span>
354
+ <span class="cline-any cline-yes">11x</span>
355
+ <span class="cline-any cline-yes">11x</span>
356
+ <span class="cline-any cline-yes">11x</span>
357
+ <span class="cline-any cline-yes">11x</span>
358
+ <span class="cline-any cline-yes">11x</span>
359
+ <span class="cline-any cline-yes">11x</span>
360
+ <span class="cline-any cline-yes">11x</span>
361
+ <span class="cline-any cline-yes">11x</span>
362
+ <span class="cline-any cline-yes">11x</span>
363
+ <span class="cline-any cline-yes">11x</span>
364
+ <span class="cline-any cline-yes">11x</span>
365
+ <span class="cline-any cline-yes">11x</span>
366
+ <span class="cline-any cline-yes">11x</span>
367
+ <span class="cline-any cline-yes">11x</span>
368
+ <span class="cline-any cline-yes">11x</span>
369
+ <span class="cline-any cline-yes">11x</span>
370
+ <span class="cline-any cline-yes">11x</span>
371
+ <span class="cline-any cline-yes">11x</span>
372
+ <span class="cline-any cline-yes">11x</span>
373
+ <span class="cline-any cline-yes">11x</span>
374
+ <span class="cline-any cline-yes">11x</span>
375
+ <span class="cline-any cline-yes">11x</span>
376
+ <span class="cline-any cline-yes">11x</span>
377
+ <span class="cline-any cline-yes">11x</span>
378
+ <span class="cline-any cline-yes">11x</span>
379
+ <span class="cline-any cline-yes">11x</span>
380
+ <span class="cline-any cline-yes">11x</span>
381
+ <span class="cline-any cline-yes">11x</span>
382
+ <span class="cline-any cline-yes">11x</span>
383
+ <span class="cline-any cline-yes">11x</span>
384
+ <span class="cline-any cline-yes">11x</span>
385
+ <span class="cline-any cline-yes">11x</span>
386
+ <span class="cline-any cline-yes">11x</span>
387
+ <span class="cline-any cline-yes">11x</span>
388
+ <span class="cline-any cline-yes">11x</span>
389
+ <span class="cline-any cline-yes">11x</span>
390
+ <span class="cline-any cline-yes">11x</span>
391
+ <span class="cline-any cline-yes">11x</span>
392
+ <span class="cline-any cline-yes">11x</span>
393
+ <span class="cline-any cline-yes">11x</span>
394
+ <span class="cline-any cline-yes">11x</span>
395
+ <span class="cline-any cline-yes">11x</span>
396
+ <span class="cline-any cline-no">&nbsp;</span>
397
+ <span class="cline-any cline-no">&nbsp;</span>
398
+ <span class="cline-any cline-no">&nbsp;</span>
399
+ <span class="cline-any cline-no">&nbsp;</span>
400
+ <span class="cline-any cline-no">&nbsp;</span>
401
+ <span class="cline-any cline-no">&nbsp;</span>
402
+ <span class="cline-any cline-no">&nbsp;</span>
403
+ <span class="cline-any cline-yes">11x</span>
404
+ <span class="cline-any cline-yes">11x</span>
405
+ <span class="cline-any cline-yes">11x</span>
406
+ <span class="cline-any cline-yes">11x</span>
407
+ <span class="cline-any cline-yes">11x</span>
408
+ <span class="cline-any cline-yes">11x</span>
409
+ <span class="cline-any cline-yes">11x</span>
410
+ <span class="cline-any cline-yes">11x</span>
411
+ <span class="cline-any cline-yes">11x</span>
412
+ <span class="cline-any cline-yes">11x</span>
413
+ <span class="cline-any cline-yes">11x</span>
414
+ <span class="cline-any cline-yes">11x</span>
415
+ <span class="cline-any cline-yes">11x</span>
416
+ <span class="cline-any cline-yes">11x</span>
417
+ <span class="cline-any cline-yes">725x</span>
418
+ <span class="cline-any cline-yes">725x</span>
419
+ <span class="cline-any cline-yes">91x</span>
420
+ <span class="cline-any cline-yes">91x</span>
421
+ <span class="cline-any cline-yes">91x</span>
422
+ <span class="cline-any cline-yes">91x</span>
423
+ <span class="cline-any cline-yes">91x</span>
424
+ <span class="cline-any cline-yes">91x</span>
425
+ <span class="cline-any cline-yes">91x</span>
426
+ <span class="cline-any cline-yes">91x</span>
427
+ <span class="cline-any cline-yes">91x</span>
428
+ <span class="cline-any cline-yes">91x</span>
429
+ <span class="cline-any cline-yes">91x</span>
430
+ <span class="cline-any cline-yes">91x</span>
431
+ <span class="cline-any cline-yes">91x</span>
432
+ <span class="cline-any cline-yes">91x</span>
433
+ <span class="cline-any cline-yes">91x</span>
434
+ <span class="cline-any cline-yes">91x</span>
435
+ <span class="cline-any cline-yes">91x</span>
436
+ <span class="cline-any cline-yes">725x</span>
437
+ <span class="cline-any cline-yes">725x</span>
438
+ <span class="cline-any cline-yes">11x</span>
439
+ <span class="cline-any cline-yes">11x</span>
440
+ <span class="cline-any cline-yes">11x</span>
441
+ <span class="cline-any cline-yes">11x</span>
442
+ <span class="cline-any cline-yes">11x</span>
443
+ <span class="cline-any cline-yes">11x</span>
444
+ <span class="cline-any cline-yes">11x</span>
445
+ <span class="cline-any cline-yes">11x</span>
446
+ <span class="cline-any cline-yes">11x</span>
447
+ <span class="cline-any cline-yes">124x</span>
448
+ <span class="cline-any cline-yes">124x</span>
449
+ <span class="cline-any cline-yes">124x</span>
450
+ <span class="cline-any cline-yes">124x</span>
451
+ <span class="cline-any cline-yes">124x</span>
452
+ <span class="cline-any cline-yes">124x</span>
453
+ <span class="cline-any cline-yes">11x</span>
454
+ <span class="cline-any cline-yes">11x</span>
455
+ <span class="cline-any cline-yes">11x</span>
456
+ <span class="cline-any cline-yes">11x</span>
457
+ <span class="cline-any cline-yes">11x</span>
458
+ <span class="cline-any cline-yes">11x</span>
459
+ <span class="cline-any cline-yes">11x</span>
460
+ <span class="cline-any cline-yes">11x</span>
461
+ <span class="cline-any cline-yes">61x</span>
462
+ <span class="cline-any cline-no">&nbsp;</span>
463
+ <span class="cline-any cline-no">&nbsp;</span>
464
+ <span class="cline-any cline-no">&nbsp;</span>
465
+ <span class="cline-any cline-no">&nbsp;</span>
466
+ <span class="cline-any cline-yes">61x</span>
467
+ <span class="cline-any cline-yes">12x</span>
468
+ <span class="cline-any cline-yes">12x</span>
469
+ <span class="cline-any cline-no">&nbsp;</span>
470
+ <span class="cline-any cline-no">&nbsp;</span>
471
+ <span class="cline-any cline-no">&nbsp;</span>
472
+ <span class="cline-any cline-yes">12x</span>
473
+ <span class="cline-any cline-yes">12x</span>
474
+ <span class="cline-any cline-yes">12x</span>
475
+ <span class="cline-any cline-yes">12x</span>
476
+ <span class="cline-any cline-yes">12x</span>
477
+ <span class="cline-any cline-no">&nbsp;</span>
478
+ <span class="cline-any cline-no">&nbsp;</span>
479
+ <span class="cline-any cline-no">&nbsp;</span>
480
+ <span class="cline-any cline-yes">12x</span>
481
+ <span class="cline-any cline-yes">61x</span>
482
+ <span class="cline-any cline-yes">61x</span>
483
+ <span class="cline-any cline-yes">11x</span>
484
+ <span class="cline-any cline-yes">11x</span>
485
+ <span class="cline-any cline-yes">11x</span>
486
+ <span class="cline-any cline-yes">11x</span>
487
+ <span class="cline-any cline-yes">11x</span>
488
+ <span class="cline-any cline-yes">11x</span>
489
+ <span class="cline-any cline-yes">11x</span>
490
+ <span class="cline-any cline-no">&nbsp;</span>
491
+ <span class="cline-any cline-no">&nbsp;</span>
492
+ <span class="cline-any cline-no">&nbsp;</span>
493
+ <span class="cline-any cline-no">&nbsp;</span>
494
+ <span class="cline-any cline-no">&nbsp;</span>
495
+ <span class="cline-any cline-no">&nbsp;</span>
496
+ <span class="cline-any cline-no">&nbsp;</span>
497
+ <span class="cline-any cline-no">&nbsp;</span>
498
+ <span class="cline-any cline-no">&nbsp;</span>
499
+ <span class="cline-any cline-no">&nbsp;</span>
500
+ <span class="cline-any cline-yes">11x</span>
501
+ <span class="cline-any cline-yes">11x</span>
502
+ <span class="cline-any cline-yes">11x</span>
503
+ <span class="cline-any cline-yes">11x</span>
504
+ <span class="cline-any cline-yes">11x</span>
505
+ <span class="cline-any cline-yes">11x</span>
506
+ <span class="cline-any cline-yes">4x</span>
507
+ <span class="cline-any cline-yes">1x</span>
508
+ <span class="cline-any cline-yes">1x</span>
509
+ <span class="cline-any cline-yes">1x</span>
510
+ <span class="cline-any cline-yes">1x</span>
511
+ <span class="cline-any cline-yes">4x</span>
512
+ <span class="cline-any cline-yes">4x</span>
513
+ <span class="cline-any cline-yes">11x</span>
514
+ <span class="cline-any cline-yes">11x</span>
515
+ <span class="cline-any cline-yes">11x</span>
516
+ <span class="cline-any cline-yes">11x</span>
517
+ <span class="cline-any cline-yes">11x</span>
518
+ <span class="cline-any cline-yes">11x</span>
519
+ <span class="cline-any cline-yes">11x</span>
520
+ <span class="cline-any cline-yes">194x</span>
521
+ <span class="cline-any cline-yes">194x</span>
522
+ <span class="cline-any cline-yes">194x</span>
523
+ <span class="cline-any cline-yes">194x</span>
524
+ <span class="cline-any cline-yes">194x</span>
525
+ <span class="cline-any cline-yes">91x</span>
526
+ <span class="cline-any cline-yes">91x</span>
527
+ <span class="cline-any cline-yes">91x</span>
528
+ <span class="cline-any cline-yes">91x</span>
529
+ <span class="cline-any cline-yes">91x</span>
530
+ <span class="cline-any cline-yes">91x</span>
531
+ <span class="cline-any cline-yes">91x</span>
532
+ <span class="cline-any cline-yes">91x</span>
533
+ <span class="cline-any cline-yes">91x</span>
534
+ <span class="cline-any cline-yes">91x</span>
535
+ <span class="cline-any cline-yes">91x</span>
536
+ <span class="cline-any cline-yes">91x</span>
537
+ <span class="cline-any cline-yes">91x</span>
538
+ <span class="cline-any cline-yes">91x</span>
539
+ <span class="cline-any cline-yes">91x</span>
540
+ <span class="cline-any cline-yes">91x</span>
541
+ <span class="cline-any cline-yes">91x</span>
542
+ <span class="cline-any cline-yes">91x</span>
543
+ <span class="cline-any cline-no">&nbsp;</span>
544
+ <span class="cline-any cline-no">&nbsp;</span>
545
+ <span class="cline-any cline-no">&nbsp;</span>
546
+ <span class="cline-any cline-no">&nbsp;</span>
547
+ <span class="cline-any cline-yes">91x</span>
548
+ <span class="cline-any cline-yes">91x</span>
549
+ <span class="cline-any cline-yes">91x</span>
550
+ <span class="cline-any cline-yes">91x</span>
551
+ <span class="cline-any cline-yes">194x</span>
552
+ <span class="cline-any cline-yes">194x</span>
553
+ <span class="cline-any cline-yes">11x</span>
554
+ <span class="cline-any cline-yes">11x</span>
555
+ <span class="cline-any cline-yes">11x</span>
556
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/* eslint-disable no-console */
557
+ const EventEmitter = require('node:events');
558
+ &nbsp;
559
+ require('dotenv').config();
560
+ const merge = require('deepmerge');
561
+ &nbsp;
562
+ /**
563
+ * Main framework class.
564
+ */
565
+ class Server {
566
+ /**
567
+ * Construct new server
568
+ * @param {Object} config main config object
569
+ * @param {Object} config.folders folders config
570
+ * @param {String} config.folders.config path to folder with config files
571
+ * @param {String} config.folders.models path to folder with moidels files
572
+ * @param {String} config.folders.controllers path to folder with controllers files
573
+ * @param {String} config.folders.views path to folder with view files
574
+ * @param {String} config.folders.public path to folder with public files
575
+ * @param {String} config.folders.locales path to folder with locales files
576
+ * @param {String} config.folders.emails path to folder with emails files
577
+ */
578
+ constructor(config) {
579
+ this.config = config;
580
+ const that = this;
581
+ this.app = {
582
+ getConfig: this.getConfig.bind(this),
583
+ getModel: this.getModel.bind(this),
584
+ runCliCommand: this.runCliCommand.bind(this),
585
+ updateConfig: this.updateConfig.bind(this),
586
+ foldersConfig: this.config.folders,
587
+ events: new EventEmitter(),
588
+ get cache() {
589
+ return that.getCache();
590
+ },
591
+ httpServer: null,
592
+ controllerManager: null,
593
+ };
594
+ &nbsp;
595
+ this.cache = {
596
+ configs: new Map(),
597
+ models: new Map(),
598
+ };
599
+ &nbsp;
600
+ this.cli = false;
601
+ }
602
+ &nbsp;
603
+ /**
604
+ * Start server (http + websocket + init all http and websocet ralated functions)
605
+ * @param &lt;Promise&gt;callbackBefore404 code that should be executed before adding page 404
606
+ * @returns {Promise}
607
+ */
608
+ async startServer(callbackBefore404 = async () =&gt; Promise.resolve()) {
609
+ // eslint-disable-next-line global-require
610
+ // const HttpServer = require('./services/http/HttpServer');
611
+ // eslint-disable-next-line global-require
612
+ // const ControllerManager = require('./controllers/index');
613
+ // TODO wait until https://github.com/nodejs/node/issues/35889
614
+ const [{ default: HttpServer }, { default: ControllerManager }] =
615
+ await Promise.all([
616
+ // eslint-disable-next-line import/extensions
617
+ import('./services/http/HttpServer.js'), // Speed optimisation
618
+ // eslint-disable-next-line import/extensions
619
+ import('./controllers/index.js'), // Speed optimisation
620
+ ]);
621
+ &nbsp;
622
+ this.addErrorHandling();
623
+ &nbsp;
624
+ // TODO config
625
+ this.app.httpServer = new HttpServer(this.app);
626
+ &nbsp;
627
+ this.app.controllerManager = new ControllerManager(this.app);
628
+ &nbsp;
629
+ await this.app.controllerManager.initControllers();
630
+ await callbackBefore404();
631
+ this.app.httpServer.add404Page();
632
+ }
633
+ &nbsp;
634
+ /**
635
+ * Add error logging on promise reject
636
+ */
637
+ // eslint-disable-next-line class-methods-use-this
638
+ addErrorHandling() {
639
+ process.on('uncaughtException', console.error);
640
+ process.on('unhandledRejection', (reason, p) =&gt; {
641
+ <span class="cstat-no" title="statement not covered" > console.log(</span>
642
+ <span class="cstat-no" title="statement not covered" > 'Possibly Unhandled Rejection at: Promise ',</span>
643
+ <span class="cstat-no" title="statement not covered" > p,</span>
644
+ <span class="cstat-no" title="statement not covered" > ' reason: ',</span>
645
+ <span class="cstat-no" title="statement not covered" > reason,</span>
646
+ <span class="cstat-no" title="statement not covered" > );</span>
647
+ <span class="cstat-no" title="statement not covered" > console.trace('unhandledRejection');</span>
648
+ });
649
+ }
650
+ &nbsp;
651
+ /**
652
+ * Return config from {configName} (file name) on config folder.
653
+ * Support cache and updating confing into cache
654
+ * Also will update config based on NODE_ENV. If config.js and config.production.js
655
+ * and NODE_ENV is production then we will load base config (config.js) and the load
656
+ * environment config (config.production.js) and overwrite base config options
657
+ * @see updateConfig
658
+ * @param {String} configName name on config file to load
659
+ * @returns {Object} config object. Structure depends of config file
660
+ */
661
+ getConfig(configName) {
662
+ // const configName = name.charAt(0).toUpperCase() + name.slice(1);
663
+ if (!this.cache.configs.has(configName)) {
664
+ let envConfig = {};
665
+ if (process.env.NODE_ENV) {
666
+ envConfig =
667
+ this.getFileWithExtendingInhirence(
668
+ 'config',
669
+ `${configName}.${process.env.NODE_ENV}.js`,
670
+ ) || envConfig;
671
+ }
672
+ this.cache.configs.set(
673
+ configName,
674
+ merge(
675
+ this.getFileWithExtendingInhirence('config', configName),
676
+ envConfig,
677
+ { arrayMerge: (destinationArray, sourceArray) =&gt; sourceArray },
678
+ ),
679
+ );
680
+ }
681
+ return this.cache.configs.get(configName);
682
+ }
683
+ &nbsp;
684
+ /**
685
+ * Primary designed for tests when we need to update some configs before start testing
686
+ * Should be called before any initialization was done
687
+ * @TODO send event to all inited components to update config
688
+ * @param {String} configName
689
+ * @param {Object} config
690
+ */
691
+ updateConfig(configName, config) {
692
+ // const confName = configName.charAt(0).toUpperCase() + configName.slice(1);
693
+ const conf = this.getConfig(configName);
694
+ const newConf = Object.assign(conf, config); // TODO deep clone
695
+ this.cache.configs.set(configName, newConf);
696
+ return newConf;
697
+ }
698
+ &nbsp;
699
+ /**
700
+ * Return model from {modelName} (file name) on model folder.
701
+ * Support cache
702
+ * @param {String} modelName name on config file to load
703
+ * @returns {import('mongoose').Model}
704
+ */
705
+ getModel(modelName) {
706
+ if (modelName.endsWith('s')) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
707
+ <span class="cstat-no" title="statement not covered" > console.warn(</span>
708
+ <span class="cstat-no" title="statement not covered" > `Probably your model name '${modelName}' in plural from. Try to avoid plural form`,</span>
709
+ <span class="cstat-no" title="statement not covered" > );</span>
710
+ <span class="cstat-no" title="statement not covered" > }</span>
711
+ if (!this.cache.models.has(modelName)) {
712
+ const Model = this.getFileWithExtendingInhirence('models', modelName);
713
+ if (!Model) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
714
+ <span class="cstat-no" title="statement not covered" > console.error(`Model not found: ${modelName}`);</span>
715
+ <span class="cstat-no" title="statement not covered" > return false;</span>
716
+ <span class="cstat-no" title="statement not covered" > }</span>
717
+ try {
718
+ const model = new Model(this.app);
719
+ &nbsp;
720
+ this.cache.models.set(modelName, model.mongooseModel);
721
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (e) {</span>
722
+ <span class="cstat-no" title="statement not covered" > console.error(`Problem with model ${modelName}, ${e.message}`);</span>
723
+ <span class="cstat-no" title="statement not covered" > console.error(e);</span>
724
+ <span class="cstat-no" title="statement not covered" > }</span>
725
+ }
726
+ return this.cache.models.get(modelName);
727
+ }
728
+ &nbsp;
729
+ /**
730
+ * Run cli command into framework (http, ws, etc)
731
+ * @param {String} commandName name of command to load
732
+ * @param {Object} args list of arguments to pass into command
733
+ */
734
+ <span class="fstat-no" title="function not covered" > async runCliCommand(commandName, args) {</span>
735
+ <span class="cstat-no" title="statement not covered" > if (!this.cli) {</span>
736
+ <span class="cstat-no" title="statement not covered" > // eslint-disable-next-line import/extensions</span>
737
+ <span class="cstat-no" title="statement not covered" > // TODO wait until https://github.com/nodejs/node/issues/35889</span>
738
+ <span class="cstat-no" title="statement not covered" > // const { default: BaseCli } = await import('./modules/BaseCli.js'); // Speed optimisation</span>
739
+ <span class="cstat-no" title="statement not covered" > // eslint-disable-next-line global-require</span>
740
+ <span class="cstat-no" title="statement not covered" > const BaseCli = require('./modules/BaseCli');</span>
741
+ <span class="cstat-no" title="statement not covered" > this.cli = new BaseCli(this);</span>
742
+ <span class="cstat-no" title="statement not covered" > }</span>
743
+ <span class="cstat-no" title="statement not covered" > return this.cli.run(commandName, args);</span>
744
+ <span class="cstat-no" title="statement not covered" > }</span>
745
+ &nbsp;
746
+ /**
747
+ * Get internal cache service
748
+ * @returns
749
+ */
750
+ getCache() {
751
+ if (!this.cacheService) {
752
+ // eslint-disable-next-line global-require
753
+ const Cache = require('./services/cache/Cache'); // Speed optimisation
754
+ this.cacheService = new Cache(this.app);
755
+ }
756
+ return this.cacheService;
757
+ }
758
+ &nbsp;
759
+ /**
760
+ * Get file using Inhirence (ability to overrite models, configs, etc)
761
+ * @param {('models'|'config')} fileType type of file to load
762
+ * @param {string} fileName name of file to load
763
+ */
764
+ getFileWithExtendingInhirence(fileType, fileName) {
765
+ let file;
766
+ try {
767
+ // eslint-disable-next-line global-require, import/no-dynamic-require
768
+ file = require(`${this.config.folders[fileType]}/${fileName}`);
769
+ } catch (e) {
770
+ try {
771
+ // eslint-disable-next-line global-require, import/no-dynamic-require
772
+ file = require(`./${fileType}/${fileName}`);
773
+ } catch (e2) {
774
+ const levels = [
775
+ 'error',
776
+ 'warn',
777
+ 'info',
778
+ 'http',
779
+ 'verbose',
780
+ 'debug',
781
+ 'silly',
782
+ ];
783
+ &nbsp;
784
+ if (
785
+ !process.env.LOGGER_CONSOLE_LEVEL ||
786
+ levels.indexOf(process.env.LOGGER_CONSOLE_LEVEL) &gt; 0 // as a warn level
787
+ ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
788
+ <span class="cstat-no" title="statement not covered" > console.warn(</span>
789
+ <span class="cstat-no" title="statement not covered" > `Config not found '${fileName}'. This can be a normal (in case this an environment config)`,</span>
790
+ <span class="cstat-no" title="statement not covered" > );</span>
791
+ <span class="cstat-no" title="statement not covered" > }</span>
792
+ &nbsp;
793
+ file = false;
794
+ }
795
+ }
796
+ return file;
797
+ }
798
+ }
799
+ &nbsp;
800
+ module.exports = Server;
801
+ &nbsp;</pre></td></tr></table></pre>
802
+
803
+ <div class='push'></div><!-- for sticky footer -->
804
+ </div><!-- /wrapper -->
805
+ <div class='footer quiet pad2 space-top1 center small'>
806
+ Code coverage generated by
807
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
808
+ at 2023-09-05T18:04:40.903Z
809
+ </div>
810
+ <script src="../prettify.js"></script>
811
+ <script>
812
+ window.onload = function () {
813
+ prettyPrint();
814
+ };
815
+ </script>
816
+ <script src="../sorter.js"></script>
817
+ <script src="../block-navigation.js"></script>
818
+ </body>
819
+ </html>
820
+